如何从主node.js脚本运行多个node.js脚本?

12

我完全不了解node.js。我有两个node.js脚本需要运行。我知道可以分别运行它们,但我想创建一个运行这两个脚本的node.js脚本。主node.js脚本的代码应该是什么?


2
你可以将这两个脚本制作成模块,每个模块都导出一个主函数。然后在调用时,你可以使用require()将它们引入,并针对每个模块执行相应的主函数。 - jfriend00
2个回答

12

您只需要使用Node.js模块格式,并为每个您的Node.js脚本导出模块定义即可,例如:

//module1.js
var colors = require('colors');

function module1() {
  console.log('module1 started doing its job!'.red);

  setInterval(function () {
    console.log(('module1 timer:' + new Date().getTime()).red);
  }, 2000);
}

module.exports = module1;

//module2.js
var colors = require('colors');

function module2() {
  console.log('module2 started doing its job!'.blue);

  setTimeout(function () {

    setInterval(function () {
      console.log(('module2 timer:' + new Date().getTime()).blue);
    }, 2000);

  }, 1000);
}

module.exports = module2;

代码中的setTimeoutsetInterval仅用于展示两者是如何同时运行的。第一个模块被调用后,每2秒会在控制台上记录一些内容,而另一个模块则在等待1秒后开始以相同的频率记录。

我还使用了npm colors package,以便让每个模块的输出带有其特定的颜色(要先在命令中运行npm install colors)。在这个例子中,module1打印red日志,而module2则以blue的颜色打印日志。这只是为了向您展示如何在JavaScript和Node.js中轻松实现并发。

最后,在一个名为index.js的主Node.js脚本中运行这两个模块非常容易,只需要:

//index.js
var module1 = require('./module1'),
  module2 = require('./module2');

module1();
module2();

并像这样执行:

node ./index.js

然后你会得到这样的输出:

在此输入图片描述


如果一个模块被阻塞,那么所有的块都会被阻塞吗? - Hacketo
@Hacketo 快速的答案是肯定的。但问题在于NodeJS不提供多线程解决方案,而且NodeJS和JavaScript的主要并发模型都基于事件循环。setTimeout和setInterval都使用这个事件循环特性来防止我们在IO上被阻塞。更具体地说,你可以使用Web Workers来实现类似多线程的解决方案,但工人仍然都来自单个Node进程内部。 - Mehran Hatami
@Hacketo 在 JavaScript 和 NodeJS 的世界中,有许多众所周知的实践被认为是不好的,以防止我们在 IO 上阻塞。在 NodeJS 世界中,著名的同步 fs.readFile 就是其中之一,在浏览器中同步 XHR 请求也是另一个坏习惯,会阻塞整个线程。 - Mehran Hatami
如果对WebWorker解决方案感兴趣,请查看webworker-threads - Mehran Hatami

2

您可以使用child_process.spawn启动每个node.js脚本。或者,child_process.fork也可能适合您的需求。

Child Process文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接