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

使用Node.js的一个理论好处是可以在客户端和服务器之间共享相同的脚本。 如果客户端不支持JavaScript,那么这将使服务器可以降低相同的function。

然而,Node.js require()方法是自己的。 在你加载的脚本中,你可以添加一些东西到this或者exports ,稍后在获取脚本的对象中可用:

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

在stuff.js中:

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

所以,在客户端重新使用这个脚本时, .show()方法将被添加到window范围中。 这不是我们想要的,而是我们想将其添加到自定义名称空间。

到目前为止,我唯一的解决scheme就像(在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() 。 但看起来古怪。 我尝试寻找解决scheme,但node.js仍然是非常新的(即使是我),所以没有可靠的资源。 有没有人有更好的想法如何解决这个问题?

总之,如果你想重新使用脚本不要使用Node.js特定的东西,你必须去与这里最低的共同点,浏览器。

解决scheme是:

  1. 过度使用和使用RequireJS ,这将使它在Node.js和浏览器。 但是,您需要在服务器端使用RequireJS格式,并且还需要插入即时转换的脚本。

  2. 做你自己的装载机

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

我希望我能给你一个简单的开箱即用的解决scheme,但在这种情况下,两种环境都有所不同。 如果你真的有大量的代码,你可以考虑一个生成脚本来生成文件。