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

Dav*_*ing 12 javascript scope client-server node.js

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

但是,Node.js require()方法可以自行运行.在您加载的脚本中,您可以添加内容this或exports稍后在获取脚本的对象中可用的内容:

var stuff = require('stuff');
stuff.show();
Run Code Online (Sandbox Code Playgroud)

在stuff.js中:

this.show = function() {
    return 'here is my stuff';
}
Run Code Online (Sandbox Code Playgroud)

因此,在客户端上重用此脚本时,该.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
Run Code Online (Sandbox Code Playgroud)

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

Ivo*_*zel 6

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

解决方案是:

  1. 过度使用并使用RequireJS,这将使它在Node.js和浏览器中都有效.但是你需要在服务器端使用RequireJS格式,你还需要插入一个即时转换的脚本......

  2. 做自己的装载机

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

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

  • 呃不是真的,要求是同步的,你必须下载脚本来做那些需要花费很长时间并阻止其他东西的脚本. (5认同)