深入淺出Node.js 筆記

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

包 與 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)行描述
  • 包描述文件與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í)需要依賴约谈。

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ù)。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末育苟,一起剝皮案震驚了整個(gè)濱河市较鼓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌违柏,老刑警劉巖博烂,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異漱竖,居然都是意外死亡脖母,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門闲孤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谆级,“玉大人,你說我怎么就攤上這事讼积》收眨” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵勤众,是天一觀的道長(zhǎng)舆绎。 經(jīng)常有香客問我,道長(zhǎng)们颜,這世上最難降的妖魔是什么吕朵? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任猎醇,我火速辦了婚禮,結(jié)果婚禮上努溃,老公的妹妹穿的比我還像新娘硫嘶。我一直安慰自己,他們只是感情好梧税,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布沦疾。 她就那樣靜靜地躺著,像睡著了一般第队。 火紅的嫁衣襯著肌膚如雪哮塞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天凳谦,我揣著相機(jī)與錄音忆畅,去河邊找鬼。 笑死尸执,一個(gè)胖子當(dāng)著我的面吹牛家凯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播剔交,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肆饶,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼改衩!你這毒婦竟也來了岖常?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤葫督,失蹤者是張志新(化名)和其女友劉穎竭鞍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體橄镜,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡偎快,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洽胶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晒夹。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖姊氓,靈堂內(nèi)的尸體忽然破棺而出丐怯,到底是詐尸還是另有隱情,我是刑警寧澤翔横,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布读跷,位于F島的核電站,受9級(jí)特大地震影響禾唁,放射性物質(zhì)發(fā)生泄漏效览。R本人自食惡果不足惜无切,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丐枉。 院中可真熱鬧哆键,春花似錦、人聲如沸矛洞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)沼本。三九已至噩峦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抽兆,已是汗流浹背识补。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辫红,地道東北人凭涂。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像贴妻,于是被迫代替她去往敵國(guó)和親切油。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 2. NODE模塊端實(shí)現(xiàn) 2.2 node模塊的實(shí)現(xiàn) 引入模塊: 路徑分析 文件定位 編譯執(zhí)行 2.2.1 優(yōu)先從...
    yozosann閱讀 2,133評(píng)論 0 0
  • 前言 js是從網(wǎng)頁(yè)小腳本演變過來的名惩,至今澎胡,前端的js庫(kù),也不像一個(gè)真正的模塊娩鹉。前端js經(jīng)歷了工具類庫(kù)攻谁、組件庫(kù)、前端...
    白昔月閱讀 3,283評(píng)論 2 11
  • Node.js是目前非惩溆瑁火熱的技術(shù)戚宦,但是它的誕生經(jīng)歷卻很奇特。 眾所周知锈嫩,在Netscape設(shè)計(jì)出JavaScri...
    Myselfyan閱讀 4,072評(píng)論 2 58
  • Node.js是目前非呈苈ィ火熱的技術(shù),但是它的誕生經(jīng)歷卻很奇特呼寸。 眾所周知艳汽,在Netscape設(shè)計(jì)出JavaScri...
    w_zhuan閱讀 3,616評(píng)論 2 41
  • 紅泥地的腳印, 連接城市的柏油路等舔, 鄉(xiāng)村的繁星骚灸, 點(diǎn)亮街市的霓虹燈。 茅庵的月光慌植, 映照青城的燈火輝煌甚牲。 黃河的濤...
    劉曉松閱讀 225評(píng)論 0 2