从另一个节点js文件运行节点js文件是否容易/可能? 例如,我有两个文件test1.js和test2.js。我想从test2.js执行test1.js文件。
答案 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
的不同之处在于,除非已导出,否则您无法导入任何内容。因此,您必须更改 require
d 文件并使用 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
中的文件名没有引号,也没有 ./
。这在使用时有点冗长(与加载的脚本相呼应)。但这至少是一种处理脚本创建的值的方式。
最后的警告:始终小心你将要执行的操作!