首先,咱們來了解一下nodejs執行起來主要須要什麼node
commonjs是nodejs所用的模塊規範chrome
咱們知道在瀏覽器中運行的JavaScript包含BOM、DOM,其中window就是一個全局對象,可是nodejs並無BOM、DOM這些東西,全部也沒有window這個全局對象,取而代之的是global,一樣裏面也有一些屬性和方法供咱們使用。json
表明當前執行的進程,掛在global下面瀏覽器
爲了理解以上內容,咱們寫這樣一段代碼緩存
而後在命令行裏運行一下,輸入下面這行代碼進入調試模式(--inspect進入調試模式,-brk在開始的時候停下)bash
chrome://inspect
,回車後能夠看到下面的界面
注意,不能直接將exports變量指向一個值,由於這樣等於切斷了exports與module.exports的聯繫。函數
下面的寫法是無效的,由於exports再也不指向module.exports了。ui
exports = function(x) {console.log(x)};
複製代碼
下面的寫法hello函數是沒法對外輸出的,由於module.exports被從新賦值了。spa
exports.hello = function() {
return 'hello';
};
module.exports = 'Hello world';`
複製代碼
這意味着,若是一個模塊的對外接口,就是一個單一的值,不能使用exports輸出,只能使用module.exports輸出。命令行
舉個栗子,咱們先寫一個模塊
接着,咱們在另外一個文件裏引入這個模塊
因此,module只有在第一次被加載的時候會執行
這個定義有點難懂,不過不要緊,咱們仍是經過例子來理解
咱們先寫三個js文件
而後咱們執行main.js文件,執行步驟以下
首先引入了a.js文件,咱們去加載a.js文件
在a.js中第一行將x賦值 'a1',接着引入了b.js,咱們又去加載b.js文件
在b.js中第一行將x賦值 'b1',接着又去引入a.js文件,此時構成循環引用,所以只能引用a.js的部份內容,也就是exports.x='a1'
,又將x賦值爲'a1',所以首先打印出b.js a1
接着,a.js打印出來a.js b2
,由於b.js的已經執行完畢了,因此引用到的x爲b2
main.js文件中,因爲a.js和b.js都已經執行完畢,因此打印出main.js a2
,main.js b2
控制點最終打印