#webpack #vue-router #vuejs3 #webpack-module-federation
Вопрос:
Я пытаюсь динамически вызывать некоторые компоненты в зависимости от названия маршрута. Мои компоненты поступают из федерации удаленных модулей, поэтому мне нужно сохранить эту структуру : импорт («модуль/модуль»), если нет других способов ее определения.
вот моя конфигурация веб-пакета
new ModuleFederationPlugin({
name: "core-front",
remotes: {
test: "test@http://localhost:8081/remoteEntry.js",
test2: "test2@http://localhost:8082/remoteEntry.js",
},
exposes: {},
shared: require("./package.json").dependencies,
}),
Поэтому я хотел бы загрузить тест или тест2, если мой маршрут является локальным хостом:8080/приложение/тест
Я попытался динамически переписать имя и использовать его внутри функции импорта (), но это не работает.
<template>
<component :is="name"></component>
</template>
<script setup>
import {computed, defineAsyncComponent} from "vue";
import {useRoute} from "vue-router";
const route = useRoute();
const capitalizer = (string) => {
return (string amp;amp; string[0].toUpperCase() string.slice(1)) || "";
};
const name = computed(() => {
const appName = route.params.name;
const appNameCapitalize = capitalizer(appName);
return defineAsyncComponent(() => import(`${appName}/${appNameCapitalize}`));
});
</script>
Я получаю эту ошибку :
Не пойманный (в обещании) Ошибка: Не удается найти модуль «тест/Тест»
(хотя название модуля правильное…)
Это работает:
const name = computed(() => defineAsyncComponent(() => import("test/Test")));
Похоже, мы не можем использовать динамическое имя при импорте.
Есть идеи, как обойти эту проблему ? Я хотел бы позже также использовать динамический список открытых модулей, поэтому я не хочу использовать жесткие кодовые имена.
Ответ №1:
если в React использовать приведенные ниже методы для загрузки динамического модуля, я скажу, что они будут очень похожи в VUE tho…
function loadComponent(scope, module, baseModuleType) {
return async () => {
await __webpack_init_sharing__('default');
const container = window[scope];
await container.init(__webpack_share_scopes__.default);
const factory = await window[scope].get(module);
const Module = factory();
return { default: Module[baseModuleType] };
};
}
const Component = React.lazy(loadComponent('App2', `./components/${componentsType}`, type));
<React.Suspense fallback="Loading System">
<Component />
</React.Suspense>
Если возникнут какие-либо дополнительные вопросы, обратитесь ниже:
https://webpack.js.org/concepts/module-federation/#dynamic-remote-containers
https://dev.to/waldronmatt/tutorial-a-guide-to-module-federation-for-enterprise-n5