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模塊很費(fèi)事蕊温?掌握這些技巧就能事半功倍!

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

譯者 | 王強(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>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末欧穴,一起剝皮案震驚了整個濱河市腊状,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌苔可,老刑警劉巖缴挖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異焚辅,居然都是意外死亡映屋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門同蜻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棚点,“玉大人,你說我怎么就攤上這事湾蔓√蔽觯” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵默责,是天一觀的道長贬循。 經(jīng)常有香客問我,道長桃序,這世上最難降的妖魔是什么杖虾? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮媒熊,結(jié)果婚禮上奇适,老公的妹妹穿的比我還像新娘坟比。我一直安慰自己,他們只是感情好嚷往,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布葛账。 她就那樣靜靜地躺著,像睡著了一般皮仁。 火紅的嫁衣襯著肌膚如雪注竿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天魂贬,我揣著相機(jī)與錄音巩割,去河邊找鬼。 笑死付燥,一個胖子當(dāng)著我的面吹牛宣谈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播键科,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼闻丑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了勋颖?” 一聲冷哼從身側(cè)響起嗦嗡,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饭玲,沒想到半個月后侥祭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茄厘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年矮冬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片次哈。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡胎署,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出窑滞,到底是詐尸還是另有隱情琼牧,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布哀卫,位于F島的核電站巨坊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏聊训。R本人自食惡果不足惜抱究,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一恢氯、第九天 我趴在偏房一處隱蔽的房頂上張望带斑。 院中可真熱鬧鼓寺,春花似錦、人聲如沸勋磕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挂滓。三九已至苦银,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赶站,已是汗流浹背幔虏。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贝椿,地道東北人想括。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像烙博,于是被迫代替她去往敵國和親瑟蜈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容

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