亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

深入淺出Node.js

oujie / 837人閱讀

摘要:深入淺出一直想致力于寫(xiě)一篇關(guān)于廣義講解系統(tǒng)的文章,苦于時(shí)間有限,資源有限。事件驅(qū)動(dòng)機(jī)制是通過(guò)內(nèi)部單線程高效率地維護(hù)事件循環(huán)隊(duì)列來(lái)實(shí)現(xiàn)的,沒(méi)有多線程的資源占用和上下文的切換。

深入淺出Node.js
一直想致力于寫(xiě)一篇關(guān)于廣義講解Node.js系統(tǒng)的文章,苦于時(shí)間有限,資源有限。這篇文章是在結(jié)合自己的學(xué)習(xí)心得以及與行業(yè)大佬共同探討下?tīng)?zhēng)對(duì)于熟練掌握J(rèn)S語(yǔ)言后的廣義Node.js.至于為什么叫作廣義在后文會(huì)提到。希望看到這篇文章后可以激發(fā)大家對(duì)Node.js的學(xué)習(xí)興趣,這篇文章的初衷就是致力于幫助大家可以走進(jìn)Node.js世界。

簡(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來(lái)實(shí)現(xiàn)的
注意:廣義的Node.js是指不掌握以底層C++技術(shù)以及V8知識(shí),利用Node.js運(yùn)行在服務(wù)端的JS特性完成操作,很多小伙伴會(huì)產(chǎn)生疑惑Node.js是什么,簡(jiǎn)單的來(lái)說(shuō):Node.js是解析器.

優(yōu)勢(shì):

RESTful API

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

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

例如個(gè)性化應(yīng)用,每個(gè)用戶(hù)看到的頁(yè)面都不一樣,緩存失效,需要在頁(yè)面加載的時(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語(yǔ)句,與web應(yīng)用有了天然的結(jié)合;比如mongoDB;
5.Javascripte運(yùn)行從前臺(tái)到后臺(tái)

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

特點(diǎn)

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

2.事件驅(qū)動(dòng) ?
首先,解釋下“事件驅(qū)動(dòng)”這個(gè)概念。所謂事件驅(qū)動(dòng),是指在持續(xù)事務(wù)管理過(guò)程中,進(jìn)行決策的一種策略,即跟隨當(dāng)前時(shí)間點(diǎn)上出現(xiàn)的事件,調(diào)動(dòng)可用資源,執(zhí)行相關(guān)任務(wù),使不斷出現(xiàn)的問(wè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ú)須阻塞等待某種操作完成,有限的資源用于其他任務(wù)。事件驅(qū)動(dòng)機(jī)制是通過(guò)內(nèi)部單線程高效率地維護(hù)事件循環(huán)隊(duì)列來(lái)實(shí)現(xiàn)的,沒(méi)有多線程的資源占用和上下文的切換。

3.異步、非阻塞I/O
Nodejs提供的很多模塊中都是異步執(zhí)行的。比如,文件操作的函數(shù)。 一個(gè)異步I/O的大致流程:
1.發(fā)起I/O調(diào)用 :
①用戶(hù)通過(guò)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帶來(lái)的挑戰(zhàn)主要是:由于JavaScript單線程的原因,如果有長(zhǎng)時(shí)間運(yùn)行的計(jì)算(比如大循環(huán)),將會(huì)導(dǎo)致CPU時(shí)間片不能釋放,使得后續(xù)I/O無(wú)法發(fā)起;
2.只支持單核CPU,不能充分利用CPU
3.可靠性低,一旦代碼某個(gè)環(huán)節(jié)崩潰,整個(gè)系統(tǒng)都崩潰
4.開(kāi)源組件庫(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.安裝過(guò)程中出現(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 ?[]?命令開(kāi)始使用特定版本。比如: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用戶(hù)名AppDataRoaming 目錄下,可以使用npm root -g查看全局安裝目錄。

局部安裝(本地安裝)

本地安裝方式是鍵入命令:npm install gulp 或?npm install gulp --save-dev等,其中參數(shù)--save-dev的含義是代表把你的安裝包信息寫(xiě)入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)很多命名沖突,尤其在多人開(kāi)發(fā)的情況下
依賴(lài)關(guān)系的管理:
比如b.js依賴(lài)a.js,在文件引入的過(guò)程中,就要先引入b.js

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

2.模塊需要解決的問(wèn)題:

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

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

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

如何方便的使用所依賴(lài)的模塊?

(二)Commonjs

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

2.模塊的簡(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

3.模塊的定義

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

4.Module.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ù),必須符合小駝峰命名的字符串,或者以.、..開(kāi)頭的相對(duì)路徑,或者絕對(duì)路徑,默認(rèn)文件名后綴.js。在Node實(shí)現(xiàn)中,正是基于這樣一個(gè)標(biāo)識(shí)符進(jìn)行模塊查找的,如果沒(méi)有發(fā)現(xiàn)指定模塊會(huì)報(bào)錯(cuò)。
根據(jù)參數(shù)的不同格式,require命令去不同路徑尋找模塊文件。加載規(guī)則如下:
(1)如果參數(shù)字符串以“/”開(kāi)頭,則表示加載的是一個(gè)位于絕對(duì)路徑的模塊文件。比如,require("/home/marco/foo.js")將加載/home/marco/foo.js。
(2)如果參數(shù)字符串以“./”開(kāi)頭,則表示加載的是一個(gè)位于相對(duì)路徑(跟當(dāng)前執(zhí)行腳本的位置相比)的模塊文件。比如,require("./circle")將加載當(dāng)前腳本同一目錄的circle.js。
(3)如果參數(shù)字符串不以“./“或”/“開(kāi)頭,則表示加載的是一個(gè)默認(rèn)提供的核心模塊(位于Node的系統(tǒng)安裝目錄中),或者一個(gè)位于各級(jí)node_modules目錄的已安裝模塊(全局安裝或局部安裝)。
舉例來(lái)說(shuō),腳本/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ì)的目的是,使得不同的模塊可以將所依賴(lài)的模塊本地化。
(4)如果參數(shù)字符串不以“./“或”/“開(kāi)頭,而且是一個(gè)路徑,比如require("example-module/path/to/file"),則將先找到example-module的位置,然后再以它為參數(shù),找到后續(xù)路徑。
(5)如果指定的模塊文件沒(méi)有發(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編寫(xiě)模塊,但NodeJS也支持使用C/C++編寫(xiě)二進(jìn)制模塊。編譯好的二進(jìn)制模塊除了文件擴(kuò)展名是.node外,和JS模塊的使用方式相同。雖然二進(jìn)制模塊能使用操作系統(tǒng)提供的所有功能,擁有無(wú)限的潛能,但對(duì)于前端同學(xué)而言編寫(xiě)過(guò)于困難,并且難以跨平臺(tái)使用,因此不在本教程的覆蓋范圍內(nèi)。

(三)Node模塊的分類(lèi):

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

核心模塊指的是那些被編譯進(jìn)Node的二進(jìn)制模塊,它們被預(yù)置在Node中,提供Node的基本功能,如fs、http、https等。核心模塊使用C/C++實(shí)現(xiàn),外部使用JS封裝。要加載核心模塊,直接在代碼文件中使用require() 方法即可,參數(shù)為模塊名稱(chēng),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í)加上路徑即可。可以使用以./ 開(kāi)頭的相對(duì)路徑和以/ 或C: 之類(lèi)的盤(pán)符開(kāi)頭的絕對(duì)路徑。

4.文件夾模塊
從文件夾中加載模塊,Node首先會(huì)在該文件夾中搜索package.json文件。如果存在,Node便嘗試解析它,并加載main屬性指定的模塊文件。如果package.json不存在,或者沒(méi)有定義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 文件。
如果目錄里沒(méi)有?package.json?文件,則 Node.js 就會(huì)試圖加載目錄下的?index.js?或?index.node?文件。 例如,如果上面的例子中沒(méi)有?package.json?文件,則?require("./modules/hello")?會(huì)試圖加載:
./modules/hello /index.js
./modules/hello /index.node

Npm與package.json詳解

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

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

npm 由三個(gè)獨(dú)立的部分組成:
網(wǎng)站:是開(kāi)發(fā)者查找包(package)、設(shè)置參數(shù)以及管理 npm 使用體驗(yàn)的主要途徑。
注冊(cè)表(registry):是一個(gè)巨大的數(shù)據(jù)庫(kù),保存了每個(gè)包(package)的信息
命令行工具 (CLI):通過(guò)命令行或終端運(yùn)行。開(kāi)發(fā)者通過(guò) 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)目依賴(lài)哪些包
2.允許我們使用 “語(yǔ)義化版本規(guī)則”(后面介紹)指明你項(xiàng)目依賴(lài)包的版本
3.讓你的構(gòu)建更好地與其他開(kāi)發(fā)者分享,便于重復(fù)使用

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 中沒(méi)有 description 信息,npm 使用項(xiàng)目中的 README.md 的第一行作為描述信息。這個(gè)描述信息有助于別人搜索你的項(xiàng)目,因此建議好好寫(xiě) description 信息。

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

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

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

Package.json的版本書(shū)寫(xiě):

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

x

(七)npm下載包

安裝方式:
如果你只是想在當(dāng)前項(xiàng)目里用 require() 加載使用,那你可以安裝到本地 npm install 默認(rèn)就是安裝到本地的
如果你想要在命令行里直接使用,比如 grunt CLI,就需要安裝到全局了
如果在你的項(xiàng)目里有 package.json 文件,運(yùn)行 npm install 后它會(huì)查找文件中列出的依賴(lài)包,然后下載符合語(yǔ)義化版本規(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 sax@0.1.1 :指定版本
$ 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

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

4)卸載本地 package

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

2.全局安裝

1)安裝
npm install -g

2)權(quán)限處理(非windows處理)
在全局安裝時(shí)可能會(huì)遇到 EACCES 權(quán)限問(wè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)前用戶(hù):
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ì)提示輸入用戶(hù)名、密碼、郵箱,這些都是注冊(cè)時(shí)填寫(xiě)過(guò)的。
npm login

3.創(chuàng)建項(xiàng)目
創(chuàng)建一個(gè)testxxxxx文件夾,cd到testxxxxx文件夾中,然后下載基礎(chǔ)配置文件:
1
2 //輸入以下命令,會(huì)提示配置包的相關(guān)信息,名稱(chēng)版本等等,都是包的基本配置信息
npm init

配置完畢開(kāi)始寫(xiě)自己的包內(nèi)代碼:?
創(chuàng)建一個(gè)index.js文件,文件內(nèi)的代碼如下,直接輸出123456789
module.exports = 123456789;
4.發(fā)布:
開(kāi)始命令行發(fā)布包,命令如下:npm publish testxxxxx

發(fā)布完畢,在npm網(wǎng)站上搜索,就可以搜索到自己剛剛發(fā)布的包了。
5.驗(yàn)證下載:

6.撤銷(xiāo)發(fā)布
接下來(lái)說(shuō)明一下怎么撤銷(xiāo)自己發(fā)布的版本。這只是一個(gè)測(cè)試的包,最好當(dāng)然還是撤銷(xiāo)下來(lái):
刪除要用force強(qiáng)制刪除。超過(guò)24小時(shí)就不能刪除了。自己把握好時(shí)間。
npm --force unpublish testxxxxx

Npm修改鏡像源:

由于npm的源在國(guó)外,所以國(guó)內(nèi)用戶(hù)使用起來(lái)各種不方便。部分國(guó)內(nèi)優(yōu)秀的npm鏡像資源,國(guó)內(nèi)用戶(hù)可以選擇使用
1.淘寶npm鏡像
搜索地址:http://npm.taobao.org/
registry地址:http://registry.npm.taobao.org/
2.cnpmjs鏡像
搜索地址:http://cnpmjs.org/ registry
地址:http://r.cnpmjs.org/
3.如何使用
有很多方法來(lái)配置npm的registry地址,下面根據(jù)不同情境列出幾種比較常用的方法。以淘寶npm鏡像舉例:
1)臨時(shí)使用
npm --registry https://registry.npm.taobao.org
2)持久使用(推薦使用)
npm config set registry https://registry.npm.taobao.org
配置后可通過(guò)下面方式來(lái)驗(yàn)證是否成功 npm config get registry
3)通過(guò)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/

斷點(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.打開(kāi)chrome,輸入地址?http://127.0.0.1:8080/debug?port=5858

相信大家都看到有錯(cuò)誤了,知道什么原因嗎? 恭喜你猜對(duì)了,我們的NodeJS程序還沒(méi)起來(lái)呢,目前先到這,現(xiàn)在需要回過(guò)頭來(lái)看看我們的NodeJS程序的變化。
?
4.??打開(kāi)NodeJS的調(diào)試模式
????????node --debug app.js? debugger的監(jiān)聽(tīng)端口是5858,這個(gè)端口可以修改

5.再次打開(kāi)chrome,刷新頁(yè)面,chrome通過(guò)node-inspector服務(wù)連接到nodejs服務(wù)上了,并顯示nodejs應(yīng)用的入口文件內(nèi)容。

總結(jié):
1、node-inspector依賴(lài)nodejs的運(yùn)行環(huán)境。
2、調(diào)試過(guò)程中node-inspector的服務(wù)不要重啟,只需要在重啟nodejs應(yīng)用后刷新一下chrome的頁(yè)面即可。
3、嚴(yán)格的來(lái)說(shuō)node-inspector不是一個(gè)完整的調(diào)試工具,它需要一個(gè)可視化的調(diào)試界面來(lái)展示所有的調(diào)試信息,node-inspector是調(diào)試界面與nodejs之間的橋梁,是調(diào)試界面能與nodejs溝通。

Vscode的debug

1.如下圖進(jìn)行點(diǎn)擊按鈕,彈出配置頁(yè)面

2.添加node處理程序

3.配置程序名稱(chēng)和程序路徑

4.配置完畢啟動(dòng)程序

5.打斷點(diǎn)

結(jié)尾:主要的學(xué)習(xí)是配置環(huán)境,其實(shí)Node.js更多扮演的是一個(gè)中間層的作用,很多國(guó)內(nèi)企業(yè)對(duì)Node.js的依賴(lài)并不是很高,希望感覺(jué)對(duì)自己有幫助的小伙伴可以積極的點(diǎn)贊加關(guān)注?。?/pre>           
               
                                           
                       
                 

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

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

相關(guān)文章

  • 深入淺出node.js總結(jié)-模塊機(jī)制(1)

    摘要:先天就缺乏一項(xiàng)功能模塊通過(guò)標(biāo)簽引入代碼的方式顯得雜亂無(wú)章,語(yǔ)言自身毫無(wú)組織和約束能力。與文件模塊區(qū)別地方在于它從內(nèi)存中加載緩存執(zhí)行結(jié)果的位置核心模塊在對(duì)象上,文件模塊在對(duì)象上未完待續(xù) javascript先天就缺乏一項(xiàng)功能:模塊 javasciprt 通過(guò)script標(biāo)簽引入代碼的方式顯得雜亂無(wú)章,語(yǔ)言自身毫無(wú)組織和約束能力。人們不得不用命名空間等方式人為地約束代碼,以求達(dá)到安全和易用的...

    jifei 評(píng)論0 收藏0
  • 精讀《深入淺出Node.js

    摘要:從社區(qū)和過(guò)往的經(jīng)驗(yàn)而言異步編程的難題已經(jīng)基本解決無(wú)論是通過(guò)事件還是通過(guò)模式或者流程控制庫(kù)。本章主要介紹了主流的幾種異步編程解決方案這是目前中主要使用的方案。最后因?yàn)槿藗兛偸橇?xí)慣性地以線性的方式進(jìn)行思考以致異步編程相對(duì)較為難以掌握。 前言 如果你想要深入學(xué)習(xí)Node,那你不能錯(cuò)過(guò)《深入淺出Node.js》這本書(shū),它從不同的視角介紹了 Node 內(nèi)在的特點(diǎn)和結(jié)構(gòu)。由首章Node 介紹為索引...

    codergarden 評(píng)論0 收藏0
  • 深入淺出Node.js

    摘要:深入淺出一直想致力于寫(xiě)一篇關(guān)于廣義講解系統(tǒng)的文章,苦于時(shí)間有限,資源有限。事件驅(qū)動(dòng)機(jī)制是通過(guò)內(nèi)部單線程高效率地維護(hù)事件循環(huán)隊(duì)列來(lái)實(shí)現(xiàn)的,沒(méi)有多線程的資源占用和上下文的切換。 深入淺出Node.js 一直想致力于寫(xiě)一篇關(guān)于廣義講解Node.js系統(tǒng)的文章,苦于時(shí)間有限,資源有限。這篇文章是在結(jié)合自己的學(xué)習(xí)心得以及與行業(yè)大佬共同探討下?tīng)?zhēng)對(duì)于熟練掌握J(rèn)S語(yǔ)言后的廣義Node.js.至于為什么...

    MadPecker 評(píng)論0 收藏0
  • 深入淺出Node.js

    摘要:深入淺出一直想致力于寫(xiě)一篇關(guān)于廣義講解系統(tǒng)的文章,苦于時(shí)間有限,資源有限。事件驅(qū)動(dòng)機(jī)制是通過(guò)內(nèi)部單線程高效率地維護(hù)事件循環(huán)隊(duì)列來(lái)實(shí)現(xiàn)的,沒(méi)有多線程的資源占用和上下文的切換。 深入淺出Node.js 一直想致力于寫(xiě)一篇關(guān)于廣義講解Node.js系統(tǒng)的文章,苦于時(shí)間有限,資源有限。這篇文章是在結(jié)合自己的學(xué)習(xí)心得以及與行業(yè)大佬共同探討下?tīng)?zhēng)對(duì)于熟練掌握J(rèn)S語(yǔ)言后的廣義Node.js.至于為什么...

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

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

0條評(píng)論

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