摘要:基礎(chǔ)的端到端的基準(zhǔn)測(cè)試顯示大約比快八倍。所謂單線程,就是指一次只能完成一件任務(wù)。在服務(wù)器端,異步模式甚至是唯一的模式,因?yàn)閳?zhí)行環(huán)境是單線程的,如果允許同步執(zhí)行所有請(qǐng)求,服務(wù)器性能會(huì)急劇下降,很快就會(huì)失去響應(yīng)。
模塊
Node.js 提供了exports 和 require 兩個(gè)對(duì)象,其中 exports 是模塊公開(kāi)的接口,require 用于從外部獲取一個(gè)模塊的接口,即所獲取模塊的 exports 對(duì)象。
接下來(lái)我們就來(lái)創(chuàng)建hello.js文件,代碼如下:
exports.world = function() { console.log("Hello World"); }
在以上示例中,hello.js 通過(guò) exports 對(duì)象把 world 作為模塊的訪問(wèn)接口,在 main.js 中通過(guò) require("./hello") 加載這個(gè)模塊,然后就可以直接訪 問(wèn)main.js 中 exports 對(duì)象的成員函數(shù)了。
require方法接受以下幾種參數(shù)的傳遞:
http、fs、path等,原生模塊。 ./mod或../mod,相對(duì)路徑的文件模塊。 /pathtomodule/mod,絕對(duì)路徑的文件模塊。 mod,非原生模塊的文件模塊。
我們以計(jì)算圓的周長(zhǎng)和面積的兩個(gè)方法為例:
var PI = Math.PI; exports.area = function (r) { return PI*r*r; };//exports 是對(duì)象,向外提供了area方法接口 exports.circumference = function (r) { return 2*PI*r; };
以上保存為circle.js,下方通過(guò)require調(diào)用模塊:
var circle = require("./circle.js");//require通過(guò)引入模塊文件,找到exports對(duì)象提供的接口 console.log("The area of a circle of radius 4 is " + circle.area(4));
編寫(xiě)稍大一點(diǎn)的程序時(shí)一般都會(huì)將代碼模塊化。在NodeJS中,一般將代碼合理拆分到不同的JS文件中,每一個(gè)文件就是一個(gè)模塊,而文件路徑就是模塊名。
在編寫(xiě)每個(gè)模塊時(shí),都有require、exports、module三個(gè)預(yù)先定義好的變量可供使用。
模塊名可使用相對(duì)路徑(以./開(kāi)頭),或者是絕對(duì)路徑(以/或C:之類的盤(pán)符開(kāi)頭)。另外,模塊名中的.js擴(kuò)展名可以省略。
a>優(yōu)點(diǎn): 可維護(hù)性 1.靈活架構(gòu),焦點(diǎn)分離 2.方便模塊間組合、分解 3.方便單個(gè)模塊功能調(diào)試、升級(jí) 4.多人協(xié)作互不干擾 可測(cè)試性 1.可分單元測(cè)試 b>缺點(diǎn): 性能損耗 1.系統(tǒng)分層,調(diào)用鏈會(huì)很長(zhǎng) 2.模塊間通信,模塊間發(fā)送消息會(huì)很耗性能Node.js常用模塊和組件
包管理 Package Management: NPM 框架 Framework: ExpressJS 模板 Template: Jade 中間件 Middleware: Connect WebSocket: Socket.io 數(shù)據(jù)庫(kù) Database: Mongo DB (選了個(gè)自己喜歡的) Mongoose (as a MongoDB ORM) 調(diào)錯(cuò) Debugging: Node Inspector 測(cè)試 Test: Mocha + should.js 控制無(wú)止境的內(nèi)嵌回調(diào) (Control the Callback flow): AsyncNode.js可以做什么? Web開(kāi)發(fā):Express + EJS + Mongoose/MySQL
express 是輕量靈活的Nodejs Web應(yīng)用框架,它可以快速地搭建網(wǎng)站。 Express框架建立在Nodejs內(nèi)置的Http模塊上,并對(duì)Http模塊再包裝,從而實(shí)際Web請(qǐng)求處理的功能。 ejs是一個(gè)嵌入的Javascript模板引擎,通過(guò)編譯生成HTML的代碼。 mongoose 是MongoDB的對(duì)象模型工具,通過(guò)Mongoose框架,可以進(jìn)行訪問(wèn)MongoDB的操作。 mysql 是連接MySQL數(shù)據(jù)庫(kù)的通信API,可以進(jìn)行訪問(wèn)MySQL的操作。
通常用Node.js做Web開(kāi)發(fā),需要3個(gè)框架配合使用,就像Java中的SSH。
Web聊天室(IM):Express + Socket.iosocket.io一個(gè)是基于Nodejs架構(gòu)體系的,支持websocket的協(xié)議用于時(shí)時(shí)通信的一個(gè)軟件包。socket.io 給跨瀏覽器構(gòu)建實(shí)時(shí)應(yīng)用提供了完整的封裝,socket.io完全由javascript實(shí)現(xiàn)。
Web爬蟲(chóng):Cheerio/Requestcheerio 是一個(gè)為服務(wù)器特別定制的,快速、靈活、封裝jQuery核心功能工具包。Cheerio包括了 jQuery核心的子集,從jQuery庫(kù)中去除了所有DOM不一致性和瀏覽器不兼容的部分,揭示了它真正優(yōu)雅的API。Cheerio工作在一個(gè)非常簡(jiǎn) 單,一致的DOM模型之上,解析、操作、渲染都變得難以置信的高效。基礎(chǔ)的端到端的基準(zhǔn)測(cè)試顯示Cheerio大約比JSDOM快八倍(8x)。 Cheerio封裝了@FB55兼容的htmlparser,幾乎能夠解析任何的 HTML 和 XML document。
Web博客:HexoHexo 是一個(gè)簡(jiǎn)單地、輕量地、基于Node的一個(gè)靜態(tài)博客框架。通過(guò)Hexo我們可以快速創(chuàng)建自己的博客,僅需要幾條命令就可以完成。
發(fā)布時(shí),Hexo可以部署在自己的Node服務(wù)器上面,也可以部署github上面。對(duì)于個(gè)人用戶來(lái)說(shuō),部署在github上好處頗多,不僅可以省 去服務(wù)器的成本,還可以減少各種系統(tǒng)運(yùn)維的麻煩事(系統(tǒng)管理、備份、網(wǎng)絡(luò))。所以,基于github的個(gè)人站點(diǎn),正在開(kāi)始流行起來(lái)….
前端包管理平臺(tái): bower.jsBower 是 twitter 推出的一款包管理工具,基于nodejs的模塊化思想,把功能分散到各個(gè)模塊中,讓模塊和模塊之間存在聯(lián)系,通過(guò) Bower 來(lái)管理模塊間的這種聯(lián)系。
單線程javascript語(yǔ)言的執(zhí)行環(huán)境是"單線程"(single thread)。
所謂"單線程",就是指一次只能完成一件任務(wù)。如果有多個(gè)任務(wù),就必須排隊(duì),前面一個(gè)任務(wù)完成,再執(zhí)行后面一個(gè)任務(wù),以此類推。
這種模式的好處是實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,執(zhí)行環(huán)境相對(duì)單純;壞處是只要有一個(gè)任務(wù)耗時(shí)很長(zhǎng),后面的任務(wù)都必須排隊(duì)等著,會(huì)拖延整個(gè)程序的執(zhí)行。常見(jiàn)的瀏覽器無(wú) 響應(yīng)(假死),往往就是因?yàn)槟骋欢?b>Javascript代碼長(zhǎng)時(shí)間運(yùn)行(比如死循環(huán)),導(dǎo)致整個(gè)頁(yè)面卡在這個(gè)地方,其他任務(wù)無(wú)法執(zhí)行。
大部分 Web 應(yīng)用的瓶頸都在 I/O, 即讀寫(xiě)磁盤(pán),讀寫(xiě)網(wǎng)絡(luò),讀寫(xiě)數(shù)據(jù)庫(kù)。使用怎樣的策略等待這段時(shí)間,就成了改善性能的關(guān)鍵點(diǎn)
同步與異步為了解決這個(gè)問(wèn)題,Javascript語(yǔ)言將任務(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)度所付出的開(kāi)銷就會(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)模塊化編程。通過(guò)require(模塊名)引入模塊.
—模塊中的功能(如:變量,函數(shù))通過(guò)賦給exports對(duì)象的某個(gè)屬性提供給調(diào)用者使用。
模塊是可重用的代碼庫(kù)。比如用來(lái)與數(shù)據(jù)庫(kù)交互的模塊、支持web開(kāi)發(fā)的模塊以及通過(guò)web套接字協(xié)助通信的模塊
如何使用模塊?在Node中使用模塊是非常方便的,在 JavaScript 代碼中可以直接使用全局函數(shù) require() 來(lái)加載一個(gè)模塊。例如,我們可以使用require("http")來(lái)加載node中自帶的http服務(wù)器模塊,
包是一個(gè)文件夾,它將模塊封裝起來(lái),用于發(fā)布、更新、依賴管理和版本控制。通過(guò)package.json來(lái)描述包的信息:入口文件,依賴的外部包等等。通過(guò)npm install命令來(lái)安裝包,并通過(guò)require使用包。
package.json在開(kāi)發(fā)Node.js應(yīng)用程序的時(shí)候,一個(gè)一個(gè)模塊的安裝顯然很耗時(shí),又或是忘了安裝某個(gè)模塊怎么辦?npm允許開(kāi)發(fā)人員使用package.json文件來(lái)指定在應(yīng)用程序中要用的模塊,并且通過(guò)單個(gè)命令來(lái)安裝它們:
npm install
package.json文件僅包含以特定格式表示的項(xiàng)目信息。一個(gè)最小的package.json文件會(huì)是這樣:
{ "name" : "example 1", "version": "0.0.2", "dependencies":{ "underscore":"~1.2.1" } }
使用package.json文件意味著我們無(wú)需記憶應(yīng)用程序會(huì)依賴于哪些模塊,其他開(kāi)發(fā)人員會(huì)發(fā)現(xiàn),可以很簡(jiǎn)單地安裝你的應(yīng)用程序
npm installPackage.json的屬性安裝nodejs的依賴包 npm install -g 將包安裝到全局環(huán)境中 npm install --save 安裝的同時(shí),將信息寫(xiě)入package.json中 npm init 會(huì)引導(dǎo)你創(chuàng)建一個(gè)package.json文件,包括名稱、版本、作者這些信息等 npm remove 移除 npm update 更新
name - 包的名稱 version - 包的版本 description - 包的描述 homepage - 包主頁(yè) author - 包的作者 contributors - 貢獻(xiàn)者到包的名字 dependencies - 依賴關(guān)系的列表。NPM自動(dòng)安裝所有在這里的包node_module文件夾中提到的依賴關(guān)系。 repository - 包的庫(kù)類型和URL main - 包的入口點(diǎn) keywords - 關(guān)鍵字 npm install module-name -save 自動(dòng)把模塊和版本號(hào)添加到dependencies部分 npm install module-name -save-dve 自動(dòng)把模塊和版本號(hào)添加到devdependencies部分異步式 I/O 與事件驅(qū)動(dòng)
Node.js 的異步機(jī)制是基于事件的,I/O 是輸入輸出的意思,指的是計(jì)算機(jī)和人或者數(shù)據(jù)處理系統(tǒng)之間的通信。可以將I/O 想成是數(shù)據(jù)在一次輸入和一次輸出之間的移動(dòng)。
每一個(gè) I/O就是一次請(qǐng)求,所有的磁盤(pán) I/O、網(wǎng)絡(luò)通信、數(shù)據(jù)庫(kù)查詢都以非阻塞的方式請(qǐng)求,返回的結(jié)果由事件循環(huán)來(lái)處理。如下圖所示:
Node.js 進(jìn)程在同一時(shí)刻只會(huì)處理一個(gè)事件,完成后立即進(jìn)入事件循環(huán)檢查并處理后面的事件。這樣做的好處是,CPU 和內(nèi)存在同一時(shí)間集中處理一件事,同時(shí)盡可能讓耗時(shí)的 I/O 操作并行執(zhí)行
開(kāi)始node編程在這里,我推薦大家使用webstorm進(jìn)行node.js的開(kāi)發(fā),方便又快捷,比起cmd,或者M(jìn)ac下的終端都好用太多了。
至于node的安裝大家就自行百度吧,這里就不贅述了,看下webstorm下的node編程界面吧:
我們只需要在編寫(xiě)好的node代碼界面按鼠標(biāo)右鍵,然后點(diǎn)擊Run就行啦,方便又快捷吧
下面是node的輸出界面:
在Mac系統(tǒng)下進(jìn)行web開(kāi)發(fā),我推薦大家使用的三款工具是:coda2這些是目前我已經(jīng)的最好的開(kāi)發(fā)工具了,大家不妨試試哪個(gè)更符合自己的口味。
在webstorm進(jìn)行node開(kāi)發(fā)需要先配置一定的文件,大家就自行百度吧,因?yàn)槲业?b>webstorm已經(jīng)配置好了,所以沒(méi)法截圖給大家看步驟了,大概步驟是,在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)。
consoleconsole用于向標(biāo)準(zhǔn)輸出流standout(stdout)和標(biāo)準(zhǔn)錯(cuò)誤流(stderr)輸出字符。
console.log()向標(biāo)準(zhǔn)輸出流打印字符并以換行符結(jié)束,其接受多個(gè)參數(shù),將以類似C語(yǔ)言的printf()格式輸出
console.log(__dirname)輸出文件目錄
計(jì)算代碼運(yùn)行時(shí)間
console.time(label) console.timeEnd(label)
我們只需在開(kāi)始和結(jié)束那里給同樣一個(gè)標(biāo)簽即可,中間放你想要計(jì)算執(zhí)行時(shí)間的任何代碼。
__filename和__dirnameconsole.log(__filename);// /Users/hwax/Desktop/My Project/avalon/hello.js console.log(__dirname);// /Users/hwax/Desktop/My Project/avalon __filename:開(kāi)發(fā)期間,該行代碼所在的文件。 __dirname:開(kāi)發(fā)期間,該行代碼所在的目錄。path.join([path1],[path2],[...])
合并參數(shù)得到一個(gè)標(biāo)準(zhǔn)化的路徑字符串 path.join("/foo", "bar", "baz/abc") // returns "/foo/bar/baz/abc"運(yùn)行hello world程序
首先在終端輸入:
trigkit4:~ trigkit4$ vi index.js
進(jìn)入vim后輸入i,進(jìn)入編輯模式,然后輸入:
var http = require("http"); http.createServer(function(req,res){ res.writeHead(200,{"Content-Type":"text/plain"}); res.end("Hello World "); }).listen(8124,"127.0.0.1"); console.log("Server running at http://127.0.0.1:8124/");
然后按ESC,退出編輯模式,輸入:w保存,再輸入:q退出
然后接著在終端輸入如下命令:
trigkit4:~ trigkit4$ node index
可以看到終端輸出了:
Server running at http://127.0.0.1:8124/
然后打開(kāi)瀏覽器,輸入地址即可看到輸出hello world
Node.js包目錄一般一個(gè)Node.js的包的根目錄結(jié)構(gòu)如下:
.gitignore —— 從git上忽略的文件清單 .npmignore —— 不包括npm注冊(cè)庫(kù)中的文件清單 LICENSE —— 包的授權(quán)文件 README.md —— 以markdown格式編寫(xiě)的readme文件 bin —— 保存包可執(zhí)行文件的文件夾 doc —— 保存包文檔的文件夾 examples —— 保存如何使用包的實(shí)例文件夾 lib —— 保存包代碼的文件夾 man —— 保存包的手冊(cè)頁(yè)的文件夾 package.json —— 描述包的json文件 src —— 保存C/C++源文件的文件夾 deps —— 保存包所用到的依賴文件夾 test —— 保存模塊測(cè)試的文件夾 index.js —— 包的入口文件 "scripts": {//“scripts”是一個(gè)由腳本命令組成的hash對(duì)象,他們?cè)诎煌纳芷谥斜粓?zhí)行。key是生命周期事件,value是要運(yùn)行的命令。 "test": "node ./libuv/test.js" }, "main": "index.js",//包的入口文件,如不指定,則為根目錄下的index.js
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/87656.html
摘要:有談?wù)劽嬖嚺c面試題對(duì)于前端面試的一些看法。動(dòng)態(tài)規(guī)劃算法的思想及實(shí)現(xiàn)方法幫大家理清動(dòng)態(tài)規(guī)劃的解決思路以及原理方法前端經(jīng)典面試題從輸入到頁(yè)面加載發(fā)生了什么這是一篇開(kāi)發(fā)的科普類文章,涉及到優(yōu)化等多個(gè)方面。極客學(xué)院前端練習(xí)題道練習(xí)題,面試季練練手。 由數(shù)據(jù)綁定和排序引入的幾個(gè) JavaScript 知識(shí)點(diǎn) 在 JavaScript 的數(shù)據(jù)綁定和做簡(jiǎn)單的表格排序中遇到的幾個(gè)知識(shí)點(diǎn) [[JS 基礎(chǔ)...
摘要:系列種優(yōu)化頁(yè)面加載速度的方法隨筆分類中個(gè)最重要的技術(shù)點(diǎn)常用整理網(wǎng)頁(yè)性能管理詳解離線緩存簡(jiǎn)介系列編寫(xiě)高性能有趣的原生數(shù)組函數(shù)數(shù)據(jù)訪問(wèn)性能優(yōu)化方案實(shí)現(xiàn)的大排序算法一怪對(duì)象常用方法函數(shù)收集數(shù)組的操作面向?qū)ο蠛驮屠^承中關(guān)鍵詞的優(yōu)雅解釋淺談系列 H5系列 10種優(yōu)化頁(yè)面加載速度的方法 隨筆分類 - HTML5 HTML5中40個(gè)最重要的技術(shù)點(diǎn) 常用meta整理 網(wǎng)頁(yè)性能管理詳解 HTML5 ...
摘要:系列種優(yōu)化頁(yè)面加載速度的方法隨筆分類中個(gè)最重要的技術(shù)點(diǎn)常用整理網(wǎng)頁(yè)性能管理詳解離線緩存簡(jiǎn)介系列編寫(xiě)高性能有趣的原生數(shù)組函數(shù)數(shù)據(jù)訪問(wèn)性能優(yōu)化方案實(shí)現(xiàn)的大排序算法一怪對(duì)象常用方法函數(shù)收集數(shù)組的操作面向?qū)ο蠛驮屠^承中關(guān)鍵詞的優(yōu)雅解釋淺談系列 H5系列 10種優(yōu)化頁(yè)面加載速度的方法 隨筆分類 - HTML5 HTML5中40個(gè)最重要的技術(shù)點(diǎn) 常用meta整理 網(wǎng)頁(yè)性能管理詳解 HTML5 ...
摘要:希望幫助更多的前端愛(ài)好者學(xué)習(xí)。前端開(kāi)發(fā)者指南作者科迪林黎,由前端大師傾情贊助。翻譯最佳實(shí)踐譯者張捷滬江前端開(kāi)發(fā)工程師當(dāng)你問(wèn)起有關(guān)與時(shí),老司機(jī)們首先就會(huì)告訴你其實(shí)是個(gè)沒(méi)有網(wǎng)絡(luò)請(qǐng)求功能的庫(kù)。 前端基礎(chǔ)面試題(JS部分) 前端基礎(chǔ)面試題(JS部分) 學(xué)習(xí) React.js 比你想象的要簡(jiǎn)單 原文地址:Learning React.js is easier than you think 原文作...
閱讀 1839·2021-09-22 15:55
閱讀 3526·2021-09-07 10:26
閱讀 633·2019-08-30 15:54
閱讀 690·2019-08-29 16:34
閱讀 844·2019-08-26 14:04
閱讀 3265·2019-08-26 11:47
閱讀 2139·2019-08-26 11:33
閱讀 2299·2019-08-23 15:17