1.筆記
common.js是js的一套規範,彌補js中的一些缺陷
1.沒有模組系統 2.沒有標準介面 3.沒有標準庫
每一個js檔案都是一個獨立的模組.
node.js的頂層物件: global
建立兩個js檔案為01.js和02.js
2.模組的匯入匯出
- 模組的匯入關鍵詞 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
輸入{} 空物件
- 模組的匯出
第一種 : 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
分析:
- 第一步先在macro-task佇列中去script(全部程式碼)並分類
macro-task : setTimeout、setImmediate
micro-task : process.nextTick、Promise中的then - 第二步執行micro-task裡的process.nextTick、Promise中的then,執行完畢後,清空micro-task佇列;再從macro-task裡往後一塊setTimeout,若產生別的非同步就放到micro-task中執行,沒有就執行第三步
- 第三步再從macro-task往後setImmediate.