第一章 node簡(jiǎn)介
語(yǔ)言和環(huán)境之間的關(guān)系
語(yǔ)言锭亏,是編寫代碼的語(yǔ)法規(guī)范官脓。
環(huán)境(平臺(tái))林螃,提供了執(zhí)行代碼的能力
語(yǔ)言必須在環(huán)境上運(yùn)行诚镰。
非阻塞式I/O模型
類似于同步和異步
Node環(huán)境中js組成部分
ECMAscript + 全局成員 + 核心API模塊
環(huán)境變量
環(huán)境變量的作用,在任意目錄下面都可以打開(環(huán)境變量/path配置的)程序
用戶變量和系統(tǒng)變量區(qū)別
用戶變量只有當(dāng)前用戶可以使用遍搞,系統(tǒng)變量所有用戶都可以使用
訪問核心成員直接使用 require('核心成員name')來調(diào)用
FS模塊
文件讀取會(huì)根據(jù)執(zhí)行Node命令時(shí)的目錄拼接
__dirname 表示當(dāng)前文件所處的文件路徑
path模塊
path.join 兼容性更好搀别,可以針對(duì)不同系統(tǒng)
JS的單線程和異步
js解析和執(zhí)行是單線程的,但是 宿主環(huán)境(瀏覽器或node)是多線程的
異步任務(wù)是由宿主環(huán)境開啟子線程完成尾抑,通過 事件驅(qū)動(dòng)歇父,回調(diào)函數(shù),隊(duì)列再愈,把完成的任務(wù)交給主線程執(zhí)行
js引擎一直在做一個(gè)工作榜苫,就是從任務(wù)隊(duì)列中提取任務(wù),放到主線程執(zhí)行
異步執(zhí)行任務(wù)的好處翎冲,提高耗時(shí)任務(wù)的效率垂睬,提高js解析引擎的工作效率
模塊化
模塊化為了解決文件之間的耦合
是一種開發(fā)思想
模塊化的好處
協(xié)作開發(fā),方便維護(hù)
CommonJs 規(guī)范
exports 定義模塊
module 模塊
require 請(qǐng)求模塊
在模塊中抗悍,上下文提供require()方法引入外部模塊驹饺。exports對(duì)象用于到處當(dāng)前模塊的方法或變量,并且他是唯一的到處的出口缴渊。在模塊中赏壹,還存在一個(gè)module對(duì)象,它代表模塊自身衔沼,exports是module的屬性蝌借,在node中昔瞧,一個(gè)文件就是一個(gè)模塊,講方法掛載在exports對(duì)象上作為屬性即可定義導(dǎo)出的方式
一個(gè)模塊作用域中菩佑,向外暴露私有成員是自晰,已 module.exports為準(zhǔn)
AMD 和 CMD 規(guī)范
commonJS模塊是同步加載的
AMD和CMD下模塊是異步加載的
1.AMD 對(duì)于依賴的模塊,ADM是提前執(zhí)行稍坯, 推崇依賴前置
2.CMD 延時(shí)執(zhí)行酬荞, CMD推崇 as lazy as possible 推崇依賴就近
ES6的模塊化:es6是在語(yǔ)言標(biāo)準(zhǔn)層面上,實(shí)現(xiàn)模塊功能瞧哟,完全可以取代CommonJS和AMD規(guī)范混巧,稱為瀏覽器和服務(wù)器通用的模塊解決方案;
npm (node package manager)
Node包管理工具
常用命令:
npm install pagageName --save-dev 開發(fā)階段需要的包绢涡,可縮寫為 -D
第二章 模塊機(jī)制
路徑分析和文件定位
- 文件擴(kuò)展名分析
require()在分析標(biāo)識(shí)符過程中,會(huì)出現(xiàn)不含文件擴(kuò)展名的情況遣疯,這種情況下雄可,Node會(huì)按照.js,.node, .json 的方式依次不足拓展名,依次嘗試缠犀,如果是.node/.json文件数苫,文件加上拓展名會(huì)提升速度
模塊編譯
- 編譯和執(zhí)行,是引入文件模塊的最后一個(gè)階段辨液,每一個(gè)編譯成功的模塊虐急,都會(huì)將其文件路徑作為索引緩存在Module._cache對(duì)象上,以提高二次引入的性能
js模塊的編譯
- 在編譯過程中滔迈,Node對(duì)獲取的js文件進(jìn)行了頭尾包裝止吁,在頭部添加( function(exports, require, module, __filename, __dirname){ \n, //end \n} ), 這樣在每個(gè)模塊文件之間都進(jìn)行了作用域隔離。
核心模塊
- Node的核心模塊在編譯成可執(zhí)行文件的過程中被編譯進(jìn)了二進(jìn)制文件燎悍。
- js核心模塊的編譯過程
- 1.轉(zhuǎn)存為C/C++代碼
- Node采用了v8附帶的js2c.py工具敬惦,將所有內(nèi)置的js代碼轉(zhuǎn)換為C++里的數(shù)組
- 2.編譯Js核心模塊
- 在核心模塊中,有些模塊全部由c/c++編寫谈山,有些模塊則由C/C++完成核心部分俄删,其他部分由js實(shí)現(xiàn)包裝或向外到處。
- 1.轉(zhuǎn)存為C/C++代碼
包 與 NPM
- 包結(jié)構(gòu)
- 包實(shí)際上是一個(gè)存檔文件奏路,完全符合CommonJs規(guī)范的包目錄應(yīng)該包含以下文件
- package.json:包描述文件
- bin:用于存放可執(zhí)行二進(jìn)制文件的目錄
- doc: 用于存放文檔的目錄
- test: 用于存放單元測(cè)試用例的代碼
- README.md: 對(duì)項(xiàng)目進(jìn)行描述
- 包實(shí)際上是一個(gè)存檔文件奏路,完全符合CommonJs規(guī)范的包目錄應(yīng)該包含以下文件
- 包描述文件與NPM
- CommonJs為package.json定義了以下必須的字段
- name,報(bào)名畴椰。規(guī)范定義由小寫字母和數(shù)字組成,可以包含.鸽粉、_和-斜脂,但不允許出現(xiàn)空格。包名必須唯一触机,以免對(duì)外公布時(shí)產(chǎn)生重名沖突的誤解秽褒。NPM建議不要再包名中附帶上node或js重復(fù)標(biāo)識(shí)它是JS或Node模塊
- description,包簡(jiǎn)介
- version, 版本號(hào)壶硅,常常用于一些版本控制的場(chǎng)合。
- keywords,關(guān)鍵詞數(shù)組销斟,NPM中主要用來做分類搜索
- maintainers,包維護(hù)者列表
- contributors,貢獻(xiàn)者列表
- bugs, 一個(gè)可以反饋bug的網(wǎng)頁(yè)地址或郵件地址
- licenses,當(dāng)前包所使用的許可證列表
- repositories,托管源代碼的位置列表
- dependencies,使用當(dāng)前包所需奧依賴的包列表
- homepage,當(dāng)前包的網(wǎng)站地址
- os,操作系統(tǒng)支持列表
- engine,支持的js引擎獵鳥
- directories,包目錄說明
- implements,實(shí)現(xiàn)規(guī)范的列表
- scripts,腳本說明對(duì)象
- 在包描述文件的規(guī)范中庐椒,NPM實(shí)際需要的字段有
- author,包作者
- bin,一些包作者希望包可以作為命令行工具使用
- main,模塊引入方法require()在引入包是,會(huì)優(yōu)先檢查這個(gè)字段蚂踊。
- devDependencies,一些模塊只在開發(fā)時(shí)需要依賴约谈。
- CommonJs為package.json定義了以下必須的字段
NPM常用功能
- 不熟悉NPM命令之前,可以直接執(zhí)行NPM查看到幫助引導(dǎo)說明
- 初始化包描述文件 npm init
Node.js 異步I/O
node自身 是多線程的
- JavaScript是單線程的犁钟,所以按常識(shí)理解為不能充分利用多核CPU棱诱。在Node中,除了JS是單線程外涝动,Node自身是多線程的迈勋,只是I/O線程使用的CUP較少。除了用戶代碼無法并行執(zhí)行外醋粟,所有的I/O(磁盤I/O和網(wǎng)絡(luò)I/O)則是可以并行起來的
非I/O的異步API
- Node中存在一些與I/O無關(guān)的異步API靡菇,分別是 setTimeout(),setInterval(), setImmediate
- 事件循環(huán)是異步實(shí)現(xiàn)的核心,它與瀏覽器中的執(zhí)行模型基本保持了一致米愿。
函數(shù)式編程
- 高階函數(shù)
- 高階函數(shù)可以把函數(shù)作為參數(shù)厦凤,或是將函數(shù)作為返回值的函數(shù)。