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仍然很新(甚至对我来说),所以几乎没有可靠的资源.有没有人对如何解决这个问题有更好的想法?
简而言之,如果您想重新使用脚本,请不要使用Node.js特定的东西,您必须使用最低的公分母,即浏览器.
解决方案是:
过度使用并使用RequireJS,这将使它在Node.js和浏览器中都有效.但是你需要在服务器端使用RequireJS格式,你还需要插入一个即时转换的脚本......
做自己的装载机
call(module)在该函数上,在传递this给模块的节点端,在客户端传递名称空间对象保持简单和愚蠢,就像现在一样,不要this在Node.js方面的模块范围内使用
我希望我能给你一个简单的开箱即用解决方案,但在这种情况下,两种环境都有很大不同.如果您确实拥有大量代码,则可以考虑生成文件的构建脚本.
| 归档时间: |
|
| 查看次数: |
2128 次 |
| 最近记录: |