最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

初始Nodejs

 更新時(shí)間:2014年11月08日 14:57:41   投稿:hebedich  
本文屬于nodejs的基礎(chǔ)知識(shí)介紹篇,從nodejs的基本概念,到架構(gòu)示意圖,同步異步等方面做了詳細(xì)的解答,是篇非常不錯(cuò)的文章

基本概念

Node.js,或者 Node,是一個(gè)可以讓 JavaScript 運(yùn)行在服務(wù)器端的平臺(tái)??梢哉f,Node.js開創(chuàng)了javascript模塊化開發(fā)的先河,早期的javascript需求都很簡(jiǎn)單,基本都是寫成函數(shù)的,然后是面向過程的寫法,后來慢慢的引入面向?qū)ο箝_發(fā)思想,再后來就慢慢寫成 類。最后node.js的出現(xiàn)才開始有了js模塊化開發(fā)的概念,這使得臃腫的js代碼免去了命名沖突等一系列開發(fā)難題。

Node最大的特點(diǎn)就是采用了異步式I/O與事件驅(qū)動(dòng)的架構(gòu)設(shè)計(jì)。Node.js是一個(gè)讓js運(yùn)行在瀏覽器外的平臺(tái)。其最初目標(biāo)是實(shí)現(xiàn)事件驅(qū)動(dòng),非阻塞I/O的web服務(wù)器

Node.js 只是一個(gè) JavaScript 的運(yùn)行環(huán)境(或者說是一組庫(kù)), 為標(biāo)準(zhǔn) js 補(bǔ)充了有關(guān)異步 IO, 即讀寫網(wǎng)絡(luò)和文件的功能。
一個(gè)庫(kù)嘛,無非是調(diào)調(diào) API 什么的,除了略反人類的事件回調(diào)之外,和其他后端語言(PHP, Python)也差不了多少。

Node.js使用的是單線程模式,每一個(gè)線程完成一個(gè)功能,一個(gè)進(jìn)程可以有多個(gè)線程,對(duì)于所有的I/O都采用異步式的請(qǐng)求方式。每個(gè)異步式I/O請(qǐng)求完成后都會(huì)被推送到事件隊(duì)列,等待程序進(jìn)程進(jìn)行處理。

總之,node的核心思想就是:非阻塞,單線程和事件驅(qū)動(dòng)。(同步對(duì)應(yīng)的是阻塞,異步對(duì)應(yīng)的是非阻塞)

Node.JS架構(gòu)示意圖

單線程

javascript語言的執(zhí)行環(huán)境是"單線程"(single thread)。
所謂"單線程",就是指一次只能完成一件任務(wù)。如果有多個(gè)任務(wù),就必須排隊(duì),前面一個(gè)任務(wù)完成,再執(zhí)行后面一個(gè)任務(wù),以此類推。

這種模式的好處是實(shí)現(xiàn)起來比較簡(jiǎn)單,執(zhí)行環(huán)境相對(duì)單純;壞處是只要有一個(gè)任務(wù)耗時(shí)很長(zhǎng),后面的任務(wù)都必須排隊(duì)等著,會(huì)拖延整個(gè)程序的執(zhí)行。常見的瀏覽器無 響應(yīng)(假死),往往就是因?yàn)槟骋欢?code>Javascript代碼長(zhǎng)時(shí)間運(yùn)行(比如死循環(huán)),導(dǎo)致整個(gè)頁面卡在這個(gè)地方,其他任務(wù)無法執(zhí)行。

大部分 Web 應(yīng)用的瓶頸都在 I/O, 即讀寫磁盤,讀寫網(wǎng)絡(luò),讀寫數(shù)據(jù)庫(kù)。使用怎樣的策略等待這段時(shí)間,就成了改善性能的關(guān)鍵點(diǎn)

同步與異步

為了解決這個(gè)問題,Javascript語言將任務(wù)的執(zhí)行模式分成兩種:同步(Synchronous)和異步(Asynchronous)。

"同步模式"就是上一段的模式,后一個(gè)任務(wù)等待前一個(gè)任務(wù)結(jié)束,然后再執(zhí)行,程序的執(zhí)行順序與任務(wù)的排列順序是一致的、同步的;"異步模式"則完全不同, 每一個(gè)任務(wù)有一個(gè)或多個(gè)回調(diào)函數(shù)(callback),前一個(gè)任務(wù)結(jié)束后,不是執(zhí)行后一個(gè)任務(wù),而是執(zhí)行回調(diào)函數(shù),后一個(gè)任務(wù)則是不等前一個(gè)任務(wù)結(jié)束就執(zhí) 行,所以程序的執(zhí)行順序與任務(wù)的排列順序是不一致的、異步的。

"異步模式"非常重要。在瀏覽器端,耗時(shí)很長(zhǎng)的操作都應(yīng)該異步執(zhí)行,避免瀏覽器失去響應(yīng),最好的例子就是Ajax操作。在服務(wù)器端,"異步模式"甚至是唯一的模式,因?yàn)閳?zhí)行環(huán)境是單線程的,如果允許同步執(zhí)行所有http請(qǐng)求,服務(wù)器性能會(huì)急劇下降,很快就會(huì)失去響應(yīng)。

進(jìn)程與線程

mac系統(tǒng)中的進(jìn)程與線程

從圖中我們可以看出,一個(gè)進(jìn)程可以包括多個(gè)線程,進(jìn)程就好比工程里的車間,線程就是這個(gè)車間的工人,在引入線程的操作系統(tǒng)中,通常都是把進(jìn)程作為分配資源的基本單位,而把線程作為獨(dú)立運(yùn)行和獨(dú)立調(diào)度的基本單位。由于線程比進(jìn)程更小,基本上不擁有系統(tǒng)資源,故對(duì)它的調(diào)度所付出的開銷就會(huì)小得多,能更高效的提高系統(tǒng)內(nèi)多個(gè)程序間并發(fā)執(zhí)行的程度。

區(qū)別

線程和進(jìn)程的區(qū)別在于,子進(jìn)程和父進(jìn)程有不同的代碼和數(shù)據(jù)空間,而多個(gè)線程則共享數(shù)據(jù)空間,每個(gè)線程有自己的執(zhí)行堆棧和程序計(jì)數(shù)器為其執(zhí)行上下文。多線程主要是為了節(jié)約CPU時(shí)間,發(fā)揮利用,根據(jù)具體情況而定。線程的運(yùn)行中需要使用計(jì)算機(jī)的內(nèi)存資源和CPU。

模塊和包模塊

模塊:一個(gè)實(shí)現(xiàn)某些特定功能的文件,以實(shí)現(xiàn)模塊化編程。通過require(模塊名)引入模塊.
—模塊中的功能(如:變量,函數(shù))通過賦給exports對(duì)象的某個(gè)屬性提供給調(diào)用者使用。

如何使用模塊?

在Node中使用模塊是非常方便的,在 JavaScript 代碼中可以直接使用全局函數(shù) require() 來加載一個(gè)模塊。例如,我們可以使用require("http")來加載node中自帶的http服務(wù)器模塊,

包:包是一個(gè)文件夾,它將模塊封裝起來,用于發(fā)布、更新、依賴管理和版本控制。通過package.json來描述包的信息:入口文件,依賴的外部包等等。通過npm install命令來安裝包,并通過require使用包。

異步式 I/O 與事件驅(qū)動(dòng)

Node.js 的異步機(jī)制是基于事件的,每一個(gè) I/O就是一次請(qǐng)求,所有的磁盤 I/O、網(wǎng)絡(luò)通信、數(shù)據(jù)庫(kù)查詢都以非阻塞的方式請(qǐng)求,返回的結(jié)果由事件循環(huán)來處理。如下圖所示:

Node.js 進(jìn)程在同一時(shí)刻只會(huì)處理一個(gè)事件,完成后立即進(jìn)入事件循環(huán)檢查并處理后面的事件。這樣做的好處是,CPU 和內(nèi)存在同一時(shí)間集中處理一件事,同時(shí)盡可能讓耗時(shí)的 I/O 操作并行執(zhí)行

開始node編程

在這里,我推薦大家使用webstorm進(jìn)行node.js的開發(fā),方便又快捷,比起cmd,或者M(jìn)ac下的終端都好用太多了。

至于node的安裝大家就自行百度吧,這里就不贅述了,看下webstorm下的node編程界面吧:
我們只需要在編寫好的node代碼界面按鼠標(biāo)右鍵,然后點(diǎn)擊Run就行啦,方便又快捷吧

下面是node的輸出界面:

Mac系統(tǒng)下進(jìn)行web開發(fā),我推薦大家使用的三款工具是:coda2,webstorm和Sublime text3這些是目前我已經(jīng)的最好的開發(fā)工具了,大家不妨試試哪個(gè)更符合自己的口味。

webstorm進(jìn)行node開發(fā)需要先配置一定的文件,大家就自行百度吧,因?yàn)槲业?code>webstorm已經(jīng)配置好了,所以沒法截圖給大家看步驟了,大概步驟是,在mac系統(tǒng)下是先點(diǎn)擊頂部欄的webstorm,然后點(diǎn)擊perference,然后點(diǎn)擊Node.js and NPM,然后在右側(cè)點(diǎn)擊configure配置,最后大概會(huì)是下面這個(gè)樣子:

windows系統(tǒng)下和這個(gè)流程步驟大概相似啊,我使用的版本是8.0.4的。

全局變量

在js編程中,我們最好給每個(gè)變量都添加上var關(guān)鍵字,以免污染全局命名空間,提高代碼的耦合風(fēng)險(xiǎn)。

console

console用于向標(biāo)準(zhǔn)輸出流standout(stdout)和標(biāo)準(zhǔn)錯(cuò)誤流(stderr)輸出字符。

console.log()向標(biāo)準(zhǔn)輸出流打印字符并以換行符結(jié)束,其接受多個(gè)參數(shù),將以類似C語言的printf()格式輸出

console.log(__dirname)輸出文件目錄

計(jì)算代碼運(yùn)行時(shí)間

 console.time(label) 
console.timeEnd(label)

我們只需在開始和結(jié)束那里給同樣一個(gè)標(biāo)簽即可,中間放你想要計(jì)算執(zhí)行時(shí)間的任何代碼。

__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報(bào)錯(cuò)信息Error:?Cannot?find?module?'XXX'問題及解決

    Node.js報(bào)錯(cuò)信息Error:?Cannot?find?module?'XXX'問題及解

    這篇文章主要介紹了Node.js報(bào)錯(cuò)信息Error:?Cannot?find?module?'XXX'問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Node.js中的process.nextTick使用實(shí)例

    Node.js中的process.nextTick使用實(shí)例

    這篇文章主要介紹了Node.js中的process.nextTick使用實(shí)例,nextTick函數(shù)有什么用、怎么用、和setTimeout有什么區(qū)別呢,本文就講解了這些知識(shí),需要的朋友可以參考下
    2015-06-06
  • 使用puppeteer爬取網(wǎng)站并抓出404無效鏈接

    使用puppeteer爬取網(wǎng)站并抓出404無效鏈接

    自動(dòng)化技術(shù)可以幫助我們做自動(dòng)化測(cè)試,本篇文章主要介紹了使用puppeteer爬取網(wǎng)站并抓出404無效鏈接,可以檢查出無效鏈接,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • Node做中轉(zhuǎn)服務(wù)器轉(zhuǎn)發(fā)接口

    Node做中轉(zhuǎn)服務(wù)器轉(zhuǎn)發(fā)接口

    這篇文章主要介紹了Node做中轉(zhuǎn)服務(wù)器轉(zhuǎn)發(fā)接口的相關(guān)資料,需要的朋友可以參考下
    2017-10-10
  • Pycharm配置Node.js運(yùn)行js代碼詳細(xì)過程

    Pycharm配置Node.js運(yùn)行js代碼詳細(xì)過程

    在PyCharm中寫JavaScript代碼并進(jìn)行調(diào)試是非常方便的,但是有些用戶可能對(duì)如何在PyCharm中準(zhǔn)確地運(yùn)行JavaScript代碼感到困惑,這篇文章主要給大家介紹了關(guān)于Pycharm配置Node.js運(yùn)行js代碼的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • module.exports和exports使用誤區(qū)案例分析

    module.exports和exports使用誤區(qū)案例分析

    module.exports和exports使用誤區(qū),使用require()模塊時(shí),得到的永遠(yuǎn)都是module.exports指向的對(duì)象
    2023-04-04
  • npm?install?-g?@vue/cli常見問題解決匯總

    npm?install?-g?@vue/cli常見問題解決匯總

    這篇文章主要給大家介紹了關(guān)于npm?install?-g?@vue/cli常見問題解決的相關(guān)資料,文中通過實(shí)例代碼將解決的方式介紹的非常詳細(xì),對(duì)遇到這個(gè)問題的朋友具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-08-08
  • Node.js中Koa2在控制臺(tái)輸出請(qǐng)求日志的方法示例

    Node.js中Koa2在控制臺(tái)輸出請(qǐng)求日志的方法示例

    這篇文章主要給大家介紹了關(guān)于Node.js中Koa2在控制臺(tái)輸出請(qǐng)求日志的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Node.js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Node.js使用MongoDB的ObjectId作為查詢條件的方法

    Node.js使用MongoDB的ObjectId作為查詢條件的方法

    這篇文章主要介紹了Node.js使用MongoDB的ObjectId作為查詢條件的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 淺談KOA2 Restful方式路由初探

    淺談KOA2 Restful方式路由初探

    這篇文章主要介紹了淺談KOA2 Restful方式路由初探,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-03-03

最新評(píng)論

泽普县| 定州市| 平武县| 济宁市| 马龙县| 庄浪县| 霍州市| 句容市| 铁岭县| 嘉峪关市| 云梦县| 漳州市| 兰考县| 化州市| 资源县| 文昌市| 满洲里市| 沧源| 台东县| 阳江市| 公安县| 淮安市| 新源县| 自贡市| 和顺县| 德保县| 正宁县| 龙海市| 贡嘎县| 昌邑市| 玉溪市| 青海省| 海淀区| 临湘市| 德钦县| 万荣县| 东丰县| 商河县| 将乐县| 南城县| 城口县|