从另一个节点 js 文件运行节点 js 文件是否容易/可能?例如,我有两个文件 test1.js 和 test2.js。我想从 test2.js 执行 test1.js 文件。
3 回答
我认为完成你想做的事情的更好方法是按照我的其他答案建议的去做。但是要按照您的问题建议在命令行上执行命令,您想使用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() 和 circle()。要导出对象,请添加到特殊的导出对象。
请注意,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") 模块中实现。
这里有不同的场景——使用模块,以“正确的方式”加载它们——这是编写自己的代码时要走的路。
“随机”.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
- 仅在尚未加载文件时才执行文件。但是 - 可以绕过它并强制重新加载:如何在 node.js 中的“require”之后删除模块?
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
,也没有./
。这在使用时有些冗长(与加载的脚本相呼应)。但这至少是使用脚本创建的值的某种方式。
最后警告:永远小心你将要执行的事情!