第一章 node簡介
語言和環境之間的關系
語言,是編寫代碼的語法規范。
環境(平臺),提供了執行代碼的能力
語言必須在環境上運行。
非阻塞式I/O模型
類似于同步和異步
Node環境中js組成部分
ECMAscript + 全局成員 + 核心API模塊
環境變量
環境變量的作用,在任意目錄下面都可以打開(環境變量/path配置的)程序
用戶變量和系統變量區別
用戶變量只有當前用戶可以使用,系統變量所有用戶都可以使用
訪問核心成員直接使用 require('核心成員name')來調用
FS模塊
文件讀取會根據執行Node命令時的目錄拼接
__dirname 表示當前文件所處的文件路徑
path模塊
path.join 兼容性更好,可以針對不同系統
JS的單線程和異步
js解析和執行是單線程的,但是 宿主環境(瀏覽器或node)是多線程的
異步任務是由宿主環境開啟子線程完成,通過 事件驅動,回調函數,隊列,把完成的任務交給主線程執行
js引擎一直在做一個工作,就是從任務隊列中提取任務,放到主線程執行
異步執行任務的好處,提高耗時任務的效率,提高js解析引擎的工作效率
模塊化
模塊化為了解決文件之間的耦合
是一種開發思想
模塊化的好處
協作開發,方便維護
CommonJs 規范
exports 定義模塊
module 模塊
require 請求模塊
在模塊中,上下文提供require()方法引入外部模塊。exports對象用于到處當前模塊的方法或變量,并且他是唯一的到處的出口。在模塊中,還存在一個module對象,它代表模塊自身,exports是module的屬性,在node中,一個文件就是一個模塊,講方法掛載在exports對象上作為屬性即可定義導出的方式
一個模塊作用域中,向外暴露私有成員是,已 module.exports為準
AMD 和 CMD 規范
commonJS模塊是同步加載的
AMD和CMD下模塊是異步加載的
1.AMD 對于依賴的模塊,ADM是提前執行, 推崇依賴前置
2.CMD 延時執行, CMD推崇 as lazy as possible 推崇依賴就近
ES6的模塊化:es6是在語言標準層面上,實現模塊功能,完全可以取代CommonJS和AMD規范,稱為瀏覽器和服務器通用的模塊解決方案;
npm (node package manager)
Node包管理工具
常用命令:
npm install pagageName --save-dev 開發階段需要的包,可縮寫為 -D
第二章 模塊機制
路徑分析和文件定位
- 文件擴展名分析
require()在分析標識符過程中,會出現不含文件擴展名的情況,這種情況下,Node會按照.js,.node, .json 的方式依次不足拓展名,依次嘗試,如果是.node/.json文件,文件加上拓展名會提升速度
模塊編譯
- 編譯和執行,是引入文件模塊的最后一個階段,每一個編譯成功的模塊,都會將其文件路徑作為索引緩存在Module._cache對象上,以提高二次引入的性能
js模塊的編譯
- 在編譯過程中,Node對獲取的js文件進行了頭尾包裝,在頭部添加( function(exports, require, module, __filename, __dirname){ \n, //end \n} ), 這樣在每個模塊文件之間都進行了作用域隔離。
核心模塊
- Node的核心模塊在編譯成可執行文件的過程中被編譯進了二進制文件。
- js核心模塊的編譯過程
- 1.轉存為C/C++代碼
- Node采用了v8附帶的js2c.py工具,將所有內置的js代碼轉換為C++里的數組
- 2.編譯Js核心模塊
- 在核心模塊中,有些模塊全部由c/c++編寫,有些模塊則由C/C++完成核心部分,其他部分由js實現包裝或向外到處。
- 1.轉存為C/C++代碼
包 與 NPM
- 包結構
- 包實際上是一個存檔文件,完全符合CommonJs規范的包目錄應該包含以下文件
- package.json:包描述文件
- bin:用于存放可執行二進制文件的目錄
- doc: 用于存放文檔的目錄
- test: 用于存放單元測試用例的代碼
- README.md: 對項目進行描述
- 包實際上是一個存檔文件,完全符合CommonJs規范的包目錄應該包含以下文件
- 包描述文件與NPM
- CommonJs為package.json定義了以下必須的字段
- name,報名。規范定義由小寫字母和數字組成,可以包含.、_和-,但不允許出現空格。包名必須唯一,以免對外公布時產生重名沖突的誤解。NPM建議不要再包名中附帶上node或js重復標識它是JS或Node模塊
- description,包簡介
- version, 版本號,常常用于一些版本控制的場合。
- keywords,關鍵詞數組,NPM中主要用來做分類搜索
- maintainers,包維護者列表
- contributors,貢獻者列表
- bugs, 一個可以反饋bug的網頁地址或郵件地址
- licenses,當前包所使用的許可證列表
- repositories,托管源代碼的位置列表
- dependencies,使用當前包所需奧依賴的包列表
- homepage,當前包的網站地址
- os,操作系統支持列表
- engine,支持的js引擎獵鳥
- directories,包目錄說明
- implements,實現規范的列表
- scripts,腳本說明對象
- 在包描述文件的規范中,NPM實際需要的字段有
- author,包作者
- bin,一些包作者希望包可以作為命令行工具使用
- main,模塊引入方法require()在引入包是,會優先檢查這個字段。
- devDependencies,一些模塊只在開發時需要依賴。
- CommonJs為package.json定義了以下必須的字段
NPM常用功能
- 不熟悉NPM命令之前,可以直接執行NPM查看到幫助引導說明
- 初始化包描述文件 npm init
Node.js 異步I/O
node自身 是多線程的
- JavaScript是單線程的,所以按常識理解為不能充分利用多核CPU。在Node中,除了JS是單線程外,Node自身是多線程的,只是I/O線程使用的CUP較少。除了用戶代碼無法并行執行外,所有的I/O(磁盤I/O和網絡I/O)則是可以并行起來的
非I/O的異步API
- Node中存在一些與I/O無關的異步API,分別是 setTimeout(),setInterval(), setImmediate
- 事件循環是異步實現的核心,它與瀏覽器中的執行模型基本保持了一致。
函數式編程
- 高階函數
- 高階函數可以把函數作為參數,或是將函數作為返回值的函數。