Наш пакет Webpack содержит заполнители для динамического импорта значков.Пример динамического импорта выглядит следующим образом:
const { icon: iconName } = this.props;
const faIconName = `fa${iconName.replace(/./, c => c.toUpperCase())}`;
import(
/* webpackInclude: /\.js$/ */
`@fortawesome/pro-light-svg-icons/${faIconName}`
).then(faIcon => {
if (this.mounted) {
this.setState({ faIcon });
}
});
Мы решили использовать эту стратегию для предотвращения объединения в Webpack всей коллекции значков FontAwesome.
Совсем недавно мы поняли, чтонужно иметь внутренние сборки, где не происходит динамический импорт, и платить цену большего пакета.Следующий код был помещен в наш код иконки (наряду с динамическим импортом, указанным выше):
const faIconName = `fa${iconName.replace(/./, c => c.toUpperCase())}`;
let faIcon;
try {
faIcon = require(`@fortawesome/pro-light-svg-icons/${faIconName}.js`)[faIconName];
} catch (e) {}
Обе стратегии загрузки работают нормально, если используются по одной .Проблема возникает, когда они сосуществуют в компоненте icon.
Я убедился, что инструкция import
побуждает Webpack создать в комплекте то, что мне кажется синтетическим файлом JS, созданным с помощью команды:
webpack:/// ./node_modules/@fortawesome/pro-light-svg-icons lazy ^\.\/.*$ include: \.js$ namespace object
Когда в компоненте Icon присутствуют инструкции import
и require
, синтетический файл отличается от того, когда встречается подошва import
.
Подробно, объект, называемый map
в синтетическом файле содержит значения, которые являются массивами с 3 элементами в случае import
и с 2 элементами в случае import+require
;синтетический код пытается получить доступ к третьему элементу, и все падает.
Кто-нибудь может прокомментировать эту проблему?