成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

nodejs 基礎(chǔ)篇整合

lentrue / 1998人閱讀

摘要:基礎(chǔ)篇整合最近有朋友也想學(xué)習(xí)相關(guān)方面的知識(shí),如果你是后端想接近前端,作為一門跑在服務(wù)端的語言從這里入門再好不過了。事件驅(qū)動(dòng)機(jī)制是通過內(nèi)部單線程高效率地維護(hù)事件循環(huán)隊(duì)列來實(shí)現(xiàn)的,沒有多線程的資源占用和上下文的切換。

nodeJs 基礎(chǔ)篇整合
最近有朋友也想學(xué)習(xí)nodeJs相關(guān)方面的知識(shí),如果你是后端想接近前端,node作為一門跑在服務(wù)端的JS語言從這里入門再好不過了。如果你正好喜歡前端,想走的更高,走的更遠(yuǎn)。nodeJs同樣也是不二之選。node的地位雖然在實(shí)戰(zhàn)項(xiàng)目中運(yùn)用的不是很多,但也不能否認(rèn)它在處理高并發(fā),服務(wù)端渲染,前端自動(dòng)化方面的優(yōu)勢(shì)。總而言之。如果你是個(gè)自學(xué)能力很強(qiáng)的人。請(qǐng)來到這里學(xué)習(xí)。讓我們一起去打開node的世界,游走于前端與服務(wù)端之間。你如果能掌握如下知識(shí)那么你的node基礎(chǔ)功底將會(huì)十分強(qiáng)大。

簡(jiǎn)介:
Node.js 就是運(yùn)行在服務(wù)端的 JavaScript。
Node.js 是一個(gè)基于Chrome JavaScript 運(yùn)行時(shí)建立的一個(gè)平臺(tái)。
Node.js是一個(gè)事件驅(qū)動(dòng)I/O服務(wù)端JavaScript環(huán)境,基于Google的V8引擎,V8引擎執(zhí)行Javascript的速度非??欤阅芊浅:?。
底層選擇用c++和v8來實(shí)現(xiàn)的

優(yōu)勢(shì):1. RESTful API

這是NodeJS最理想的應(yīng)用場(chǎng)景,可以處理數(shù)萬條連接,本身沒有太多的邏輯,只需要請(qǐng)求API,組織數(shù)據(jù)進(jìn)行返回即可。它本質(zhì)上只是從某個(gè)數(shù)據(jù)庫(kù)中查找一些值并將它們組成一個(gè)響應(yīng)。由于響應(yīng)是少量文本,入站請(qǐng)求也是少量的文本,因此流量不高,一臺(tái)機(jī)器甚至也可以處理最繁忙的公司的API需求。

統(tǒng)一Web應(yīng)用的UI層

目前MVC的架構(gòu),在某種意義上來說,Web開發(fā)有兩個(gè)UI層,一個(gè)是在瀏覽器里面我們最終看到的,另一個(gè)在server端,負(fù)責(zé)生成和拼接頁面。
不討論這種架構(gòu)是好是壞,但是有另外一種實(shí)踐,面向服務(wù)的架構(gòu),更好的做前后端的依賴分離。如果所有的關(guān)鍵業(yè)務(wù)邏輯都封裝成REST調(diào)用,就意味著在上層只需要考慮如何用這些REST接口構(gòu)建具體的應(yīng)用。那些后端程序員們根本不操心具體數(shù)據(jù)是如何從一個(gè)頁面?zhèn)鬟f到另一個(gè)頁面的,他們也不用管用戶數(shù)據(jù)更新是通過Ajax異步獲取的還是通過刷新頁面。

大量Ajax請(qǐng)求的應(yīng)用

例如個(gè)性化應(yīng)用,每個(gè)用戶看到的頁面都不一樣,緩存失效,需要在頁面加載的時(shí)候發(fā)起Ajax請(qǐng)求,NodeJS能響應(yīng)大量的并發(fā)請(qǐng)求。 
4.Javascript在nosql的應(yīng)用 
Javascript在nosql數(shù)據(jù)庫(kù)中大量應(yīng)用,使得數(shù)據(jù)存儲(chǔ)和管理使用的都是javascript語句,與web應(yīng)用有了天然的結(jié)合;比如mongoDB;
5.Javascripte運(yùn)行從前臺(tái)到后臺(tái)

一門語言從前臺(tái)后臺(tái),減少了開發(fā)客戶端和服務(wù)端時(shí),所需的語言切換,使得數(shù)據(jù)交互效率提升

特點(diǎn):1.單線程:

Nodejs跟Nginx一樣都是單線程為基礎(chǔ)的,這里的單線程指主線程為單線程,所有的阻塞的全部放入一個(gè)線程池中,然后主線程通過隊(duì)列的方式跟線程池來協(xié)作。我們寫js部分不需要關(guān)心線程的問題,簡(jiǎn)單了解就可以了,主要由一堆callback回調(diào)構(gòu)成的,然后主線程在循環(huán)過在適當(dāng)場(chǎng)合調(diào)用。

2.事件驅(qū)動(dòng) ?
首先,解釋下“事件驅(qū)動(dòng)”這個(gè)概念。所謂事件驅(qū)動(dòng),是指在持續(xù)事務(wù)管理過程中,進(jìn)行決策的一種策略,即跟隨當(dāng)前時(shí)間點(diǎn)上出現(xiàn)的事件,調(diào)動(dòng)可用資源,執(zhí)行相關(guān)任務(wù),使不斷出現(xiàn)的問題得以解決,防止事務(wù)堆積。 ? Nodejs設(shè)計(jì)思想中以事件驅(qū)動(dòng)為核心,事件驅(qū)動(dòng)在于異步回調(diào),他提供的大多數(shù)api都是基于事件的、異步的風(fēng)格。而事件驅(qū)動(dòng)的優(yōu)勢(shì)在于充分利用系統(tǒng)資源,執(zhí)行代碼無須阻塞等待某種操作完成,有限的資源用于其他任務(wù)。事件驅(qū)動(dòng)機(jī)制是通過內(nèi)部單線程高效率地維護(hù)事件循環(huán)隊(duì)列來實(shí)現(xiàn)的,沒有多線程的資源占用和上下文的切換。

3.異步、非阻塞I/O
Nodejs提供的很多模塊中都是異步執(zhí)行的。比如,文件操作的函數(shù)。 一個(gè)異步I/O的大致流程:
1.發(fā)起I/O調(diào)用 :
①用戶通過js代碼調(diào)用nodejs的核心模塊,將回調(diào)函數(shù)和參數(shù)傳入核心模塊
②將回調(diào)函數(shù)和參數(shù)封裝成
2.執(zhí)行回調(diào):
①操作完成將結(jié)果儲(chǔ)存到請(qǐng)求對(duì)象的result屬性上,并發(fā)出完成通知。
②循環(huán)事件,如果有未完成的,就在進(jìn)入對(duì)象請(qǐng)求I/O觀察者隊(duì)列,之后當(dāng)做事件處理;

缺點(diǎn):1.不適合CPU密集型應(yīng)用;CPU密集型應(yīng)用給Node帶來的挑戰(zhàn)主要是:由于JavaScript單線程的原因,如果有長(zhǎng)時(shí)間運(yùn)行的計(jì)算(比如大循環(huán)),將會(huì)導(dǎo)致CPU時(shí)間片不能釋放,使得后續(xù)I/O無法發(fā)起;
2.只支持單核CPU,不能充分利用CPU
3.可靠性低,一旦代碼某個(gè)環(huán)節(jié)崩潰,整個(gè)系統(tǒng)都崩潰
4.開源組件庫(kù)質(zhì)量參差不齊,更新快,向下不兼容

安裝:(一)官網(wǎng)下載:

   1.下載地址:http://nodejs.cn/download/
   2.根據(jù)自己的系統(tǒng)進(jìn)行鏡像的下載:
   3.下載的為最新的node版本,當(dāng)前下載的為10.8.0

Nvm管理node:

nvm可以方便的在同一臺(tái)設(shè)備上進(jìn)行多個(gè)node版本之間切換

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

Nvm -v

6.安裝nodejs

?使用nvm install ?[]命令下載需要的版本。arch參數(shù)表示系統(tǒng)位數(shù),默認(rèn)是64位,如果是32位操作系統(tǒng),需要執(zhí)行命令:nvm install 10.8.0 32,如:

Nvm install 10.8.0

7.使用下載的nodejs

?執(zhí)行nvm use ?[]?命令開始使用特定版本。比如:nvm use 10.8.0或者nvm use 10.8.0 32

Nvm use 10.8.0

8.當(dāng)有多個(gè)nodejs版本時(shí),設(shè)置默認(rèn)的node版本

nvm alias default v10.8.0

9.查看當(dāng)前所安裝的node版本

Nvm list

全局安裝和局部安裝:
全局安裝:

全局安裝方式是鍵入命令:npm install gulp -g 或?npm install gulp?--global,其中參數(shù)-g的含義是代表安裝到全局環(huán)境里面,包安裝在Node安裝目錄下的node_modules文件夾中,一般在 Users用戶名AppDataRoaming 目錄下,可以使用npm root -g查看全局安裝目錄。

局部安裝(本地安裝)

本地安裝方式是鍵入命令:npm install gulp 或?npm install gulp --save-dev等,其中參數(shù)--save-dev的含義是代表把你的安裝包信息寫入package.json文件的devDependencies字段中,包安裝在指定項(xiàng)目的node_modules文件夾下。

局部安裝的意義:
1、可以實(shí)現(xiàn)多個(gè)項(xiàng)目中使用不同版本的包;
2、可以在不使用全局變量NODE_PATH的情況下,進(jìn)行包的引入;

Node運(yùn)行

終端運(yùn)行和外部文件運(yùn)行

Nodejs的模塊(commonjs規(guī)范)

(一)模塊化

1.誕生背景:
全局變量的災(zāi)難:
函數(shù)命令的沖突:
對(duì)于公用方法的封裝會(huì)出現(xiàn)很多命名沖突,尤其在多人開發(fā)的情況下
依賴關(guān)系的管理:
比如b.js依賴a.js,在文件引入的過程中,就要先引入b.js

最早的時(shí)候在解決上述部分問題時(shí)的解決方案是:使用匿名的自執(zhí)行函數(shù)

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

如何安全的包裝一個(gè)模塊的代碼?(不污染模塊外的任何代碼)

如何唯一標(biāo)識(shí)一個(gè)模塊?

如何優(yōu)雅的把模塊的API暴漏出去?(不能增加全局變量)

如何方便的使用所依賴的模塊?

(二)Commonjs

1.規(guī)范:
1)模塊的標(biāo)識(shí)應(yīng)遵循的規(guī)則(書寫規(guī)范)
定義,標(biāo)識(shí),引用
2)定義全局函數(shù)require,通過傳入模塊標(biāo)識(shí)來引入其他模塊,執(zhí)行的結(jié)果即為別的模塊暴漏出來的API
3)如果被require函數(shù)引入的模塊中也包含依賴,那么依次加載這些依賴
4)如果引入模塊失敗,那么require函數(shù)應(yīng)該報(bào)一個(gè)異常
5)模塊通過變量exports來向往暴漏API,exports只能是一個(gè)對(duì)象,暴漏的API須作為此對(duì)象的屬性。

模塊的簡(jiǎn)單使用:

//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)全局有一個(gè)module變量,用來定義模塊
2)通過module.declare方法來定義一個(gè)模塊(一般不通過此方式進(jìn)行模塊的定義)
3)module.declare方法只接收一個(gè)參數(shù),那就是模塊的factory,次factory可以是函數(shù)也可以是對(duì)象,如果是對(duì)象,那么模塊輸出就是此對(duì)象。
4)模塊的factory函數(shù)傳入三個(gè)參數(shù):require,exports,module,用來引入其他依賴和導(dǎo)出本模塊API
如果factory函數(shù)最后明確寫有return數(shù)據(jù)(js函數(shù)中不寫return默認(rèn)返回undefined),那么return的內(nèi)容即為模塊的輸出。

不常用:
module.declare(function(require, exports, module) {
    exports.foo = "bar";
});
module.declare(function(require)
{
return { foo: "bar" };
});
常用:
module.exports={}

odule.exports和exports的區(qū)別:

1)module.exports 初始值為一個(gè)空對(duì)象 {}
2)exports 是指向的 module.exports 的引用
3)require() 返回的是 module.exports 而不是 exports

4)關(guān)系為var exports = module.exports={};

如:
module.exports可以賦值一個(gè)對(duì)象
module.exports={}

exports不可以賦值一個(gè)對(duì)象,只能添加方法或者屬性
exports.add=function(){

}
5.模塊引用
require函數(shù)的基本功能是,讀入并執(zhí)行一個(gè)JavaScript文件,然后返回該模塊的exports對(duì)象。當(dāng)我們用require()獲取module時(shí),Node會(huì)根據(jù)module.id找到對(duì)應(yīng)的module,并返回module. exports,這樣就實(shí)現(xiàn)了模塊的輸出。
require函數(shù)使用一個(gè)參數(shù),參數(shù)值可以帶有完整路徑的模塊的文件名,也可以為模塊名。
假如,有三個(gè)文件:一個(gè)是a.js(存放路徑:home/a.js),一個(gè)是b.js(存放路徑:home/user/b.js), 一個(gè)是c.js(存放路徑:home/user/c.js)。我們?cè)赼.js文件中引用三個(gè)模塊,實(shí)例代碼如下:
var httpModule=require("HTTP");//用 “模塊名”加載服務(wù)模塊http

var b=require("./user/b");//用“相對(duì)路徑”加載文件b.js

var b=require("../ home/user/c");//用“絕對(duì)路徑”加載文件c.js
?
6.?模塊標(biāo)識(shí)
模塊標(biāo)識(shí)就是傳遞給require方法的參數(shù),必須符合小駝峰命名的字符串,或者以.、..開頭的相對(duì)路徑,或者絕對(duì)路徑,默認(rèn)文件名后綴.js。在Node實(shí)現(xiàn)中,正是基于這樣一個(gè)標(biāo)識(shí)符進(jìn)行模塊查找的,如果沒有發(fā)現(xiàn)指定模塊會(huì)報(bào)錯(cuò)。
根據(jù)參數(shù)的不同格式,require命令去不同路徑尋找模塊文件。加載規(guī)則如下:
(1)如果參數(shù)字符串以“/”開頭,則表示加載的是一個(gè)位于絕對(duì)路徑的模塊文件。比如,require("/home/marco/foo.js")將加載/home/marco/foo.js。
(2)如果參數(shù)字符串以“./”開頭,則表示加載的是一個(gè)位于相對(duì)路徑(跟當(dāng)前執(zhí)行腳本的位置相比)的模塊文件。比如,require("./circle")將加載當(dāng)前腳本同一目錄的circle.js。
(3)如果參數(shù)字符串不以“./“或”/“開頭,則表示加載的是一個(gè)默認(rèn)提供的核心模塊(位于Node的系統(tǒng)安裝目錄中),或者一個(gè)位于各級(jí)node_modules目錄的已安裝模塊(全局安裝或局部安裝)。
舉例來說,腳本/home/user/projects/foo.js執(zhí)行了require("bar.js")命令,Node會(huì)依次搜索以下文件。

/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

這樣設(shè)計(jì)的目的是,使得不同的模塊可以將所依賴的模塊本地化。
(4)如果參數(shù)字符串不以“./“或”/“開頭,而且是一個(gè)路徑,比如require("example-module/path/to/file"),則將先找到example-module的位置,然后再以它為參數(shù),找到后續(xù)路徑。
(5)如果指定的模塊文件沒有發(fā)現(xiàn),Node會(huì)嘗試為文件名添加.js、.json、.node后,再去搜索。.js件會(huì)以文本格式的JavaScript腳本文件解析,.json文件會(huì)以JSON格式的文本文件解析,.node文件會(huì)以編譯后的二進(jìn)制文件解析。
(6)如果想得到require命令加載的確切文件名,使用require.resolve()方法。此方法會(huì)返回一個(gè)完整的路徑,并且還會(huì)對(duì)文件的是否存在做檢測(cè)
7.二進(jìn)制模塊
雖然一般我們使用JS編寫模塊,但NodeJS也支持使用C/C++編寫二進(jìn)制模塊。編譯好的二進(jìn)制模塊除了文件擴(kuò)展名是.node外,和JS模塊的使用方式相同。雖然二進(jìn)制模塊能使用操作系統(tǒng)提供的所有功能,擁有無限的潛能,但對(duì)于前端同學(xué)而言編寫過于困難,并且難以跨平臺(tái)使用,因此不在本教程的覆蓋范圍內(nèi)。

Node模塊的分類:

1.內(nèi)置模塊(核心模塊)

核心模塊指的是那些被編譯進(jìn)Node的二進(jìn)制模塊,它們被預(yù)置在Node中,提供Node的基本功能,如fs、http、https等。核心模塊使用C/C++實(shí)現(xiàn),外部使用JS封裝。要加載核心模塊,直接在代碼文件中使用require() 方法即可,參數(shù)為模塊名稱,Node將自動(dòng)從核心模塊文件夾中進(jìn)行加載。

2.第三方模塊
Node使用NPM (Node Package Manager) 安裝第三方模塊,NPM會(huì)將模塊安裝到應(yīng)用根目錄下的node_modules文件夾中,然后就可以像使用核心模塊一樣使用第三方模塊了。在進(jìn)行模塊加載時(shí),Node會(huì)先在核心模塊文件夾中進(jìn)行搜索,然后再到node_modules文件夾中進(jìn)行搜索。

3.文件模塊
上述兩種方式都是從當(dāng)前目錄獲取模塊文件,實(shí)際上,可以將文件放在任何位置,然后在加載模塊文件時(shí)加上路徑即可。可以使用以./ 開頭的相對(duì)路徑和以/ 或C: 之類的盤符開頭的絕對(duì)路徑。

4.文件夾模塊
從文件夾中加載模塊,Node首先會(huì)在該文件夾中搜索package.json文件。如果存在,Node便嘗試解析它,并加載main屬性指定的模塊文件。如果package.json不存在,或者沒有定義main屬性,Node默認(rèn)加載該文件夾下的index.js文件。 如從項(xiàng)目根目錄下的 modules/hello 文件夾加載模塊: var hello = require("./modules/hello");
package.json格式如下:

{ "name": "hello", "version": "1.0.0", "main": "./hello.js" }
此時(shí),Node會(huì)去加載./modules/hello/hello.js 文件。
如果目錄里沒有?package.json?文件,則 Node.js 就會(huì)試圖加載目錄下的?index.js?或?index.node?文件。 例如,如果上面的例子中沒有?package.json?文件,則?require("./modules/hello")?會(huì)試圖加載:
./modules/hello /index.js
./modules/hello /index.node
四、Npm與package.json詳解

(一)npm簡(jiǎn)介:
世界上最大的軟件注冊(cè)表,每星期大約有 30 億次的下載量,包含超過 600000 個(gè)?包(package)?(即,代碼模塊)。來自各大洲的開源軟件開發(fā)者使用 npm 互相分享和借鑒。包的結(jié)構(gòu)使您能夠輕松跟蹤依賴項(xiàng)和版本。
npm 是一個(gè)包管理器,它讓 JavaScript 開發(fā)者分享、復(fù)用代碼更方便(有點(diǎn) maven 的感覺)。 在程序開發(fā)中我們常常需要依賴別人提供的框架,寫 JS 也不例外。這些可以重復(fù)的框架代碼被稱作包(package)或者模塊(module),一個(gè)包可以是一個(gè)文件夾里放著幾個(gè)文件,同時(shí)有一個(gè)叫做 package.json 的文件。 一個(gè)網(wǎng)站里通常有幾十甚至上百個(gè) package,分散在各處,通常會(huì)將這些包按照各自的功能進(jìn)行劃分,但是如果重復(fù)造一些輪子,不如上傳到一個(gè)公共平臺(tái),讓更多的人一起使用、參與這個(gè)特定功能的模塊。 而 npm 的作用就是讓我們發(fā)布、下載一些 JS 輪子更加方便。

(二)npm構(gòu)成:

npm 由三個(gè)獨(dú)立的部分組成:
網(wǎng)站:是開發(fā)者查找包(package)、設(shè)置參數(shù)以及管理 npm 使用體驗(yàn)的主要途徑。
注冊(cè)表(registry):是一個(gè)巨大的數(shù)據(jù)庫(kù),保存了每個(gè)包(package)的信息
命令行工具 (CLI):通過命令行或終端運(yùn)行。開發(fā)者通過 CLI 與 npm 打交道

(三)npm更新:

查看版本:nvm -V
更新版本:nvm install npm@latest -g

(四)npm更改全局目錄:

查看npm全局目錄:
npm root -g?

修改全局包位置?:
npm config set prefix "目標(biāo)目錄"

查看修改結(jié)果?
npm config get prefix或npm root -g

(五)package.json

A.作用:

1.作為一個(gè)描述文件,描述了你的項(xiàng)目依賴哪些包
2.允許我們使用 “語義化版本規(guī)則”(后面介紹)指明你項(xiàng)目依賴包的版本
3.讓你的構(gòu)建更好地與其他開發(fā)者分享,便于重復(fù)使用
4.如果項(xiàng)目構(gòu)架進(jìn)行復(fù)制時(shí),可以直接使用npm install,直接根據(jù)package.json的配置進(jìn)行包的下載
5.作為項(xiàng)目的描述文件,對(duì)整個(gè)項(xiàng)目進(jìn)行描述。

B.創(chuàng)建:

npm init 即可在當(dāng)前目錄創(chuàng)建一個(gè) package.json 文件:

C.內(nèi)容:
基本配置:
1.name:項(xiàng)目的名字
2.version:項(xiàng)目的版本
3.description:描述信息,有助于搜索
4.main: 入口文件,一般都是 index.js
5.scripts:支持的腳本,默認(rèn)是一個(gè)空的 test
6.keywords:關(guān)鍵字,有助于在人們使用 npm search 搜索時(shí)發(fā)現(xiàn)你的項(xiàng)目
7.author:作者信息
8.license:默認(rèn)是 MIT
9.bugs:當(dāng)前項(xiàng)目的一些錯(cuò)誤信息,如果有的話
注:
如果 package.json 中沒有 description 信息,npm 使用項(xiàng)目中的 README.md 的第一行作為描述信息。這個(gè)描述信息有助于別人搜索你的項(xiàng)目,因此建議好好寫 description 信息。

依賴包配置:
1.dependencies:在生產(chǎn)環(huán)境中需要用到的依賴
2.devDependencies:在開發(fā)、測(cè)試環(huán)境中用到的依賴

(六)package-lock.json文件

npm5之后安裝文件之后會(huì)多出一個(gè)package-lock.json的文件,它的作用是:
1.安裝之后鎖定包的版本,手動(dòng)更改package.json文件安裝將不會(huì)更新包,想要更新只能使用 npm install [email protected] --save 這種方式來進(jìn)行版本更新package-lock.json 文件才可以
2.加快了npm install 的速度,因?yàn)?package-lock.json 文件中已經(jīng)記錄了整個(gè) node_modules 文件夾的樹狀結(jié)構(gòu),甚至連模塊的下載地址都記錄了,再重新安裝的時(shí)候只需要直接下載文件即可

(七)npm的包版本規(guī)范和package.json的使用規(guī)范

npm版本規(guī)范:
如果一個(gè)項(xiàng)目打算與別人分享,應(yīng)該從 1.0.0 版本開始。以后要升級(jí)版本應(yīng)該遵循以下標(biāo)準(zhǔn):
補(bǔ)丁版本:解決了 Bug 或者一些較小的更改,增加最后一位數(shù)字,比如 1.0.1
小版本:增加了新特性,同時(shí)不會(huì)影響之前的版本,增加中間一位數(shù)字,比如 1.1.0
大版本:大改版,無法兼容之前的,增加第一位數(shù)字,比如 2.0.0

Package.json的版本書寫:

我們可以在 package.json 文件中寫明我們可以接受這個(gè)包的更新程度(假設(shè)當(dāng)前依賴的是 1.0.4 版本):
如果只打算接受補(bǔ)丁版本的更新(也就是最后一位的改變),就可以這么寫:
1.0
1.0.x
~1.0.4
如果接受小版本的更新(第二位的改變),就可以這么寫:
1
1.x
^1.0.4
如果可以接受大版本的更新(自然接受小版本和補(bǔ)丁版本的改變),就可以這么寫:

x

(八)npm下載包

安裝方式:
如果你只是想在當(dāng)前項(xiàng)目里用 require() 加載使用,那你可以安裝到本地 npm install 默認(rèn)就是安裝到本地的
如果你想要在命令行里直接使用,比如 grunt CLI,就需要安裝到全局了
如果在你的項(xiàng)目里有 package.json 文件,運(yùn)行 npm install 后它會(huì)查找文件中列出的依賴包,然后下載符合語義化版本規(guī)則的版本。 npm install 默認(rèn)會(huì)安裝 package.json 中 dependencies 和 devDependencies 里的所有模塊。 如果想只安裝 dependencies 中的內(nèi)容,可以使用 --production 字段:
npm install --production

1.本地安裝:
1)安裝指定版本:
$ npm install sax@latest :最新版本
$ npm install [email protected] :指定版本
$ npm install sax@" >=0.1.0 <0.2.0” :安裝0.1.0到0.2.0版本
注:
有時(shí)下載會(huì)報(bào)錯(cuò):npm install error saveError ENOENT: no such file or directory, 解決辦法: - 在目錄下執(zhí)行 npm init 創(chuàng)建 package.json,輸入初始化信息 - 然后再執(zhí)行下載命令

2)安裝參數(shù) --save 和 --save -dev

添加依賴時(shí)我們可以手動(dòng)修改 package.json 文件,添加或者修改 dependencies devDependencies 中的內(nèi)容即可。
另一種更酷的方式是用命令行,在使用 npm install 時(shí)增加 --save 或者 --save -dev 后綴:
npm install --save 表示將這個(gè)包名及對(duì)應(yīng)的版本添加到 package.json的 dependencies
npm install --save-dev 表示將這個(gè)包名及對(duì)應(yīng)的版本添加到 package.json的 devDependencies

3)更新本地package
有時(shí)候我們想知道依賴的包是否有新版本,可以使用 npm outdated 查看,如果發(fā)現(xiàn)有的包有新版本,就可以使用 npm update 更新它,或者直接 npm update 更新所有:
npm update 的工作過程是這樣的:
先到遠(yuǎn)程倉(cāng)庫(kù)查詢最新版本
然后對(duì)比本地版本,如果本地版本不存在,或者遠(yuǎn)程版本較新
查看 package.json 中對(duì)應(yīng)的語義版本規(guī)則 (一定注意規(guī)則)
如果當(dāng)前新版本符合語義規(guī)則,就更新,否則不更新

4)卸載本地 package

卸載一個(gè)本地 package 很簡(jiǎn)單,npm uninstall

2.全局安裝

1)安裝
npm install -g

2)權(quán)限處理(非windows處理)
在全局安裝時(shí)可能會(huì)遇到 EACCES 權(quán)限問題,解決辦法辦法有如下 2種:
1.sudo npm install -g jshint,使用 sudo 簡(jiǎn)單粗暴,但是治標(biāo)不治本
2.修改 npm 全局默認(rèn)目錄的權(quán)限 先獲取 npm 全局目錄:npm config get prefix,一般都是 /usr/local; 然后修改這個(gè)目錄權(quán)限為當(dāng)前用戶:
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,可以發(fā)現(xiàn)對(duì)比本地的,只是多了個(gè) -g。

4)卸載全局包

npm uninstall -g

3.其他命令

Npm run: 運(yùn)行 package.json 中 scripts 指定的腳本
npm install from github: 從github下載資源
npm install git://github.com/package/path.git ;
npm info:npm info 可以查看指定包的信息:

(九)Npm發(fā)布包:

1.注冊(cè):
npm網(wǎng)站地址:https://www.npmjs.com/
npm網(wǎng)站注冊(cè)地址:https://www.npmjs.com/signup
2.命令行登錄
Windows直接cmd到命令行:
輸入以下命令,會(huì)提示輸入用戶名、密碼、郵箱,這些都是注冊(cè)時(shí)填寫過的。
npm login
3.創(chuàng)建項(xiàng)目
創(chuàng)建一個(gè)testxxxxx文件夾,cd到testxxxxx文件夾中,然后下載基礎(chǔ)配置文件:
1
2 //輸入以下命令,會(huì)提示配置包的相關(guān)信息,名稱版本等等,都是包的基本配置信息
npm init
配置完畢開始寫自己的包內(nèi)代碼:?
創(chuàng)建一個(gè)index.js文件,文件內(nèi)的代碼如下,直接輸出123456789
module.exports = 123456789;
4.發(fā)布:
開始命令行發(fā)布包,命令如下:npm publish testxxxxx
發(fā)布完畢,在npm網(wǎng)站上搜索,就可以搜索到自己剛剛發(fā)布的包了。
5.驗(yàn)證下載:
正常下載好了,沒有問題了,搞定。
6.撤銷發(fā)布
接下來說明一下怎么撤銷自己發(fā)布的版本。這只是一個(gè)測(cè)試的包,最好當(dāng)然還是撤銷下來:
刪除要用force強(qiáng)制刪除。超過24小時(shí)就不能刪除了。自己把握好時(shí)間。
npm --force unpublish testxxxxx
(十)Npm修改鏡像源:

由于npm的源在國(guó)外,所以國(guó)內(nèi)用戶使用起來各種不方便。部分國(guó)內(nèi)優(yōu)秀的npm鏡像資源,國(guó)內(nèi)用戶可以選擇使用
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地址,下面根據(jù)不同情境列出幾種比較常用的方法。以淘寶npm鏡像舉例:
1)臨時(shí)使用
npm --registry https://registry.npm.taobao.org
2)持久使用(推薦使用)
npm config set registry https://registry.npm.taobao.org
配置后可通過下面方式來驗(yàn)證是否成功 npm config get registry
3)通過cnpm使用 (也可以使用cnpm) (常用)
npm install -g cnpm --registry=https://registry.npm.taobao.org
4.恢復(fù)npm源鏡像:
如果將npm的鏡像地址改變后,在發(fā)布包時(shí),應(yīng)該將鏡像改回:
npm config set registry https://registry.npmjs.org/

五、yarn的使用:

1.簡(jiǎn)介:
Yarn是由Facebook、Google、Exponent 和 Tilde 聯(lián)合推出了一個(gè)新的 JS 包管理工具 Yarn 是為了彌補(bǔ) npm 的一些缺陷而出現(xiàn)的。
2.Npm的缺陷:
1)npm install的時(shí)候巨慢。特別是新的項(xiàng)目拉下來要等半天,刪除node_modules,重新install的時(shí)候依舊如此。
2)同一個(gè)項(xiàng)目,安裝的時(shí)候無法保持一致性。由于package.json文件中版本號(hào)的特點(diǎn),下面三個(gè)版本號(hào)在安裝的時(shí)候代表不同的含義。
"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中最新的版本。這就麻煩了,常常會(huì)出現(xiàn)同一個(gè)項(xiàng)目,有的同事是OK的,有的同事會(huì)由于安裝的版本不一致出現(xiàn)bug。
3)安裝的時(shí)候,包會(huì)在同一時(shí)間下載和安裝,中途某個(gè)時(shí)候,一個(gè)包拋出了一個(gè)錯(cuò)誤,但是npm會(huì)繼續(xù)下載和安裝包。因?yàn)閚pm會(huì)把所有的日志輸出到終端,有關(guān)錯(cuò)誤包的錯(cuò)誤信息就會(huì)在一大堆npm打印的警告中丟失掉,并且你甚至永遠(yuǎn)不會(huì)注意到實(shí)際發(fā)生的錯(cuò)誤。
3.Yarn的優(yōu)點(diǎn)
1)速度快 。速度快主要來自以下兩個(gè)方面:
a)并行安裝:無論 npm 還是 Yarn 在執(zhí)行包的安裝時(shí),都會(huì)執(zhí)行一系列任務(wù)。npm 是按照隊(duì)列執(zhí)行每個(gè) package,也就是說必須要等到當(dāng)前 package 安裝完成之后,才能繼續(xù)后面的安裝。而 Yarn 是同步執(zhí)行所有任務(wù),提高了性能。
b)離線模式:如果之前已經(jīng)安裝過一個(gè)軟件包,用Yarn再次安裝時(shí)之間從緩存中獲取,就不用像npm那樣再?gòu)木W(wǎng)絡(luò)下載了。
2)安裝版本統(tǒng)一:為了防止拉取到不同的版本,Yarn 有一個(gè)鎖定文件 (lock file) 記錄了被確切安裝上的模塊的版本號(hào)。每次只要新增了一個(gè)模塊,Yarn 就會(huì)創(chuàng)建(或更新)yarn.lock 這個(gè)文件。這么做就保證了,每一次拉取同一個(gè)項(xiàng)目依賴時(shí),使用的都是一樣的模塊版本。npm 其實(shí)也有辦法實(shí)現(xiàn)處處使用相同版本的 packages,但需要開發(fā)者執(zhí)行 npm shrinkwrap 命令。這個(gè)命令將會(huì)生成一個(gè)鎖定文件,在執(zhí)行 npm install 的時(shí)候,該鎖定文件會(huì)先被讀取,和 Yarn 讀取 yarn.lock 文件一個(gè)道理。npm 和 Yarn 兩者的不同之處在于,Yarn 默認(rèn)會(huì)生成這樣的鎖定文件,而 npm 要通過 shrinkwrap 命令生成 npm-shrinkwrap.json 文件,只有當(dāng)這個(gè)文件存在的時(shí)候,packages 版本信息才會(huì)被記錄和更新。
3)更簡(jiǎn)潔的輸出:npm 的輸出信息比較冗長(zhǎng)。在執(zhí)行 npm install 的時(shí)候,命令行里會(huì)不斷地打印出所有被安裝上的依賴。相比之下,Yarn 簡(jiǎn)潔太多:默認(rèn)情況下,結(jié)合了 emoji直觀且直接地打印出必要的信息,也提供了一些命令供開發(fā)者查詢額外的安裝信息。
4)多注冊(cè)來源處理:所有的依賴包,不管他被不同的庫(kù)間接關(guān)聯(lián)引用多少次,安裝這個(gè)包時(shí),只會(huì)從一個(gè)注冊(cè)來源去裝,要么是 npm 要么是 bower, 防止出現(xiàn)混亂不一致。
5)更好的語義化: yarn改變了一些npm命令的名稱,比如 yarn add/remove,感覺上比 npm 原本的 install/uninstall 要更清晰。
4.Yarn和npm命令對(duì)比
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版本)
默認(rèn)新增了類似yarn.lock的 package-lock.json;
文件依賴優(yōu)化:在之前的版本,如果將本地目錄作為依賴來安裝,將會(huì)把文件目錄作為副本拷貝到 node_modules 中。而在 npm5 中,將改為使用創(chuàng)建 symlinks 的方式來實(shí)現(xiàn)(使用本地 tarball 包除外),而不再執(zhí)行文件拷貝。這將會(huì)提升安裝速度。目前yarn還不支持。
總結(jié)
在npm5.0之前,yarn的優(yōu)勢(shì)特別明顯。但是在npm之后,通過以上一系列對(duì)比,我們可以看到 npm5 在速度和使用上確實(shí)有了很大提升,值得嘗試,不過還沒有超過yarn。
綜上我個(gè)人的建議是如果你已經(jīng)在個(gè)人項(xiàng)目上使用 yarn,并且沒有遇到更多問題,目前完全可以繼續(xù)使用。但如果有兼容 npm 的場(chǎng)景,或者身處在使用 npm,cnpm,tnpm 的團(tuán)隊(duì),以及還沒有切到 yarn 的項(xiàng)目,那現(xiàn)在就可以試一試 npm5 了。

六、斷點(diǎn)調(diào)試

(一)Node-inspector的瀏覽器調(diào)試

1.安裝node-inspector運(yùn)行環(huán)境??
????????安裝命令:npm install -g node-inspector??
????????注意:a、參數(shù)-g 將node-inspector安裝到系統(tǒng)環(huán)境變量中,可以在任何路徑下執(zhí)行,盡量保留。
????????????????? b、如果是Linux或Unix系統(tǒng),需要使用root權(quán)限安裝
?
2.?啟動(dòng)node-inspector
????????node-inspector啟動(dòng)后會(huì)生成一個(gè)服務(wù),主要負(fù)責(zé)調(diào)試工具與nodejs程序之間的溝通工作,一個(gè)橋梁。
????????a、window:直接在任意路徑下執(zhí)行?node-inspector,進(jìn)行守護(hù)
????b、Linux || Unix:node-inspector &?
?將node-inspcetor作為后臺(tái)服務(wù),這樣就不怕誤操作,把窗口關(guān)掉了。出現(xiàn)進(jìn)程PID,表示node-inspcetor已經(jīng)成為后臺(tái)進(jìn)程,可以ctrl+c結(jié)束當(dāng)前任務(wù),node-inspcetor進(jìn)程依然保持。如果想停止可以?kill -9 pid?殺掉node-inspcetor進(jìn)程。? ? ????
?
3.打開chrome,輸入地址?http://127.0.0.1:8080/debug?port=5858
?NodeJS程序還沒起來呢,目前先到這,看看NodeJS程序的變化。
?
4.??打開NodeJS的調(diào)試模式
????????node --debug app.js? debugger的監(jiān)聽端口是5858,這個(gè)端口可以修改
????????
5.?再次打開chrome,刷新頁面,chrome通過node-inspector服務(wù)連接到nodejs服務(wù)上了,并顯示nodejs應(yīng)用的入口文件內(nèi)容。
總結(jié):
1、node-inspector依賴nodejs的運(yùn)行環(huán)境。
2、調(diào)試過程中node-inspector的服務(wù)不要重啟,只需要在重啟nodejs應(yīng)用后刷新一下chrome的頁面即可。
3、嚴(yán)格的來說node-inspector不是一個(gè)完整的調(diào)試工具,它需要一個(gè)可視化的調(diào)試界面來展示所有的調(diào)試信息,node-inspector是調(diào)試界面與nodejs之間的橋梁,是調(diào)試界面能與nodejs溝通。

由于文章過程筆者也在做改進(jìn)只整理了部分, 后序會(huì)繼續(xù)推出更多優(yōu)秀的作品。希望大家喜歡并支持

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/114204.html

相關(guān)文章

  • nodejs 基礎(chǔ)整合

    摘要:基礎(chǔ)篇整合最近有朋友也想學(xué)習(xí)相關(guān)方面的知識(shí),如果你是后端想接近前端,作為一門跑在服務(wù)端的語言從這里入門再好不過了。事件驅(qū)動(dòng)機(jī)制是通過內(nèi)部單線程高效率地維護(hù)事件循環(huán)隊(duì)列來實(shí)現(xiàn)的,沒有多線程的資源占用和上下文的切換。 nodeJs 基礎(chǔ)篇整合 最近有朋友也想學(xué)習(xí)nodeJs相關(guān)方面的知識(shí),如果你是后端想接近前端,node作為一門跑在服務(wù)端的JS語言從這里入門再好不過了。如果你正好喜歡前端,...

    lemanli 評(píng)論0 收藏0
  • nodejs 基礎(chǔ)整合

    摘要:基礎(chǔ)篇整合最近有朋友也想學(xué)習(xí)相關(guān)方面的知識(shí),如果你是后端想接近前端,作為一門跑在服務(wù)端的語言從這里入門再好不過了。事件驅(qū)動(dòng)機(jī)制是通過內(nèi)部單線程高效率地維護(hù)事件循環(huán)隊(duì)列來實(shí)現(xiàn)的,沒有多線程的資源占用和上下文的切換。 nodeJs 基礎(chǔ)篇整合 最近有朋友也想學(xué)習(xí)nodeJs相關(guān)方面的知識(shí),如果你是后端想接近前端,node作為一門跑在服務(wù)端的JS語言從這里入門再好不過了。如果你正好喜歡前端,...

    高勝山 評(píng)論0 收藏0
  • 優(yōu)秀文章收藏(慢慢消化)持續(xù)更新~

    摘要:整理收藏一些優(yōu)秀的文章及大佬博客留著慢慢學(xué)習(xí)原文協(xié)作規(guī)范中文技術(shù)文檔協(xié)作規(guī)范阮一峰編程風(fēng)格凹凸實(shí)驗(yàn)室前端代碼規(guī)范風(fēng)格指南這一次,徹底弄懂執(zhí)行機(jī)制一次弄懂徹底解決此類面試問題瀏覽器與的事件循環(huán)有何區(qū)別筆試題事件循環(huán)機(jī)制異步編程理解的異步 better-learning 整理收藏一些優(yōu)秀的文章及大佬博客留著慢慢學(xué)習(xí) 原文:https://www.ahwgs.cn/youxiuwenzhan...

    JeOam 評(píng)論0 收藏0
  • 從零開始nodejs系列文章

    摘要:從零開始系列文章,將介紹如何利做為服務(wù)端腳本,通過框架開發(fā)??蚣苁腔诘囊妫悄壳八俣茸羁斓囊?。瀏覽器就基于,同時(shí)打開個(gè)網(wǎng)頁都很流暢。標(biāo)準(zhǔn)的開發(fā)框架,可以幫助我們迅速建立站點(diǎn),比起的開發(fā)效率更高,而且學(xué)習(xí)曲線更低。 從零開始nodejs系列文章,將介紹如何利Javascript做為服務(wù)端腳本,通過Nodejs框架web開發(fā)。Nodejs框架是基于V8的引擎,是目前速度最快的Java...

    rickchen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<