有關npm rum的3個簡潔技巧

【編者按】本文做者爲來自 MongoDB 的 NodeJS 工程師 Valeri Karpov。Valeri 專一於維護常見的 Mongoose ODM,是《Professional AngularJS》一書的做者。本文由 OneAPM 工程師編譯呈現,如下爲正文。html

大多數Node.js 開發人員都將npm用作包管理器。然而,npm一樣也是一個強大的task runner,可以代替gulp。npm run命令讓你在package.jso上定義客製化腳本,這樣一來就簡化了複雜的與節點相關的 shell腳本,使其變成單行。筆者將在本文講述常見的npm run使用案例,包括使用npm run,經過Babel和Browserify輸入ES6瀏覽器代碼。node

設置環境變量和標誌

Node.js有幾個方便的配置選項,使用環境變量和命令行標誌(好比過去用來啓用0.12.x版中ES2015特性的古老的harmony標誌)就能夠設置。npm run命令,尤爲是npm start指令,可讓你在運行前設置任何應用所需的標誌。正則表達式

好比說, NODE_PATH 環境變量能讓你在require()函數的模塊搜索路徑上添加額外目錄。換句話說,若是你的項目中有一個包含源代碼的lib目錄和一個包含測試代碼的test目錄。而且,你在test/e2e/my_feature/my_feature.test.js中有個測試,試圖require()某個聲明在lib/server/my_feature/utils.js中的函數。這就會涉及脆弱的require(‘../../../lib/server/my_feature_utils’)命令。每次目錄更改時,該命令便會中斷。然而,若是你運行 env NODE_PATH=./ node test/e2e/my_feature/my_feature.test.js, require()便知道查看當前目錄。這樣就能夠 用require(‘lib/server/my_feature/utils’)進行替代。mongodb

遺憾的是,你設置的每個環境變量和標誌都會額外增長啓動應用的複雜性。能夠肯定的是,若是你須要設置17個環境變量和標誌來啓動應用,確定會遺漏一兩個。若是你的應用依賴於 env NODE_PATH=./和ES2015 proxies(後者直到本文寫稿時,仍隱藏在–harmony_proxies標誌後)。那麼,你能夠按照下文所示,在.json包文件中定義一個 start腳本:shell

{

"scripts": {

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

如今,若是運行npm start(npm run start的簡稱),npm會運行start腳本,啓動帶有特殊配置選項的應用。npm

命令行快捷鍵

咱們知道,讓用戶運行 npm install –g很是麻煩。或許,你已經據說,即將面世的gulp4.0與gulp3.x.徹底不兼容。因爲全球有許多人安裝了gulp,所以package.json沒有辦法強制遍及全球的軟件包,因此,許多用戶將不得不面臨選擇:到底要哪個版本的gulp。json

在package.json中將gulp列做devDependency會好不少,可是,以後你就必須運行/node_modules/.bin/gulp watch而並不是gulp watch,這樣十分麻煩。這就是npm run大展身手的地方了。它能將 /node_modules/.bin 加到你的PATH中。換句話說,若是你把gulp3.8列做 devDependency,就能訪問package.json腳本上的gulp可執行文件,而不須要用戶運行npm install gulp –g。gulp

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

如今,npm run watch 是/node_modules/.bin/gulp watch的快捷方式。使用mocha也能夠達到一樣的效果。瀏覽器

{

 "scripts": {

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

如今,npm test(和npm run test同樣)是在test目錄中使用nyan cat指示器運行全部mocha測試的快捷方式。babel

Mocha可執行文件一樣也有一些簡潔的命令行標誌。好比說,grep (簡稱 -g )mocha標誌讓你只運行名稱和給定正則表達式匹配的測試。在npm >= 2.14.0中,你可使用 – 傳輸其餘標誌爲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的備選方案

做爲強大的流構建系統,gulp可以讓你並行化編譯文件。這是一個很棒的工具,可是,對於某些應用程序,可能有點大材小用,尤爲當你的團隊不太瞭解Node.js流時。在許多狀況下,npm run指令能夠做爲性能較溫和的gulp替代物。舉個例子來講,假如在example.js中有一些ES2015代碼,你想經過babel transpile,以後導入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,而不僅是任務管理器。好的node.js應用憑藉npm start和 npm test明確瞭如何運行應用以及如何測驗。一樣,npm run 讓可執行npm模塊(gulp、mocha、karma等)用做devDependencies更加方便。你甚至能夠藉助 npm run和Unix流來運行構建程序,無需gulp或者grunt等構建系統的幫助。從概念上講,npm run 與package.json 中的scripts部分應該定義如何爲你的應用完成最多見的指令行任務,如啓動應用、檢測和運行各類transpilers。

OneAPM 助您輕鬆鎖定 Node.js 應用性能瓶頸,經過強大的 Trace 記錄逐層分析,直至鎖定行級問題代碼。以用戶角度展現系統響應速度,以地域和瀏覽器維度統計用戶使用狀況。想閱讀更多技術文章,請訪問 OneAPM 官方博客

本文轉自 OneAPM 官方博客

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

相關文章
相關標籤/搜索