初始Nodejs
基本概念
Node.js
,或者 Node,是一個可以讓 JavaScript
運行在服務(wù)器端的平臺??梢哉f,Node.js
開創(chuàng)了javascript
模塊化開發(fā)的先河,早期的javascript
需求都很簡單,基本都是寫成函數(shù)的,然后是面向過程的寫法,后來慢慢的引入面向?qū)ο箝_發(fā)思想,再后來就慢慢寫成 類。最后node.js的出現(xiàn)才開始有了js模塊化開發(fā)的概念,這使得臃腫的js
代碼免去了命名沖突等一系列開發(fā)難題。
Node
最大的特點就是采用了異步式I/O
與事件驅(qū)動的架構(gòu)設(shè)計。Node.js
是一個讓js運行在瀏覽器外的平臺。其最初目標是實現(xiàn)事件驅(qū)動,非阻塞I/O
的web服務(wù)器
Node.js
只是一個 JavaScript
的運行環(huán)境(或者說是一組庫), 為標準 js
補充了有關(guān)異步 IO, 即讀寫網(wǎng)絡(luò)和文件的功能。
一個庫嘛,無非是調(diào)調(diào) API 什么的,除了略反人類的事件回調(diào)之外,和其他后端語言(PHP, Python)也差不了多少。
Node.js
使用的是單線程模式,每一個線程完成一個功能,一個進程可以有多個線程,對于所有的I/O都采用異步式的請求方式。每個異步式I/O請求完成后都會被推送到事件隊列,等待程序進程進行處理。
總之,node
的核心思想就是:非阻塞,單線程和事件驅(qū)動。(同步對應(yīng)的是阻塞,異步對應(yīng)的是非阻塞)
Node.JS
架構(gòu)示意圖
單線程
javascript
語言的執(zhí)行環(huán)境是"單線程"(single thread)。
所謂"單線程",就是指一次只能完成一件任務(wù)。如果有多個任務(wù),就必須排隊,前面一個任務(wù)完成,再執(zhí)行后面一個任務(wù),以此類推。
這種模式的好處是實現(xiàn)起來比較簡單,執(zhí)行環(huán)境相對單純;壞處是只要有一個任務(wù)耗時很長,后面的任務(wù)都必須排隊等著,會拖延整個程序的執(zhí)行。常見的瀏覽器無 響應(yīng)(假死),往往就是因為某一段Javascript
代碼長時間運行(比如死循環(huán)),導(dǎo)致整個頁面卡在這個地方,其他任務(wù)無法執(zhí)行。
大部分 Web 應(yīng)用的瓶頸都在 I/O
, 即讀寫磁盤,讀寫網(wǎng)絡(luò),讀寫數(shù)據(jù)庫。使用怎樣的策略等待這段時間,就成了改善性能的關(guān)鍵點
同步與異步
為了解決這個問題,Javascript
語言將任務(wù)的執(zhí)行模式分成兩種:同步(Synchronous)和異步(Asynchronous)。
"同步模式"就是上一段的模式,后一個任務(wù)等待前一個任務(wù)結(jié)束,然后再執(zhí)行,程序的執(zhí)行順序與任務(wù)的排列順序是一致的、同步的;"異步模式"則完全不同, 每一個任務(wù)有一個或多個回調(diào)函數(shù)(callback
),前一個任務(wù)結(jié)束后,不是執(zhí)行后一個任務(wù),而是執(zhí)行回調(diào)函數(shù),后一個任務(wù)則是不等前一個任務(wù)結(jié)束就執(zhí) 行,所以程序的執(zhí)行順序與任務(wù)的排列順序是不一致的、異步的。
"異步模式"非常重要。在瀏覽器端,耗時很長的操作都應(yīng)該異步執(zhí)行,避免瀏覽器失去響應(yīng),最好的例子就是Ajax操作。在服務(wù)器端,"異步模式"甚至是唯一的模式,因為執(zhí)行環(huán)境是單線程的,如果允許同步執(zhí)行所有http
請求,服務(wù)器性能會急劇下降,很快就會失去響應(yīng)。
進程與線程
mac系統(tǒng)中的進程與線程
從圖中我們可以看出,一個進程可以包括多個線程,進程就好比工程里的車間,線程就是這個車間的工人,在引入線程的操作系統(tǒng)中,通常都是把進程作為分配資源的基本單位,而把線程作為獨立運行和獨立調(diào)度的基本單位。由于線程比進程更小,基本上不擁有系統(tǒng)資源,故對它的調(diào)度所付出的開銷就會小得多,能更高效的提高系統(tǒng)內(nèi)多個程序間并發(fā)執(zhí)行的程度。
區(qū)別
線程和進程的區(qū)別在于,子進程和父進程有不同的代碼和數(shù)據(jù)空間,而多個線程則共享數(shù)據(jù)空間,每個線程有自己的執(zhí)行堆棧和程序計數(shù)器為其執(zhí)行上下文。多線程主要是為了節(jié)約CPU時間,發(fā)揮利用,根據(jù)具體情況而定。線程的運行中需要使用計算機的內(nèi)存資源和CPU。
模塊和包模塊
模塊:一個實現(xiàn)某些特定功能的文件,以實現(xiàn)模塊化編程。通過require(模塊名)引入模塊.
—模塊中的功能(如:變量,函數(shù))通過賦給exports
對象的某個屬性提供給調(diào)用者使用。
如何使用模塊?
在Node中使用模塊是非常方便的,在 JavaScript
代碼中可以直接使用全局函數(shù) require()
來加載一個模塊。例如,我們可以使用require("http")
來加載node
中自帶的http服務(wù)器模塊,
包
包:包是一個文件夾,它將模塊封裝起來,用于發(fā)布、更新、依賴管理和版本控制。通過package.json來描述包的信息:入口文件,依賴的外部包等等。通過npm install
命令來安裝包,并通過require
使用包。
異步式 I/O 與事件驅(qū)動
Node.js
的異步機制是基于事件的,每一個 I/O
就是一次請求,所有的磁盤 I/O
、網(wǎng)絡(luò)通信、數(shù)據(jù)庫查詢都以非阻塞的方式請求,返回的結(jié)果由事件循環(huán)來處理。如下圖所示:
Node.js
進程在同一時刻只會處理一個事件,完成后立即進入事件循環(huán)檢查并處理后面的事件。這樣做的好處是,CPU 和內(nèi)存在同一時間集中處理一件事,同時盡可能讓耗時的 I/O 操作并行執(zhí)行
開始node編程
在這里,我推薦大家使用webstorm
進行node.js
的開發(fā),方便又快捷,比起cmd,或者Mac下的終端都好用太多了。
至于node的安裝大家就自行百度吧,這里就不贅述了,看下webstorm
下的node編程界面吧:
我們只需要在編寫好的node代碼界面按鼠標右鍵,然后點擊Run就行啦,方便又快捷吧
下面是node的輸出界面:
在Mac
系統(tǒng)下進行web開發(fā),我推薦大家使用的三款工具是:coda2,webstorm和Sublime text3這些是目前我已經(jīng)的最好的開發(fā)工具了,大家不妨試試哪個更符合自己的口味。
在webstorm
進行node開發(fā)需要先配置一定的文件,大家就自行百度吧,因為我的webstorm
已經(jīng)配置好了,所以沒法截圖給大家看步驟了,大概步驟是,在mac系統(tǒng)下是先點擊頂部欄的webstorm
,然后點擊perference
,然后點擊Node.js and NPM
,然后在右側(cè)點擊configure配置,最后大概會是下面這個樣子:
windows
系統(tǒng)下和這個流程步驟大概相似啊,我使用的版本是8.0.4的。
全局變量
在js編程中,我們最好給每個變量都添加上var關(guān)鍵字,以免污染全局命名空間,提高代碼的耦合風(fēng)險。
console
console
用于向標準輸出流standout
(stdout)和標準錯誤流(stderr)輸出字符。
console.log()
向標準輸出流打印字符并以換行符結(jié)束,其接受多個參數(shù),將以類似C語言的printf()
格式輸出
console.log(__dirname)輸出文件目錄
計算代碼運行時間
console.time(label)
console.timeEnd(label)
我們只需在開始和結(jié)束那里給同樣一個標簽即可,中間放你想要計算執(zhí)行時間的任何代碼。
__filename
和__dirname
console.log(__filename);// /Users/hwax/Desktop/My Project/avalon/hello.js
console.log(__dirname);// /Users/hwax/Desktop/My Project/avalon
相關(guān)文章
node.js請求HTTPS報錯:UNABLE_TO_VERIFY_LEAF_SIGNATURE\的解決方法
最近在工作中遇到一個問題,node.js請求HTTPS時報錯:Error: UNABLE_TO_VERIFY_LEAF_SIGNATURE\,通過查找網(wǎng)上的一些資料找到了解決方法,現(xiàn)在總結(jié)下分享給大家,有需要的朋友們可以參考借鑒,下面來一起看看吧。2016-12-12如何設(shè)置process.env.NODE_ENV生產(chǎn)環(huán)境模式
process.env.NODE_ENV默認只有兩種狀態(tài)即development和production,本文主要介紹了process.env.NODE_ENV設(shè)置生產(chǎn)環(huán)境模式,感興趣的可以了解一下2021-09-09Puppeteer 爬取動態(tài)生成的網(wǎng)頁實戰(zhàn)
這篇文章主要介紹了Puppeteer 爬取動態(tài)生成的網(wǎng)頁實戰(zhàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11Node.js發(fā)起HTTP請求的6種不同方法小結(jié)
本文主要介紹了Node.js發(fā)起HTTP請求的6種不同方法小結(jié),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03