2014-12-19 304 views
6

我對node.js完全陌生。我有兩個我想運行的node.js腳本。我知道我可以單獨運行它們,但是我想創建一個運行這兩個腳本的node.js腳本。主節點的代碼應該是什麼?如何從主node.js腳本運行多個node.js腳本?

+2

您可以將這兩個腳本作爲每個導出一個主函數的模塊。你需要()'它們並且在它們每一個上執行一個主函數。 – jfriend00 2014-12-19 06:48:34

回答

5

所有你需要做的是使用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秒開始在控制檯中記錄一些內容,另一個模塊首先等待一秒鐘,然後每2秒開始一次。

我也使用npm colors package來允許每個模塊使用其特定顏色打印其輸出(以便能夠在命令中首先運行npm install colors)。在此示例中,module1打印red日誌,module2打印其blue中的日誌。所有這些僅僅是爲了向你展示如何在JavaScript和Node.js中輕鬆實現併發性。

在運行結束從主Node.js腳本,它在這裏被命名爲index.js這兩個模塊,你可以很容易做到:

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

module1(); 
module2(); 

並執行它想:

node ./index.js 

然後你將具有如下輸出:

enter image description here

+0

如果一個模塊塊然後全部阻塞? – Hacketo 2014-12-19 10:34:28

+0

@Hacketo快速回答是肯定的。但關鍵是NodeJS不提供多線程解決方案,而NodeJS和JavaScript中的主要併發模型基於[Event Loop](https://developer.mozilla.org/en-US/docs/Web/的JavaScript /指南/事件循環)。 setTimeout和setInterval都使用這個事件循環功能來防止我們阻塞IO。更具體地說,您可以使用Web Workers來實現類似於多線程方法的解決方案,但工作人員仍然都來自單個Node進程。 – 2014-12-19 11:03:57

+0

@Hacketo在JavaScript和NodeJS領域有許多衆所周知的做法,這些做法被認爲是不好的,以防止我們在IO上被阻塞。在NodeJS世界中,着名的同步fs.readFile就是其中之一,並且在瀏覽器中同步XHR請求是阻止整個線程的另一個壞習慣。 – 2014-12-19 11:06:48