Author:Mr.柳上原
- 付出不亞于任何的努力
- 愿我們所有的努力,都不會被生活辜負
- 不忘初心,方得始終
Nodejs
node規(guī)范:
CommonJS
CommonJS是一種規(guī)范,NodeJS是這種規(guī)范的實現(xiàn)
AMD
A-ajax,是CommonJS規(guī)范的延伸,是一種異步的,需要對應的模塊支持(requirejs)
CMD
是CommonJS規(guī)范的延伸,模塊的定義和引入
控制臺的使用
cmd 打開控制臺(黑窗口)
cmd命令:
ls(查看當前文件夾內(nèi)的文件)
cd 文件名(進入此文件夾)
node命令:
node -v (Node版本號)
node 文件名(運行當前文件)
node ./文件名/文件名(運行當前文件夾的xxx文件夾下的xxx文件)
nodejs的使用
node的頂層對象是global(全局),不再是window
導入模塊
文件一.js:
let obj1 = require("./文件二");
./表示當前目錄,../表示上層目錄,/表示根目錄
注意點:導入的文件后綴為js的時候,.js可以不用寫,導入文件時,文件名前面必須加./,只有node官方的核心模塊和網(wǎng)上下載的模塊可以不用加./
定義跨文件的全局變量
文件一.js:
console.log(global.xxx); // 123
文件二.js:
global.xxx = 123;
把需要的屬性掛載到global下面
node會把每個導入的文件包裝到一個函數(shù)里function(){},所以導入的文件的數(shù)據(jù)都是局部數(shù)據(jù)
獲取跨文件的數(shù)據(jù)
文件一.js:
console.log(obj1); // {123, function (){}}
文件二.js:
module.exports = {}
module.exports里的值默認是對象,require導入的其實是文件里的module.exports的值
多個值的寫法一:擴展屬性或鍵值對
module.exports.num = 123;
module.exports.fn = function (){}
module.exports = {
num: 1,
fn: function (){}
}
多個值的寫法二:exports
node底層global.exports = module.exports,exports = module.exports
exports.num = 123;
exports.fn = function (){}
nodejs的執(zhí)行
文件一.js:
在控制臺里,進入當前js所在的文件夾
node 文件一 回車 // 后綴.js可以不用寫
nodejs把所有的行為抽象成為事件
nodejs用來執(zhí)行代碼的過程叫做事件循環(huán)
while(true){}
相當于node在執(zhí)行的開始生成了一個無限循環(huán)的while
node的異步事件處理:
setImmediate(() => { // setImmediate的回調(diào)函數(shù)是異步
console.log(1);
})
promise.resolve("2") // promise是同步
.then(res => { // then的回調(diào)函數(shù)是異步
console.log(res);
})
process.nextTick(() => { // process的回調(diào)函數(shù)是異步
consloe.log(3);
})
console.log(4); // 同步
js全部的代碼都是同步的,真正的異步是事件的回調(diào)函數(shù)
事件隊列
macro-task:script(全部的代碼),setInterval,setTimeout,setImmediate,I/O // setInterval和setTimeout優(yōu)先級相同,默認時間下誰先寫隨先執(zhí)行
micro-task:process.nextTick,promise(then) // 優(yōu)先級
第一步:script(全部的代碼)
第二步:執(zhí)行清空micro-task里的所有代碼
第三步:執(zhí)行macro-task的下一個代碼
第四步:再次執(zhí)行清空micro-task里的所有代碼
第五步:執(zhí)行macro-task的下下一個代碼
第六步:再再次執(zhí)行清空micro-task里的所有代碼
......