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