Я пытаюсь настроить следующую архитектуру: основное приложение React, которое создается с некоторыми базовыми функциями, и возможность загружать дополнительные компоненты React во время выполнения.Эти дополнительные компоненты React могут быть загружены по требованию, и они не доступны во время сборки для основного приложения (поэтому они не могут быть включены в пакеты для основного приложения и должны быть собраны отдельно).После исследований в течение некоторого времени я наткнулся на Webpack Externals , который мне показался подходящим.Сейчас я строю свои модули отдельно, используя следующий файл webpack.config.js:
const path = require('path');
const fs = require('fs');
process.env.BABEL_ENV = 'production';
process.env.NODE_ENV = 'production';
const appDirectory = fs.realpathSync(process.cwd());
const resolveApp = relativePath => path.resolve(appDirectory, relativePath);
module.exports = {
entry: './src/MyModule.jsx',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'MyModule.js',
library: 'MyModule',
libraryTarget: 'umd'
},
externals: {
"react": "react",
"semantic-ui-react": "semantic-ui-react"
},
module: {
rules: [
{
test: /\.(js|jsx|mjs)$/,
include: resolveApp('src'),
loader: require.resolve('babel-loader'),
options: {
compact: true,
},
}
]
},
resolve: {
extensions: ['.wasm', '.mjs', '.js', '.json', '.jsx']
}
};
Взглянул на сгенерированный файл MyModule.js, и он выглядит мне корректно.
СейчасВ моем основном приложении я импортирую модуль следующим образом:
let myComponent = React.lazy(() => import(componentName + '.js'));
, где componentName
- это переменная, которая соответствует имени моего модуля, в данном случае «MyModule». Имя неизвестно.во время сборки, а файл отсутствует в папке src во время сборки.Чтобы избежать ошибок из webpack при создании этого кода с неизвестным импортом, я добавил следующее в мой webpack.config.js для основного проекта:
module.exports = {
externals: function (context, request, callback/*(err, result)*/) {
if (request === './MyModule.js') {
callback(null, "umd " + request);
} else {
callback();
}
}
}
Я подтвердил, что вызывается функция во внешних файлах.во время сборки, и если условие соответствует этому модулю.Сборка прошла успешно, и я могу запустить свое основное приложение.
Затем, чтобы протестировать динамическую загрузку, я помещаю MyModule.js
в папку static / js, где находятся пакеты для моего основного приложения, затем перехожу на страницу в своем основном приложении, которая запрашивает MyModule через let myComponent = React.lazy(() => import(componentName + '.js'));
Я вижу ошибку времени выполнения в консоли в строке импорта,
TypeError: undefined is not a function
at Array.map (<anonymous>)
at webpackAsyncContext
Мне кажется, что он не может найти модуль.Я не понимаю, где он ищет модуль или как получить больше информации для отладки.