Использовать обозреватель Требовать все файлы в каталоге
Я новичок в 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();