<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模塊很費(fèi)事蕊温?掌握這些技巧就能事半功倍!
前端之巔
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
譯者 | 王強(qiáng)
編輯 | Yonie
熟悉 Node 或前端 JavaScript 工作的同學(xué)都知道,社區(qū)中的可用模塊有數(shù)十萬之多凉翻。
開發(fā)人員經(jīng)常會提問或抱怨制轰,比如說:
“開發(fā)易,選模塊難......”
“X 模塊和 Y 模塊區(qū)別在哪里垃杖,哪一個更好?”
“npm 很好用伶棒,可是那些模塊指不定半年一年多就沒用了,具體看它們的支持情況【顺”
在談到這些問題時司忱,你通常會得到十個不同的答案。每個人都會向你推薦他最寶貝的模塊鳍烁,然后大家就會為哪個模塊是最好的這個話題吵得不可開交繁扎。
選擇 npm 模塊時容易遇到“分析癱瘓”這種情況〉海可選項(xiàng)實(shí)在太多了提澎,還總有一大堆新模塊被吹成是“你,值得擁有”积糯,想要為自己的項(xiàng)目選出合適的模塊實(shí)在不是件容易的事情谦纱。而且許多模塊做的事情都是差不多(或者完全一樣)的,更給人添亂绍昂。
其實(shí)你用不著浪費(fèi)時間在谷歌或 npmjs.org 上亂搜一通偿荷,影響你的應(yīng)用構(gòu)建工作;你要做的就是知道在什么時候選擇哪些模塊忍饰。
精選列表
為了幫你解決這個問題寺庄,本文針對各種最常見的問題類型制作了一份模塊列表(例如 Web 框架力崇、模板赢织、身份驗(yàn)證等)于置,并告訴你這些模塊應(yīng)該何時使用。
有一些注意事項(xiàng):有些模塊你可能已經(jīng)很熟悉了八毯,但有時你會遇到完全陌生的技術(shù)棧(比如說身份驗(yàn)證或 Web Socket 之類)话速,這時候你需要知道用哪些模塊可以完成工作。你可能覺得某款模塊更出色乳讥。也可能你的用例 / 需求不在下面的列表里廓俭。我并沒有在每個分類下塞一堆選項(xiàng),而是盡量精簡留晚,避免陷入分析癱瘓的陷阱告嘲。如果你的場景比較特殊路星,那么就得自己做些調(diào)查來做補(bǔ)充了;這個列表的目的是讓你更快地投身工作仰楚。
這些模塊是基于下面的原則挑選出來的:
它們完成工作的能力如何。
社區(qū)規(guī)模(對支持 / 故障排除很重要)侨嘀。
積極維護(hù)
如果你還是覺得信息不足捂襟,難下決定,我建議使用 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 的依賴項(xiàng)更少刨摩,而且是基于原生 Promise 的。
Web 框架
Express:
你的 API呻征、網(wǎng)站或單頁應(yīng)用需要一個輕量級 Web 框架時用它罢浇。
你不介意使用開箱即用的回調(diào)來實(shí)現(xiàn)異步嚷闭。
你希望有一個搭配框架使用的豐富的模塊生態(tài)系統(tǒng)。
你希望框架有一個大型社區(qū)來提供支持并排除故障阵子。
Koa:
你想要比 Express 還輕量的框架時就選它胜蛉。
Koa 更像是一個中間件層色乾,不提供開箱即用的模板或路由领突,更適合 API 開發(fā)君旦。
你想要開箱即用的 async/await 支持。
Hapi:
你想要一個比 Express 或 Koa 有更多“部件”的框架時選它局蚀,但它集成的東西沒 Sails 那么多恕稠。
Sails:
你想要像 Rails 之類的東西時就用它,它集成了一大堆東西(但其中有很多可能是你用不著的)千扶。
驗(yàn)證
Ajv:
在需要驗(yàn)證 JSON 時使用(例如來自一個 Web 請求的 JSON)骆捧。
你想與應(yīng)用程序的非 JS 部分共享這些 schema(它是 JSON,所以你可以這樣做)妆绞。
Joi:
你需要驗(yàn)證輸入并且喜歡它下面這種樣式時就用它
它不是在 JSON 中定義 schema
你正在使用 Hapi(Joi 自帶它枫攀,開箱即用)
身份驗(yàn)證
Passport:
需要為你的網(wǎng)站或 API 使用身份驗(yàn)證中間件時用它脓豪。
你希望能選擇多種身份驗(yàn)證類型(Oauth,F(xiàn)acebook 等)楞泼。
你需要管理會話笤闯。
異步
Async(庫):
你需要使用只支持回調(diào),不支持 Promise 的舊版 Node 時選它
ES6 原生 Promise(原生 JS超陆,不是 npm):
使用 Node 0.12 以上版本時用它。
還要考慮你的團(tuán)隊(duì)是否熟悉 Promise≌牌現(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硝枉,我強(qiáng)烈建議你先確認(rèn)自己的確用得著 ORM 再說妻味。很多時候用原始的 SQL 或查詢構(gòu)建器就夠了欣福,而 ORM 會加入另一層抽象,性價(jià)比不夠高雏逾。
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)為它用起來沒什么問題瞧柔。但如果你有問題 / 疑慮就請咨詢你的法律部門造锅,因?yàn)槲也皇锹蓭煛?/p>
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 實(shí)現(xiàn)饰剥,而且更新維護(hù)很勤快摧阅;如果你想換個庫用棒卷,那么改一行代碼就能輕松切換不同的庫了。
Primus:
你需要 Web Socket若厚,但又不想局限在某個特定的 Web Socket 實(shí)現(xiàn)時用它蜒什。
API 文檔
Swagger-node:
你需要為 REST API 編寫文檔,并需要針對端點(diǎn)測試請求時用它霎冯。
實(shí)用程序 / 雜項(xiàng)
Lodash:
在需要 JS 實(shí)用程序庫時使用沈撞。
你使用了大量的 OOP。
Ramda:
你想用更加函數(shù)式的風(fēng)格編程显晶,用函數(shù)組合寫代碼時用它晋修。
你想在函數(shù)式編程中使用 lodash 一類的東西。
Moment:
在需要解析倦春、驗(yàn)證睁本、操作和顯示日期 / 時間時使用忠怖。
UUID:
需要很難破解的隨機(jī)、獨(dú)特的 id 時用它枉疼。
NVM:
你希望能在環(huán)境中安裝的多個版本 Node 之間切換時用它鞋拟。
FS-EXTRA:
你需要遞歸 mkdir贺纲、rm -rf 和 Node 中缺少的其他文件系統(tǒng)實(shí)用程序時用它。
Nodemailer:
需要從 Node 中發(fā)送電子郵件時使用潦刃。
Dotenv:
需要將.env 文件中的環(huán)境變量加載到 process.env 時使用懈叹。
CLI
Commander:
你要構(gòu)建一個 CLI 實(shí)用程序澄成,將所有參數(shù)作為命令行上的標(biāo)志時就用它笆包。
Inquirer:
你想要構(gòu)建一個按順序確定選項(xiàng)的“交互式”CLI 實(shí)用程序時用它(類似運(yùn)行 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:
在需要編寫和運(yùn)行單元測試時使用。
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)試需求就最好省掉額外的依賴項(xiàng)梆暖。
小結(jié)
挑選模塊可能會很費(fèi)事,但用些技巧就能事半功倍掂骏。如果你犯了選擇困難癥轰驳,甚至不知道從哪里下手的話就看看本文的推薦吧。
英文原文: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ùn)行原理及應(yīng)用場景勤哗;云函數(shù)架構(gòu)設(shè)計(jì)、冷啟動優(yōu)化掩驱、本地開發(fā)調(diào)試等問題解析芒划;還有無服務(wù)器云函數(shù) + 新餐飲案例落地展示。
</article>