衆所周知,npm
是工程師們基於nodejs
的開發中的核心內容。而大部分人在使用npm
時,主要使用她的包管理系統。node
可是,當咱們稍微look look那些知名的開源項目,或者老牛們的代碼時,經常都能在它們的package.json
裏看到一個寫滿了命令的scripts
屬性。這裏面都隱藏了哪些祕密,牛牛們都用它作了什麼,怎麼作到的?這些疑問一定撕扯着你的好奇心,來,咱們今天就聊聊神祕的scripts
屬性。git
一般狀況下,應用程序只能處理來自內部的消息,若是但願對外部發來的消息也能攔截處理,那就須要一種叫鉤子(Hook)的技術。想象一下,npm test
這個過程你是控制不了的,但若是就很是想在test
以前自動處理點什麼事兒,怎麼辦?沒次都手動在test
以前執行什麼,煩不煩、煩不煩、煩不煩?就是不煩,也會忘啊!github
這時候就用到咱們的Hook了。下面這些指令都是Hook,它們均可以在package.json
的scripts
屬性裏定義,而且會在生命週期的某個指定時刻被執行,這就是上面提到的「對外部發來的消息也能攔截處理」,這極大的方便了開發人員(或許你想作點壞事兒?)npm
prepublish
: 在publish
該包以前執行。(在包目錄下執行npm install
時也會執行)json
postpublish
: 在該包publish
以後執行post
preinstall
: 在該包被install
以前執行操作系統
postinstall
: 在該包被install
以後執行eslint
preuninstall
: 在該包被uninstall
以前執行rest
postuninstall
: 在該包被uninstall
以後執行code
preversion
: 在修改該包的version
以前執行
postversion
: 在修改該包的version
以後執行
pretest
, posttest
: 在該包內執行test
時執行,其中pretest
先於posttest
prestop
, poststop
: 在該包內執行stop
時執行,其中prestop
先於poststop
prestart
,poststart
: 在該包內執行start
時執行,其中prestart
先於poststart
prerestart
, postrestart
: 在該包內執行restart
腳本時執行,其中prerestart
先於postrestart
。注意: 若是沒有在scripts
裏顯示指定restart
腳本,則會自動調用stop
,而後再start
上面這些Hooks都是npm
預約義好的,也就是說,當你執行npm install
時,若是你在scripts
裏定義了preinstall
和postinstall
,那它們分別會在npm install
以前/後自動執行,不勞你操心!碉堡了,有木有?
還有,任何自定義腳本(經過npm run-script <腳本名>
來執行)也能夠前綴pre
和post
爲其製做鉤子。好比:premyscript
,myscript
,postmyscript
注:也可使用
run
做爲run-script
的簡寫使用。
若是你寫了一個類庫,有些操做和操做系統無關,但卻但願在該包被使用前執行,能夠試試prepublish
,意思是,在你執行npm publish
的時候,自動先執行scripts
裏定義的prepublish
裏的腳本。
舉個栗子:假設我用CoffeeScript
寫了一個類庫,我有下面兩個願望:
我但願發佈的是JavaScript
版本,這樣用戶npm install <類庫>
以後無需搭建神馬亂七八糟的環境,便可直接使用
我但願發佈的是一個minified版本,即用戶npm install <類庫>
以後,也可直接引入使用,而沒必要關心還要幫我壓縮一次
OK,咱們如今來聊聊這裏我用prepublish
的好處:
這事兒執行一次就夠,就是我publish
包的時候,不須要神馬用戶每次install
的時候也作
coffee-script
能夠做爲devDependencies
在個人項目裏,這樣的話,用戶在install
這個類庫的時候,就不會下載coffee-script
了。
uglify-js
也能夠做爲devDependencies
在個人項目裏,好處同上
再好比,寫了一個類庫,其中有些操做是和操做系統相關的,可使用postinstall
看看。
那我以前寫的一個movoto-cli舉例,我有一個指望:
用戶在install
個人類庫後,這個類庫要將兩個配置文件eslintrc_browser_legacy.json
和eslintrc_node.json
裏的LINEBREAK_OS
字段根據用戶的操做系統修改成正確的值。
因而我把這個操做寫在了postinstall
這個Hook裏,問題解決,完美,沒問題!
常常聽到有朋友問到這樣的問題,說看到有人的scripts
裏寫了"test": "mocha --reporter nyan"
,以爲這個代碼有漏洞,使用這個指令的人,必須得先npm install -g mocha
(全局安裝mocha
),不然test
命令找不到mocha
,會報錯的吧!
答案是這樣的,通常這麼寫scripts
的,一般會把mocha
裝在devDependencies
或者dependencies
裏。scripts
裏的指令有這樣一個特色,若是你的類庫(或叫模塊)依賴的其它模塊提供了可執行腳本(譬如:mocha
),那這些依賴會在你執行scripts
指令時自動被注入到執行進程的PATH
裏。
這就是說,若是devDependencies
或者dependencies
裏有mocha
,那在npm test
的時候,裏面的mocha
命令,是從注入的PATH
裏(即:node_modules/.bin/mocha
)找了。
So,還須要全局安裝mocha
麼?恐怕不須要了^^