Как требовать JavaScript с помощью webpack из динамического каталога
У меня есть старый старый ES5 JavaScript старой школы, который мне нужно вставить в мое приложение, которое использует webpack в качестве связующего. Проблема в том, что расположение этих файлов находится в папке, путь которой динамический. Похоже, что webpack не работает с выражениями в require
и require.context
не позволяет их вообще.
Для известных каталогов путей, требующих всех файлов в каталоге и его подкаталогах, этот подход отлично работает:
let domainRequires = require.context('./app/domain', true, /\.js$/);
domainRequires.keys().forEach(domainRequires);
Поскольку я не могу использовать выражение в require.context
, я попробовал просто использовать plain require
и НЕ работает:
require('../../path/to/code/my-library-' + versionNumber + '/domain/clazz.js');
используя полный относительный путь.
Я также пытался использовать require.context
, но увеличивая часть регулярного выражения, чтобы заставить его работать и не повезло:
require.context('../../path/to/code', true, /^my-library-.*\/domain\/.*\.js$/);
Любые мысли, предложения или решения будут приветствоваться. Если мне нужно использовать что-то третье лицо с webpack, это тоже хорошо.
Ответы
Ответ 1
В итоге я понял это. Используя webpack resolve.alias
, я мог бы добавить:
resolve: {
alias: {
common: path.resolve(__dirname, '../../path/to/code/my-library-' + versionNumber + '/domain')
}
}
в webpack.config
.
Тогда в моем коде я могу потребовать все файлы в /domain
через:
var commonRequires = require.context('common', true, /\.js$/);
commonRequires.keys().forEach(commonRequires);
Аналогично, я мог бы получить один файл через:
require('common/clazz.js'); // ../../path/to/code/my-library-1.0.0/domain/clazz.js
FWIW, чтобы получить versionNumber
Я использовал модуль node fs
для чтения из json файла, использовал JSON.parse(file)
, а затем извлек версию вверху webpack.config
Ответ 2
Из Webpack 3.9 (я думаю) commonRequires
не требуется. Я запустил это в webpack.config.js:
resolve: {
alias: {
tmpDir: path.resolve(__dirname, '/tmp')
}
}
И затем я загружаю свой настраиваемый модуль как:
const dynModule = require('tmpDir/dyn_module.js');
Не уверен, что я пропустил что-то из ваших требований, но commonRequires
мне не нужен, и Webpack строит это просто отлично (и он работает).