【編者按】本文作者為來自 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/