npm install --global or --save-dev, it's a question

npm

一句話

如果你需要安裝的帶有CLI的npm包被某個(gè)項(xiàng)目依賴,請(qǐng)盡量使用--save-dev而不要使用--global安裝。

引子

在我們啟動(dòng)一個(gè)前端項(xiàng)目時(shí)懈糯,總會(huì)用到一些 npm 上的帶有 CLI 的包(package)赊颠,我們?cè)诿钚邢掳堰@些包當(dāng)作全局的系統(tǒng)命令來(lái)使用。比如 babel-cli鸭轮,express-generatorbrowserify 等等橄霉。我們往往在需要使用它們時(shí)這樣做:

npm install -g babel-cli

之后窃爷,我們就理所當(dāng)然的使用它們了:

babel script.js -o script-compiled.js

可是,這樣真的好嗎姓蜂?

你在這樣做時(shí)按厘,也隱隱約約感覺到,這或許有些“臟”(dirty)钱慢,有點(diǎn)像是泛濫的全局對(duì)象逮京。

剝開看看

這種感覺沒有錯(cuò),拿 OSX 舉例來(lái)說束莫,如果我們使用 npm bin -g 來(lái)查看npm的全局包都裝到哪了懒棉,會(huì)得到這樣的結(jié)果:

/usr/local/bin

這個(gè)目錄是系統(tǒng)中用來(lái)存放需要本地全局使用的二進(jìn)制可執(zhí)行文件的地方,屬于系統(tǒng)環(huán)境的一部分览绿,往往不僅僅被某個(gè)或某些應(yīng)用依賴策严。

問題在哪

我們將帶有CLI的npm包分為兩類(非等價(jià)類):

  • 工程級(jí)
  • 系統(tǒng)級(jí)

如果我們僅僅是在現(xiàn)在的(或?qū)?lái))某個(gè)項(xiàng)目中打算使用它,那么這類包更偏向于 工程級(jí)饿敲。比如之前文中提到的 browserifybabel-cli 妻导。

如果我們更需要將它作為系統(tǒng)中的應(yīng)用,而不限于在某個(gè) Node.js 項(xiàng)目中依賴它怀各,那么這類包更偏向于 系統(tǒng)級(jí)倔韭。比如 作為Node.js版本管理器的n

更直接一點(diǎn)說瓢对,如果某個(gè)npm包不被任何項(xiàng)目或應(yīng)用依賴狐肢,那么它即屬于 系統(tǒng)級(jí)

對(duì)于工程級(jí)的npm包,如果我們進(jìn)行全局安裝沥曹,那么會(huì)帶來(lái)兩個(gè)問題:

  • 全局安裝的包會(huì)作為系統(tǒng)環(huán)境的一部分份名,但同一系統(tǒng)下的不同項(xiàng)目可能對(duì)于其依賴版本不同。
  • 項(xiàng)目在遷移或更換環(huán)境時(shí)妓美,沒有顯性的依賴表明新環(huán)境需要該npm包

如何解決

npm 提供了一種針對(duì)于開發(fā)過程中依賴的安裝方法:

npm install --save-dev <package>

使用這種方法安裝的包僵腺,會(huì)在 package.json中被顯性指出在 devDependencies中:

{
  "name": "my_package",
  "version": "1.0.0",
  "dependencies": {
    "my_dep": "^1.0.0"
  },
  "devDependencies" : {
    "my_test_framework": "^3.1.0"
  }
}

但這還有一個(gè)問題,如果使用 npm install --save-dev 安裝的包壶栋,如何在項(xiàng)目中使用CLI呢辰如?

首先,通過 --save-dev 安裝的包的可執(zhí)行文件都被放到了項(xiàng)目中的 ./node_modules/.bin/ 中贵试。所以琉兜,我們可以通過該目錄執(zhí)行需要本地運(yùn)行的CLI命令凯正,比如:

./node_modules/.bin/babel script.js -o script-compiled.js

更進(jìn)一步,我們也可以把命令放入package.jsonscripts中豌蟋,比如:

{
    ...
    "scripts": {
        "babel": "babel"
    }
}

因?yàn)閚pm會(huì)在執(zhí)行時(shí)首先檢查當(dāng)前項(xiàng)目中的 ./node_moduels/.bin/ 目錄廊散,這樣在執(zhí)行時(shí)只需要輸入:

npm run babel -- script.js -o script-compiled.js

注意,傳遞參數(shù)前需要加 -- 梧疲。

另外允睹,還可以把 ./node_modules/.bin/ 加入到系統(tǒng)環(huán)境變量 PATH 中,但這樣只能在包含 node_modules 的項(xiàng)目目錄下使用CLI命令幌氮。這種做法其實(shí)更加增多了項(xiàng)目對(duì)系統(tǒng)環(huán)境的隱性依賴缭受,不推薦。

結(jié)論

古人有云:“兩害相較该互,則取其輕”米者。相比之前全局安裝,使用 --save-dev 安裝的npm包宇智,在執(zhí)行CLI命令時(shí)的確會(huì)比較麻煩蔓搞,但這樣做的好處也是顯而易見且更為重要的,而對(duì)于增加的使用成本普筹,另有許多成熟方法可以解決败明。在我們使用npm時(shí)隘马,對(duì)于 工程級(jí)系統(tǒng)級(jí) 的包的區(qū)分有時(shí)并不是那么明顯太防,希望通過這篇文章能讓大家意識(shí)到使用全局安裝的意義,并在管理項(xiàng)目依賴時(shí)多一些思考酸员。

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蜒车,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子幔嗦,更是在濱河造成了極大的恐慌酿愧,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邀泉,死亡現(xiàn)場(chǎng)離奇詭異嬉挡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)汇恤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門庞钢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人因谎,你說我怎么就攤上這事基括。” “怎么了财岔?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵风皿,是天一觀的道長(zhǎng)河爹。 經(jīng)常有香客問我,道長(zhǎng)桐款,這世上最難降的妖魔是什么咸这? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮鲁僚,結(jié)果婚禮上炊苫,老公的妹妹穿的比我還像新娘。我一直安慰自己冰沙,他們只是感情好侨艾,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拓挥,像睡著了一般唠梨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侥啤,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天当叭,我揣著相機(jī)與錄音,去河邊找鬼盖灸。 笑死蚁鳖,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赁炎。 我是一名探鬼主播醉箕,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼徙垫!你這毒婦竟也來(lái)了讥裤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤姻报,失蹤者是張志新(化名)和其女友劉穎己英,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吴旋,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡损肛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了荣瑟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片治拿。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖褂傀,靈堂內(nèi)的尸體忽然破棺而出忍啤,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布同波,位于F島的核電站鳄梅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏未檩。R本人自食惡果不足惜戴尸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冤狡。 院中可真熱鬧孙蒙,春花似錦、人聲如沸悲雳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)合瓢。三九已至坦胶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間晴楔,已是汗流浹背顿苇。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留税弃,地道東北人纪岁。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像则果,于是被迫代替她去往敵國(guó)和親幔翰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

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