Подтвердить что ты не робот

Как требовать 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, это тоже хорошо.

4b9b3361

Ответ 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 строит это просто отлично (и он работает).