npm 运行 <cmd> 运行缓慢

npm run <cmd> works slow

我过去常常通过 Makefile 运行 各种命令,但对于 nodejs 项目 package.json 是放置这些东西的更合适的地方。

运行 通过 npm 命令效果很好,但与命令时执行相比非常慢。

$ time ./node_modules/.bin/jshint . && ./node_modules/.bin/jscs .

real    0m0.759s
user    0m0.524s
sys 0m0.085s
No code style errors found.

$ time npm run lint

> @ lint /path/to/project
> jshint . && jscs .

No code style errors found.

real    0m2.246s
user    0m1.637s
sys 0m0.277s

可以加速吗?

upd. 我的 package.json:

{
  "devDependencies": {
    "jscs": "^1.12.0",
    "jshint": "^2.6.3"
  },
  "scripts": {
    "lint": "jshint . && jscs ."
  }
}

upd2. 我用错误的方式测量了时间。甘特在他的评论中指出了这一点。现在这两个时间看起来很相似(相差 100 毫秒)。

$ time sh -c './node_modules/.bin/jshint . && ./node_modules/.bin/jscs .'
No code style errors found.

real    0m1.704s
user    0m1.245s
sys 0m0.177s
$ time npm run lint

> @ lint /path/to/project
> jshint . && jscs .

No code style errors found.

real    0m1.822s
user    0m1.621s
sys 0m0.198s

这不是 npm 的错,事实上它甚至可以更准确地测量时间。

让我们看看你做了什么。

time npm run lint 将调用时间,然后按顺序调用您的任务。 time 将在 npm 退出时停止占用所需的时间,它会在您的任务完成后停止 运行ning。这里只有轻微的开销,脚本按预期工作。

然而,

time ./node_modules/.bin/jshint . && ./node_modules/.bin/jscs . 将调用 time,这将调用 jshint。一旦jshint退出,时间也会退出,jscs将是运行。这也是为什么在您的示例中输出顺序混淆的原因。

要在没有 npm 的情况下获得准确的时间测量值,请尝试 time sh -c './node_modules/.bin/jshint . && ./node_modules/.bin/jscs .'