2014-02-08 33 views
14

我正在使用Browserify将大型Node.js应用程序编译为单个文件(使用选项--bare--ignore-missing [以避免Express中的lib-cov出现问题])。我有一些代码动态地加载基于什么是目录中可用的模块:其中aribtrary文本的文件是从我的编译文件中加载的目录加载在我的应用使用Browserify编译动态需要的模块

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

我得到奇怪的错误。我认为这是因为路径不能正确设置,并且因为Browserify将无法正确地动态加载像这样的文件。

制作静态index.js文件的缺点,是否有一个首选的方法来动态地要求一个与Browserify兼容的模块目录?

回答

19

这个插件允许需要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) 
+0

非常酷。我将不得不在晚些时候搞砸了! – Brad

+5

Muahhhahha,欺骗静态分析器,相信你正在使用它们 - 经典:D – incarnate

+0

为什么要求(“app /”+模块)只有当我把它放在require(“app/*。 js“)是?所需的JS在编译的JS中,我可以找到它们但不能访问... – haxpanel

2

Browserify不支持动态要求 - 请参见GH issue 377

动态需要目录的唯一方法我知道:构建步骤来列出目录文件并写入“静态”index.js文件。

+0

谢谢你的笔记。按照您的建议,我最终创建了一个静态包含文件。就目前而言,我只有约15件事。 – Brad

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