我正在使用Browserify将大型Node.js应用程序编译为单个文件(使用选项--bare
和--ignore-missing
[以避免Express中lib-cov
出现问题)。我有一些代码可以根据目录中的可用内容动态加载模块:
var fs = require('fs'),
path = require('path');
fs.readdirSync(__dirname).forEach(function (file) {
if (file !== 'index.js' && fs.statSync(path.join(__dirname, file)).isFile()) {
module.exports[file.substring(0, file.length-3)] = require(path.join(__dirname, file));
}
});
我的应用程序中出现了奇怪的错误,其中从我编译的文件加载的目录中加载了aribtrary文本文件。我认为这是因为路径不再正确设置,并且因为Browserify将无法{ {1}}像这样动态加载的正确文件。
如果没有制作静态require()
文件,是否有一种首选方法可动态要求与Browserify开箱即用兼容的模块目录?
答案 0 :(得分:21)
此插件允许要求Glob模式:require-globify
然后,通过一点点黑客,您可以在编译时添加所有文件而不执行它们:
// Hack to compile Glob files. Don´t call this function!
function ಠ_ಠ() {
require('views/**/*.js', { glob: true })
}
例如,您可以在需要时要求并执行特定文件:D
var homePage = require('views/'+currentView)
答案 1 :(得分:2)
Browserify不支持动态需求 - 请参阅GH issue 377。
动态要求我知道的目录的唯一方法:列出目录文件的构建步骤并写入“静态”index.js文件。
答案 2 :(得分:2)
还有bulkify
转换,如下所示:
https://github.com/chrisdavies/tech-thoughts/blob/master/browserify-include-directory.md
基本上,您可以在app.js
或其他任何内容中执行此操作:
var bulk = require('bulk-require');
// Require all of the scripts in the controllers directory
bulk(__dirname, ['controllers/**/*.js']);
我的gulpfile里面有这样的东西:
gulp.task('js', function () {
return gulp.src('./src/js/init.js')
.pipe(browserify({
transform: ['bulkify']
}))
.pipe(rename('app.js'))
.pipe(uglify())
.pipe(gulp.dest('./dest/js'));
});