【编者按】本文作者为来自 MongoDB 的 NodeJS 工程师 Valeri Karpov。Valeri 专注于维护常见的 Mongoose ODM,是《Professional AngularJS》一书的作者。本文由 OneAPM 工程师编译呈现,以下为正文。

大多数Node.js 开发人员都将npm用做包管理器。然而,npm同样也是一个强大的task runner,能够代替gulp。npm run命令让你在package.jso上定义客制化脚本,这样一来就简化了复杂的与节点相关的 shell脚本,使其变成单行。笔者将在本文讲述常见的npm run使用案例,包括使用npm run,通过Babel和Browserify输入ES6浏览器代码。

设置环境变量和标志

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’)进行替代。

遗憾的是,你设置的每一个环境变量和标志都会额外增加启动应用的复杂性。可以确定的是,如果你需要设置17个环境变量和标志来启动应用,肯定会遗漏一两个。如果你的应用依赖于 env NODE_PATH=./和ES2015 proxies(后者直到本文写稿时,仍隐藏在–harmony_proxies标志后)。那么,你可以按照下文所示,在.json包文件中定义一个 start脚本:

{

"scripts": {

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

现在,如果运行npm start(npm run start的简称),npm会运行start脚本,启动带有特殊配置选项的应用。

命令行快捷键

我们知道,让用户运行 npm install –g非常麻烦。或许,你已经听说,即将面世的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可执行文件,而不需要用户运行npm install gulp –g。

{
"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测试的快捷方式。

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/

有关npm rum的3个简洁技巧的更多相关文章

  1. NPM 在MacOSX中的使用技巧

    经常看到有人说『为啥npm install 的时候报错,显示EACCESS错误…』,之前大家都是sudo大法解决问题,也没太在意. 至于这个问题是brew安装工具的时候造成的,还是系统修改磁盘权限造成 ...

  2. npm 一些有用的提示和技巧

    生成 package.json 我们通常执行 npm init,然后开始添加 npm 请求的信息. 但是,如果我们不关心所有这些信息,并且希望保留默认值,那么对于 npm 请求的每一条数据,我们都按 ...

  3. NPM使用技巧

    如果你是一个JavaScript系的开发者,一定不会陌生NPM,它既是一个平台,也是一个工具.在这个平台上,我们能够使用其他开发者提供的功能代码,当然我们也能将我们自己代码提交到这里分享给世界上的开发 ...

  4. 如何使用Vue

    我在学习前端框架的时候面临了很多的选择,比较流行的有react,angularJS,还有另外一个就是Vue,Vue相对于另外两个出现时间更晚,也更符合响应式(Reactive)组件化(Composab ...

  5. nodejs的第三天学习笔记

    一. CommonJS 规范 1.1nodejs 与 commonjs 之间的关系: 1)nodejs是一种服务器语言. a)开启服务的能力 b)文件读写的能力 服务器:就是一台安装了服务软件 2)c ...

  6. Docker 发布 Abp net core web 服务

    Docker 发布 Abp net core web 服务 准备工作:Abp 项目,这个是模板下载地址 https://aspnetboilerplate.com/Templates (本例使用的是S ...

  7. TModJS:README

    ylbtech-TModJS:README 1.返回顶部 1. TmodJS 项目已经停止维护,请使用更好的代替方案:art-template-loader TmodJS(原名 atc)是一个简单易用 ...

  8. ES6 - 基础学习(1): 开发环境搭建

    现在Chrome浏览器已经很好的支持ES6了,但有些低版本的浏览器或其他浏览器还是不支持ES6的语法,因此实际项目开发或上线过程中就需要把ES6的语法转变成ES5的语法.项目开发过程中 Webpack ...

  9. 1.vue的基础认识

    vue 1.基于MvvM MVC--MVVM,是MVC的改进版      MVVM主要是将视图的状态和行为抽象化,把视图和业务逻辑分开      M:模型--存放状态的容器,是以数据为中心的      ...

随机推荐

  1. python第一天作业

    作业需求 OK 开始动手了 作业要用到的知识点: python的文件操作 ####################################################3 开始了 1.先写一 ...

  2. 银行卡BIN码大全

    BIN号即银行标识代码的英文缩写.BIN由6位数字表示,出现在卡号的前6位,由国际标准化组织(ISO)分配给各从事跨行转接交换的银行卡组织.银行卡的卡号是标识发卡机构和持卡人信息的号码,由以下三部分组 ...

  3. 【转】C#中Invoke的用法

    在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界 ...

  4. DB2中ixf文件的导入导出

    1. 导出数据 语法:EXPORT TO <文件路径>/文件名.IXF OF IXF SELECT * FROM 表名   2. 导入数据 语法:db2 IMPORT FROM <路 ...

  5. ios中怎么样判断路径最后的后缀名称

    使用hasSuffix属性即可 例如 [photo.thumbnail_pic.lowercaseString hasSuffix:@"gif"]

  6. 安装Ubuntu 15.10后要做的事

    Ubuntu 15.10发布了,带来了很多新特性,同样也依然带着很多不习惯的东西,所以装完系统后还要进行一系列的优化. 1.删除libreoffice libreoffice虽然是开源的,但是Java ...

  7. IOS之表视图添加索引

    我们要实现的效果如下. 1.修改ControlView.h,即添加变量dict,用于存储TabelView的数据源. #import <UIKit/UIKit.h> @interface  ...

  8. sharepoint 2010 中获取system账号的真实账号

    在使用sharepoint的时候有的时候需要在后台获取当前登录用户的登录名,一般的时候使用SPContext.Current.Web.CurrentUser就可以了,但是有一个特殊的用“系统账户”,获 ...

  9. php捕获网络页面

    <?php $url = 'http://jwzx.cqupt.edu.cn/pubYxKebiao.php?type=zy&yx=06'; $html = file_get_conte ...

  10. 如何破解UltraEdit

    在断网的前提下,软件->帮助->注册->激活->脱机激活—>用户和密码随便输入->还有两个空着,就是该用注册机激活了. 打开注册机->输入ULtredit的自 ...