我目前正在尝试建立一个使用 Webpack 的 Module Federation 来共享组件的项目。
为此,我使用 cli 设置了两个基本的 vue 项目,并在两个项目中添加了一个 vue.config.js 文件:
宿主项目(将包括共享组件)(在 localhost:8000 上运行)
const { ModuleFederationPlugin } = require('webpack').container
module.exports = {
configureWebpack: {
plugins: [
new ModuleFederationPlugin({
name: 'shell',
filename: 'remoteEntry.js',
remotes: {
component: 'component@http://localhost:8001/remoteEntry.js'
},
exposes: {},
shared: {}
})
]
}
}
组件项目(共享组件)(在 localhost:8001 上运行):
const { ModuleFederationPlugin } = require('webpack').container
module.exports = {
configureWebpack: {
plugins: [
new ModuleFederationPlugin({
name: 'component',
filename: 'remoteEntry.js',
remotes: {},
exposes: {
'./HelloWorld': './src/components/HelloWorld.vue'
},
shared: {}
})
]
}
}
我尝试在我的 App.vue 中加载组件:
<template>
<img alt="Vue logo" src="./assets/logo.png" />
<HelloWorld msg="Welcome to Your Vue.js App" />
<otherComp />
</template>
<script>
import { defineAsyncComponent } from "vue";
import HelloWorld from "./components/HelloWorld.vue";
const otherComp = defineAsyncComponent(() => import("component/HelloWorld"));
export default {
name: "App",
components: {
HelloWorld,
otherComp,
},
};
</script>
实际上,它会尝试加载组件,但不是从 localhost:8001(组件所在的位置)加载它,而是尝试从 localhost:8000 加载它:
localhost:8001 上的相同路径确实存在。一些调试显示,webpack publicPath 似乎设置为“/”(导致 localhost:8000 的托管应用程序将 url 设置为/js/src_components_HelloWorld_vue.js
)
/******/ /* webpack/runtime/publicPath */
/******/ !function() {
/******/ __webpack_require__.p = "/";
/******/ }();
我相信这是由于 vue-cli 与 webpack 交互的方式。这是一个已知问题吗?如何解决?