nodejs 基礎篇整合

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來實現的javascript

  • 優點:1. RESTful API

這是NodeJS最理想的應用場景,能夠處理數萬條鏈接,自己沒有太多的邏輯,只須要請求API,組織數據進行返回便可。它本質上只是從某個數據庫中查找一些值並將它們組成一個響應。因爲響應是少許文本,入站請求也是少許的文本,所以流量不高,一臺機器甚至也能夠處理最繁忙的公司的API需求。前端

  • 統一Web應用的UI層

目前MVC的架構,在某種意義上來講,Web開發有兩個UI層,一個是在瀏覽器裏面咱們最終看到的,另外一個在server端,負責生成和拼接頁面。
不討論這種架構是好是壞,可是有另一種實踐,面向服務的架構,更好的作先後端的依賴分離。若是全部的關鍵業務邏輯都封裝成REST調用,就意味着在上層只須要考慮如何用這些REST接口構建具體的應用。那些後端程序員們根本不操心具體數據是如何從一個頁面傳遞到另外一個頁面的,他們也不用管用戶數據更新是經過Ajax異步獲取的仍是經過刷新頁面。java

  • 大量Ajax請求的應用

例如個性化應用,每一個用戶看到的頁面都不同,緩存失效,須要在頁面加載的時候發起Ajax請求,NodeJS能響應大量的併發請求。 
4.Javascript在nosql的應用 
Javascript在nosql數據庫中大量應用,使得數據存儲和管理使用的都是javascript語句,與web應用有了自然的結合;好比mongoDB;
5.Javascripte運行從前臺到後臺node

一門語言從前臺後臺,減小了開發客戶端和服務端時,所需的語言切換,使得數據交互效率提高
  • 特色:1.單線程:

Nodejs跟Nginx同樣都是單線程爲基礎的,這裏的單線程指主線程爲單線程,全部的阻塞的所有放入一個線程池中,而後主線程經過隊列的方式跟線程池來協做。咱們寫js部分不須要關心線程的問題,簡單瞭解就能夠了,主要由一堆callback回調構成的,而後主線程在循環過在適當場合調用。 react

2.事件驅動  
首先,解釋下「事件驅動」這個概念。所謂事件驅動,是指在持續事務管理過程當中,進行決策的一種策略,即跟隨當前時間點上出現的事件,調動可用資源,執行相關任務,使不斷出現的問題得以解決,防止事務堆積。   Nodejs設計思想中以事件驅動爲核心,事件驅動在於異步回調,他提供的大多數api都是基於事件的、異步的風格。而事件驅動的優點在於充分利用系統資源,執行代碼無須阻塞等待某種操做完成,有限的資源用於其餘任務。事件驅動機制是經過內部單線程高效率地維護事件循環隊列來實現的,沒有多線程的資源佔用和上下文的切換。c++

3.異步、非阻塞I/O
Nodejs提供的不少模塊中都是異步執行的。好比,文件操做的函數。 一個異步I/O的大體流程:
1.發起I/O調用 :
①用戶經過js代碼調用nodejs的核心模塊,將回調函數和參數傳入核心模塊
②將回調函數和參數封裝成
2.執行回調:
①操做完成將結果儲存到請求對象的result屬性上,併發出完成通知。
②循環事件,若是有未完成的,就在進入對象請求I/O觀察者隊列,以後當作事件處理;git

  • 缺點: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版本之間切換github

1.先下載安裝nvm,下載地址:https://github.com/coreybutle...,選擇nvm-setup壓縮文件,解壓後安裝;
2.安裝過程當中出現,選擇nvm的安裝目錄
3.選擇node的安裝目錄
4.配置環境變量
5.查看nvm是否安裝成功:web

Nvm -v

6.安裝nodejs

 使用nvm install <version> [<arch>]命令下載須要的版本。arch參數表示系統位數,默認是64位,若是是32位操做系統,須要執行命令:nvm install 10.8.0 32,如:

Nvm install 10.8.0

7.使用下載的nodejs

 執行nvm use <version> [<arch>] 命令開始使用特定版本。好比:nvm use 10.8.0或者nvm use 10.8.0 32

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文件夾下。

    局部安裝的意義:
    一、能夠實現多個項目中使用不一樣版本的包;
    二、能夠在不使用全局變量NODE_PATH的狀況下,進行包的引入;

  • Node運行

終端運行和外部文件運行

  • Nodejs的模塊(commonjs規範)

(一)模塊化

1.誕生背景:
全局變量的災難:
函數命令的衝突:
對於公用方法的封裝會出現不少命名衝突,尤爲在多人開發的狀況下
依賴關係的管理:
好比b.js依賴a.js,在文件引入的過程當中,就要先引入b.js

最先的時候在解決上述部分問題時的解決方案是:使用匿名的自執行函數

2.模塊須要解決的問題:

  1. 如何安全的包裝一個模塊的代碼?(不污染模塊外的任何代碼)
  2. 如何惟一標識一個模塊?
  3. 如何優雅的把模塊的API暴漏出去?(不能增長全局變量)
  4. 如何方便的使用所依賴的模塊?

(二)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
4、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 <packages>

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 <package>

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/

5、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 <package> 的時候,命令行裏會不斷地打印出全部被安裝上的依賴。相比之下,Yarn 簡潔太多:默認狀況下,結合了 emoji直觀且直接地打印出必要的信息,也提供了一些命令供開發者查詢額外的安裝信息。
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 了。

6、斷點調試

(一)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應用的入口文件內容。
總結:
一、node-inspector依賴nodejs的運行環境。
二、調試過程當中node-inspector的服務不要重啓,只須要在重啓nodejs應用後刷新一下chrome的頁面便可。
三、嚴格的來講node-inspector不是一個完整的調試工具,它須要一個可視化的調試界面來展現全部的調試信息,node-inspector是調試界面與nodejs之間的橋樑,是調試界面能與nodejs溝通。

因爲文章過程筆者也在作改進只整理了部分, 後序會繼續推出更多優秀的做品。但願你們喜歡並支持
相關文章
相關標籤/搜索