我們平時閱讀一些開源項目,可能會發現有些項目的package.json裡的scripts區域定義的腳本很複雜,令人眼花缭亂。
其實這些腳本是有規律可循的。讓我們從最簡單的一個例子開始學習。
建立一個空檔案夾,執行指令npm init,會自動在該檔案夾下生成一個package.json。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiADNyEzLcd3LcJzLcJzdllmVldWYtl2Q3UCcpJHdz9CX05WZpJ3bt8Gd1F2LcJjcn9WTldWYtl2PykTMmNGNlR2NhRDMlhjYi1SM5cTN4AjMvw1cldWYtl2XkF2bsBXdvw1bp5SdoNnbhlmauMXZnFWbp1CZh9GbwV3Lc9CX6MHc0RHaiojIsJye.jpg)
{
"name": "nodejsexample",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"build": "node example.js",
"dev": "node example.js",
"start": "node example.js",
"prestart": "node example.js",
"poststart": "node example.js"
},
"author": "",
"license": "ISC"
}
重點看第9行~第11行,意思就是當npm執行指令時,如果執行到名為start的生命周期事件(lifecycle event),則執行nodejs的指令node example.js,如果執行到名為prestart的生命周期事件, 則執行nodejs指令node example.js,對于poststart也同理。
然後我們再來編寫example.js。為了簡單起見,用example.js同時響應prestart, start和poststart三個事件,是以在example.js裡需要判斷當該檔案執行時,到底所處哪個生命周期事件。這個可以用環境變量process.env.npm_lifecycle_event獲得:
const ENVIRONMENT = process.env.npm_lifecycle_event;
if (ENVIRONMENT === "build") {
console.log("Running your build tasks!");
}
if ( ENVIRONMENT === "dev") {
console.log("Running the dev server!");同
}
if ( ENVIRONMENT === "prestart") {
console.log("Prestart event: Prepare for Start event!");
}
if ( ENVIRONMENT === "poststart") {
console.log("Poststart event: Do some cleanup task!");
}
if ( ENVIRONMENT === "start") {
console.log("Running App in production!");
}
現在執行指令行npm start,可以看到依次執行了事件prestart->start->poststart對應的script。
package.json裡所有支援寫script的事件在這個連結裡詳細定義了:
https://docs.npmjs.com/misc/scripts要擷取更多Jerry的原創技術文章,請關注公衆号"汪子熙"或者掃描下面二維碼: