<node.js學習筆記(1)>

liangsheng0111發表於2018-11-12

1.筆記

common.js是js的一套規範,彌補js中的一些缺陷
1.沒有模組系統 2.沒有標準介面 3.沒有標準庫
每一個js檔案都是一個獨立的模組.
node.js的頂層物件: global

建立兩個js檔案為01.js和02.js

2.模組的匯入匯出

  1. 模組的匯入關鍵詞 require
//在01.js中匯入02.js
const obj = require("./02.js"); //0依賴於02
/*
    1. 當前檔案下的檔案之前要加"./",表示尋找自定義的模組,不加則表示去node內建中找模組.
    2. 自定義的模組一定要加"./",核心模組和第三方依賴模組不需要加.
    3. 去上一層找 "../";
    4. js檔案的字尾.js可以省略
*/
複製程式碼

在終端執行

const obj = require("./02.js");
console.log(obj);
複製程式碼

node -./01 輸入{} 空物件

  1. 模組的匯出

第一種 : glabal

global.liang = {
    name : liang,
    age : 18
}
//此方法是唯一定義全域性變數的做法,但是幾乎不用,因為很少會去認為定義全域性變數
複製程式碼

第二種: module.exports
module.exprots預設值是{},所有模組都能用,也是全域性變數

let liang = "123";
module.exports.liang = liang;
複製程式碼

在終端執行
node ./01.js 輸出{liang : "123"}

簡寫:
global.exports 相當於exports
因為有一步操作: global.exports = module.exports
因為module.exports 是引用型別,所以傳的是地址,因此不能直接
exports = 123; //錯誤
正確的為:
exports.a = 100 //正確


2.事件的迴圈機制

事件佇列:
macro-task(巨集任務) : script(全部程式碼)、setTimeout/setInterval、setImmediate、..
micro-task(微任務) : process.nextTick、Promise中的then

例子
新建03.js檔案

process.nextTick(() => {
    console.log(1);
});

process.nextTick(() => {
    console.log(2);
});

new Promise(res => {
    res("12")
}).then(res => {
    console.log(res);
});

setImmediate(() => {
    console.log(3);
    process.nextTick(() => {
        console.log(4);
    });
});

setImmediate(() => {
    console.log(5);
    process.nextTick(() => {
        console.log(11);
    });
});

setTimeout(() => {
    console.log(7);
    process.nextTick(() => {
        console.log(10);
    });
}, 0);

process.nextTick(() => {
    console.log(8);
});

console.log(6);
複製程式碼

在終端執行
node ./03
結果: 6 1 2 8 12 7 10 3 5 4 11
分析:

  1. 第一步先在macro-task佇列中去script(全部程式碼)並分類 macro-task : setTimeout、setImmediate
    micro-task : process.nextTick、Promise中的then
  2. 第二步執行micro-task裡的process.nextTick、Promise中的then,執行完畢後,清空micro-task佇列;再從macro-task裡往後一塊setTimeout,若產生別的非同步就放到micro-task中執行,沒有就執行第三步
  3. 第三步再從macro-task往後setImmediate.

相關文章