Node.js和客户端共享相同的脚本

时间:2010-12-06 21:37:12

标签: javascript scope client-server node.js

使用Node.js的一个理论上的好处是可以在客户端和服务器之间共享相同的脚本。如果客户端不支持javascript,那么就可以将相同的功能降级到服务器。

但是,Node.js require()方法可以自行运行。在您加载的脚本中,您可以向thisexports添加稍后将在提取脚本的对象中可用的内容:

var stuff = require('stuff');
stuff.show();

在stuff.js:

this.show = function() {
    return 'here is my stuff';
}

因此,在客户端重新使用此脚本时,.show()方法将添加到window范围。这不是我们想要的,而是我们想将它添加到自定义命名空间。

到目前为止我唯一的解决方案是(在stuff.js中):

var ns = typeof exports == 'undefined' ? (function() {
    return window['stuff'] = {};
})() : exports;

ns.show = function() {
    return 'here is my stuff';
}

delete ns; // remove ns from the global scope

这非常有效,因为我可以在服务器和客户端上调用stuff.show()。但它看起来古怪。我尝试寻找解决方案,但node.js仍然很新(甚至对我来说),所以几乎没有可靠的资源。有没有人对如何解决这个问题有更好的想法?

1 个答案:

答案 0 :(得分:6)

简而言之,如果你想重新使用脚本,请不要使用Node.js特定的东西,你必须使用最低的公分母,浏览器。

解决方案是:

  1. 过度杀戮并使用RequireJS,这将使其在Node.js和浏览器中都能正常工作。但是你需要在服务器端使用RequireJS格式,你还需要插入一个即时转换的脚本......

  2. 自己做装载机

    1. 使用匿名函数
    2. 在服务器端和客户端端包装您的重用脚本
    3. 现在创建一些代码,用户call(module)在该功能上,在节点一侧为模块传递this,在客户端传递名称空间对象
  3. 保持简单和愚蠢,就像现在一样,并且不要在Node.js方面的模块范围内使用this

  4. 我希望我能为您提供简单易用的解决方案,但在这种情况下,两种环境都有很大不同。如果您确实拥有大量代码,则可以考虑生成文件的构建脚本。