摘要:基礎篇整合最近有朋友也想學習相關方面的知識,如果你是后端想接近前端,作為一門跑在服務端的語言從這里入門再好不過了。事件驅動機制是通過內部單線程高效率地維護事件循環隊列來實現的,沒有多線程的資源占用和上下文的切換。
nodeJs 基礎篇整合
最近有朋友也想學習nodeJs相關方面的知識,如果你是后端想接近前端,node作為一門跑在服務端的JS語言從這里入門再好不過了。如果你正好喜歡前端,想走的更高,走的更遠。nodeJs同樣也是不二之選。node的地位雖然在實戰項目中運用的不是很多,但也不能否認它在處理高并發,服務端渲染,前端自動化方面的優勢。總而言之。如果你是個自學能力很強的人。請來到這里學習。讓我們一起去打開node的世界,游走于前端與服務端之間。你如果能掌握如下知識那么你的node基礎功底將會十分強大。
簡介:
Node.js 就是運行在服務端的 JavaScript。
Node.js 是一個基于Chrome JavaScript 運行時建立的一個平臺。
Node.js是一個事件驅動I/O服務端JavaScript環境,基于Google的V8引擎,V8引擎執行Javascript的速度非常快,性能非常好。
底層選擇用c++和v8來實現的
優勢:1. RESTful API
這是NodeJS最理想的應用場景,可以處理數萬條連接,本身沒有太多的邏輯,只需要請求API,組織數據進行返回即可。它本質上只是從某個數據庫中查找一些值并將它們組成一個響應。由于響應是少量文本,入站請求也是少量的文本,因此流量不高,一臺機器甚至也可以處理最繁忙的公司的API需求。
統一Web應用的UI層
目前MVC的架構,在某種意義上來說,Web開發有兩個UI層,一個是在瀏覽器里面我們最終看到的,另一個在server端,負責生成和拼接頁面。
不討論這種架構是好是壞,但是有另外一種實踐,面向服務的架構,更好的做前后端的依賴分離。如果所有的關鍵業務邏輯都封裝成REST調用,就意味著在上層只需要考慮如何用這些REST接口構建具體的應用。那些后端程序員們根本不操心具體數據是如何從一個頁面傳遞到另一個頁面的,他們也不用管用戶數據更新是通過Ajax異步獲取的還是通過刷新頁面。
大量Ajax請求的應用
例如個性化應用,每個用戶看到的頁面都不一樣,緩存失效,需要在頁面加載的時候發起Ajax請求,NodeJS能響應大量的并發請求。
4.Javascript在nosql的應用
Javascript在nosql數據庫中大量應用,使得數據存儲和管理使用的都是javascript語句,與web應用有了天然的結合;比如mongoDB;
5.Javascripte運行從前臺到后臺
一門語言從前臺后臺,減少了開發客戶端和服務端時,所需的語言切換,使得數據交互效率提升
特點:1.單線程:
Nodejs跟Nginx一樣都是單線程為基礎的,這里的單線程指主線程為單線程,所有的阻塞的全部放入一個線程池中,然后主線程通過隊列的方式跟線程池來協作。我們寫js部分不需要關心線程的問題,簡單了解就可以了,主要由一堆callback回調構成的,然后主線程在循環過在適當場合調用。
2.事件驅動 ?
首先,解釋下“事件驅動”這個概念。所謂事件驅動,是指在持續事務管理過程中,進行決策的一種策略,即跟隨當前時間點上出現的事件,調動可用資源,執行相關任務,使不斷出現的問題得以解決,防止事務堆積。 ? Nodejs設計思想中以事件驅動為核心,事件驅動在于異步回調,他提供的大多數api都是基于事件的、異步的風格。而事件驅動的優勢在于充分利用系統資源,執行代碼無須阻塞等待某種操作完成,有限的資源用于其他任務。事件驅動機制是通過內部單線程高效率地維護事件循環隊列來實現的,沒有多線程的資源占用和上下文的切換。
3.異步、非阻塞I/O
Nodejs提供的很多模塊中都是異步執行的。比如,文件操作的函數。 一個異步I/O的大致流程:
1.發起I/O調用 :
①用戶通過js代碼調用nodejs的核心模塊,將回調函數和參數傳入核心模塊
②將回調函數和參數封裝成
2.執行回調:
①操作完成將結果儲存到請求對象的result屬性上,并發出完成通知。
②循環事件,如果有未完成的,就在進入對象請求I/O觀察者隊列,之后當做事件處理;
缺點:1.不適合CPU密集型應用;CPU密集型應用給Node帶來的挑戰主要是:由于JavaScript單線程的原因,如果有長時間運行的計算(比如大循環),將會導致CPU時間片不能釋放,使得后續I/O無法發起;
2.只支持單核CPU,不能充分利用CPU
3.可靠性低,一旦代碼某個環節崩潰,整個系統都崩潰
4.開源組件庫質量參差不齊,更新快,向下不兼容
安裝:(一)官網下載:
1.下載地址:http://nodejs.cn/download/ 2.根據自己的系統進行鏡像的下載: 3.下載的為最新的node版本,當前下載的為10.8.0
Nvm管理node:
nvm可以方便的在同一臺設備上進行多個node版本之間切換
1.先下載安裝nvm,下載地址:https://github.com/coreybutle...,選擇nvm-setup壓縮文件,解壓后安裝;
2.安裝過程中出現,選擇nvm的安裝目錄
3.選擇node的安裝目錄
4.配置環境變量
5.查看nvm是否安裝成功:
Nvm -v
6.安裝nodejs
?使用nvm install
Nvm install 10.8.0
7.使用下載的nodejs
?執行nvm use
Nvm use 10.8.0
8.當有多個nodejs版本時,設置默認的node版本
nvm alias default v10.8.0
9.查看當前所安裝的node版本
Nvm list
全局安裝和局部安裝:
全局安裝:
全局安裝方式是鍵入命令:npm install gulp -g 或?npm install gulp?--global,其中參數-g的含義是代表安裝到全局環境里面,包安裝在Node安裝目錄下的node_modules文件夾中,一般在 Users用戶名AppDataRoaming 目錄下,可以使用npm root -g查看全局安裝目錄。
局部安裝(本地安裝)
本地安裝方式是鍵入命令:npm install gulp 或?npm install gulp --save-dev等,其中參數--save-dev的含義是代表把你的安裝包信息寫入package.json文件的devDependencies字段中,包安裝在指定項目的node_modules文件夾下。
局部安裝的意義:
1、可以實現多個項目中使用不同版本的包;
2、可以在不使用全局變量NODE_PATH的情況下,進行包的引入;
Node運行
終端運行和外部文件運行
Nodejs的模塊(commonjs規范)
(一)模塊化
1.誕生背景:
全局變量的災難:
函數命令的沖突:
對于公用方法的封裝會出現很多命名沖突,尤其在多人開發的情況下
依賴關系的管理:
比如b.js依賴a.js,在文件引入的過程中,就要先引入b.js
最早的時候在解決上述部分問題時的解決方案是:使用匿名的自執行函數
2.模塊需要解決的問題:
如何安全的包裝一個模塊的代碼?(不污染模塊外的任何代碼)
如何唯一標識一個模塊?
如何優雅的把模塊的API暴漏出去?(不能增加全局變量)
如何方便的使用所依賴的模塊?
(二)Commonjs
1.規范:
1)模塊的標識應遵循的規則(書寫規范)
定義,標識,引用
2)定義全局函數require,通過傳入模塊標識來引入其他模塊,執行的結果即為別的模塊暴漏出來的API
3)如果被require函數引入的模塊中也包含依賴,那么依次加載這些依賴
4)如果引入模塊失敗,那么require函數應該報一個異常
5)模塊通過變量exports來向往暴漏API,exports只能是一個對象,暴漏的API須作為此對象的屬性。
模塊的簡單使用:
//math.js exports.add = function() { var sum = 0, i = 0, args = arguments, l = args.length; while (i < l) { sum += args[i++]; } return sum; }; //increment.js var add = require("math").add; exports.increment = function(val) { return add(val, 1); }; //program.js var inc = require("increment").increment; var a = 1; inc(a); // 2
模塊的定義
1)全局有一個module變量,用來定義模塊
2)通過module.declare方法來定義一個模塊(一般不通過此方式進行模塊的定義)
3)module.declare方法只接收一個參數,那就是模塊的factory,次factory可以是函數也可以是對象,如果是對象,那么模塊輸出就是此對象。
4)模塊的factory函數傳入三個參數:require,exports,module,用來引入其他依賴和導出本模塊API
如果factory函數最后明確寫有return數據(js函數中不寫return默認返回undefined),那么return的內容即為模塊的輸出。
不常用: module.declare(function(require, exports, module) { exports.foo = "bar"; }); module.declare(function(require) { return { foo: "bar" }; }); 常用: module.exports={}
odule.exports和exports的區別:
1)module.exports 初始值為一個空對象 {}
2)exports 是指向的 module.exports 的引用
3)require() 返回的是 module.exports 而不是 exports
4)關系為var exports = module.exports={};
如:
module.exports可以賦值一個對象
module.exports={}
exports不可以賦值一個對象,只能添加方法或者屬性
exports.add=function(){
}
5.模塊引用
require函數的基本功能是,讀入并執行一個JavaScript文件,然后返回該模塊的exports對象。當我們用require()獲取module時,Node會根據module.id找到對應的module,并返回module. exports,這樣就實現了模塊的輸出。
require函數使用一個參數,參數值可以帶有完整路徑的模塊的文件名,也可以為模塊名。
假如,有三個文件:一個是a.js(存放路徑:home/a.js),一個是b.js(存放路徑:home/user/b.js), 一個是c.js(存放路徑:home/user/c.js)。我們在a.js文件中引用三個模塊,實例代碼如下:
var httpModule=require("HTTP");//用 “模塊名”加載服務模塊http
var b=require("./user/b");//用“相對路徑”加載文件b.js
var b=require("../ home/user/c");//用“絕對路徑”加載文件c.js
?
6.?模塊標識
模塊標識就是傳遞給require方法的參數,必須符合小駝峰命名的字符串,或者以.、..開頭的相對路徑,或者絕對路徑,默認文件名后綴.js。在Node實現中,正是基于這樣一個標識符進行模塊查找的,如果沒有發現指定模塊會報錯。
根據參數的不同格式,require命令去不同路徑尋找模塊文件。加載規則如下:
(1)如果參數字符串以“/”開頭,則表示加載的是一個位于絕對路徑的模塊文件。比如,require("/home/marco/foo.js")將加載/home/marco/foo.js。
(2)如果參數字符串以“./”開頭,則表示加載的是一個位于相對路徑(跟當前執行腳本的位置相比)的模塊文件。比如,require("./circle")將加載當前腳本同一目錄的circle.js。
(3)如果參數字符串不以“./“或”/“開頭,則表示加載的是一個默認提供的核心模塊(位于Node的系統安裝目錄中),或者一個位于各級node_modules目錄的已安裝模塊(全局安裝或局部安裝)。
舉例來說,腳本/home/user/projects/foo.js執行了require("bar.js")命令,Node會依次搜索以下文件。
/usr/local/lib/node/bar.js
/home/user/projects/node_modules/bar.js
/home/user/node_modules/bar.js
/home/node_modules/bar.js
/node_modules/bar.js
這樣設計的目的是,使得不同的模塊可以將所依賴的模塊本地化。
(4)如果參數字符串不以“./“或”/“開頭,而且是一個路徑,比如require("example-module/path/to/file"),則將先找到example-module的位置,然后再以它為參數,找到后續路徑。
(5)如果指定的模塊文件沒有發現,Node會嘗試為文件名添加.js、.json、.node后,再去搜索。.js件會以文本格式的JavaScript腳本文件解析,.json文件會以JSON格式的文本文件解析,.node文件會以編譯后的二進制文件解析。
(6)如果想得到require命令加載的確切文件名,使用require.resolve()方法。此方法會返回一個完整的路徑,并且還會對文件的是否存在做檢測
7.二進制模塊
雖然一般我們使用JS編寫模塊,但NodeJS也支持使用C/C++編寫二進制模塊。編譯好的二進制模塊除了文件擴展名是.node外,和JS模塊的使用方式相同。雖然二進制模塊能使用操作系統提供的所有功能,擁有無限的潛能,但對于前端同學而言編寫過于困難,并且難以跨平臺使用,因此不在本教程的覆蓋范圍內。
Node模塊的分類:
1.內置模塊(核心模塊)
核心模塊指的是那些被編譯進Node的二進制模塊,它們被預置在Node中,提供Node的基本功能,如fs、http、https等。核心模塊使用C/C++實現,外部使用JS封裝。要加載核心模塊,直接在代碼文件中使用require() 方法即可,參數為模塊名稱,Node將自動從核心模塊文件夾中進行加載。
2.第三方模塊
Node使用NPM (Node Package Manager) 安裝第三方模塊,NPM會將模塊安裝到應用根目錄下的node_modules文件夾中,然后就可以像使用核心模塊一樣使用第三方模塊了。在進行模塊加載時,Node會先在核心模塊文件夾中進行搜索,然后再到node_modules文件夾中進行搜索。
3.文件模塊
上述兩種方式都是從當前目錄獲取模塊文件,實際上,可以將文件放在任何位置,然后在加載模塊文件時加上路徑即可。可以使用以./ 開頭的相對路徑和以/ 或C: 之類的盤符開頭的絕對路徑。
4.文件夾模塊
從文件夾中加載模塊,Node首先會在該文件夾中搜索package.json文件。如果存在,Node便嘗試解析它,并加載main屬性指定的模塊文件。如果package.json不存在,或者沒有定義main屬性,Node默認加載該文件夾下的index.js文件。 如從項目根目錄下的 modules/hello 文件夾加載模塊: var hello = require("./modules/hello");
package.json格式如下:
{ "name": "hello", "version": "1.0.0", "main": "./hello.js" }
此時,Node會去加載./modules/hello/hello.js 文件。
如果目錄里沒有?package.json?文件,則 Node.js 就會試圖加載目錄下的?index.js?或?index.node?文件。 例如,如果上面的例子中沒有?package.json?文件,則?require("./modules/hello")?會試圖加載:
./modules/hello /index.js
./modules/hello /index.node
四、Npm與package.json詳解
(一)npm簡介:
世界上最大的軟件注冊表,每星期大約有 30 億次的下載量,包含超過 600000 個?包(package)?(即,代碼模塊)。來自各大洲的開源軟件開發者使用 npm 互相分享和借鑒。包的結構使您能夠輕松跟蹤依賴項和版本。
npm 是一個包管理器,它讓 JavaScript 開發者分享、復用代碼更方便(有點 maven 的感覺)。 在程序開發中我們常常需要依賴別人提供的框架,寫 JS 也不例外。這些可以重復的框架代碼被稱作包(package)或者模塊(module),一個包可以是一個文件夾里放著幾個文件,同時有一個叫做 package.json 的文件。 一個網站里通常有幾十甚至上百個 package,分散在各處,通常會將這些包按照各自的功能進行劃分,但是如果重復造一些輪子,不如上傳到一個公共平臺,讓更多的人一起使用、參與這個特定功能的模塊。 而 npm 的作用就是讓我們發布、下載一些 JS 輪子更加方便。
(二)npm構成:
npm 由三個獨立的部分組成:
網站:是開發者查找包(package)、設置參數以及管理 npm 使用體驗的主要途徑。
注冊表(registry):是一個巨大的數據庫,保存了每個包(package)的信息
命令行工具 (CLI):通過命令行或終端運行。開發者通過 CLI 與 npm 打交道
(三)npm更新:
查看版本:nvm -V
更新版本:nvm install npm@latest -g
(四)npm更改全局目錄:
查看npm全局目錄:
npm root -g?
修改全局包位置?:
npm config set prefix "目標目錄"
查看修改結果?
npm config get prefix或npm root -g
(五)package.json
A.作用:
1.作為一個描述文件,描述了你的項目依賴哪些包
2.允許我們使用 “語義化版本規則”(后面介紹)指明你項目依賴包的版本
3.讓你的構建更好地與其他開發者分享,便于重復使用
4.如果項目構架進行復制時,可以直接使用npm install,直接根據package.json的配置進行包的下載
5.作為項目的描述文件,對整個項目進行描述。
B.創建:
npm init 即可在當前目錄創建一個 package.json 文件:
C.內容:
基本配置:
1.name:項目的名字
2.version:項目的版本
3.description:描述信息,有助于搜索
4.main: 入口文件,一般都是 index.js
5.scripts:支持的腳本,默認是一個空的 test
6.keywords:關鍵字,有助于在人們使用 npm search 搜索時發現你的項目
7.author:作者信息
8.license:默認是 MIT
9.bugs:當前項目的一些錯誤信息,如果有的話
注:
如果 package.json 中沒有 description 信息,npm 使用項目中的 README.md 的第一行作為描述信息。這個描述信息有助于別人搜索你的項目,因此建議好好寫 description 信息。
依賴包配置:
1.dependencies:在生產環境中需要用到的依賴
2.devDependencies:在開發、測試環境中用到的依賴
(六)package-lock.json文件
npm5之后安裝文件之后會多出一個package-lock.json的文件,它的作用是:
1.安裝之后鎖定包的版本,手動更改package.json文件安裝將不會更新包,想要更新只能使用 npm install xxx@1.0.0 --save 這種方式來進行版本更新package-lock.json 文件才可以
2.加快了npm install 的速度,因為 package-lock.json 文件中已經記錄了整個 node_modules 文件夾的樹狀結構,甚至連模塊的下載地址都記錄了,再重新安裝的時候只需要直接下載文件即可
(七)npm的包版本規范和package.json的使用規范
npm版本規范:
如果一個項目打算與別人分享,應該從 1.0.0 版本開始。以后要升級版本應該遵循以下標準:
補丁版本:解決了 Bug 或者一些較小的更改,增加最后一位數字,比如 1.0.1
小版本:增加了新特性,同時不會影響之前的版本,增加中間一位數字,比如 1.1.0
大版本:大改版,無法兼容之前的,增加第一位數字,比如 2.0.0
Package.json的版本書寫:
我們可以在 package.json 文件中寫明我們可以接受這個包的更新程度(假設當前依賴的是 1.0.4 版本):
如果只打算接受補丁版本的更新(也就是最后一位的改變),就可以這么寫:
1.0
1.0.x
~1.0.4
如果接受小版本的更新(第二位的改變),就可以這么寫:
1
1.x
^1.0.4
如果可以接受大版本的更新(自然接受小版本和補丁版本的改變),就可以這么寫:
x
(八)npm下載包
安裝方式:
如果你只是想在當前項目里用 require() 加載使用,那你可以安裝到本地 npm install 默認就是安裝到本地的
如果你想要在命令行里直接使用,比如 grunt CLI,就需要安裝到全局了
如果在你的項目里有 package.json 文件,運行 npm install 后它會查找文件中列出的依賴包,然后下載符合語義化版本規則的版本。 npm install 默認會安裝 package.json 中 dependencies 和 devDependencies 里的所有模塊。 如果想只安裝 dependencies 中的內容,可以使用 --production 字段:
npm install --production
1.本地安裝:
1)安裝指定版本:
$ npm install sax@latest :最新版本
$ npm install sax@0.1.1 :指定版本
$ npm install sax@" >=0.1.0 <0.2.0” :安裝0.1.0到0.2.0版本
注:
有時下載會報錯:npm install error saveError ENOENT: no such file or directory, 解決辦法: - 在目錄下執行 npm init 創建 package.json,輸入初始化信息 - 然后再執行下載命令
2)安裝參數 --save 和 --save -dev
添加依賴時我們可以手動修改 package.json 文件,添加或者修改 dependencies devDependencies 中的內容即可。
另一種更酷的方式是用命令行,在使用 npm install 時增加 --save 或者 --save -dev 后綴:
npm install --save 表示將這個包名及對應的版本添加到 package.json的 dependencies
npm install --save-dev 表示將這個包名及對應的版本添加到 package.json的 devDependencies
3)更新本地package
有時候我們想知道依賴的包是否有新版本,可以使用 npm outdated 查看,如果發現有的包有新版本,就可以使用 npm update 更新它,或者直接 npm update 更新所有:
npm update 的工作過程是這樣的:
先到遠程倉庫查詢最新版本
然后對比本地版本,如果本地版本不存在,或者遠程版本較新
查看 package.json 中對應的語義版本規則 (一定注意規則)
如果當前新版本符合語義規則,就更新,否則不更新
4)卸載本地 package
卸載一個本地 package 很簡單,npm uninstall
2.全局安裝
1)安裝
npm install -g
2)權限處理(非windows處理)
在全局安裝時可能會遇到 EACCES 權限問題,解決辦法辦法有如下 2種:
1.sudo npm install -g jshint,使用 sudo 簡單粗暴,但是治標不治本
2.修改 npm 全局默認目錄的權限 先獲取 npm 全局目錄:npm config get prefix,一般都是 /usr/local; 然后修改這個目錄權限為當前用戶:
sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
3)更新全局包
想知道哪些包需要更新,可以使用 npm outdated -g --depth=0,然后使用 npm update -g 更新指定的包;
要更新所有全局包,可以使用 npm update -g,可以發現對比本地的,只是多了個 -g。
4)卸載全局包
npm uninstall -g
3.其他命令
Npm run: 運行 package.json 中 scripts 指定的腳本
npm install from github: 從github下載資源
npm install git://github.com/package/path.git ;
npm info:npm info 可以查看指定包的信息:
(九)Npm發布包:
1.注冊:
npm網站地址:https://www.npmjs.com/
npm網站注冊地址:https://www.npmjs.com/signup
2.命令行登錄
Windows直接cmd到命令行:
輸入以下命令,會提示輸入用戶名、密碼、郵箱,這些都是注冊時填寫過的。
npm login
3.創建項目
創建一個testxxxxx文件夾,cd到testxxxxx文件夾中,然后下載基礎配置文件:
1
2 //輸入以下命令,會提示配置包的相關信息,名稱版本等等,都是包的基本配置信息
npm init
配置完畢開始寫自己的包內代碼:?
創建一個index.js文件,文件內的代碼如下,直接輸出123456789
module.exports = 123456789;
4.發布:
開始命令行發布包,命令如下:npm publish testxxxxx
發布完畢,在npm網站上搜索,就可以搜索到自己剛剛發布的包了。
5.驗證下載:
正常下載好了,沒有問題了,搞定。
6.撤銷發布
接下來說明一下怎么撤銷自己發布的版本。這只是一個測試的包,最好當然還是撤銷下來:
刪除要用force強制刪除。超過24小時就不能刪除了。自己把握好時間。
npm --force unpublish testxxxxx
(十)Npm修改鏡像源:
由于npm的源在國外,所以國內用戶使用起來各種不方便。部分國內優秀的npm鏡像資源,國內用戶可以選擇使用
1.淘寶npm鏡像
搜索地址:http://npm.taobao.org/
registry地址:http://registry.npm.taobao.org/
2.cnpmjs鏡像
搜索地址:http://cnpmjs.org/ registry
地址:http://r.cnpmjs.org/
3.如何使用
有很多方法來配置npm的registry地址,下面根據不同情境列出幾種比較常用的方法。以淘寶npm鏡像舉例:
1)臨時使用
npm --registry https://registry.npm.taobao.org
2)持久使用(推薦使用)
npm config set registry https://registry.npm.taobao.org
配置后可通過下面方式來驗證是否成功 npm config get registry
3)通過cnpm使用 (也可以使用cnpm) (常用)
npm install -g cnpm --registry=https://registry.npm.taobao.org
4.恢復npm源鏡像:
如果將npm的鏡像地址改變后,在發布包時,應該將鏡像改回:
npm config set registry https://registry.npmjs.org/
五、yarn的使用:
1.簡介:
Yarn是由Facebook、Google、Exponent 和 Tilde 聯合推出了一個新的 JS 包管理工具 Yarn 是為了彌補 npm 的一些缺陷而出現的。
2.Npm的缺陷:
1)npm install的時候巨慢。特別是新的項目拉下來要等半天,刪除node_modules,重新install的時候依舊如此。
2)同一個項目,安裝的時候無法保持一致性。由于package.json文件中版本號的特點,下面三個版本號在安裝的時候代表不同的含義。
"5.0.3",
"~5.0.3",
"^5.0.3"
“5.0.3”表示安裝指定的5.0.3版本,“~5.0.3”表示安裝5.0.X中最新的版本,“^5.0.3”表示安裝5.X.X中最新的版本。這就麻煩了,常常會出現同一個項目,有的同事是OK的,有的同事會由于安裝的版本不一致出現bug。
3)安裝的時候,包會在同一時間下載和安裝,中途某個時候,一個包拋出了一個錯誤,但是npm會繼續下載和安裝包。因為npm會把所有的日志輸出到終端,有關錯誤包的錯誤信息就會在一大堆npm打印的警告中丟失掉,并且你甚至永遠不會注意到實際發生的錯誤。
3.Yarn的優點
1)速度快 。速度快主要來自以下兩個方面:
a)并行安裝:無論 npm 還是 Yarn 在執行包的安裝時,都會執行一系列任務。npm 是按照隊列執行每個 package,也就是說必須要等到當前 package 安裝完成之后,才能繼續后面的安裝。而 Yarn 是同步執行所有任務,提高了性能。
b)離線模式:如果之前已經安裝過一個軟件包,用Yarn再次安裝時之間從緩存中獲取,就不用像npm那樣再從網絡下載了。
2)安裝版本統一:為了防止拉取到不同的版本,Yarn 有一個鎖定文件 (lock file) 記錄了被確切安裝上的模塊的版本號。每次只要新增了一個模塊,Yarn 就會創建(或更新)yarn.lock 這個文件。這么做就保證了,每一次拉取同一個項目依賴時,使用的都是一樣的模塊版本。npm 其實也有辦法實現處處使用相同版本的 packages,但需要開發者執行 npm shrinkwrap 命令。這個命令將會生成一個鎖定文件,在執行 npm install 的時候,該鎖定文件會先被讀取,和 Yarn 讀取 yarn.lock 文件一個道理。npm 和 Yarn 兩者的不同之處在于,Yarn 默認會生成這樣的鎖定文件,而 npm 要通過 shrinkwrap 命令生成 npm-shrinkwrap.json 文件,只有當這個文件存在的時候,packages 版本信息才會被記錄和更新。
3)更簡潔的輸出:npm 的輸出信息比較冗長。在執行 npm install
4)多注冊來源處理:所有的依賴包,不管他被不同的庫間接關聯引用多少次,安裝這個包時,只會從一個注冊來源去裝,要么是 npm 要么是 bower, 防止出現混亂不一致。
5)更好的語義化: yarn改變了一些npm命令的名稱,比如 yarn add/remove,感覺上比 npm 原本的 install/uninstall 要更清晰。
4.Yarn和npm命令對比
npm yarn
npm install yarn
npm install react --save yarn add react
npm uninstall react --save yarn remove react
npm install react --save-dev yarn add react --dev
npm update --save yarn upgrade
5.npm的未來:npm5.0(目前使用大多為5.0版本)
默認新增了類似yarn.lock的 package-lock.json;
文件依賴優化:在之前的版本,如果將本地目錄作為依賴來安裝,將會把文件目錄作為副本拷貝到 node_modules 中。而在 npm5 中,將改為使用創建 symlinks 的方式來實現(使用本地 tarball 包除外),而不再執行文件拷貝。這將會提升安裝速度。目前yarn還不支持。
總結
在npm5.0之前,yarn的優勢特別明顯。但是在npm之后,通過以上一系列對比,我們可以看到 npm5 在速度和使用上確實有了很大提升,值得嘗試,不過還沒有超過yarn。
綜上我個人的建議是如果你已經在個人項目上使用 yarn,并且沒有遇到更多問題,目前完全可以繼續使用。但如果有兼容 npm 的場景,或者身處在使用 npm,cnpm,tnpm 的團隊,以及還沒有切到 yarn 的項目,那現在就可以試一試 npm5 了。
六、斷點調試
(一)Node-inspector的瀏覽器調試
1.安裝node-inspector運行環境??
????????安裝命令:npm install -g node-inspector??
????????注意:a、參數-g 將node-inspector安裝到系統環境變量中,可以在任何路徑下執行,盡量保留。
????????????????? b、如果是Linux或Unix系統,需要使用root權限安裝
?
2.?啟動node-inspector
????????node-inspector啟動后會生成一個服務,主要負責調試工具與nodejs程序之間的溝通工作,一個橋梁。
????????a、window:直接在任意路徑下執行?node-inspector,進行守護
????b、Linux || Unix:node-inspector &?
?將node-inspcetor作為后臺服務,這樣就不怕誤操作,把窗口關掉了。出現進程PID,表示node-inspcetor已經成為后臺進程,可以ctrl+c結束當前任務,node-inspcetor進程依然保持。如果想停止可以?kill -9 pid?殺掉node-inspcetor進程。? ? ????
?
3.打開chrome,輸入地址?http://127.0.0.1:8080/debug?port=5858
?NodeJS程序還沒起來呢,目前先到這,看看NodeJS程序的變化。
?
4.??打開NodeJS的調試模式
????????node --debug app.js? debugger的監聽端口是5858,這個端口可以修改
????????
5.?再次打開chrome,刷新頁面,chrome通過node-inspector服務連接到nodejs服務上了,并顯示nodejs應用的入口文件內容。
總結:
1、node-inspector依賴nodejs的運行環境。
2、調試過程中node-inspector的服務不要重啟,只需要在重啟nodejs應用后刷新一下chrome的頁面即可。
3、嚴格的來說node-inspector不是一個完整的調試工具,它需要一個可視化的調試界面來展示所有的調試信息,node-inspector是調試界面與nodejs之間的橋梁,是調試界面能與nodejs溝通。
由于文章過程筆者也在做改進只整理了部分, 后序會繼續推出更多優秀的作品。希望大家喜歡并支持
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/114204.html
摘要:基礎篇整合最近有朋友也想學習相關方面的知識,如果你是后端想接近前端,作為一門跑在服務端的語言從這里入門再好不過了。事件驅動機制是通過內部單線程高效率地維護事件循環隊列來實現的,沒有多線程的資源占用和上下文的切換。 nodeJs 基礎篇整合 最近有朋友也想學習nodeJs相關方面的知識,如果你是后端想接近前端,node作為一門跑在服務端的JS語言從這里入門再好不過了。如果你正好喜歡前端,...
摘要:基礎篇整合最近有朋友也想學習相關方面的知識,如果你是后端想接近前端,作為一門跑在服務端的語言從這里入門再好不過了。事件驅動機制是通過內部單線程高效率地維護事件循環隊列來實現的,沒有多線程的資源占用和上下文的切換。 nodeJs 基礎篇整合 最近有朋友也想學習nodeJs相關方面的知識,如果你是后端想接近前端,node作為一門跑在服務端的JS語言從這里入門再好不過了。如果你正好喜歡前端,...
摘要:整理收藏一些優秀的文章及大佬博客留著慢慢學習原文協作規范中文技術文檔協作規范阮一峰編程風格凹凸實驗室前端代碼規范風格指南這一次,徹底弄懂執行機制一次弄懂徹底解決此類面試問題瀏覽器與的事件循環有何區別筆試題事件循環機制異步編程理解的異步 better-learning 整理收藏一些優秀的文章及大佬博客留著慢慢學習 原文:https://www.ahwgs.cn/youxiuwenzhan...
摘要:從零開始系列文章,將介紹如何利做為服務端腳本,通過框架開發。框架是基于的引擎,是目前速度最快的引擎。瀏覽器就基于,同時打開個網頁都很流暢。標準的開發框架,可以幫助我們迅速建立站點,比起的開發效率更高,而且學習曲線更低。 從零開始nodejs系列文章,將介紹如何利Javascript做為服務端腳本,通過Nodejs框架web開發。Nodejs框架是基于V8的引擎,是目前速度最快的Java...
閱讀 1800·2021-11-22 09:34
閱讀 3083·2019-08-30 15:55
閱讀 663·2019-08-30 15:53
閱讀 2053·2019-08-30 15:52
閱讀 3000·2019-08-29 18:32
閱讀 1989·2019-08-29 17:15
閱讀 2391·2019-08-29 13:14
閱讀 3557·2019-08-28 18:05