【编者按】本文做者为来自 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可以让你并行化编译文件。这是一个很棒的工具,可是,对于某些应用程序,可能有点大材小用,尤为当你的团队不太了解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/