使用Node.js的一个理论上的好处是可以在客户端和服务器之间共享相同的脚本。如果客户端不支持javascript,那么就可以将相同的功能降级到服务器。
但是,Node.js require()
方法可以自行运行。在您加载的脚本中,您可以向this
或exports
添加稍后将在提取脚本的对象中可用的内容:
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仍然很新(甚至对我来说),所以几乎没有可靠的资源。有没有人对如何解决这个问题有更好的想法?
答案 0 :(得分:6)
简而言之,如果你想重新使用脚本,请不要使用Node.js特定的东西,你必须使用最低的公分母,浏览器。
解决方案是:
过度杀戮并使用RequireJS,这将使其在Node.js和浏览器中都能正常工作。但是你需要在服务器端使用RequireJS格式,你还需要插入一个即时转换的脚本......
自己做装载机
call(module)
在该功能上,在节点一侧为模块传递this
,在客户端传递名称空间对象保持简单和愚蠢,就像现在一样,并且不要在Node.js方面的模块范围内使用this
我希望我能为您提供简单易用的解决方案,但在这种情况下,两种环境都有很大不同。如果您确实拥有大量代码,则可以考虑生成文件的构建脚本。