如何在Node.js中包含一个不是模块的文件(制作模块)?

时间:2013-02-16 18:03:27

标签: node.js

目的:从像这样的普通旧JavaScript文件制作Node.js模块或Requirejs AMD模块:

var foo = function () {};

无法控制,我无法修改 foo.js

为什么foo是第一个if内的普通空对象?如何在我的模块中“包含”普通的JavaScript文件?档案mymodule.js

(function(root) {
    if(typeof exports === 'object') { // Node.js
        var foo = require('./foo');

        console.log(foo); // { }
    } else if (typeof define === 'function' && define.amd) { // RequireJS AMD
        define(['foo'], function () {
            return foo;
        });
    }
}());

2 个答案:

答案 0 :(得分:5)

加载了require的节点模块必须使用模块想要公开的所有内容填充exports对象。在您的情况下,当您需要该文件时,exports没有添加任何内容,因此它显示为空。所以简短的回答是你需要以某种方式修改foo.js的内容。如果您不能手动执行,则需要以编程方式执行此操作。为什么你无法控制它?

最简单的方法是,如果代码中需要foo.js,那么以编程方式包装内容,使其成为一个合适的模块。

// Add an 'exports' line to the end of the module before loading it.
var originalFoo = fs.readFileSync('./foo.js', 'utf8');
fs.writeFileSync('./foo-module.js', originalFoo + "\nexports.foo = foo;");
var foo = require('./foo-module.js');

答案 1 :(得分:0)

你可以尝试:

var fs = require('fs');

var foo = fs.readFileSync('foo.js', 'utf8') // Or request it somehow, just get it as a string

foo += "module.exports.foo = module.exports = foo;";

fs.writeFileSync('fooModule.js',foo);

var foo = require('./fooModule');

// foo() and foo.foo() are both the same

注意:这需要节点。