vue-cli 5接入模块联邦 module federation

[复制链接]
发表于 2025-12-3 02:35:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
模块联邦概念

模块联邦由webpack 5开始推出的,让应用加载长途的代码模块来实现差别的Web应用共享代码片断.模块联邦分为两个脚色,一个是生产者,一个是斲丧者.生产者袒露代码供斲丧者斲丧
(用一个不太精准的比喻 这个就是webpack内置的cdn)
实现思绪


  • 起主要先将vue-cli升级到5 详细在上一篇
  • 针对模块联邦举行设置
设置

我是vue-cli 接入webpack应用,vue-cli接vue-cli用vue-cli的设置就好了
webpack生产者 webpack.config.js
  1. const { ModuleFederationPlugin } = require("webpack").container;
  2. const path = require("path");
  3. module.exports = {
  4.   entry: "./index.js",
  5.   mode: "development",
  6.   output: {
  7.     publicPath: "http://localhost:6780/",
  8.     clean: true,
  9.   },
  10.   devServer: {
  11.     static: {
  12.       directory: path.join(__dirname, "dist"),
  13.     },
  14.     compress: true,
  15.     port: 6780,
  16.   },
  17.   optimization: {
  18.     splitChunks: false,//splitChunks和mf冲突不能用
  19.   },
  20.   plugins: [
  21.     new ModuleFederationPlugin({
  22.       name: "moduleFederationLib",
  23.       filename: "remoteEntry.js",
  24.       library: { type: "window", name: "moduleFederationLib" },
  25.       exposes: {
  26.         "./react": "react",
  27.         "./react-dom": "react-dom",
  28.         './apiUrl':"./src/utils/apiUrl"
  29.       },
  30.     }),
  31.   ],
  32. };
复制代码
vue-cli生产者 vue.config.js
  1. // vue.config.js
  2. module.exports = {
  3.   publicPath: "http://localhost:4567/",
  4.   chainWebpack: (config) => {
  5.     /* module federation plugin import */
  6.     config.optimization.delete("splitChunks");
  7.     config
  8.       .plugin("module-federation-plugin")
  9.       .use(require("webpack").container.ModuleFederationPlugin, [
  10.         {
  11.           name: "home", // 模块名称(必须唯一)
  12.           filename: "remoteEntry.js",//加载的文件名
  13.           library: { type: "window", name: "home" },//type:指定如何将远程模块暴露给其他应用 设置成window才能找到
  14.           exposes: {
  15.             // 对外暴露的组件
  16.             "./HelloWorld": "./src/components/HelloWorld.vue",
  17.           },
  18.         },
  19.       ]);
  20.   },
  21.   // devSever 一定要设置跨域 能够跨域是整个mf的基础
  22.   devServer: {
  23.     port: 4567,
  24.     hot: true,
  25.     headers: {
  26.       "Access-Control-Allow-Origin": "*",
  27.       "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, PATCH, OPTIONS",
  28.       "Access-Control-Allow-Headers":
  29.         "X-Requested-With, content-type, Authorization",
  30.     },
  31.   },
  32. };
复制代码
vue-cli斲丧者 webpack.config.js
  1. module.exports = {
  2.   configureWebpack: {
  3.     resolve: {
  4.       fallback: {
  5.         //禁止webpack在找不到引入的文件的时候用fs模块去查找
  6.         //模块联邦的模块就是找不到的 webpack尝试在/src下找 在不到再报错 根本就不到远程
  7.         fs: false
  8.       }
  9.     },
  10.   },
  11.   chainWebpack: (config) => {
  12.     /* module federation plugin import */
  13.     config.optimization.delete("splitChunks");//splitChunks和mf冲突不能用
  14.     config
  15.       .plugin("module-federation-plugin")
  16.       .use(require("webpack").container.ModuleFederationPlugin, [
  17.         {
  18.           name: "app",
  19.           remotes: {
  20.             // 导入
  21.             home: "home@http://localhost:4567/remoteEntry.js",
  22.             "moduleFederationLib"://remote模块的module Name是不能带 - 不然会导致导入失败
  23.             "moduleFederationLib@http://localhost:6780/remoteEntry.js",
  24.           },
  25.         },
  26.       ]);
  27.   },
  28. };
复制代码
斲丧者使用:
  1. <script>
  2. export default {
  3.   name: 'App',
  4.   components: {
  5.     HelloWorld: () => import('home/HelloWorld')
  6.   },
  7.   mounted() {
  8.     //采用异步导入
  9.     import('moduleFederationLib/apiUrl').then(({default: apiUrl}) =>{
  10.       console.log('apiUrl!',apiUrl)
  11.     })
  12.   }
  13. }
  14. </script>
复制代码
遇到的题目:

题目1.引入长途模块后Uncaught TypeError: Cannot read properties of undefined (reading ‘call’),不引入就没有这个题目
办理方法:

  • 查抄生产者的remoteEntry.js是否正确启动
  • 查抄config中library是否已经设置成window,假如乐成设置成window在控制台可以查抄
题目2.ScriptExternalLoadError: Loading script failed
办理方法:

  • 查抄splitChunks是否已经设置成false
  • 查抄生产者的remoteEntry.js是否正确启动
题目3.不可以或许像webpack示例一样 使用静态导入长途模块
缘故原由:
mf提供的模块是长途模块,必须要先加载长途模块才气够像静态模块一样使用
办理方法:
使用动态加载长途模块,再加载斲丧者
留意:import 静态导入的模块会提拔至顶层,以是必须使用动态导入
bootstrap.js
  1. //bootstrap.js
  2. import Vue from 'vue';
  3. Vue.config.productionTip = false;
  4. const loadRemoteAndInitApp = async () => {
  5.   try {
  6.     //先动态导入远程模块
  7.     const remote = await import('moduleFederationLib/apiUrl');
  8.     console.log('Successfully loaded remote component:', remote);
  9.     //导入成功之后再加载App.vue(消费模块的页面) 一定要确保先加载模块再导入消费者
  10.     const App = (await import('./App.vue')).default;
  11.     //创建并挂载 Vue 实例
  12.     new Vue({
  13.       render: h => h(App),
  14.     }).$mount('#app');
  15.     console.log('Vue app has been mounted.');
  16.   } catch (error) {
  17.     console.error('Error loading remote component or initializing Vue app:', error);
  18.   }
  19. };
  20. loadRemoteAndInitApp();
复制代码
main.js
  1. import './bootstrap'
复制代码
长途模块斲丧者App.vue
  1. import APIURl from 'moduleFederationLib/apiUrl'
  2. // 下面就跟正常从文件夹导入就行
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表