如何將npm做為構(gòu)建工具使用

npmscripts命令可以做其它構(gòu)建工具所用的一切事情虑鼎,而且它更加簡明、更加優(yōu)雅冀惭、更少的包依賴和更少的維護成本震叙。

npm Script

首先掀鹅,我需要講一下npm是如何管理我們的構(gòu)建腳本的。我們知道npm的構(gòu)建腳本有npm run-script這個命令(npm run是它的簡寫)媒楼,npm run的第一個參數(shù)會關(guān)聯(lián)到scripts對象的一個屬性乐尊,它會將這個屬性的值做為一個命令在操作系統(tǒng)默認的shell中執(zhí)行。例如划址,下面的這個package.json

{
  "name": "myproject",
  "devDependencies": {
    "jshint": "latest",
    "browserify": "latest",
    "mocha": "latest"
  },
  "scripts": {
    "lint": "jshint **.js",
    "test": "mocha test/"
  }
}

如果運行npm run lint扔嵌,npm將開啟一個shell并執(zhí)行jshint **.js,如果運行npm run test夺颤,npm將開啟一個shell并執(zhí)行mocha test/痢缎。而這個shell環(huán)境已經(jīng)將你的node_modules/.bin文件夾添加到了PATH中,這意味著你安裝的任何依賴可以被直接執(zhí)行--換句話說世澜,你沒有必要像./node_modules/.bin/jshint **.js或者$(npm bin)/jshint **.js這樣來指定它的路徑独旷。

如果你在運行npm run時沒有寫任何參數(shù),那么npm將會把已經(jīng)有的所有命令列出來寥裂,如:

Available scripts in the user-service package:
  lint
     jshint **.js
  test
    mocha test/

Shortcut script

為了方便使用嵌洼,npm也提供了一些命令的快捷使用方式。如:npm test封恰、npm start麻养、npm stop命令等,它們可以省去run诺舔。

Pre and Post Hooks

別外一個很酷的特性是鳖昌,任何npmscript可以設(shè)置多個pre-post-鉤子。例如低飒,如果你執(zhí)行npm run lint许昨,盡管npm預(yù)先并不知道lint任務(wù)是什么,但它會立即運行npm run prelint逸嘀,然后再執(zhí)行npm run lint车要,最后再執(zhí)行npm run postlint允粤。prepostscript也是exit-code-sensitive的崭倘,這意味著,如果你的pretestscript以一個非零退出碼退出类垫,那么NPM先會立即停止司光,并且也不會執(zhí)行再testposttestscripts。

你不在一個已經(jīng)是pre-的script上再加一個pre-悉患,例如残家,prepretest將會被忽略。

你也可以在npm中對一些內(nèi)部的命令使用pre-post-售躁,如:install坞淮、uninstall茴晋、publishupdate。你不能覆蓋任何內(nèi)部命令的行為回窘,但是你可以通過pre-post-來影響他們的行為诺擅。這意味著,你可以做像這樣一件很酷的事情:

"scripts": {
    "lint": "jshint **.js",
    "build": "browserify index.js > myproject.min.js",
    "test": "mocha test/",

    "prepublish": "npm run build # also runs npm run prebuild",    
    "prebuild": "npm run test # also runs npm run pretest",
    "pretest": "npm run lint"
  }

Passing Arguments

npm中啡直,另一個很酷的特性是:傳遞參數(shù)集合烁涌。如下:

"scripts": {
    "test": "mocha test/",
    "test:xunit": "npm run test -- --reporter xunit"
  }

通過這個配制,我們可以簡單運行npm run test酒觅,它將會執(zhí)行mocha test/撮执,但是我們可以通過--前輟來擴展它的參數(shù)。

例如舷丹,npm run test --anothertest.js將會執(zhí)行mocha test/ anothertest.js抒钱,或者更有用的如npm run test -- --grep parser將會?解析為mocha test/ --grep parser(它只會執(zhí)行名為parser的測試)。

NPM Config Variables

最后一件值得我們注意的事是颜凯,npmpackage.json中有一個config命令继效,它使得任意的一系列值可以被包裝成為一個在scripts中的環(huán)境變量。例如:

  "name": "fooproject",
  "config": {
    "reporter": "xunit"
  },
  "scripts": {
    "test": "mocha test/ --reporter $npm_package_config_reporter",
    "test:dev": "npm run test --fooproject:reporter=spec"
  }

這里装获,config中有一個reporter屬性瑞信,它的值為xunit。這里所有config的屬性都暴露給了環(huán)境變量穴豫,你可以通過加npm_package_config_這個前輟來訪問它們凡简。

在上面這個例子中,npm run test命令使用$npm_package_config_reporter變量來獲取configreporter的值精肃。

運行多個任務(wù)

GruntCulp這樣的構(gòu)建工具都具有將多個任務(wù)整合成一個任務(wù)的能力秤涩。而使用npm時你有兩種方式可以選擇,這取決于哪種語義更加附合你使用場景司抱。如果你的任務(wù)是一個先決條件(例如筐眷,將js最小化之前我們要將所有的js代碼導到一個文件中),那么使用pre-post-鉤子會是更好的選擇习柠。另外你還可以像下面這樣使用bash的&&操作符:

  "scripts": {
    "build": "npm run build:css && npm run build:js"
  }

讓我們來看下來這個例子:

我們的package.json的scripts代碼如下:

  "scripts": {
    "jslint": "node jslint.js",
    "csslint": "node csslint.js",
    "build:css": "node build-css.js",
    "build:js": "node build-js.js",
    "build": "npm run build:css && npm run build:js",
    "prebuild:js": "npm run jslint",
    "prebuild:css": "npm run csslint"
  }

下面是幾個文件匀谣,只是為了在執(zhí)行它們時打印出信息,代碼如下:

jslint.js

 console.log("jslint task running...");

csslint.js

 console.log("csslint task running...");

build-css.js

console.log("build:css task running...");

build-js.js

console.log("build:js task running...");

當我們執(zhí)行npm run build時资溃,程序執(zhí)行順序如下:

> npm run build:css && npm run build:js

> npm run csslint
> node csslint.js
csslint task running...

> node build-css.js
build:css task running...

> npm run jslint
> node jslint.js  
jslint task running...

> node build-js.js
build:js task running...

多個任務(wù)的流式調(diào)用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末武翎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子溶锭,更是在濱河造成了極大的恐慌宝恶,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異垫毙,居然都是意外死亡霹疫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門综芥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來更米,“玉大人,你說我怎么就攤上這事毫痕≌髀停” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵消请,是天一觀的道長栏笆。 經(jīng)常有香客問我,道長臊泰,這世上最難降的妖魔是什么蛉加? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮缸逃,結(jié)果婚禮上针饥,老公的妹妹穿的比我還像新娘。我一直安慰自己需频,他們只是感情好丁眼,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著昭殉,像睡著了一般苞七。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挪丢,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天蹂风,我揣著相機與錄音,去河邊找鬼乾蓬。 笑死惠啄,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的任内。 我是一名探鬼主播撵渡,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼族奢!你這毒婦竟也來了姥闭?” 一聲冷哼從身側(cè)響起丹鸿,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤越走,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體廊敌,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡铜跑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了骡澈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锅纺。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖肋殴,靈堂內(nèi)的尸體忽然破棺而出囤锉,到底是詐尸還是另有隱情,我是刑警寧澤护锤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布官地,位于F島的核電站,受9級特大地震影響烙懦,放射性物質(zhì)發(fā)生泄漏驱入。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一氯析、第九天 我趴在偏房一處隱蔽的房頂上張望亏较。 院中可真熱鬧,春花似錦掩缓、人聲如沸雪情。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旺罢。三九已至,卻和暖如春绢记,著一層夾襖步出監(jiān)牢的瞬間扁达,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工蠢熄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留跪解,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓签孔,卻偏偏與公主長得像叉讥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子饥追,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一图仓、什么是 npm 腳本? npm 允許在package.json文件里面但绕,使用scripts字段定義腳本命令救崔。 ...
    豬豬9527閱讀 391評論 0 0
  • 關(guān)鍵詞:npm 定義:npm 允許在package.json文件里面惶看,使用scripts字段定義腳本命令。 上面代...
    ferrint閱讀 13,602評論 2 6
  • 什么是 NPM npm之于Node六孵,就像pip之于Python,gem之于Ruby,composer之于PHP纬黎。 ...
    ihoey閱讀 6,249評論 2 36
  • 原文鏈接:http://www.reibang.com/p/6b816c609669 前傳 出于興趣最近開始研究k...
    懸筆e絕閱讀 7,204評論 1 11
  • 4月的最后一天,我來了一場期待已久的騎行劫窒。剛剛突然想起來本今,現(xiàn)在居然在做一件很是巧合的事情。四月份開頭寫過一篇文章...
    冰魚兒閱讀 430評論 0 1