如何在2016年成為一個更好的Node.js開發者
本文提供的建議和最佳事件不僅僅適合開發者,還適合用于管理和維護Node.js基礎架構, 本文將會指導你更高的進行日常的開發工作,以及一些其他的建議。
Statement
原文地址:https://blog.risingstack.com/how-to-become-a-better-node-js-developer-in-2016/
使用ES2015
在2015年的夏天ES2015的最終草案(即ES6)正式發布了。在該版本中為JavaScript語言增加了大量的新的語言特性,主要包括:
- 箭頭函數
- 模版字符串
- rest operator(不定參數), argument spreading
- 生成器
- promises
- maps, sets
- symbols
以及很多其他特性。一個更加完整的新特性的列表你可以從 Kyle Simpson 的 ES6 and Beyond 中進行了解。 它們中的絕大部分特性被加入到了Node.js v4中。
在客戶端,你也可以借助Babel來使用ES6的所有新特性,Babel是一個JavaScript轉譯器。,目前為止, 在服務器端我們只傾向于使用那些被加入到最新的穩定版本的特性,而無需編譯代碼,避免出現那些令我們頭疼的潛在問題。
對于Node.js中的ES6的更多信息,你可以訪問官方站點: https://nodejs.org/en/docs/es6/
回調約定 - 同時支持Promise
在過去的一年,我們推薦你為模塊暴露錯誤優先的回調函數接口。由于生成器函數已經標準化了,并且異步函數也即將來臨, 因此你的模塊應該暴露同時支持Promise的錯誤優先的回調函數。
為什么?為了提供向后兼容性,因此回調函數接口必須要提供,為了能夠更好的為未來的兼容性做打算,你同時應該提供Promise支持。
為了說明如何達到這效果,可以參考如下的代碼。在這個例子中readPackage函數讀取了package.json文件, 并同時通過Promise和回調接口返回了它的內容。
異步模式
在Node.js中,很長一段時間你只有兩種方法來管理異步流:回調或者流(Stream)。對于回調函數而言, 你可以使用類似于 async 這類庫, 對于流而言,有 through 、 bl 、 highland 。
但是隨著Promise、生成器、異步函數等被逐漸引入進標準的ECMAScript,JS中的流程控制也得到了極大的改變。
關于異步JavaScript的發展歷史,你可以參考 異步JavaScript的發展歷程 這篇博文。
錯誤處理
錯誤處理在應用開發過程中起著至關重要的作用:確定應用崩潰的時間,或者僅僅是打印錯誤信息,確保應用繼續運行都是有一定難度的。
為了能夠更簡單的說明這個問題,我們決定將其分為兩種:程序員錯誤(programmer errors)和運算錯誤(operational errors)。
程序員錯誤就是我們所說的bug,由于你不知道程序運行的確切狀態因此當出現錯誤時你最好立刻停止應用的運行(crash the process)。
另一方面,運算錯誤是由于系統或者遠程服務本身所導致的問題。例如:請求超時和內存不足等。基于錯誤發生的特點,你可以對癥下藥, 然后重試,例如文件丟失,你可以去創建相應的文件。
在回調中進行錯誤處理
如果一個錯誤發生在異步操作的過程中,錯誤對象應該作為異步函數的第一個參數進行傳遞。你必須始終要檢查該錯誤對象并進行錯誤處理。
下面的代碼判斷顯示了進行錯誤優先的回調函數處理的例子:
在Promise中進行錯誤處理
如果是下面的代碼片段會發生什么情況?
- 在第3行會拋出一個異常。
- catch會處理它,并且在stdout中打印出:[Error: ops]
- 執行繼續,并且在第9行會拋出一個新的錯誤
- 沒有了
的確沒有什么了 - 最后一個被拋出的錯誤將會是靜默的。你需要注意,你應該始終以一個catch語句作為promise鏈的最后一環。 這會為你解決很多頭疼的問題。像下面這樣:
現在會輸出如下內容:
[Error: ops] [Error: ops]
使用JavaScript標準風格
在過去幾年中,我們會使用JSHint、JSCS、ESLint等非常有用的代碼質量工具來盡可能的自動化檢查我們的代碼。
最近,當談到代碼風格的時候,我們使用 feross 的 JavaScript標準風格 。
原因是它非常的簡單:無需任何配置文件,只需要將其放到項目中。主要包括如下一些規則:
- 使用2個空格作為縮進
- 字符串使用單引號 - 除了為了避免轉義
- 不要包括沒有被使用的變量
- 沒有分號
- 永遠不要以 ( 或者 [ 作為一行的開始
- 關鍵字后加空格if (condition) { ... }
- 函數名后加空格function name (args) { ... }
- 始終使用===代替==,但是可以使用obj == null來檢查null || undefined。
- 始終要處理Node.js的err函數參數
- 始終要為瀏覽器全局變量增加window前綴,除了document和navigator
- 盡可能避免使用類似于open、length、evet、name等走位瀏覽器全局變量。
當然,如果你的 編輯器只支持ESLint的話,這里有一個ESLint的規則庫用于使用標準風格,即 eslint-plugin-standard 。 安裝了這個插件后,你的.eslintrc文件可以是下面這樣的:
{ "plugins": [ "standard" ], }
The Twelve-Factor Application
開始新的項目
監控你的應用
使用構建系統
使用最新的長期支持(LTS)的Node版本
每周更新你的項目依賴
選擇合適的數據庫
使用語義版本號
閱讀
來自: http://wwsun.github.io/posts/become-a-better-node-developer-in-2016.html