你或許不知道的一些npm實(shí)用技巧
前言
絕大多數(shù)前端和 Node.js 開發(fā)者每天的日常工作都離不開 npm,不知道你對 npm 的觀感如何?如果你覺得 npm 很棒,那么不妨看下這篇文章,說不定其中有你之前沒留意過的小竅門,可以讓你 npm 用得更順手。如果你覺得 npm 很糟糕,那也可以看下這篇文章,也許會發(fā)現(xiàn)用上一些小技巧,npm 會變得稍微不那么糟糕。
npm ci
別被它的名字騙了。npm ci 并不僅僅適用于持續(xù)集成系統(tǒng),在日常開發(fā)中,npm ci 非常實(shí)用。和 npm install 不同,npm ci 根據(jù) package-lock.json 安裝依賴,這可以保證整個開發(fā)團(tuán)隊(duì)都使用版本完全一致的依賴,避免把時間浪費(fèi)在排查因?yàn)橐蕾嚥灰恢露鴮?dǎo)致的各種奇怪問題上。不僅如此,npm ci 還有一個很好的副作用,加快 node 模塊安裝速度。因?yàn)?npm ci 直接根據(jù) package-lock.json 中指定的版本安裝,無需計算求解依賴滿足問題,在大多數(shù)情況下都可以大大加速 node 模塊安裝過程。如果你曾經(jīng)因?yàn)橄?npm install 太慢而換用兼容性不那么好的 yarn 以及兼容性更不好的 pnpm,那么不妨試下 npm ci,也許你會發(fā)現(xiàn),其實(shí) npm 也可以不那么慢。
另外,如果 package-lock.json 過時(和 package.json 沖突),那么 npm ci 會很貼心地報錯,避免項(xiàng)目依賴陷入過時狀態(tài)。
有了 npm ci,基本上我只在引入新依賴時才使用 npm install。
注意,npm ci 在安裝前會自動清除現(xiàn)存的 node_modules,所以 npm ci 天然規(guī)避了增量安裝可能帶來的不一致性等問題。(這也意味著,你又可以少記一條命令 npm prune。)不過,如果你的網(wǎng)絡(luò)很慢,那可能就不那么妙了。別慌,你可以用 --prefer-offline,最大限度地利用 npm 的全局緩存加速安裝過程。
當(dāng)然,既然使用 npm ci,那就別忘了把 package-lock.json 加入 git 倉庫。
npm outdated
npm ci 基于 package-lock.json 鎖定依賴版本,確保項(xiàng)目開發(fā)環(huán)境的一致性。但這并不意味著依賴版本是鎖死的。為了利用新版本帶來的問題修復(fù)、新特性以及性能提升,定期還是需要升級依賴版本的。在這一場景下,推薦使用 npm outdated。它會列出還沒有升到當(dāng)前最新版本的項(xiàng)目依賴。紅色表示符合指定的語義化版本范圍,理論上可以無腦升級(npm update 會一次性升級所有紅色依賴)。黃色表示不符合指定的語義化版本范圍,比如大版本升級,升級可能會遇到兼容性問題。
有些項(xiàng)目處于維護(hù)階段,不打算加新特性了,甚至可能不太嚴(yán)重的問題都不打算修復(fù)了,但是像安全漏洞這樣的嚴(yán)重問題還是要管的。這時可以使用 npm audit 命令,列出項(xiàng)目依賴中有安全漏洞的版本。處于活躍開發(fā)階段的項(xiàng)目當(dāng)然也需要關(guān)注安全漏洞問題,但是因?yàn)?npm install 引入新依賴時會自動運(yùn)行 npm audit,再加上會定期運(yùn)行 npm outdated,所以手動運(yùn)行 npm audit 的機(jī)會不太多。
npx
前面說過基本上只在引入新依賴時才使用 npm install,沒有提到全局安裝。全局安裝當(dāng)然也需要使用 npm install。不過,為了確保開發(fā)環(huán)境的一致性,npm install --global 應(yīng)當(dāng)慎用。個人建議僅僅在安裝一些日常使用的工具時才使用全局安裝,而項(xiàng)目開發(fā)所需的工具,則作為開發(fā)依賴安裝,然后使用 npx 調(diào)用。
不推薦:
npm install --global webpack webpack ...
推薦:
npm i -D webpack npx webpack ...
這里 i -D 是 install --save-dev 的簡寫形式。
對于一些一次性的臨時任務(wù),可以直接通過 npx 運(yùn)行相應(yīng)工具,免去了手動安裝的麻煩,也不會污染 devDependencies。
例如,之前項(xiàng)目使用 webpack 打包,現(xiàn)在想臨時試下?lián)Q用 rollup 打包的效果:
npx rollup ...
npx 很智能,如果路徑中找不到 rollup,會自動安裝。
npx 用來測試不同版本的兼容性時非常好用。下面是一些例子。
需要用到的 cowsay 的某個特性或修復(fù)已經(jīng)合入 GitHub 主線,但是還沒在 npmjs 上發(fā)新版,試一下:
npx github:piuccio/cowsay
臨時測下內(nèi)部維護(hù)的 cowsay 的一個分支:
npx git+ssh://my.hosted.git:cowsay.git#semver:^1
當(dāng)前使用的是 node 的 LTS 版本(10),想試下 node 12 下構(gòu)建腳本能不能跑起來:
npx -p node@12 npm run build
從上面我們可以看到,當(dāng)包名和命令名不同時(npm 命令由 node 提供),可以用 -p 選項(xiàng)指定包名。
npm run
在 package.json 的 scripts 屬性中加入命令(例如:"foo": "echo foo")就可以通過 npm run foo 運(yùn)行對應(yīng)命令。這是 npm 提供的一個很方便的運(yùn)行項(xiàng)目相關(guān)的自動化任務(wù)的機(jī)制,有一點(diǎn)類似 make。不過直接運(yùn)行 make (不帶任何參數(shù))會運(yùn)行默認(rèn)任務(wù),但直接運(yùn)行 npm run (不帶任何參數(shù))會列出所有在 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 ...
其他
這里還有一些我個人覺得不是特別實(shí)用的小竅門,不過,每個人的需求和偏好不同,說不定你會覺得它們挺有用的。如果你有想要分享的竅門,歡迎留言。
- npm init -y 默認(rèn)情況下,npm init 會讓你回答一些問題。npm init -y 可以跳過這些問題,直接上手開發(fā)。我之所以不推薦它,是因?yàn)?,如果你打算盡快上手開發(fā)一個應(yīng)用,絕大多數(shù)情況下會用框架,而幾乎所有框架在 npmjs 上都至少有一個 create-xxx-app 包。所以基本上你沒有機(jī)會輸入 npm init 去回答那些問題。而如果你打算寫一個組件或庫,那么 package.json 中的元信息對組件或庫的使用者很重要(即使是僅供你自己使用的組件或庫,未來的你也未必記得當(dāng)初寫這個組件或庫的上下文),跳過這些問題并不是一個好主意。當(dāng)然,急躁是程序員的三大美德,你也許會想,我可以在完成開發(fā)后再來補(bǔ)這些。但是,一般來說,往往項(xiàng)目開始的時候是你最有興趣(或者說,稍微不那么反感)記錄這些上下文的時刻。如果在項(xiàng)目開始的時候都不耐煩做這個,開發(fā)完成后,很可能就更沒興趣了。同理,README 也應(yīng)該在項(xiàng)目開始前寫。
- npm repo 可以打開項(xiàng)目的源代碼倉庫(大部分情況下是 GitHub),它還有一個姊妹命令,npm home,可以打開項(xiàng)目的主頁。不過,我個人覺得,比起這兩個命令,通常而言, IDE 或者編輯器的智能提示(速覽類型、速覽文檔、速覽定義之類)更高效。
- .npmignore 文件可以列出不想打包的文件,避免把一些無關(guān)的文件發(fā)布到 npmjs 上。但是,統(tǒng)一使用 .gitignore 可以滿足絕大部分場景下的需求。而且,只存在 .gitignore 的情況下,npm publish 會尊重 .gitignore 的聲明,而 .npmignore 和 .gitignore 同時存在的情況下,npm publish 會忽略 .gitignore,而不是取兩者的并集。換言之,.gitignore 中忽略但 .npmignore 中未忽略的文件會被打包發(fā)布。所以,使用 .npmginore 就意味著需要同時小心翼翼地維護(hù)兩份大部分內(nèi)容重復(fù)的列表。同時,一旦團(tuán)隊(duì)中有任何一人因?yàn)榕既坏氖韬龌蛘卟皇煜?.npmignore 和 .gitignore 關(guān)系的細(xì)節(jié)出現(xiàn)了失誤,那就有可能將敏感信息發(fā)布到 npmjs 上,導(dǎo)致安全事故。
- 各種 npm 命令的快捷版本,比如上文用到的 npm i -D。這些個人覺得不用專門刻意去記。經(jīng)常輸入的命令,可以 npm help 一下看看有沒有簡短版本。不查也沒有關(guān)系,npm t 和 npm test 乃至 npm run test 的區(qū)別絕不是開發(fā)效率的瓶頸所在。很多時候這只是個人偏好問題,比如追求盡可能少打字的人會喜歡 npm t,追求盡可能少記東西的人會喜歡 npm run test (永遠(yuǎn)不會因?yàn)檎`以為 npm build 表示 npm run build 而碰到問題),其他人可能會喜歡 npm test 這樣中庸的選項(xiàng)。
- npm xmas 猜猜輸入這個命令會得到什么結(jié)果?你可以親自試一下。提示:這個命令完全沒有實(shí)用性可言。;-)
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。
相關(guān)文章
快速掌握Node.js環(huán)境的安裝與運(yùn)行方法
這篇文章主要介紹了Node.js環(huán)境的安裝與運(yùn)行方法,Node是基于Google Chrome V8引擎的JavaScript解釋器,需要的朋友可以參考下2016-02-02npm?list輸出結(jié)果包含extraneous標(biāo)志記錄分析
這篇文章主要為大家介紹了npm?list輸出結(jié)果包含extraneous標(biāo)志記錄分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Windows下安裝Bun像Node或Deno的現(xiàn)代JS運(yùn)行時
這篇文章主要為大家介紹了一款像Node或Deno的現(xiàn)代JavaScript運(yùn)行時的bun在Windows下安裝過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07用node開發(fā)并發(fā)布一個cli工具的方法步驟
這篇文章主要介紹了用node開發(fā)并發(fā)布一個cli工具的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01node-webkit打包成exe文件被360誤報木馬的解決方法
這篇文章主要介紹了node-webkit打包成exe文件被360誤報木馬的解決方法的相關(guān)資料,需要的朋友可以參考下2015-03-03