摘要:深入淺出一直想致力于寫一篇關于廣義講解系統的文章,苦于時間有限,資源有限。事件驅動機制是通過內部單線程高效率地維護事件循環隊列來實現的,沒有多線程的資源占用和上下文的切換。
深入淺出Node.js
一直想致力于寫一篇關于廣義講解Node.js系統的文章,苦于時間有限,資源有限。這篇文章是在結合自己的學習心得以及與行業大佬共同探討下爭對于熟練掌握JS語言后的廣義Node.js.至于為什么叫作廣義在后文會提到。希望看到這篇文章后可以激發大家對Node.js的學習興趣,這篇文章的初衷就是致力于幫助大家可以走進Node.js世界。
簡介:
Node.js 就是運行在服務端的 JavaScript。
Node.js 是一個基于Chrome JavaScript 運行時建立的一個平臺。
Node.js是一個事件驅動I/O服務端JavaScript環境,基于Google的V8引擎,V8引擎執行Javascript的速度非常快,性能非 常好。
底層選擇用c++和v8來實現的
注意:廣義的Node.js是指不掌握以底層C++技術以及V8知識,利用Node.js運行在服務端的JS特性完成操作,很多小伙伴會產生疑惑Node.js是什么,簡單的來說:Node.js是解析器.
優勢:
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須作為此對象的屬性。
2.模塊的簡單使用:
//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)全局有一個module變量,用來定義模塊
2)通過module.declare方法來定義一個模塊(一般不通過此方式進行模塊的定義)
3)module.declare方法只接收一個參數,那就是模塊的factory,次factory可以是函數也可以是對象,如果是對象,那么模塊輸出就是此對象。
4)模塊的factory函數傳入三個參數:require,exports,module,用來引入其他依賴和導出本模塊API
5)如果factory函數最后明確寫有return數據(js函數中不寫return默認返回undefined),那么return的內容即為模塊的輸出。
不常用:
module.declare(function(require, exports, module) {
exports.foo = "bar";
});
module.declare(function(require)
{
return { foo: "bar" };
});
常用:
module.exports={}
4.Module.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.讓你的構建更好地與其他開發者分享,便于重復使用
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:在開發、測試環境中用到的依賴
(六)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/
斷點調試
(一)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溝通。
Vscode的debug
1.如下圖進行點擊按鈕,彈出配置頁面
2.添加node處理程序
3.配置程序名稱和程序路徑
4.配置完畢啟動程序
5.打斷點
結尾:主要的學習是配置環境,其實Node.js更多扮演的是一個中間層的作用,很多國內企業對Node.js的依賴并不是很高,希望感覺對自己有幫助的小伙伴可以積極的點贊加關注!!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/113994.html
摘要:先天就缺乏一項功能模塊通過標簽引入代碼的方式顯得雜亂無章,語言自身毫無組織和約束能力。與文件模塊區別地方在于它從內存中加載緩存執行結果的位置核心模塊在對象上,文件模塊在對象上未完待續 javascript先天就缺乏一項功能:模塊 javasciprt 通過script標簽引入代碼的方式顯得雜亂無章,語言自身毫無組織和約束能力。人們不得不用命名空間等方式人為地約束代碼,以求達到安全和易用的...
摘要:從社區和過往的經驗而言異步編程的難題已經基本解決無論是通過事件還是通過模式或者流程控制庫。本章主要介紹了主流的幾種異步編程解決方案這是目前中主要使用的方案。最后因為人們總是習慣性地以線性的方式進行思考以致異步編程相對較為難以掌握。 前言 如果你想要深入學習Node,那你不能錯過《深入淺出Node.js》這本書,它從不同的視角介紹了 Node 內在的特點和結構。由首章Node 介紹為索引...
摘要:深入淺出一直想致力于寫一篇關于廣義講解系統的文章,苦于時間有限,資源有限。事件驅動機制是通過內部單線程高效率地維護事件循環隊列來實現的,沒有多線程的資源占用和上下文的切換。 深入淺出Node.js 一直想致力于寫一篇關于廣義講解Node.js系統的文章,苦于時間有限,資源有限。這篇文章是在結合自己的學習心得以及與行業大佬共同探討下爭對于熟練掌握JS語言后的廣義Node.js.至于為什么...
摘要:深入淺出一直想致力于寫一篇關于廣義講解系統的文章,苦于時間有限,資源有限。事件驅動機制是通過內部單線程高效率地維護事件循環隊列來實現的,沒有多線程的資源占用和上下文的切換。 深入淺出Node.js 一直想致力于寫一篇關于廣義講解Node.js系統的文章,苦于時間有限,資源有限。這篇文章是在結合自己的學習心得以及與行業大佬共同探討下爭對于熟練掌握JS語言后的廣義Node.js.至于為什么...
閱讀 3469·2021-09-22 15:02
閱讀 3506·2021-09-02 15:21
閱讀 2132·2019-08-30 15:55
閱讀 2779·2019-08-30 15:44
閱讀 776·2019-08-29 16:56
閱讀 2414·2019-08-23 18:22
閱讀 3341·2019-08-23 12:20
閱讀 3091·2019-08-23 11:28