目的:从像这样的普通旧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;
});
}
}());
答案 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
注意:这需要节点。