2019-08-13

<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模塊很費事?掌握這些技巧就能事半功倍!

image

前端之巔

image

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>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 瀏覽器事件循環(huán)機制 一、為什么JavaScript是單線程? JavaScript語言的一大特點就是單線程,也就是...
    問_道閱讀 268評論 0 0
  • 1.類和對象 類的屬性: 解釋:在Python中屬性分為兩種:類屬性和實例屬性; 區(qū)別:“類屬性”在該類及其所有的...
    棒棒糖117閱讀 204評論 0 0
  • 安徽某機器人研究院購入遠(yuǎn)距離AGV模塊 項目背景 隨著智能科技的發(fā)展,作為全球新一輪科技和產(chǎn)業(yè)革命的切入點,機器人...
    簡單小王子閱讀 196評論 0 0
  • 【行動派?學(xué)習(xí)日記】 [打卡寶寶]:王燕 [打卡日期]:2019/8/13 [學(xué)習(xí)內(nèi)容]:內(nèi)審人員實務(wù) [學(xué)習(xí)筆記...
    meng7277閱讀 561評論 0 0
  • 再遇見時,我們都已青絲成雪,但我仍然涌起一陣悸動。 第一時間想起的,是讀書時你最喜歡用鉛筆做筆記,細(xì)細(xì)小小的字密密...
    圭圭_e605閱讀 311評論 1 0

友情鏈接更多精彩內(nèi)容