<header class="G-can-be-select is-share" style="display: block; margin: 0px; outline: 0px; border: 0px; padding: 0px; vertical-align: baseline; font-size: 16px; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); user-select: auto; text-align: center; color: rgb(0, 0, 0); font-family: "Helvetica Neue", Roboto, "microsoft yahei"; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(250, 250, 250); text-decoration-style: initial; text-decoration-color: initial;">
挑選npm模塊很費事?掌握這些技巧就能事半功倍!
前端之巔

2019-08-09
</header>
<article class="undefined _3rEWv content G-can-be-select" style="display: block; margin: 0px; outline: 0px; border: 0px; padding: 0px; vertical-align: baseline; font-size: 16px; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); user-select: auto; line-height: 1.5556; word-break: break-word; text-align: justify; color: rgb(36, 36, 36); font-family: "Helvetica Neue", Roboto, "microsoft yahei"; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(250, 250, 250); text-decoration-style: initial; text-decoration-color: initial; max-height: initial;">
[圖片上傳失敗...(image-9eda39-1565682273290)]
作者 | coreyc
譯者 | 王強
編輯 | Yonie
熟悉 Node 或前端 JavaScript 工作的同學(xué)都知道,社區(qū)中的可用模塊有數(shù)十萬之多。
開發(fā)人員經(jīng)常會提問或抱怨,比如說:
“開發(fā)易,選模塊難......”
“X 模塊和 Y 模塊區(qū)別在哪里,哪一個更好?”
“npm 很好用,可是那些模塊指不定半年一年多就沒用了,具體看它們的支持情況。”
在談到這些問題時,你通常會得到十個不同的答案。每個人都會向你推薦他最寶貝的模塊,然后大家就會為哪個模塊是最好的這個話題吵得不可開交。
選擇 npm 模塊時容易遇到“分析癱瘓”這種情況??蛇x項實在太多了,還總有一大堆新模塊被吹成是“你,值得擁有”,想要為自己的項目選出合適的模塊實在不是件容易的事情。而且許多模塊做的事情都是差不多(或者完全一樣)的,更給人添亂。
其實你用不著浪費時間在谷歌或 npmjs.org 上亂搜一通,影響你的應(yīng)用構(gòu)建工作;你要做的就是知道在什么時候選擇哪些模塊。
精選列表
為了幫你解決這個問題,本文針對各種最常見的問題類型制作了一份模塊列表(例如 Web 框架、模板、身份驗證等),并告訴你這些模塊應(yīng)該何時使用。
有一些注意事項:有些模塊你可能已經(jīng)很熟悉了,但有時你會遇到完全陌生的技術(shù)棧(比如說身份驗證或 Web Socket 之類),這時候你需要知道用哪些模塊可以完成工作。你可能覺得某款模塊更出色。也可能你的用例 / 需求不在下面的列表里。我并沒有在每個分類下塞一堆選項,而是盡量精簡,避免陷入分析癱瘓的陷阱。如果你的場景比較特殊,那么就得自己做些調(diào)查來做補充了;這個列表的目的是讓你更快地投身工作。
這些模塊是基于下面的原則挑選出來的:
它們完成工作的能力如何。
社區(qū)規(guī)模(對支持 / 故障排除很重要)。
積極維護
如果你還是覺得信息不足,難下決定,我建議使用 slant.co 和 nodejs.libhunt.com 來做比較。npmtrends.com 這個網(wǎng)站可以對比不同包的下載量 / 問題數(shù) /GitHub 星數(shù),也很有用(感謝 Bill 推薦)。
注意:為了控制范圍,記住這些模塊都是服務(wù)端的。很多模塊既能在客戶端也能在服務(wù)端使用,但總的來說是“服務(wù)端優(yōu)先”原則。
HTTP 請求
Request:
需要發(fā)起基于回調(diào)的 HTTP 請求時使用,例如從一個 REST 服務(wù)到另一個 REST 服務(wù)。
Axios:
需要發(fā)起基于 Promise 的 HTTP 請求時使用。
注意:可以使用 request-promise,但 axios 的依賴項更少,而且是基于原生 Promise 的。
Web 框架
Express:
你的 API、網(wǎng)站或單頁應(yīng)用需要一個輕量級 Web 框架時用它。
你不介意使用開箱即用的回調(diào)來實現(xiàn)異步。
你希望有一個搭配框架使用的豐富的模塊生態(tài)系統(tǒng)。
你希望框架有一個大型社區(qū)來提供支持并排除故障。
Koa:
你想要比 Express 還輕量的框架時就選它。
Koa 更像是一個中間件層,不提供開箱即用的模板或路由,更適合 API 開發(fā)。
你想要開箱即用的 async/await 支持。
Hapi:
你想要一個比 Express 或 Koa 有更多“部件”的框架時選它,但它集成的東西沒 Sails 那么多。
Sails:
你想要像 Rails 之類的東西時就用它,它集成了一大堆東西(但其中有很多可能是你用不著的)。
驗證
Ajv:
在需要驗證 JSON 時使用(例如來自一個 Web 請求的 JSON)。
你想與應(yīng)用程序的非 JS 部分共享這些 schema(它是 JSON,所以你可以這樣做)。
Joi:
你需要驗證輸入并且喜歡它下面這種樣式時就用它
它不是在 JSON 中定義 schema
你正在使用 Hapi(Joi 自帶它,開箱即用)
身份驗證
Passport:
需要為你的網(wǎng)站或 API 使用身份驗證中間件時用它。
你希望能選擇多種身份驗證類型(Oauth,F(xiàn)acebook 等)。
你需要管理會話。
異步
Async(庫):
你需要使用只支持回調(diào),不支持 Promise 的舊版 Node 時選它
ES6 原生 Promise(原生 JS,不是 npm):
使用 Node 0.12 以上版本時用它。
還要考慮你的團隊是否熟悉 Promise?,F(xiàn)在大多數(shù)開發(fā)者應(yīng)該都很熟悉了。
async/await(原生 JS,不是 npm):
你好容易逃離了回調(diào)地獄,結(jié)果又掉進(jìn) Promise 地獄的時候用它。
你有很多來自 Promise 的.then 和.catch
數(shù)據(jù)庫
下面列出了數(shù)據(jù)庫驅(qū)動程序、ORM 和查詢構(gòu)建器等內(nèi)容。先別急著找 ORM,我強烈建議你先確認(rèn)自己的確用得著 ORM 再說。很多時候用原始的 SQL 或查詢構(gòu)建器就夠了,而 ORM 會加入另一層抽象,性價比不夠高。
mysql、node-postgres:
在不需要完整的 ORM 時使用,它們使用原始的 SQL 查詢數(shù)據(jù)庫(這些是驅(qū)動程序)
node-mongodb-native:
在不需要完整的 ORM 時使用,它會直接查詢 MongoDB
Mongoose:
你更想在 MongoDB 上使用 ORM 時用它
Knex:
你不需要完整的 ORM 解決方案,只是想在寫查詢代碼時方便一些就用它。
Knex 是一個生成 SQL 的查詢構(gòu)建器。
你有一個 Postgres、MSSQL、MySQL、MariaDB、SQLite3、Oracle 或 Amazon Redshift 數(shù)據(jù)庫。
Objection.js:
你想要一個支持 Knex 所有功能的 ORM,不用查詢 DSL(所以你寫的代碼更接近原始 SQL),還有一個基于 Promise 的 API 和詳盡的文檔。
進(jìn)程管理
想要對比進(jìn)程管理器的話,可以參考 http://strong-pm.io/compare/。注意:它們還會同時對比 StrongLoop 進(jìn)程管理器,后者挺好用但是有些復(fù)雜。我建議你先找找解決方案,然后再決定是否使用 StrongLoop。
PM2:
你需要一個能夠在服務(wù)崩潰時重新啟動服務(wù),并能用來控制集群的進(jìn)程管理器時選它。
注意:據(jù)說 PM2 可能違反 AGPL 許可證,相關(guān)討論可以看 這里。我認(rèn)為它用起來沒什么問題。但如果你有問題 / 疑慮就請咨詢你的法律部門,因為我不是律師。
forever:
你想要一個能在服務(wù)崩潰時重啟服務(wù)的進(jìn)程管理器時可以選它。
你的部署比較?。ㄖС旨旱?pm2 適用于更大規(guī)模的部署)。如果你只有少量服務(wù) / 進(jìn)程,那么用 forever 就很合適。
nodemon:
你想監(jiān)視應(yīng)用程序中的任何代碼更改,并在本地開發(fā)時自動重啟服務(wù)器時用它。
它非常適合開發(fā)工作!
Web Socket
Web Socket 這里我單推 primus。它支持所有流行的 Web Socket 實現(xiàn),而且更新維護很勤快;如果你想換個庫用,那么改一行代碼就能輕松切換不同的庫了。
Primus:
你需要 Web Socket,但又不想局限在某個特定的 Web Socket 實現(xiàn)時用它。
API 文檔
Swagger-node:
你需要為 REST API 編寫文檔,并需要針對端點測試請求時用它。
實用程序 / 雜項
Lodash:
在需要 JS 實用程序庫時使用。
你使用了大量的 OOP。
Ramda:
你想用更加函數(shù)式的風(fēng)格編程,用函數(shù)組合寫代碼時用它。
你想在函數(shù)式編程中使用 lodash 一類的東西。
Moment:
在需要解析、驗證、操作和顯示日期 / 時間時使用。
UUID:
需要很難破解的隨機、獨特的 id 時用它。
NVM:
你希望能在環(huán)境中安裝的多個版本 Node 之間切換時用它。
FS-EXTRA:
你需要遞歸 mkdir、rm -rf 和 Node 中缺少的其他文件系統(tǒng)實用程序時用它。
Nodemailer:
需要從 Node 中發(fā)送電子郵件時使用。
Dotenv:
需要將.env 文件中的環(huán)境變量加載到 process.env 時使用。
CLI
Commander:
你要構(gòu)建一個 CLI 實用程序,將所有參數(shù)作為命令行上的標(biāo)志時就用它。
Inquirer:
你想要構(gòu)建一個按順序確定選項的“交互式”CLI 實用程序時用它(類似運行 npm init 時的方法,它會問你一系列問題來生成 package.json 文件)。
日志
Winston:
在需要日志庫和不同的日志輸出時使用。
Bunyan:
在需要日志庫時使用,并且可以處理 JSON 是唯一的日志輸出的情況。
你想為不同的組件、請求或功能使用不同的日志記錄器(比如說這些記錄器可能以不同的方式解析)。
Morgan:
在使用 Express 并且想要記錄 HTTP 請求時使用。
注意:它是和類似 Winston 或 Bunyan 的工具并用的。由于它是中間件,所以知道如何處理請求并記錄它,但不會像 Winston 和 Bunyan 那樣負(fù)責(zé)傳輸?shù)饺罩据敵鲋小?/p>
模板
Pug(原 Jade):
你需要一個易讀的服務(wù)端模板引擎并附帶開箱即用的子布局塊支持時就用它。
你的輸出只有 HTML。
EJS:
你需要一個完全使用 JS 的服務(wù)端模板引擎并且可以容忍空格縮進(jìn)時選它(Pug 沒有縮進(jìn))。
注意:它不支持異步 JS 函數(shù)。
測試
Mocha:
在需要編寫和運行單元測試時使用。
Chai:
你的單元測試需要一個斷言庫時用它。
注意:它和 Mocha 是搭配使用的。
Chai-as-promised:
你需要針對 promise 的斷言庫,但不想用 then 或 catch 時用它。
Sinon:
需要一個 mocking 庫進(jìn)行測試時使用。
工具
ESdoc:
你在使用較新版本的 JS,想從代碼中生成 API 文檔時用它。
支持當(dāng)前版本的 JS,默認(rèn)目標(biāo) class。所以如果你在代碼中使用原型,請使用 JSdoc。
JSdoc:
你需要支持 ES6 的代碼 API 文檔生成器時用它。
支持類和原型。
ESlint:
你需要一個 linter 來自動查找(和修復(fù))代碼中的語法和模式問題時選它。
調(diào)試
目前 Node 的原生調(diào)試已經(jīng)夠用了,我建議用原生功能就行。幾年前一些額外的 npm 模塊還能有些幫助,有的特定場景可能用得著;但是現(xiàn)在有了足夠的原生支持,如果你沒什么瘋狂的調(diào)試需求就最好省掉額外的依賴項。
小結(jié)
挑選模塊可能會很費事,但用些技巧就能事半功倍。如果你犯了選擇困難癥,甚至不知道從哪里下手的話就看看本文的推薦吧。
英文原文:https://www.coreycleary.me/which-of-the-635000-npm-modules-do-i-choose/
活動推薦
8 月 17 日(周六 13:00-17:30),由騰訊云主辦的 Hello Serverless 來了!主題沙龍將深圳騰訊大廈和大家見面。為大家講解 Serverless 2.0 如何從 0 到 1 、運行原理及應(yīng)用場景;云函數(shù)架構(gòu)設(shè)計、冷啟動優(yōu)化、本地開發(fā)調(diào)試等問題解析;還有無服務(wù)器云函數(shù) + 新餐飲案例落地展示。
</article>