Компиляция динамически требуемых модулей с помощью 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'));
});