使用Browserify编译动态所需的模块

时间:2014-02-08 05:34:44

标签: javascript node.js browserify

我正在使用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开箱即用兼容的模块目录?

3 个答案:

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