Использовать обозреватель Требовать все файлы в каталоге

Я новичок в Browserify (и в системах Javascript build вообще) и достиг точки, в которой я полностью запутался.

У меня есть Gulp настройка для моих сборников, которая всегда работала нормально, и в последнее время я использую Browserify для комплектации - в основном, поэтому я могу разделить свой код на отдельные файлы и require() их там, где им нужно быть.

Моя проблема в том, что у меня есть папка с кучей небольших модулей, которые мне требуются в другом модуле, и я стараюсь избегать жесткого кодирования имен всех из них. Есть ли способ сделать все файлы?

Я пробовал использовать Bulkify и Folderify, но не могут заставить их работать. Например, с Bulkify установленный пакет называется bulkify и находится в папке node_modules, но затем они говорят вам потребовать bulk-require, который находится в sub node_modules папки большого объема. Когда я это пробую, Browserify дросселирует с ошибкой типа Cannot find module 'bulk-require'....

В этот момент я смущен, потому что я понятия не имею, почему инструкции по установке обоих из них не работают (и не помогут ли они мне). Предполагаю ли я использовать их в своем файле Gulp? Или я могу использовать их в одном из моих модулей, и он будет вызван во время браузера?

Вот фрагмент моей задачи сборки для этого, если это помогает:

// 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() или есть лучший способ?


ИЗМЕНИТЬ

Я отчетливо вижу bulk-require в модуле bulkify node:

enter image description here

Но, когда я пытаюсь потребовать bulk-require, он задыхается:

module.exports = function(type, driver, node) {

    var propertiesContainer = '#property-container';

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

}

Ошибка: не удается найти модуль "bulk-require" из "/path/to/my/project/resources/assets/js/report"


РЕДАКТИРОВАТЬ 2

Мне удалось выполнить эту работу, используя пакет require-globify (https://github.com/capaj/require-globify). В моем javascript я использовал:

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

Это возвращает объект с ключами как имя файла без расширения или префикса пути.

В моем gulpfile.js я сделал это:

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

Ответы

Ответ 1

Это довольно простая задача. Используя fs, вы можете динамически потребовать, чтобы все зависимости сразу просто обращались к вашей папке node_modules.

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

Дополнительные ответы по этому вопросу можно найти здесь

ИЗМЕНИТЬ Извиняюсь за общий ответ. Я как-то неправильно понял вопрос о динамическом требовании файлов в Browserify.

Require-globify кажется аккуратным подходом к вашей проблеме.

Найдите время, чтобы посмотреть на этот ответ, Компилировать динамически требуемые модули с Browserify

Ответ 2

Я не использовал его, но я думаю, что bulkify сделает то, что вы хотите.

Я должен использовать их в моем файле Gulp? Или я могу использовать их в одном из моих модулей, и он будет вызван во время браузера?

Да и да.

Я думаю, что суть в этом примерно такая:

gulpfile.js

var bulkify = require('bulkify');

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

another-module.js (вложенный модуль)

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