NodeJs:带有依赖项的外部javascript

时间:2015-07-21 20:28:11

标签: javascript node.js watch assemble nodemon

我们试图只使用nodeJS与其他包的依赖性最小,我们现在遇到的挑战是HandelbarsJS。我们找到了一个包,可以为我们生成html的汇编。只是,它非常非常慢,每次约3秒,在这3秒内,下一行有2,5 / 2,7秒:

var assemble = require('assemble');

我们的package.json脚本部分:

"scripts": {
  "build:handlebars": "node scripts/handlebars.js",
  "watch:handlebars": "nodemon --watch assets --exec \"npm run build:handlebars\"" }

脚本/ handlebars.js文件

#! /usr/bin/env node

var assemble = require('assemble');
var extname = require('gulp-extname');

console.log(Date.now() - start);

assemble.data('assets/templates/data/*.json');
assemble.layouts('assets/templates/layouts/*.hbs');
assemble.partials('assets/templates/partials/*.hbs');

assemble.src('assets/templates/*.hbs', { layout: 'default' })
    .pipe(extname())
    .pipe(assemble.dest('build/'));

每次,当我们保存.hbs文件时,Nodemon会重新启动并调用外部javascript文件。

我们如何确保“需要”'只被召唤一次,或者它们是否留在记忆中?

谢谢!

2 个答案:

答案 0 :(得分:1)

由于您希望使用assemble完成此操作,但没有gulp,我建议使用chokidar

npm install chokidar --save

现在您可以像这样要求chokidar

var chokidar = require('chokidar');

然后定义一个小帮助程序,只要模式中的某些内容发生变化,就会运行handler

function watch(patterns, handler) {
  chokidar.watch(patterns, {
    ignoreInitial: false
  }).on('add', handler).on('change', handler).on('unlink', handler);
}

现在我们可以改变这样的脚本:

#! /usr/bin/env node

var assemble = require('assemble');
var extname = require('gulp-extname');
var chokidar = require('chokidar');

console.log(Date.now() - start);

assemble.data('assets/templates/data/*.json');
assemble.layouts('assets/templates/layouts/*.hbs');
assemble.partials('assets/templates/partials/*.hbs');

// Enable --watch command line for Chokidar, otherwise, just run!
if (process.argv.pop() === '--watch') {
  watch('assets', runOnce);
} else {
  runOnce();
}

function watch(patterns, handler) {
  chokidar.watch(patterns, {
    ignoreInitial: false
  }).on('add', handler).on('change', handler).on('unlink', handler);
}

function runOnce() {
  assemble.src('assets/templates/*.hbs', { layout: 'default' })
      .pipe(extname())
      .pipe(assemble.dest('build/'));
}

而不是nodemon,这将使您的脚本保持活动并运行。所以,在npm中,你想要这个:

"scripts": {
  "build:handlebars": "node scripts/handlebars.js",
  "watch:handlebars": "node scripts/handlebars.js --watch"
}

每当文件发生变化时,脚本现在都会运行,无需从头开始重新调用。

答案 1 :(得分:0)

汇编的beta版本基于gulp并且有一个你可以像使用gulp一样使用的cli,但是如果你不想使用cli而是使用npm脚本,你可以做一些基于@ roel-van-uden的回答没有chokidar,也能够重新加载实际资产(例如数据,布局,部分)

__END__