送給Node.js新手的7個開發小技巧

jopen 10年前發布 | 30K 次閱讀 Node.js

nodejs.png

 

或者當我開始學習的時候,我希望知道的。

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.jsQ ,它們均可以避免回調出現。

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/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!