7

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

2 回答 2

6

加载的节点模块必须使用模块想要公开的所有内容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');
于 2013-02-16T19:49:29.343 回答
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

注意:这需要节点。

于 2013-02-16T20:09:11.533 回答