寫給 Node.js 學徒的 7 個建議

一些我更願意在開始就知道東西利用 Node.js 開發是一個很是有趣,和使人知足的過程, 它有3萬多個模塊能夠選擇使用,而且全部的模塊能夠很是容易的集成入現有的應用之中。

不管如何,對於一些剛開始使用Node.js 開發的的人來講, 很容易碰壁,在這個文章中,我會提到在你學習過程當中遇到的問題。

貼士 1: 在開發環境使用 nodemon, 在生產環境使用pm2
當你第一次開發Node.js應用的時候, 其中一件事情就是一次又一次的運行[file].js 就和揭傷疤同樣。 當我第一次開發的node app時候,這個讓我感到異常挫敗和痛苦, 尤爲是每當我修改很小東西的時候須要control+c

幸運的是我發現了一個很是棒的工具Nodemon。 你能夠利用如下的命令來安裝javascript

  1. npm install -g nodemonjava

複製代碼node

Nodemon 是一個使人驚歎的工具, 當你全局安裝它之後, 能夠經過 nodemon [file].js 來啓動你的node.js scripts,它會告訴nodemon來監視你的script和scripts的全部變化, 這樣的Node.js開發方式很是震撼以及讓大大提升開發速度。

那麼,生產環境又如何, 除非你用了heroku,Nodejitsu或者其它一些好的 Node.js 平臺(也許它們有相似的功能), 可是碰巧你用了EC2 或者一些其它的雲平臺來運行你的Node.js app, 你如何能然保證這是一個始終運行的Node.js app

案就是PM2, PM2 是一個相似於Nodemon的工具,不一樣之處在於它用於生產環境, 和Nodemon類似的地方在於它會監控你的app的任何修改或者從新部署,可是有更好的一面, PM2 在遭遇到崩潰的時候,它會正確重啓你的app。

PM2的優勝之處在於當你要將app須要多核處理的時候,PM2內部集成的負載均衡可讓你很容易的去指定運行多少個實例。git

  1. pm2 start app.js -i maxgithub

複製代碼web

-i參數目的是指定運行多少個實例,在這個例子中 PM2 使用了一個常量max來擴展你的app運轉到你最大的核數,不要忘記Node 平時只會運行在單核!

貼士 2: Async 或者 Q
當你專一於寫了更多的node.js apps的時候,你確定領略了什麼是回調地獄。 若是你還不知道,這裏有一個例子:redis

  1. function register(name, password, cb){
    chrome

  2.   checkIfNameExists(name, function(err, result){
    npm

  3.    if(err){
    json

  4.     return cb(「error」);

  5.    }

  6.    checkIfPasswordGood(password, function(err, result){

  7.     if(err){

  8.      return cb(「error」);

  9.     }


  10.     createAccount(name,password, function(err,result){

  11.      if(err){

  12.       return cb(「error」);

  13.      }

  14.      createBlog(name, function(err, result){

  15.       sendEmail(name, function(err, result){

  16.        callback(result);

  17.       });

  18.      });

  19.     });

  20.    });

  21.   });

  22. }

複製代碼

這顯然不是一個有用或者使人折服的代碼, 反而進入一種回調地獄般兩難的境地,是你的話將如何避免

一個簡單的辦法是使用events, 可是我我的不建議這麼作,由於使用events來調用只有一個用途的私有方法,足以使人受挫

因此你該怎麼作 這裏有兩個編譯好的模塊,async.js和Q, 它們兩個均可以防止落入回調地獄

Async.js或者 ‘async’ 讓你能夠容易的執行一些連續或者平行的任務,在不依賴一個又一個的嵌套循環前提下。

下面是一些來自Async的readme,寫明瞭它支持的模式, 如需獲取所有的支持方式請去它們的github主頁查看。

  1. async.map([‘file1',’file2',’file3'], fs.stat, function(err, results){

  2.   // results is now an array of stats for each file

  3. });


  4. async.filter([‘file1',’file2',’file3'], fs.exists, function(results){

  5. // results now equals an array of the existing files

  6. });


  7. async.parallel([

  8.   function(){ … },

  9.   function(){ … }

  10.   ], callback);


  11. async.series([

  12.   function(){ … },

  13.   function(){ … }

  14.   ]);


  15. async.waterfall([

  16.   function(callback){

  17.    callback(null, ‘one’, ‘two’);

  18.   },

  19.   function(arg1, arg2, callback){

  20.    callback(null, ‘three’);

  21.   },

  22.   function(arg1, callback){

  23. // arg1 now equals ‘three’

  24. callback(null, ‘done’);

  25. }

  26. ], function (err, result) {

  27. // result now equals ‘done’ 

  28. });

複製代碼

若是咱們用async的waterfall來修改以前的例子,結果將更加容易閱讀, 不再用讓你的代碼看起來像一個死亡金字塔。

另外一個重要的庫叫作Q。 這個庫是一個暴漏promises的概念, Promise 是一個含有’promise’方法的返回對象,它提供了一個最終的返回值,很是優雅的將javascripts的異步和node.js緊密聯繫在一塊兒。

For example, taken from Q’s repo page.

  1. promiseMeSomething()

  2. .then(function (value) {

  3. }, function (reason) {

  4. });

複製代碼

這個 promise me 方法 正確返回了一個對象, 對象將在傳入value的時候調用這個方法當,而且它提供了一個額外的callback來處理失敗後的返回值

這是一個很是有條理的方式來避免回調地獄,若是你重寫咱們以前的那個例子,你能夠很是容易的讓這些函數正確被調用並執行。

就和我以前說的同樣, 我很不肯建立只有一個用途的一堆功能,相反的在’then’以後傳入一個方法名,僅僅建立了一個匿名的內部功能和傳遞,固然了選擇權始終在你手裏。

總的來講,當你落入回調地獄的時候,是時候去看看 async.js或者Q吧。

個人選擇 固然是 Q

貼士 3: 輕鬆調試 Node.js apps
若是你從一個IDE重度集成的語言好比java 或者C# 轉來調試Node.js, 你必定會感到很困擾, 大部分新加入node的開發者採用了’flow’的調試模式,從這一刻開始你最好的朋友就是console.log

可是依然有更常見的調試方式來代替, Node.js 內置了一個調試器你能夠稱爲 node debug, 不過我更喜歡的 node-inspector

它們的github說 「Node Inspector 是一個使用Blink Developer Tools (之前稱爲WebKit Web Inspector)node.js調試器的界面,」簡而言之,node-inspector 可讓你用任何你想用的編輯器和chrome web tools來調試你的應用,這是多麼的性感。

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的manifest文件中的模塊。然而,全部初學者都會碰上保持的package.json文件中您所使用的全部的模塊都是最新版。

這彷佛是一個痛苦的過程,老是打開的package.json來更新新模塊的依賴,但許多人不知道的是npm會爲你作這個!

很是簡單運行 npm install – save module_name 而後 npm將自動更新你的package.json 包含正確的模塊和版本,

  1. npm install - save module_name

複製代碼


貼士 6: 不要檢查node_modules 文件夾

雖然咱們的話題一直是modules和npm,可是並非不是不少人都知道,你不該該提交node_modules文件夾。這背後最大的緣由是,沒有必要提交這個文件夾。只要有人下載你的代碼,它們可經過運行NPM來安裝和下載全部須要的模塊。

您可能會說,它是否是一個大問題,若是檢查node_modules,可是,若是下載代碼的人使用了和你編譯modules不同的操做系統的來安裝經過NPM?你的應用程序將會崩潰,下載代碼的人將不知道爲何會如此!

舉個例子bcrypt以及sentimental若是當在您安裝在主機系統上編譯它們,由於它們用了本地C語言組件來編譯。避免檢查node_modules文件夾的方式是加入.gitignore

  1. // .gitignore node_modules/*

複製代碼


貼士 7: 別忘記返回

初學者常常犯一個很常識的錯誤,就是忘記callback後的返回值,雖然有些時候,這沒有影響,有不少時候,你會遇到奇怪的問題,由於你的回調被調用兩次。

讓咱們看一個簡單的例子

  1. function do(err,result, callback){

  2.    if(err){

  3.       callback(「error」);

  4.   }

  5.   callback(「good」);

  6. }

複製代碼

乍一看,這個片斷是有道理的。若是有錯誤,在回調中發送「錯誤。若是不發送return,調用callaback後這個函數不會停下來。它只是將移動到調用回callback(「good」)。這樣作在長期和複雜的代碼行裏面會節省幾個小時的調試。

相關文章
相關標籤/搜索