我知道如何在NodeJS中制作模块(这很简单)。但是,如果我想做一些在服务器和客户端环境中都可以使用的东西,那么能做到这一点吗?

假设您要创建一个Model类型(“类”)。假设您有一个名为Lib.define()的类创建函数。所以,你这样写:

Lib.Model = Lib.define({
    init: function() {
        // constructor...
    },

    save: function() {
        // saves the model.
    }
});


上面的代码将使Lib.Model成为代表可实例化类型的对象。但是,您将如何编写它使其也兼容NodeJS?如果尝试要求上述文件(require('Model.js')),则不会执行任何操作,因为没有分配给export。但是,如果我这样做了,那我应该只是在客户端环境中有一个无用的export对象吗?

除了要求可以简单地加载并解析JS并在全局工作以使上述代码在全局变量Model中产生Lib成员之外,还有其他方法可以做到这一点吗?

我现在正在研究vm,但不确定如何正确使用它。我确实有一个文件/类加载器,可以像Dojo一样解析路径并加载脚本。我是否应该在那里写一些在客户端上正常工作的逻辑(放置脚本标签),对于NodeJS,它只是读取文件内容和vm.runInThisContext(code)

最佳答案

JSHint仅检测是否存在exports符号,如果存在,则将其添加。他们的支票看起来像这样:

// Make JSHINT a Node module, if possible.
if (typeof exports == 'object' && exports)
    exports.JSHINT = JSHINT;


这会检查exports是否是对象,然后检查它是否不是null(通过&& exports)。似乎是一种合理的方法,尽管它当然特定于CommonJS module system(这是Node使用的方法)。

10-06 15:57
查看更多