本文主要討論一些進行Node.js開發的最佳實踐和建議,這些建議不僅僅適合開發者, 還適合那些管理與維護Node.js基礎架構的工作人員。遵循本文提供的這些建議, 能夠讓你更好的進行日常的開發工作。
在2015年的夏天,ES2015的最終草案(即ES6)正式發布了。該版本為JavaScript語言增加了大量的新的語言特性,主要包括:
以及很多其他特性。一個更加完整的新特性的列表你可以從Kyle Simpson的ES6 and Beyond中進行了解。 並且它們中的絕大部分特性已經被加入到了Node.js v4中。
在客戶端,你也可以借助Babel來使用ES6的所有新特性,Babel是一個JavaScript轉譯器。目前在服務器端, 我們只傾向於使用那些被加入到最新的穩定版本的特性,這樣無需轉譯代碼,這可以避免出現那些令我們頭疼的潛在問題。
對於Node.js中的ES6的更多信息,你可以訪問官方站點:https://nodejs.org/en/docs/es6/
在去年,我們可能會推薦你為你的模塊暴露錯誤優先的回調接口。但是隨著生成器函數的正式標准化,並且異步函數也即將到來, 因此我們現在建議你在編寫模塊的接口時應該暴露支持Promise的的錯誤優先的回調函數。
為什麼需要這樣?首先回調接口是為了提供向後兼容性,為了能夠在未來能夠獲得更好的兼容性,需要同時提供Promise支持。
你可以參考下面的例子來進一步的理解具體應該如何進行編程。在這個例子中readPackage
函數讀取了package.json
文件, 並同時通過Promise和回調接口返回了它的內容。
const fs = require('fs');
function readPackage (callback) {
// as of now we do not have default values in Node.js
callback = callback || function () {}
return new Promise((resolve, reject) => {
fs.readFile('./package.json', (err, data) => {
if (err) {
reject(err);
return callback(err);
}
resolve(data);
return callback(null, data);
})
})
}
module.exports.readPackage = readPackage;
在Node.js中,很長一段時間你只有兩種方法來管理異步流:回調或者流(Stream)。對於回調函數而言, 你可以使用類似於async這類庫, 對於流而言,有through、bl、highland等庫可以選擇。
但是隨著Promise、生成器、異步函數等被逐漸引入進標准的ECMAScript,JS中的流程控制也得到了極大的改善。
關於異步JavaScript的發展歷史,你可以參考異步JavaScript的發展歷程這篇博文。
錯誤處理在應用開發過程中起著至關重要的作用:確定應用崩潰的時間,或者僅僅是打印錯誤信息,確保應用繼續運行都是有一定難度的。
為了能夠更簡單的說明這個問題,我們決定將其分為兩種:程序員錯誤(programmer errors)和運算錯誤(operational errors)。
程序員錯誤就是我們所說的bug,由於你不知道程序運行的確切狀態因此當出現錯誤時你最好立刻停止應用的運行(crash the process)。
另一方面,運算錯誤是由於系統或者遠程服務本身所導致的問題。例如:請求超時和內存不足等。基於錯誤發生的特點,你可以對症下藥, 然後重試,例如文件丟失,你可以去創建相應的文件。
如果一個錯誤發生在異步操作的過程中,錯誤對象應該作為異步函數的第一個參數進行傳遞。你必須始終要檢查該錯誤對象並進行錯誤處理。
在前面的有關回調約定的例子裡面已經展示了如何在回調函數中進行錯誤的優先處理。
如果是下面的代碼片段會發生什麼情況?
Promise.resolve(() => 'John')
.then(() => {
throw new Error('ops');
})
.catch((ex) => {
console.log(ex);
})
.then(() => {
throw new Error('ups');
console.log(Doe');
})
[Error: ops]
的確沒有什麼了 - 最後一個被拋出的錯誤將會是靜默的。你需要注意,你應該始終以一個catch語句作為promise鏈的最後一環。 這會為你解決很多頭疼的問題。像下面這樣:
Promise.resolve(() => 'John')
.then(() => {
throw new Error('ops');
})
.catch((ex) => {
console.log(ex);
})
.then(() => {
throw new Error('ups');
console.log(Doe');
})
.catch((ex) => {
console.log(ex);
});
現在會輸出如下內容:
[Error: ops]
[Error: ops]
在過去幾年中,我們會使用JSHint、JSCS、ESLint等非常有用的代碼質量工具來盡可能的自動化檢查我們的代碼。
最近,當談到代碼風格的時候,我們使用feross的JavaScript標准風格。
原因是它非常的簡單:無需任何配置文件,只需要將其放到項目中。主要包括如下一些規則:
if (condition) { ... }
function name (args) { ... }
===
代替==
,但是可以使用obj == null
來檢查null || undefined
。err
函數參數window
前綴,除了document
和navigator
open
、length
、evet
、name
等走位浏覽器全局變量。當然,如果你的 編輯器只支持ESLint的話,這裡有一個ESLint的規則庫用於使用標准風格,即eslint-plugin-standard。 安裝了這個插件後,你的.eslintrc
文件可以是下面這樣的:
{
"plugins": [
"standard"
],
}
如今,軟件通常會作為一種服務來交付,它們被稱為網絡應用程序,或軟件即服務(SaaS)。 12-Factor應用宣言描述了進行Web應用開發的最佳實踐:
這套理論適用於任意語言和後端服務(數據庫、消息隊列、緩存等)開發的應用程序。
始終通過npm init
命令來開始一個新項目。這可以為你的項目創建一個初始的package.json
。
如果你想跳過初始的提問並直接使用默認的配置,只需要運行npm init --yes
即可。
當發生某個故障或是故障即將發生時,及時的通知你,能夠為你挽回損失。
為了進行應用的監控,你可以使用類似的SaaS產品或是開源軟件。在開源軟件方面,主要包括:Zabbix, Collected, ElasticSearch和Logstash。
如果你不想要自己進行部署,可以考慮使用線上的服務,你可以嘗試使用Trace, 它是我們公司開發的Node.js和微服務監控解決方法。
盡可能的自動化一切東西。沒有什麼比讓開發來做應該讓grunt做的事情更無聊和令人惱火的了,這不僅浪費時間,而且沒有意義。
現如今JvavaScript的這類工具已經非常的豐富了,包括Grunt, Gulp, 和Webpack,你知道幾個就行。
在RisingStack,絕大部分的前端開發新項目都是使用Webpack來進行自動化構建,其他類型的則使用gulp實現自動化任務。 對於新手而言,Webpack可能會花費大量的時間去理解,所以我強烈建議你去閱讀一下Webpack Cookbook。
為了能夠更好的獲取穩定性和新特性,我們建議你使用最新的Node的LTS(長期支持)版本,它們是使用偶數發布編號的版本。 當然,你也可以自由的使用最新的實驗版本,即稱為穩定發布版本的使用奇數發布編號的。
如果你需要為多個項目工作,並且使用了不同的Node.js版本,建議你最好使用一個Node版本管理器——nvm。
更多信息你可以參考Node.js官方網站的發布信息:
What You Should Know about Node.js v5 and More
養成每周更新一次你的項目依賴的習慣。這方面,你可以使用npm outdated
或者是ncu包。
當我們談到Node.js和數據庫的時候,可能你想到的第一個技術是MongoDB。當然這並沒有什麼錯,但是你不應該直接就去使用它。 在這麼做之前你需要問你自己和你的團隊幾個問題。包括下面幾個:
可能你需要的僅僅是Redis,或者是如果你有結構化數據,那麼你要用的可能是PostgrelSQL。 如果你需要在Node.js中使用SQL的話,你可以看看knex。
語義版本控制是一種為了兼容性空啊率的使用三段式版本號的正式約定,即:
major.minor.patch
,分別為主版本,次版本,補丁。
如果是一個不會向後兼容(backward-compatible)的API變化使用主版本號。當添加新的特性且API變化是向後兼容的時候使用次版本號。 如果只是對Bug進行修復可以使用包版本號。
幸運的是,你可以使用semantic-release這個模塊自動化你的JavaScript的模塊發布。
下面關於Node.js的內容你可能也喜歡:
在 Ubuntu 14.04/15.04 上安裝配置 Node.js v4.0.0 http://www.linuxidc.com/Linux/2015-10/123951.htm
如何在CentOS 7安裝Node.js http://www.linuxidc.com/Linux/2015-02/113554.htm
Ubuntu 14.04下搭建Node.js開發環境 http://www.linuxidc.com/Linux/2014-12/110983.htm
Ubunru 12.04 下Node.js開發環境的安裝配置 http://www.linuxidc.com/Linux/2014-05/101418.htm
Node.Js入門[PDF+相關代碼] http://www.linuxidc.com/Linux/2013-06/85462.htm
Node.js開發指南 高清PDF中文版 +源碼 http://www.linuxidc.com/Linux/2014-09/106494.htm
Node.js入門開發指南中文版 http://www.linuxidc.com/Linux/2012-11/73363.htm
Ubuntu 編譯安裝Node.js http://www.linuxidc.com/Linux/2013-10/91321.htm
Node.js 的詳細介紹:請點這裡
Node.js 的下載地址:請點這裡