我會(huì)在這篇文章中簡(jiǎn)述 10 個(gè)技巧,幫助你在 2017 年成為更好的 Node 開(kāi)發(fā)者。這些技巧有一些是我在實(shí)踐中學(xué)習(xí)和領(lǐng)悟的,還有一些從優(yōu)秀的 Node 和 npm 模塊作者那里借鑒而來(lái)。本文的內(nèi)容包含如下一些:
避免過(guò)于復(fù)雜 — 把代碼按盡可能小的塊來(lái)組織。
使用異步代碼 — 避免像災(zāi)難一樣的同步代碼。
避免阻塞請(qǐng)求 — 把所有 require 語(yǔ)句放在文件的頂部,因?yàn)樗鼈兪峭降?,?huì)阻塞執(zhí)行中的程序。
了解 require 會(huì)被緩存 — 這會(huì)在你的代碼中起到正面或負(fù)面的作用。
總是檢查錯(cuò)誤 — 錯(cuò)誤不是足球,不要拋棄錯(cuò)誤,也不要跳過(guò)錯(cuò)誤檢查。
只在同步代碼中使用 try…catch — try...catch 對(duì)異步代碼無(wú)效,而且 V8 也不能像優(yōu)化普通代碼一樣優(yōu)化 try...catch。
返回回調(diào)或使用 if … else — 確定返回回調(diào)阻止繼續(xù)執(zhí)行程序。
監(jiān)聽(tīng)錯(cuò)誤事件 — 幾乎所有 Node 的類(lèi)/對(duì)象都從 EventEmitter 繼承(觀察者模式),并觸發(fā)錯(cuò)誤事件。請(qǐng)確認(rèn)監(jiān)聽(tīng)了這些事件。
了解 npm — 安裝模塊時(shí)使用 -S 或 -D,而不是 --save 或 --save-dev
在 package.json 中使用確定的版本:npm 會(huì)在你使用 -S 的時(shí)候選用默認(rèn)版本,這很愚蠢。所以你需要手工修改版本號(hào)。不要相信 semver[譯者注:語(yǔ)義化版本標(biāo)準(zhǔn)],但在開(kāi)源模塊中需要這樣做。
加分 — 使用不同的依賴(lài)。把項(xiàng)目在開(kāi)發(fā)階段需要的東西放在 devDependencies 中,記得使用 npm i --production。多余的依賴(lài)越多,出現(xiàn)問(wèn)題的風(fēng)險(xiǎn)就越大。
我們應(yīng)該分別看待上述每一條,不是嗎?

避免過(guò)于復(fù)雜
Isaac Z. Schlueter,是 npm 的創(chuàng)造者,我們來(lái)看看他寫(xiě)的代碼。例如,用 use-strict 在模塊中強(qiáng)制實(shí)施 JavaScript 嚴(yán)格模式,只需要三行代碼:
var module = require('module')module.wrapper[0] += '"use strict";'Object.freeze(module.wrap)
為什么要避免復(fù)雜性呢?美國(guó)海軍傳說(shuō)中,有一句短語(yǔ)很著名:化繁為簡(jiǎn),返璞歸真。(或者“保持簡(jiǎn)單,蠢貨!”)。因?yàn)槭聦?shí)證明,人的大腦在同一時(shí)刻只能記憶 5 到 7 項(xiàng)內(nèi)容。
把代碼模塊化為更小的部分,你和其它開(kāi)發(fā)者才能更好的理解它。這樣你也可以更好的測(cè)試它。看看這個(gè)例子:
app.use(function(req, res, next) { if (req.session.admin === true) return next() else return next(new Error('Not authorized'))}, function(req, res, next) { req.db = db next()})
或者這個(gè):
const auth = require('./middleware/auth.js')const db = require('./middleware/db.js')(db)app.use(auth, db)
我相信大多數(shù)人會(huì)更喜歡第2個(gè)例子,尤其是在名稱(chēng)可以自解釋的時(shí)候。當(dāng)然,如果你在寫(xiě)代碼,你會(huì)想知道它的工作方式。有時(shí),你可能會(huì)耍耍小聰明,將多個(gè)方法在同一行里進(jìn)行鏈?zhǔn)秸{(diào)用。不過(guò),請(qǐng)按最簡(jiǎn)單的方式編寫(xiě)代碼。因?yàn)樵跁r(shí)隔 6 個(gè)月,或在你喝醉或極度興奮的時(shí)候,再來(lái)看你寫(xiě)的這些代碼,可能你自己都難以理解,更不用說(shuō)那些不了解它的算法和復(fù)雜性的同事了。簡(jiǎn)單做事,尤其是在使用 Node 的異步方式的時(shí)候。