Компиляция динамически требуемых модулей с помощью Browserify

Я использую Browserify для компиляции большого приложения Node.js в один файл (с помощью опций --bare и --ignore-missing [во избежание проблем с lib-cov в Express]). У меня есть некоторый код для динамической загрузки модулей на основе того, что доступно в каталоге:

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 text из каталога, в который загружен мой скомпилированный файл. Я думаю, что это потому, что пути больше не установлены правильно, и потому что Browserify не сможет require() правильные файлы, которые динамически загружаются следующим образом.

За исключением создания статического файла index.js, существует ли предпочтительный метод динамического запроса каталога модулей, совместимых с браузером?

Ответы

Ответ 1

Этот плагин позволяет использовать шаблоны 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)

Ответ 2

Browserify не поддерживает динамические требования - см. GH issue 377.

Единственный метод динамического запроса каталога, о котором я знаю: шаг сборки для отображения файлов каталога и записи "статического" файла index.js.

Ответ 3

Здесь также преобразование 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'));
});