Vue 2.0 + 乾坤(qiankun)+ Module Federation 踩坑记录(二)

lxf2023-05-03 00:41:18

Vue 2.0 + 乾坤(qiankun)+ Module Federation 踩坑记录(一)

书接上文

先说一个最近发现的问题,Vue 2.0 + 乾坤(qiankun)+ Module Federation 踩坑记录(一)这里说的一个样式兼容方案还是有点问题。 ant-design-vue一些弹窗(渲染到body节点的)组件样式丢失。 解决方案

增加带有 ant- 的样式类

// index.html
<body class="ant-xxxx">

// App.vue
<div id="xxx" class="ant-xxxx"></div>

接入Module Federation

先说两个概念

remote:远程组件项目

host:使用远程组件

// remote项目
// webpack.config.js
// 没装的自己装一下
...
const { ModuleFederationPlugin } = require('webpack').container
const exposesConfig = require('./exposes.config')
...

optimization: {
    splitChunks: false,
    ...
}
...
plugins: [
    new ModuleFederationPlugin(exposesConfig),
]
...
// remote项目
// exposes.config.js
module.exports = {
  // 应用名,全局唯一,不可冲突。
  name: 'koala',
  // 暴露的文件名称
  filename: 'remote-entry-koala.js',
  library: { type: 'window', name: 'koala' },
  // 远程应用暴露出的模块名。
  exposes: {
    './config': './src/shared/config.js',
    './demo1': './src/shared/remote-entry-demo1.js',
    './demo2': './src/shared/remote-entry-demo2.js',
  },
  // 依赖包 依赖的包 webpack在加载的时候会先判断本地应用是否存在对应的包,如果不存在,则加载远程应用的依赖包。
  shared: {
    vue: {
      singleton: true,
      requiredVersion: '^2.5.17',
      eager: true,
    },
  },
}

注意这块代码

library: { type: 'window', name: 'koala' }

如果出现这个问题

ScriptExternalLoadError: Loading script failed.

可以先看看这个issue

即使我们不写library的参数,也会默认为 { type: 'var', name: name },但这里我们需要将 remote_sjms_customer 这个模块去暴露到全局,所以type修改为window

还要注意

splitChunks: false, 关掉它

// host 项目
// webpack.config.js
// 没装的自己装一下
...
const { ModuleFederationPlugin } = require('webpack').container
const ExternalTemplateRemotesPlugin = require('external-remotes-plugin')
const remoteEntryConfig = require('./remote.entry.config')
...

plugin: [
...
      new ModuleFederationPlugin(remoteEntryConfig),
      new ExternalTemplateRemotesPlugin(),
]


// remote.entry.config.js
module.exports = {
  name: 'view',
  filename: 'remote-entry-view.js',
  // 引用 koala 的服务
  remotes: {
    koala: 'koala@[window.koalaUrl]/remote-entry-koala.js?[getRandomString()]',
  },
  shared: {
    vue: {
      eager: true,
      import: 'vue',
      shareKey: 'vue',
      shareScope: 'default',
      singleton: true,
    },
  },
}

// remote-url.js

const remoteUrl = {
  koalaUrl: {
    dev: '//localhost:8779',
    pro: `${window.location.protocol}//${window.location.host}/v/koala`,
  },
}
const initRemoteUrl = () => {
  const isDev = process.env.NODE_ENV === 'development'
  for (const key of Object.keys(remoteUrl)) {
    window[key] = isDev ? remoteUrl[key].dev : remoteUrl[key].pro
  }
  window.getRandomString = () => {
    return new Date().valueOf()
  }
}

export default initRemoteUrl

// main.js
// 初始化远程模块url
import initRemoteUrl from './remote-url'
initRemoteUrl()

// any.vue
  components: {
      demo:()=>import('koala/demo2')
  },

host项目主要做了2个事,注册+使用

external-remotes-plugin

这个插件是用于切换dev/pro模式

  window.getRandomString = () => {
    return new Date().valueOf()
  }

随机生成字符串,用于解决缓存问题

引入组件要异步,同步获取不到

总结

我的项目本身需要兼容IE11,需要拆解巨石应用,所以需要采用Vue2.0 + qiankun,有很多无奈之举,调研期间也遇到很多问题,但是没有随手记录,觉得亏了一个亿,随后想起写文章吧,能记多少是多少。

如果谁遇到问题可以发到评论区,我回忆一下,万一是遇到过的呢。

酒浆! 祝好!

本网站是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。 本网站还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。 除此之外,本网站还拥有一个活跃的社区,您可以在社区中与其他前端开发者交流技术、分享经验、解决问题。我们相信,社区的力量可以帮助您更好地成长和进步。 在本网站中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!