一、腳本的地位
腳本是 項目真正的入口 。
無論你是剛剛
clone
完公司的項目,抑或是你準備在開源社群做一點微小的貢獻;你需要做的第一件事,永遠是:
打開 ,看看
package.json
裡都有哪些腳本。
scripts
- 有些腳本負責“建構”,如:
、build
、bundle
;build:doc
- 有些腳本負責“調試”,如:
、dev
、serve
;start
- 有些腳本負責“單測”,如
;test
- 等等……
當你執行
npm run serve
或者
npm run dev
時,你可以開始開發調試,推進項目的進度。
但使用腳本的過程中,也有不便之處。
是什麼?往下看。
二、“腳本排程”的難題
王鹹魚是一家小公司的前端骨幹,經常負責前端項目重構、架構調整、打包優化等方面的工作。
但他經常遇到這樣的問題:
如果我要先運作 、再運作
build:umd
、再運作
build:esm
,應該怎麼做?
build:docs
就像這樣:
想了想,他覺得自己可以了,于是寫了如下代碼:
npm run build:umd && npm run build:esm && npm run build:docs
不過項目組的小夥伴很快就提出了質疑:
" 和
build:umd
沒有前置依賴關系啊,應該可以同時建構,這樣能提升建構效率。"
build:esm
王鹹魚一聽,覺得很有道理。
建構過程就變成了這樣:
這下讓王鹹魚為難了,居然沒想到快捷的辦法,隻能引入了
gulp
,并寫了一些額外的
js
腳本才解決這個問題。
那麼,有更好的辦法嗎?
這天晚上,王鹹魚加班到深夜,一位正在巡邏的發際線奇高的保安大哥,偶然掃了一眼他的螢幕,用低沉的聲音告訴他:
"傻小子,用
npm-run-all
啊!"
新世界的大門從此打開。
三、如此簡單?
上面那個讓王鹹魚抓耳撓腮的問題,瞬間被解決了!
他隻寫了一行代碼:
{
"scripts": {
"build": "npm-run-all -p build:esm build:umd -s build:docs"
以上腳本執行後會有什麼效果呢?
-
和build:umd
首先會異步同時執行;build:esm
- 以上二者都結束後,會同步執行
build:docs
“完美!”
王鹹魚伸了個懶腰,終于可以下班了。
但是第二天,又有組員提出了疑問:“這仨完全可以同時運作啊!”
王鹹魚聽了,覺得很有道理,用了三秒鐘就實作了效果,僅僅删了幾個代碼:
{
"scripts": {
"build": "npm-run-all -p build:esm build:umd build:docs"
sooooooo!easy!
四、此劍名曰: npm-run-all
npm-run-all
npm-run-all
是什麼?
官方如此自我介紹:
一個 工具,可以并行、或者按順序執行多個
CLI
腳本。
npm
對,它可以輕松地組織 “
npm
腳本” 的執行順序。
npmjs: www.npmjs.com/package/npm…
github: github.com/mysticatea/…
4.1 安裝
yarn add -D npm-run-all
# or
4.2 第一個指令: npm-run-all
npm-run-all
通過
npm-run-all
這個指令,你可以随意組織腳本。它有很多選項,其中最關鍵的是這兩個:
npm-run-all -s a b -p c d
沒錯,就是
-s
和
-p
;
-
,便是s
,指 “串行”。serial
-
,便是p
,指 “并行”。parallel
通過不斷組合以上兩個選項,可以定義出多種執行順序,比如:
npm-run-all a b --parallel c d --serial e f --parallel g h i
- 首先,串行執行
和a
b
- 然後,并行執行
和c
d
- 再次,串行執行
和e
f
- 最後,并行執行
、g
、h
i
4.3 第二個指令: npm-s
npm-s
npm-s
可以了解為
npm-run-all --serial
的簡寫。
npm-s a b c
先效果是:串行執行
a
,
b
,
c
;
4.4 第三個指令: npm-p
npm-p
npm-p
可以了解為
npm-run-all --parallel
的簡寫。
npm-p a b c
先效果是:并行執行
a
,
b
,
c
;
4.5 通配符
先假設,如果同時存在
build:umd
、
build:esm
、
build:docs
,你想讓它們三個并行執行。
你可能會寫這樣的代碼:
{
"scripts": {
"build": "npm-p build:umd build:esm build:docs"
但是呢,就很長,很難看,有沒有更好的辦法?
有,用通配符:
{
"scripts": {
"build": "run-p \"build:*\""
舒服!這樣就行了,完美!
4.6 更多實用能力
除了上面介紹的順序編排外,
npm-run-all
還提供了很多實用選項:
-
最大并發數限制。比如你有20個建構物要打包,但 --max-parallel
能力有限,你希望同一時間最多有三個在建構,就可以用它;CPU
-
顧名思義,出錯了繼續執行;--continue-on-error
-
參考 --race
Promise.race
....