从另一个node js文件运行一个node js文件是否容易/可能?例如,我有两个文件test1.js和test2.js。我想从test2.js执行test1.js文件。
从另一个node js文件运行一个node js文件是否容易/可能?例如,我有两个文件test1.js和test2.js。我想从test2.js执行test1.js文件。
我认为实现你试图做的事情更好的方法是使用我另一个答案建议的方式。但根据你的问题,如果想要在命令行上执行命令,你需要使用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);
}
});
只需运行require('test2.js')
,然后调用导出对象上的函数。根据模块文档:
Node拥有简单的模块加载系统。在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对象中。function MyConstructor (opts) {
//...
}
// BROKEN: Does not modify exports
exports = MyConstructor;
// exports the constructor properly
module.exports = MyConstructor;
模块内部的变量将被视为私有变量。在这个例子中,变量 PI 是 circle.js 私有的。
模块系统是在 require("module") 模块中实现的。
// 允许我们直接运行或通过另一个node.js脚本运行 if (require.main === module) { // 我们正在直接运行 runTest() } else { // 我们是另一个脚本中的模块 module.exports = runTest }
- Julian Knightconsole.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')
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
文件并使用 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
中没有引号,也没有./
。这在使用时会有些冗长(回显已加载的脚本)。但至少这是一种操作脚本创建值的方式。
require('test2.js')
有何不同? - adrianp