在node.js中加载并执行外部文件

时间:2013-07-12 10:40:26

标签: node.js

从另一个节点js文件运行节点js文件是否容易/可能? 例如,我有两个文件test1.js和test2.js。我想从test2.js执行test1.js文件。

3 个答案:

答案 0 :(得分:11)

您只需运行require('test2.js'),然后在导出的对象上调用函数。来自documentation on modules

Node有一个简单的模块加载系统。在节点中,文件和模块是一一对应的。例如,foo.js将模块circle.js加载到同一目录中。

foo.js的内容:

var circle = require('./circle.js');
console.log( 'The area of a circle of radius 4 is ' + circle.area(4));

circle.js的内容:

var PI = Math.PI;

exports.area = function (r) {
  return PI * r * r;
};

exports.circumference = function (r) {
  return 2 * PI * r;
};

模块circle.js导出了函数area()和circumference()。要导出对象,请添加到特殊导出对象。

请注意,exports是对module.exports的引用,使其仅适用于扩充。如果要导出单个项目(如构造函数),则需要直接使用module.exports。

function MyConstructor (opts) {
  //...
}

// BROKEN: Does not modify exports
exports = MyConstructor;

// exports the constructor properly
module.exports = MyConstructor;

模块本地的变量将是私有的。在此示例中,变量PI对circle.js是私有的。

模块系统在require(“module”)模块中实现。

答案 1 :(得分:9)

我认为完成你想要做的事情的更好方法是做我的其他答案所表明的。但是,如您的问题所示,要在命令行上执行命令,您需要使用child_process.exec。例如:

var exec = require('child_process').exec,
    child;

child = exec('node test2.js {{args}}',
  function (error, stdout, stderr) {
    console.log('stdout: ' + stdout);
    console.log('stderr: ' + stderr);
    if (error !== null) {
      console.log('exec error: ' + error);
    }
});

答案 2 :(得分:1)

这里有不同的场景 - 使用模块,以“正确的方式”加载它们 - 这是编写自己的代码时要走的路。

“随机”.js 文件怎么样,例如通过网页抓取下载? (如果这是执行它们的好主意超出了本答案的范围......)

好吧 - 如果您只对副作用感兴趣,您可以只需要它们:

test2.js

console.log('hello')

test1.js

console.log('about to execute')
require('./test2.js')
console.log('done')

注意 ./ 中的 require()。但是,如果您想运行它两次,这将不起作用:

test3.js

console.log('about to execute twice?')
require('./test2.js')
require('./test2.js')
console.log('surprise')

这表明, require 的工作方式类似于 Python import - 仅在文件尚未加载时才执行该文件。但是 - 可以绕过它并强制重新加载:How to remove module after "require" in node.js?

test4.js

console.log('about to execute twice!')
require('./test2.js')
delete require.cache[require.resolve('./test2.js')]
require('./test2.js')
console.log('NO surprise this time around')

与 Python import 的不同之处在于,除非已导出,否则您无法导入任何内容。因此,您必须更改 required 文件并使用 module.exports 执行某些操作。

如果您正在使用 node shell,还有一种替代方法:

test5.js

console.log('the const below is private?')
const x = 5

然后:

$ node
> .load test5.js
console.log('the const below is private?')
const x = 5

the const below is private?
undefined
> x
5

请注意,.load 中的文件名没有引号,也没有 ./。这在使用时有点冗长(与加载的脚本相呼应)。但这至少是一种处理脚本创建的值的方式。

最后的警告:始终小心你将要执行的操作!