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