摘要:但這并不意味著依賴版本是鎖死的。黃色表示不符合指定的語(yǔ)義化版本范圍,比如大版本升級(jí),升級(jí)可能會(huì)遇到兼容性問(wèn)題。文件可以列出不想打包的文件,避免把一些無(wú)關(guān)的文件發(fā)布到上。
作者: LeanCloud weakish
分享一些 npm 包管理工具的實(shí)用小竅門(mén),希望能夠略微提高下前端、Node.js 開(kāi)發(fā)者的生活質(zhì)量。
絕大多數(shù)前端和 Node.js 開(kāi)發(fā)者每天的日常工作都離不開(kāi) npm,不知道你對(duì) npm 的觀感如何?如果你覺(jué)得 npm 很棒,那么不妨看下這篇文章,說(shuō)不定其中有你之前沒(méi)留意過(guò)的小竅門(mén),可以讓你 npm 用得更順手。如果你覺(jué)得 npm 很糟糕,那也可以看下這篇文章,也許會(huì)發(fā)現(xiàn)用上一些小技巧,npm 會(huì)變得稍微不那么糟糕。
npm ci別被它的名字騙了。npm ci 并不僅僅適用于持續(xù)集成系統(tǒng),在日常開(kāi)發(fā)中,npm ci 非常實(shí)用。和 npm install 不同,npm ci 根據(jù) package-lock.json 安裝依賴,這可以保證整個(gè)開(kāi)發(fā)團(tuán)隊(duì)都使用版本完全一致的依賴,避免把時(shí)間浪費(fèi)在排查因?yàn)橐蕾嚥灰恢露鴮?dǎo)致的各種奇怪問(wèn)題上。不僅如此,npm ci 還有一個(gè)很好的副作用,加快 node 模塊安裝速度。因?yàn)?npm ci 直接根據(jù) package-lock.json 中指定的版本安裝,無(wú)需計(jì)算求解依賴滿足問(wèn)題,在大多數(shù)情況下都可以大大加速 node 模塊安裝過(guò)程。如果你曾經(jīng)因?yàn)橄?npm install 太慢而換用兼容性不那么好的 yarn 以及兼容性更不好的 pnpm,那么不妨試下 npm ci,也許你會(huì)發(fā)現(xiàn),其實(shí) npm 也可以不那么慢。
另外,如果 package-lock.json 過(guò)時(shí)(和 package.json 沖突),那么 npm ci 會(huì)很貼心地報(bào)錯(cuò),避免項(xiàng)目依賴陷入過(guò)時(shí)狀態(tài)。
有了 npm ci,基本上我只在引入新依賴時(shí)才使用 npm install。
注意,npm ci 在安裝前會(huì)自動(dòng)清除現(xiàn)存的 node_modules,所以 npm ci 天然規(guī)避了增量安裝可能帶來(lái)的不一致性等問(wèn)題。(這也意味著,你又可以少記一條命令 npm prune。)不過(guò),如果你的網(wǎng)絡(luò)很慢,那可能就不那么妙了。別慌,你可以用 --prefer-offline,最大限度地利用 npm 的全局緩存加速安裝過(guò)程。
當(dāng)然,既然使用 npm ci,那就別忘了把 package-lock.json 加入 git 倉(cāng)庫(kù)。
npm outdatednpm ci 基于 package-lock.json 鎖定依賴版本,確保項(xiàng)目開(kāi)發(fā)環(huán)境的一致性。但這并不意味著依賴版本是鎖死的。為了利用新版本帶來(lái)的問(wèn)題修復(fù)、新特性以及性能提升,定期還是需要升級(jí)依賴版本的。在這一場(chǎng)景下,推薦使用 npm outdated。它會(huì)列出還沒(méi)有升到當(dāng)前最新版本的項(xiàng)目依賴。紅色表示符合指定的語(yǔ)義化版本范圍,理論上可以無(wú)腦升級(jí)(npm update 會(huì)一次性升級(jí)所有紅色依賴)。黃色表示不符合指定的語(yǔ)義化版本范圍,比如大版本升級(jí),升級(jí)可能會(huì)遇到兼容性問(wèn)題。
有些項(xiàng)目處于維護(hù)階段,不打算加新特性了,甚至可能不太嚴(yán)重的問(wèn)題都不打算修復(fù)了,但是像安全漏洞這樣的嚴(yán)重問(wèn)題還是要管的。這時(shí)可以使用 npm audit 命令,列出項(xiàng)目依賴中有安全漏洞的版本。處于活躍開(kāi)發(fā)階段的項(xiàng)目當(dāng)然也需要關(guān)注安全漏洞問(wèn)題,但是因?yàn)?npm install 引入新依賴時(shí)會(huì)自動(dòng)運(yùn)行 npm audit,再加上會(huì)定期運(yùn)行 npm outdated,所以手動(dòng)運(yùn)行 npm audit 的機(jī)會(huì)不太多。
npx前面說(shuō)過(guò)基本上只在引入新依賴時(shí)才使用 npm install,沒(méi)有提到全局安裝。全局安裝當(dāng)然也需要使用 npm install。不過(guò),為了確保開(kāi)發(fā)環(huán)境的一致性,npm install --global 應(yīng)當(dāng)慎用。個(gè)人建議僅僅在安裝一些日常使用的工具時(shí)才使用全局安裝,而項(xiàng)目開(kāi)發(fā)所需的工具,則作為開(kāi)發(fā)依賴安裝,然后使用 npx 調(diào)用。
不推薦:
npm install --global webpack webpack ...
推薦:
npm i -D webpack npx webpack ...
這里 i -D 是 install --save-dev 的簡(jiǎn)寫(xiě)形式。
對(duì)于一些一次性的臨時(shí)任務(wù),可以直接通過(guò) npx 運(yùn)行相應(yīng)工具,免去了手動(dòng)安裝的麻煩,也不會(huì)污染 devDependencies。
例如,之前項(xiàng)目使用 webpack 打包,現(xiàn)在想臨時(shí)試下?lián)Q用 rollup 打包的效果:
npx rollup ...
npx 很智能,如果路徑中找不到 rollup,會(huì)自動(dòng)安裝。
npx 用來(lái)測(cè)試不同版本的兼容性時(shí)非常好用。下面是一些例子。
需要用到的 cowsay 的某個(gè)特性或修復(fù)已經(jīng)合入 GitHub 主線,但是還沒(méi)在 npmjs 上發(fā)新版,試一下:
npx github:piuccio/cowsay
臨時(shí)測(cè)下內(nèi)部維護(hù)的 cowsay 的一個(gè)分支:
npx git+ssh://my.hosted.git:cowsay.git#semver:^1
當(dāng)前使用的是 node 的 LTS 版本(10),想試下 node 12 下構(gòu)建腳本能不能跑起來(lái):
npx -p node@12 npm run build
從上面我們可以看到,當(dāng)包名和命令名不同時(shí)(npm 命令由 node 提供),可以用 -p 選項(xiàng)指定包名。
npm run在 package.json 的 scripts 屬性中加入命令(例如:"foo": "echo foo")就可以通過(guò) npm run foo 運(yùn)行對(duì)應(yīng)命令。這是 npm 提供的一個(gè)很方便的運(yùn)行項(xiàng)目相關(guān)的自動(dòng)化任務(wù)的機(jī)制,有一點(diǎn)類似 make。不過(guò)直接運(yùn)行 make (不帶任何參數(shù))會(huì)運(yùn)行默認(rèn)任務(wù),但直接運(yùn)行 npm run (不帶任何參數(shù))會(huì)列出所有在 scripts 中聲明的命令。
; npm run Lifecycle scripts included in leancloud-realtime: test npm run lint && npm run build && npm run docs && npm run test:node && npm run test:browser available via `npm run-script`: precommit pretty-quick --staged commitmsg commitlint -e $GIT_PARAMS lint eslint --ignore-path .gitignore src test plugins && tsc realtime.d.ts --strict ...其他
這里還有一些我個(gè)人覺(jué)得不是特別實(shí)用的小竅門(mén),不過(guò),每個(gè)人的需求和偏好不同,說(shuō)不定你會(huì)覺(jué)得它們挺有用的。如果你有想要分享的竅門(mén),歡迎留言。
npm init -y 默認(rèn)情況下,npm init 會(huì)讓你回答一些問(wèn)題。npm init -y 可以跳過(guò)這些問(wèn)題,直接上手開(kāi)發(fā)。我之所以不推薦它,是因?yàn)?,如果你打算盡快上手開(kāi)發(fā)一個(gè)應(yīng)用,絕大多數(shù)情況下會(huì)用框架,而幾乎所有框架在 npmjs 上都至少有一個(gè) create-xxx-app 包。所以基本上你沒(méi)有機(jī)會(huì)輸入 npm init 去回答那些問(wèn)題。而如果你打算寫(xiě)一個(gè)組件或庫(kù),那么 package.json 中的元信息對(duì)組件或庫(kù)的使用者很重要(即使是僅供你自己使用的組件或庫(kù),未來(lái)的你也未必記得當(dāng)初寫(xiě)這個(gè)組件或庫(kù)的上下文),跳過(guò)這些問(wèn)題并不是一個(gè)好主意。當(dāng)然,急躁是程序員的三大美德,你也許會(huì)想,我可以在完成開(kāi)發(fā)后再來(lái)補(bǔ)這些。但是,一般來(lái)說(shuō),往往項(xiàng)目開(kāi)始的時(shí)候是你最有興趣(或者說(shuō),稍微不那么反感)記錄這些上下文的時(shí)刻。如果在項(xiàng)目開(kāi)始的時(shí)候都不耐煩做這個(gè),開(kāi)發(fā)完成后,很可能就更沒(méi)興趣了。同理,README 也應(yīng)該在項(xiàng)目開(kāi)始前寫(xiě)。
npm repo 可以打開(kāi)項(xiàng)目的源代碼倉(cāng)庫(kù)(大部分情況下是 GitHub),它還有一個(gè)姊妹命令,npm home,可以打開(kāi)項(xiàng)目的主頁(yè)。不過(guò),我個(gè)人覺(jué)得,比起這兩個(gè)命令,通常而言, IDE 或者編輯器的智能提示(速覽類型、速覽文檔、速覽定義之類)更高效。
.npmignore 文件可以列出不想打包的文件,避免把一些無(wú)關(guān)的文件發(fā)布到 npmjs 上。但是,統(tǒng)一使用 .gitignore 可以滿足絕大部分場(chǎng)景下的需求。而且,只存在 .gitignore 的情況下,npm publish 會(huì)尊重 .gitignore 的聲明,而 .npmignore 和 .gitignore 同時(shí)存在的情況下,npm publish 會(huì)忽略 .gitignore,而不是取兩者的并集。換言之,.gitignore 中忽略但 .npmignore 中未忽略的文件會(huì)被打包發(fā)布。所以,使用 .npmginore 就意味著需要同時(shí)小心翼翼地維護(hù)兩份大部分內(nèi)容重復(fù)的列表。同時(shí),一旦團(tuán)隊(duì)中有任何一人因?yàn)榕既坏氖韬龌蛘卟皇煜?.npmignore 和 .gitignore 關(guān)系的細(xì)節(jié)出現(xiàn)了失誤,那就有可能將敏感信息發(fā)布到 npmjs 上,導(dǎo)致安全事故。
各種 npm 命令的快捷版本,比如上文用到的 npm i -D。這些個(gè)人覺(jué)得不用專門(mén)刻意去記。經(jīng)常輸入的命令,可以 npm help 一下看看有沒(méi)有簡(jiǎn)短版本。不查也沒(méi)有關(guān)系,npm t 和 npm test 乃至 npm run test 的區(qū)別絕不是開(kāi)發(fā)效率的瓶頸所在。很多時(shí)候這只是個(gè)人偏好問(wèn)題,比如追求盡可能少打字的人會(huì)喜歡 npm t,追求盡可能少記東西的人會(huì)喜歡 npm run test (永遠(yuǎn)不會(huì)因?yàn)檎`以為 npm build 表示 npm run build 而碰到問(wèn)題),其他人可能會(huì)喜歡 npm test 這樣中庸的選項(xiàng)。
npm xmas 猜猜輸入這個(gè)命令會(huì)得到什么結(jié)果?你可以親自試一下。提示:這個(gè)命令完全沒(méi)有實(shí)用性可言。;-)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/105287.html
摘要:每天,數(shù)以百萬(wàn)計(jì)的開(kāi)發(fā)人員使用或來(lái)構(gòu)建項(xiàng)目。在本文中,我們將會(huì)介紹的個(gè)技巧來(lái)最大限度地利用從簡(jiǎn)單的快捷方式到自定義腳本。保存為開(kāi)發(fā)依賴常規(guī),簡(jiǎn)寫(xiě)。首先通過(guò)安裝開(kāi)發(fā)依賴。在下一個(gè)也是最后一個(gè)技巧中,我們將合并。 為了保證的可讀性,本文采用意譯而非直譯。 每天,數(shù)以百萬(wàn)計(jì)的開(kāi)發(fā)人員使用 npm 或 yarn 來(lái)構(gòu)建項(xiàng)目。運(yùn)行npm init或npx create- response -ap...
摘要:構(gòu)建是為了在中為常見(jiàn)任務(wù)提供實(shí)用程序功能。所有功能都自動(dòng)進(jìn)行,并且相應(yīng)地安排傳遞的參數(shù)以便于使用。在星級(jí),是一個(gè)用于處理本機(jī)對(duì)象的實(shí)用程序庫(kù)。該庫(kù)沒(méi)有外部依賴關(guān)系,這是一個(gè)將事件作為序列進(jìn)行測(cè)試的現(xiàn)場(chǎng)演示。 由于Javascript在2018年仍然是最受歡迎和最廣泛使用的編程語(yǔ)言,因此圍繞它擴(kuò)展了生態(tài)系統(tǒng)。 showImg(https://segmentfault.com/img/re...
摘要:構(gòu)建是為了在中為常見(jiàn)任務(wù)提供實(shí)用程序功能。所有功能都自動(dòng)進(jìn)行,并且相應(yīng)地安排傳遞的參數(shù)以便于使用。在星級(jí),是一個(gè)用于處理本機(jī)對(duì)象的實(shí)用程序庫(kù)。該庫(kù)沒(méi)有外部依賴關(guān)系,這是一個(gè)將事件作為序列進(jìn)行測(cè)試的現(xiàn)場(chǎng)演示。 由于Javascript在2018年仍然是最受歡迎和最廣泛使用的編程語(yǔ)言,因此圍繞它擴(kuò)展了生態(tài)系統(tǒng)。 showImg(https://segmentfault.com/img/re...
摘要:一個(gè)帶提示的最后對(duì)于開(kāi)發(fā)同學(xué)來(lái)說(shuō),就算不使用,也強(qiáng)烈建議使用提供注解,它會(huì)通過(guò)一些類型推導(dǎo)來(lái)檢查你的代碼的正確性,可以減少很多開(kāi)發(fā)過(guò)程中的。相對(duì)于對(duì)象,它保證了輸入的類型你定義的對(duì)象可能某一天不再只有類型的,不再需要額外的類型判斷。 作者:陳達(dá)孚 香港中文大學(xué)研究生,《移動(dòng)Web前端高效開(kāi)發(fā)實(shí)戰(zhàn)》作者之一,《前端開(kāi)發(fā)者指南2017》譯者之一,在中國(guó)前端開(kāi)發(fā)者大會(huì),中生代技術(shù)大會(huì)等技術(shù)...
摘要:你只要算好各種食材的比例,不用關(guān)心做菜的過(guò)程,就是那個(gè)微波爐。項(xiàng)目搭建步驟官網(wǎng)官網(wǎng)開(kāi)發(fā)環(huán)境安裝配置項(xiàng)目配置如圖所示運(yùn)行項(xiàng)目開(kāi)發(fā)編譯在瀏覽器輸入看到,就跑通了。從基礎(chǔ)開(kāi)始,循序漸進(jìn),含有常用實(shí)戰(zhàn)項(xiàng)目,貼近企業(yè)真實(shí)現(xiàn)狀。 用一個(gè)完成的Vue系列文章,讓大家全面理解Vue的實(shí)現(xiàn)原理,掌握實(shí)用技巧,能在實(shí)戰(zhàn)中使用Vue,解鎖一個(gè)開(kāi)發(fā)技能。文末有文章大綱請(qǐng)查看。不墨跡了!馬上寫(xiě)內(nèi)容: 1.為什...
閱讀 1302·2021-11-11 16:54
閱讀 936·2021-10-19 11:44
閱讀 1401·2021-09-22 15:18
閱讀 2521·2019-08-29 16:26
閱讀 3017·2019-08-29 13:57
閱讀 3159·2019-08-26 13:32
閱讀 1155·2019-08-26 11:58
閱讀 2402·2019-08-26 10:37