深入淺出Node.js 筆記

第一章 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實現包裝或向外到處。

包 與 NPM

  • 包結構
    • 包實際上是一個存檔文件,完全符合CommonJs規范的包目錄應該包含以下文件
      • package.json:包描述文件
      • bin:用于存放可執行二進制文件的目錄
      • doc: 用于存放文檔的目錄
      • test: 用于存放單元測試用例的代碼
      • README.md: 對項目進行描述
  • 包描述文件與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,一些模塊只在開發時需要依賴。

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
  • 事件循環是異步實現的核心,它與瀏覽器中的執行模型基本保持了一致。

函數式編程

  • 高階函數
    • 高階函數可以把函數作為參數,或是將函數作為返回值的函數。
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 2. NODE模塊端實現 2.2 node模塊的實現 引入模塊: 路徑分析 文件定位 編譯執行 2.2.1 優先從...
    yozosann閱讀 2,153評論 0 0
  • 前言 js是從網頁小腳本演變過來的,至今,前端的js庫,也不像一個真正的模塊。前端js經歷了工具類庫、組件庫、前端...
    白昔月閱讀 3,306評論 2 11
  • Node.js是目前非常火熱的技術,但是它的誕生經歷卻很奇特。 眾所周知,在Netscape設計出JavaScri...
    Myselfyan閱讀 4,089評論 2 58
  • Node.js是目前非常火熱的技術,但是它的誕生經歷卻很奇特。 眾所周知,在Netscape設計出JavaScri...
    w_zhuan閱讀 3,639評論 2 41
  • 紅泥地的腳印, 連接城市的柏油路, 鄉村的繁星, 點亮街市的霓虹燈。 茅庵的月光, 映照青城的燈火輝煌。 黃河的濤...
    劉曉松閱讀 236評論 0 2