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']);
}
我们正在尝试仅使用对其他包具有最小依赖性的 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']);
}