送給Node.js新手的7個開發小技巧
或者當我開始學習的時候,我希望知道的。
Node.js的開發相當有趣和令人愉快的。有超過3萬5千個模塊可供選擇,并且更重要的是用node開發的很容易擴展。
對于剛接觸 Node.js 的開發者,免不了一些磕磕碰碰。在這篇簡短的文章中,我提到了一些我學習 Node.js 時遇到的問題。
技巧 1 :開發環境使用 nodemon
,生產環境使用 pm2
當你著手 Node.js 開發時,非常尷尬的是,必須一遍又一遍的運行 node [file].js 。在我開始學 node 時,這點相當令我很不耐煩。特別是每次修改一點東西,都要 control + C一下 。幸運的是我發現了一個非常棒的工具 Nodemon 。運行以下命令安裝它:npm install -g nodemon
Nodemon 是個很好的工具,一旦全局安裝了它,你可以通過 nodemon [file].js 運行 node.js 腳本。nodemon 會監控你的代碼,以及所有依賴代碼的變化。如此開發 Node.js ,開發效率瞬間提高。
生產環境呢?除非你用了 Heroku,Nodejitsu 或者其它不錯的 Node.js 托管服務,否則你可以試試 EC2 或者其它的云服務,通過它們運行你的 Node.js 應用。如何保證 Node.js 應用一直運行呢?PM2 像 nodemon ,用于在生產環境運行 node 應用。它會監控你的 app 變化并重新部署它們,不同之處在于,如果 PM2 遇到事故,它將立刻重啟你的 node.js 應用。
當你的應用需要多核處理的時候,凸顯出了 PM2 的優勢。PM2 內部集成的“負載均衡”讓你輕松指定 Node 應用運行幾個實例。
pm2 start app.js -i max
-i
參數用來指定運行多少個實例,此例中 PM2 使用了一個常量 max
自動擴展你的 app 運轉到最大核數,不要忘記 Node 平時只運行在單核上!
技巧 2 :Async 或者 Q
越早寫 node.js 應用,越會盡早領略回調之痛。這有一個例子:
function register(name, password, cb){ checkIfNameExists(name, function(err, result){ if(err){ return cb(“error”); } checkIfPasswordGood(password, function(err, result){ if(err){ return cb(“error”); } createAccount(name,password, function(err,result){ if(err){ return cb(“error”); } createBlog(name, function(err, result){ sendEmail(name, function(err, result){ callback(result); }); }); }); }); }); }
不怎么美的代碼的確存在,但你如何避免呢?
一種簡單的方式是用 events
,我個人不建議這么做,它違背了一個函數的觀點,可以用 events 調用只有一個用途的私有方法。
所以怎么做呢?有兩個相互競爭的庫:async.js
和 Q
,它們均可以避免回調出現。
Async.js 或者 “async”可以輕松執行連續或者平行的函數,不需要一層一層的嵌套。
下面是 Async 支持的模式,readme 有記錄。想了解 async 支持的所有模式,看看它們的代碼倉庫。
async.map([‘file1',’file2',’file3'], fs.stat, function(err, results){ // results is now an array of stats for each file }); async.filter([‘file1',’file2',’file3'], fs.exists, function(results){ // results now equals an array of the existing files }); async.parallel([ function(){ … }, function(){ … } ], callback); async.series([ function(){ … }, function(){ … } ]); async.waterfall([ function(callback){ callback(null, ‘one’, ‘two’); }, function(arg1, arg2, callback){ callback(null, ‘three’); }, function(arg1, callback){ // arg1 now equals ‘three’ callback(null, ‘done’); } ], function (err, result) { // result now equals ‘done’ });
如果我們用 async 的 waterfall 來修改之前的例子,代碼將更加易讀,再也不會涉及死亡金字塔了。
另一個很好的庫是 Q ,這個庫用到了 promises 的概念。Promise 是一個含有‘promise’方法的返回對象,他提供了一個最終返回值,非常優雅的將 javascripts 的異步特性和 node.js 緊密聯系起來。
從 Q 的代碼倉庫中拿來的例子。
promiseMeSomething() .then(function (value) { }, function (reason) { });
promise me 函數立刻返回一個對象,調用 then 將返回傳入 value 值的函數。它也帶一個回調函數,處理未能返回值的情況。
用非常整潔的方式避免了回調。如果重寫原來的例子,當 then
執行的時候才調用每個函數。
Q.fcall(checkIfNameExists) .then(checkIfPasswordIsGood) .then(createAccount) .then(createBlog) .then(function (result) { // Do something with the result }) .catch(function (error) { // Handle any error from all above steps }) .done();
如前面所說,我不喜歡創建單一目標函數。取而代之,用 “then”傳遞函數,僅傳遞一個匿名函數,當然選擇器在你手中。
總之,當你掉入回調地獄時,是該關注下 async.js 或者 Q 了。
“我個人喜好?一直是 Q!”
技巧 3 :輕松調試 Node.js 應用
如果你從一個 IDE 重度集成的語言比如 java 或者 C# 轉來調試 Node.js,你一定會感到很困擾。大多數新的 node 開發者采用 “flow”調試模式,你最好的幫手是 console.log 。
但是肯定有更便利的調試方式,Node.js 內置了一個調試器你可以叫它 node debug,不過我更喜歡的 node-inspector
。
它們的 github 倉庫提到“Node Inspector 是使用了 Blink 開發工具的 node.js 調試工具界面(先前的 WebKit Web Inspector)。”
簡而言之,無論你選擇哪個編輯器和 chrome web tools ,node-inspector 都可以調試你的應用。Node Inspector 可以做一些真正酷的東西,比如實時代碼修改,單步調試,作用域注入和一堆很酷的功能。
它涉及到一些設置,可以按照這里 https://github.com/node-inspector/node-inspector 的說明做。
技巧 4 :Nodefly
一旦你的應用正常運行,你可能會問自己,如何監控它的性能,如何通過分析確保它以最佳速度運行呢。最簡單的回答是使用非常棒的 Nodefly 服務。
通過一行簡單的代碼,Nodefly 開始監控應用程序的內存泄露, 測量 redis 用了多久,mongo 查詢和一堆其他很酷的東西。
http://www.nodefly.com/
技巧 5 :用 NPM 管理模塊
node 最尋常的事情之一是通過 NPM 安裝程序包。Node 有個神奇的包管理器,它會安裝 package.json 清單文件里指定的模塊。可是初學者都會遇到一件事情,package.json 文件中所有使用的模塊如何保持最新。
總是打開 package.json 更新已安裝模塊的依賴屬性似乎很痛苦,很多人不知道 npm 可以幫你做這些!
簡單運行 npm install?—?save module_name ,npm 將自動更新帶有正確模塊和版本號的 package.json
npm install —save module_name
技巧 6 :不要提交 node_modules 文件夾
我們一直談論模塊和 npm ,還有人不知道不該提交 node_modules 文件夾,最大的原因是沒有必要提交。當別人檢出你的代碼,他們可以用 npm 安裝所需模塊。
你也許會說提交 node_modules 文件夾無傷大雅,但是如果檢出你代碼的人用跟你不同的操作系統呢,通過 npm 安裝的模塊是編譯過的?你的應用會崩潰,檢出你代碼的人完全不知道為什么!
舉例來說,當你安裝過 bcrypt 和 sentimental 模塊后,它們在主機上是編譯過的,因為它們的原始組件是用 C 寫的。
最優的作法是把 node_modules 文件夾加到 .gitignore 里,避免提交它。
// .gitignore node_modules/*
技巧 7 :不要忘記 return
剛入門的 node 開發者通常容易犯個錯誤,callback 回調函數后面忘加 return 。雖然有時候沒什么影響,多數情況你會遇到奇怪的問題,callback 回調執行了兩次。
看個簡單的例子:
function do(err,result, callback){ if(err){ callback(“error”); } callback(“good”); }
乍一看,沒什么問題。如果有錯誤,把 “error”傳入 callback,沒錯則傳遞“good”。但是調用 callback 以后并沒有停止執行,會接著調用 callback(“good”) 。在復雜的代碼中,加上 return 會節約數小時的調試時間。
Node.js 是個很贊的開發平臺,如果你謹記這 7 條技巧,開發,調試和部署到生產環境時,可以節省不少時間,防止頭發盡早變灰白。
原文:https://medium.com/tech-talk/7-tips-for-a-node-dot-js-padawan/ by Faisal Abid
來自:http://www.lembed.com/7-node-js-skills/