如何在Node.js中包含一个不是模块的文件(使其成为模块)?
目的:从普通的旧JavaScript文件制作Node.js模块或Requirejs AMD模块,如下所示:如何在Node.js中包含一个不是模块的文件(使其成为模块)?,node.js,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 = requi
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;
});
}
}());
加载了
require
的节点模块必须用模块想要公开的所有内容填充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');
你可以试试:
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
注意:这需要节点。我很困惑,你想用代码的
RequireJS
部分做什么?我用read+eval解决了这个问题。不需要写回文件。我无法编辑foo.js,因为它是一个依赖项(自动下载)。这节省了我数小时的工作-我的目标是通过加载所有需要的全局变量来调试一个特定的mocha测试,我可以通过调用我想要调试的测试来解决这个问题,并将所需的文件路径数组提供给一个调用eval的函数