关于javascript:Browserify需要目录中的所有文件

Browserify Require All Files in Directory

我刚开始浏览(和一般的javascript构建系统),已经到了一个我完全困惑的地步。

我有大量的设置来完成我的构建,它一直工作得很好,最近我一直在使用browserify进行捆绑——主要是为了将我的代码分为单独的文件和require()它们需要的地方。

我的问题是,我有一个文件夹,里面有一堆我需要在另一个模块中使用的小模块,我试图避免对所有模块的名称进行硬编码。有没有办法要求所有的文件?

我试过使用Bulkify和Folderify,但无法让它们工作。例如,对于Bulkify,安装的包称为Bulkify,位于node_modules文件夹中,但随后它们会告诉您需要Bulk Require,它位于Bulkify包的子节点_modules文件夹中。当我尝试的时候,用一个Cannot find module 'bulk-require'...类型的错误浏览扼流圈。

在这一点上我感到困惑,因为我不知道为什么这两个安装方向都不工作(也不知道它们是否会帮助我)。我应该在我的档案里用它们吗?或者我可以在我的一个模块中使用它们,它将在浏览期间被调用吗?

如果这有助于:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// Report Builder
gulp.task('script-builder', function() {

    // Unminified
    // **********************************************************
    browserify({entries: './resources/assets/js/report/builder.js'})
        .on('error', function (err) { console.log(err); this.emit('end'); })
        .bundle()
        .on('error', function (err) { console.log(err); this.emit('end'); })
        .pipe(source('builder.js'))
        .on('error', function (err) { console.log(err); this.emit('end'); })
        .pipe(buffer())
        .on('error', function (err) { console.log(err); this.emit('end'); })
        .pipe(gulp.dest('./public/js/debug'));

    // Minified
    // **********************************************************
    browserify({entries: './resources/assets/js/report/builder.js'})
        .on('error', function (err) { console.log(err); this.emit('end'); })
        .bundle()
        .on('error', function (err) { console.log(err); this.emit('end'); })
        .pipe(source('builder.js'))
        .on('error', function (err) { console.log(err); this.emit('end'); })
        .pipe(buffer())
        .on('error', function (err) { console.log(err); this.emit('end'); })
        .pipe(ext_replace('.min.js'))
        .on('error', function (err) { console.log(err); this.emit('end'); })
        .pipe(uglify())
        .on('error', function (err) { console.log(err); this.emit('end'); })
        .pipe(gulp.dest('./public/js/dist'));

});

我不知道我在这里做什么。我是要在我的require()调用中硬编码路径,还是有更好的方法?

编辑

我可以在bulkify节点模块中清楚地看到bulk-require

enter image description here

但是,当我试图要求bulk-require时,它会窒息:

1
2
3
4
5
6
7
8
module.exports = function(type, driver, node) {

    var propertiesContainer = '#property-container';

    var bulk = require('bulk-require');
    var mods = bulk(__dirname, ['properties/**/*.js']);

}

Error: Cannot find module 'bulk-require' from '/path/to/my/project/resources/assets/js/report'

编辑2

我可以使用require-globify包(https://github.com/capaj/requireglobify)来完成这项工作。在我的javascript中,我使用了:

1
var properties = require('./properties/*.js', {mode: 'hash', resolve: ['path-reduce', 'strip-ext']});

返回一个对象,其中键作为文件名,不带扩展名或路径前缀。

在我的gulpfile.js中,我这样做了:

1
2
3
4
5
6
7
8
9
10
11
12
browserify({
    entries: './resources/assets/js/report/builder.js',
    transform: ['require-globify']
})
.on('error', function (err) { console.log(err); this.emit('end'); })
.bundle()
.on('error', function (err) { console.log(err); this.emit('end'); })
.pipe(source('builder.js'))
.on('error', function (err) { console.log(err); this.emit('end'); })
.pipe(buffer())
.on('error', function (err) { console.log(err); this.emit('end'); })
.pipe(gulp.dest('./public/js/debug'));


这是一项很容易完成的任务。使用fs,您可能只需访问node_modules文件夹就可以动态地同时需要所有依赖项。

1
2
3
4
var normalizedPath = require("path").join(__dirname,"node_modules/bulkify");
require("fs").readdirSync(normalizedPath).forEach(function(file) {
  require("./node_modules/bulkify" + file);
});

关于这个问题的更多答案可以在这里找到

编辑抱歉,对于一般的答案,我有点误解了关于动态要求文件进入browserify的问题。

"需要全局化"似乎是解决问题的一个好方法。

花点时间看看这个答案,并用browserify编译动态需要的模块


我没有用过,但我想江户十一〔0〕会做你想做的。

Am I supposed to be using them in my Gulp file? Or can I use them in one of my modules and it will get called during the Browserify?

是的,是的。

我想要点是这样的:

gulpfile.js

1
2
3
4
5
var bulkify = require('bulkify');

browserify(...)
  .transform(bulkify)
  // ...

another-module.js(捆绑模块)

1
2
3
var bulk = require('bulk-require');
var a_bunch_of_small_modules = bulk(__dirname, ['somdir/**/*.js']);
a_bunch_of_small_modules.somedir.whatever();