【问题标题】:Node.js and client sharing the same scriptsNode.js 和客户端共享相同的脚本
【发布时间】:2011-05-21 05:58:27
【问题描述】:

使用 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 仍然很新(甚至对我来说),所以几乎没有可靠的资源。有没有人知道如何解决这个问题?

【问题讨论】:

    标签: javascript scope client-server node.js


    【解决方案1】:

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

    解决方案是:

    1. 过度使用并使用RequireJS,这将使它在 Node.js 和浏览器中都可以工作。但是你需要在服务器端使用RequireJS格式,你还需要插入一个动态转换的脚本......

    2. 做你自己的加载器

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

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

    【讨论】:

    • 您可以编写自己的 require 函数并将其作为脚本加载到浏览器中,其工作方式与在 node.js 上的工作方式完全相同
    • 呃,不是,require 是同步的,你必须下载脚本才能做到这一点,这需要相当长的时间并阻止其他东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多