有關(guān)npm rum的3個簡潔技巧

【編者按】本文作者為來自 MongoDB 的 NodeJS 工程師 Valeri Karpov满俗。Valeri 專注于維護常見的 Mongoose ODM,是《Professional AngularJS》一書的作者溶其。本文由 OneAPM 工程師編譯呈現(xiàn),以下為正文。

大多數(shù)Node.js 開發(fā)人員都將npm用做包管理器晌砾。然而,npm同樣也是一個強大的task runner烦磁,能夠代替gulp养匈。npm run命令讓你在package.jso上定義客制化腳本哼勇,這樣一來就簡化了復(fù)雜的與節(jié)點相關(guān)的 shell腳本,使其變成單行呕乎。筆者將在本文講述常見的npm run使用案例积担,包括使用npm run,通過Babel和Browserify輸入ES6瀏覽器代碼楣嘁。

設(shè)置環(huán)境變量和標(biāo)志

Node.js有幾個方便的配置選項磅轻,使用環(huán)境變量和命令行標(biāo)志(比如過去用來啟用0.12.x版中ES2015特性的古老的harmony標(biāo)志)就可以設(shè)置。npm run命令逐虚,尤其是npm start指令聋溜,可以讓你在運行前設(shè)置任何應(yīng)用所需的標(biāo)志。

比如說叭爱, NODE_PATH 環(huán)境變量能讓你在require()函數(shù)的模塊搜索路徑上添加額外目錄撮躁。換句話說,如果你的項目中有一個包含源代碼的lib目錄和一個包含測試代碼的test目錄买雾。并且把曼,你在test/e2e/my_feature/my_feature.test.js中有個測試,試圖require()某個聲明在lib/server/my_feature/utils.js中的函數(shù)漓穿。這就會涉及脆弱的require(‘../../../lib/server/my_feature_utils’)命令嗤军。每次目錄更改時,該命令便會中斷晃危。然而叙赚,如果你運行 env NODE_PATH=./ node test/e2e/my_feature/my_feature.test.js, require()便知道查看當(dāng)前目錄。這樣就可以 用require(‘lib/server/my_feature/utils’)進行替代僚饭。

遺憾的是震叮,你設(shè)置的每一個環(huán)境變量和標(biāo)志都會額外增加啟動應(yīng)用的復(fù)雜性△⑼遥可以確定的是苇瓣,如果你需要設(shè)置17個環(huán)境變量和標(biāo)志來啟動應(yīng)用,肯定會遺漏一兩個偿乖。如果你的應(yīng)用依賴于 env NODE_PATH=./和ES2015 proxies(后者直到本文寫稿時击罪,仍隱藏在–harmony_proxies標(biāo)志后)。那么汹想,你可以按照下文所示外邓,在.json包文件中定義一個 start腳本:

{

"scripts": {

"start": "env NODE_PATH=./ node --harmony_proxies index.js"  } }

現(xiàn)在,如果運行npm start(npm run start的簡稱)古掏,npm會運行start腳本损话,啟動帶有特殊配置選項的應(yīng)用。

命令行快捷鍵

我們知道,讓用戶運行 npm install –g非常麻煩丧枪」馔浚或許,你已經(jīng)聽說拧烦,即將面世的gulp4.0與gulp3.x.完全不兼容忘闻。由于全球有許多人安裝了gulp,因此package.json沒有辦法強制遍布全球的軟件包恋博,所以齐佳,許多用戶將不得不面臨選擇:到底要哪一個版本的gulp。

在package.json中將gulp列作devDependency會好很多债沮,但是炼吴,之后你就必須運行/node_modules/.bin/gulp watch而并非gulp watch,這樣十分麻煩疫衩。這就是npm run大展身手的地方了硅蹦。它能將 /node_modules/.bin 加到你的PATH中。換句話說闷煤,如果你把gulp3.8列作 devDependency童芹,就能訪問package.json腳本上的gulp可執(zhí)行文件,而不需要用戶運行npm install gulp –g鲤拿。

{
 "scripts": {
"watch": "gulp watch" }}

現(xiàn)在假褪,npm run watch 是/node_modules/.bin/gulp watch的快捷方式。使用mocha也可以達到同樣的效果近顷。

{

 "scripts": {

 "test": "mocha -r nyan test/*.test.js"  } }

現(xiàn)在嗜价,npm test(和npm run test一樣)是在test目錄中使用nyan cat指示器運行所有mocha測試的快捷方式。

Mocha可執(zhí)行文件同樣也有一些簡潔的命令行標(biāo)志幕庐。比如說,grep (簡稱 -g )mocha標(biāo)志讓你只運行名稱和給定正則表達式匹配的測試家淤。在npm >= 2.14.0中,你可以使用 – 傳輸其他標(biāo)志為mocha异剥。例如,下面的命令作用是相同的絮重。

# This command... npm test -- -g "login.*fails"  # is the same thing as this one  /node_modules/.bin/mocha -r nyan test/*.test.js -g "login.*fails"

gulp的備選方案

作為強大的流構(gòu)建系統(tǒng)冤寿,gulp能夠讓你并行化編譯文件。這是一個很棒的工具青伤,但是督怜,對于某些應(yīng)用程序,可能有點大材小用狠角,尤其當(dāng)你的團隊不太了解Node.js流時号杠。在許多情況下,npm run指令可以作為性能較溫和的gulp替代物。舉個例子來說姨蟋,假如在example.js中有一些ES2015代碼屉凯,你想通過babel transpile,之后導(dǎo)入browserify 眼溶,在瀏覽器中使用悠砚。

 'use strict';  const co = require('co')

  /node_modules/.bin/mocha -r nyan test/*.test.js -g "login.*fails"

co(function*() {

  console.log('Hello, world!');

如果想用gulp進行編譯,你可能會用到gulp-babel和gulp-browserify npm兩種模型堂飞,為gulp包裝babel和browserify灌旧。然而,babel和browserify有命令行界面绰筛,因此你可以使用Unix-style pipes編譯這一文件枢泰。注意,下面的例子要求使用babel 5.x别智,不適用于babel 6.

 'use strict'; /node_modules/.bin/browserify example.js | ./node_modules/.bin/babel > ./bin/example.js

再說一次宗苍,/node_modules/.bin這部分很討人厭。值得慶幸的是薄榛,如果你在package.json中定義編譯腳本讳窟,使用 npm run編譯也能夠取得同樣的效果。

 { "scripts": { "compile": "browserify example.js | babel > ./bin/example.js}
}

文末思考

npm run指令讓npm成為多功能的task runner敞恋,而不只是任務(wù)管理器丽啡。好的node.js應(yīng)用憑借npm start和 npm test明確了如何運行應(yīng)用以及如何測驗。同樣硬猫,npm run 讓可執(zhí)行npm模塊(gulp补箍、mocha、karma等)用作devDependencies更加方便啸蜜。你甚至可以借助 npm run和Unix流來運行構(gòu)建程序坑雅,無需gulp或者grunt等構(gòu)建系統(tǒng)的幫助。從概念上講衬横,npm run 與package.json 中的scripts部分應(yīng)該定義如何為你的應(yīng)用完成最常見的指令行任務(wù)裹粤,如啟動應(yīng)用、檢測和運行各種transpilers蜂林。

OneAPM 助您輕松鎖定 Node.js 應(yīng)用性能瓶頸遥诉,通過強大的 Trace 記錄逐層分析,直至鎖定行級問題代碼噪叙。以用戶角度展示系統(tǒng)響應(yīng)速度矮锈,以地域和瀏覽器維度統(tǒng)計用戶使用情況。想閱讀更多技術(shù)文章睁蕾,請訪問 OneAPM 官方博客苞笨。

本文轉(zhuǎn)自 OneAPM 官方博客

原文地址:https://strongloop.com/strongblog/3-neat-tricks-with-npm-run/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子猫缭,更是在濱河造成了極大的恐慌葱弟,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猜丹,死亡現(xiàn)場離奇詭異芝加,居然都是意外死亡冯乘,警方通過查閱死者的電腦和手機兰绣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門空扎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恋脚,“玉大人效扫,你說我怎么就攤上這事庆揪±蚰眨” “怎么了咕村?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵艾疟,是天一觀的道長来吩。 經(jīng)常有香客問我,道長蔽莱,這世上最難降的妖魔是什么弟疆? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮盗冷,結(jié)果婚禮上怠苔,老公的妹妹穿的比我還像新娘。我一直安慰自己仪糖,他們只是感情好柑司,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锅劝,像睡著了一般攒驰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上故爵,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天讼育,我揣著相機與錄音,去河邊找鬼稠集。 笑死,一個胖子當(dāng)著我的面吹牛饥瓷,可吹牛的內(nèi)容都是我干的剥纷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼呢铆,長吁一口氣:“原來是場噩夢啊……” “哼晦鞋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤悠垛,失蹤者是張志新(化名)和其女友劉穎线定,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體确买,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡斤讥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了湾趾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芭商。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖搀缠,靈堂內(nèi)的尸體忽然破棺而出铛楣,到底是詐尸還是另有隱情,我是刑警寧澤艺普,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布簸州,位于F島的核電站,受9級特大地震影響歧譬,放射性物質(zhì)發(fā)生泄漏岸浑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一缴罗、第九天 我趴在偏房一處隱蔽的房頂上張望助琐。 院中可真熱鬧,春花似錦面氓、人聲如沸兵钮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掘譬。三九已至,卻和暖如春呻拌,著一層夾襖步出監(jiān)牢的瞬間葱轩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工藐握, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留靴拱,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓猾普,卻偏偏與公主長得像袜炕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子初家,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355

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