如何在Node.js中包含一个不是模块的文件(使其成为模块)?

如何在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

目的:从普通的旧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;
        });
    }
}());

加载了
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的函数