NodeJs:带有依赖的外部javascript

NodeJs: external javascript with dependencies

本文关键字:外部 javascript 依赖 NodeJs      更新时间:2023-09-26

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

var assemble = require('assemble');

我们的包。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');

然后定义一个小助手,当模式中的某些内容发生变化时运行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"
}

无论何时文件发生变化,脚本现在都将运行,而无需从头重新调用。

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']);
}