NodeJs:具有依赖关系的外部 javascript

NodeJs: external javascript with dependencies

我们正在尝试仅使用对其他包具有最小依赖性的 nodeJS,我们现在遇到的挑战是 HandelbarsJS。我们找到了一个包,Assemble 可以为我们生成 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\"" }

script/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 文件。

我们如何确保 'require' 只被调用一次,或者它们是否保留在内存中?

谢谢!

既然你想用 assemble 来完成这个,但没有 gulp,我推荐 chokidar

npm install chokidar --save

现在您可以这样要求 chokidar

var chokidar = require('chokidar');

然后定义一个小帮手,当模式发生变化时 运行s 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,这将使您的脚本保持活动状态并 运行ning。所以,在 npm 中,你想要这个:

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

每当文件更改时,脚本现在 运行,无需从头开始重新调用。

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

#! /usr/bin/env node

var start = Date.now();
var assemble = require('assemble');
var extname = require('gulp-extname');

assemble.task('assets', function () {
  console.log(Date.now() - start);
  assemble.data('assets/templates/data/*.json');
  assemble.layouts('assets/templates/layouts/*.hbs');
  assemble.partials('assets/templates/partials/*.hbs');

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

assemble.task('watch', ['assets'], function () {
  assemble.watch('./assets/**/*.*', ['assets]');
});

// Enable --watch command line
if (process.argv.pop() === '--watch') {
  assemble.run(['watch']);
} else {
  assemble.run(['assets']);
}