Microapp 接入vite子应用

一、子应用

官网教程:https://micro-zoe.github.io/micro-app/docs.html#/zh-cn/framework/vite

1,步骤一:修改vue.config.js/vue.config.ts

注意:

(1)根据官方教程,basename需要更换的!

(2)plugin:[] 里面保留vue(),再加上自定义插件的内容!

(3)记得配置跨域!

import { join } from 'path' 
import { writeFileSync } from 'fs'
// vite.config.js
export default defineConfig({
  base: `${process.env.NODE_ENV === 'production' ? 'http://my-site.com' : ''}/child-vite/`,
  plugins: [
    vue(), //这个不要删掉,亲测踩坑过,不要删
    // 自定义插件
    (function () {
      let basePath = ''
      return {
        name: "vite:micro-app",
        apply: 'build',
        configResolved(config) {
          basePath = `${config.base}${config.build.assetsDir}/`
        },
        writeBundle (options, bundle) {
          for (const chunkName in bundle) {
            if (Object.prototype.hasOwnProperty.call(bundle, chunkName)) {
              const chunk = bundle[chunkName]
              if (chunk.fileName && chunk.fileName.endsWith('.js')) {
                chunk.code = chunk.code.replace(/(from|import\()(\s*['"])(\.\.?\/)/g, (all, $1, $2, $3) => {
                  return all.replace($3, new URL($3, basePath))
                })
                const fullPath = join(options.dir, chunk.fileName)
                writeFileSync(fullPath, chunk.code)
              }
            }
          }
        },
      }
    })(),
  ],
})
    server: {
        port: 8081,//这个端口就是主应用挂载的url端口
        headers: {
          'Access-Control-Allow-Origin': '*' //记得配置跨域
        }
      }

2,步骤二:修改index.html的id名字

3,步骤三:同步修改main.js/main.ts挂载的容器

4,检查路由是否是history模式

到这里,可以去检验一下改好的子应用有没有问题,能不能正常跑,有问题及时调试,如果按照上面修改的话,最后跑起来的地址在应该是:

http://localhost:8081/child-vite/#/home;

注意:

(1)child-vite 就是你修改的 basename !

(2)home就是你路由redirect的那个路径,你也可以自己修改的,懂的哈!

二、主应用

接入vite子应用和接入其他的子应用大部分步骤一样,可以参考我前面的文章(若依vue3 前端微应用改造),不一样的部分就是main.js里面的microApp.start()方法需要修改;我们按顺序来吧。

1,步骤一:下载microapp依赖

npm i @micro-zoe/micro-app --save 或 yarn add micro-zoe/micro-app --save

2,步骤二:main.js/main.ts引入microapp并且改写

// 放在顶部
import microApp from'@micro-zoe/micro-app'
microApp.start({
    plugins: {
        modules: {
          // appName即应用的name值
          'micro-app': [{
            loader(code) {
              if (process.env.NODE_ENV === 'development') {
                // 这里 basename 需要和子应用vite.config.js中base的配置保持一致
                code = code.replace(/(from|import)(\s*['"])(\/child-vite\/)/g, all => {
                  return all.replace('/child-vite/', 'http://localhost:8081/child-vite/')
                })
              }
              return code
            }
          }]
        }
      }
})

3,步骤三:router/index.js留一个给子应用挂载页面的路由

  {
    path: '',
    component: Layout,
    redirect: '/index',
    children: [
      {
        path: '/index',
        component: () => import('@/views/micro/micro2/index'),//根据相应的路径创建文件
        name: 'Index',
        meta: { title: '首页', icon: 'dashboard', affix: true }
      }
    ]
  },

注意:我这上面是若依的index的路由,你可以根据自己的路由创建文件和路径;

4,步骤四:创建的页面里面挂载子应用端口

    <micro-app 
      :name="micro-app" 
      :url="http://localhost:8081/" //你在子应用vite.config.ts里面配的端口
      baseRoute="/micro-app" //这个官网说失效,我忘记删了,根据情况试试吧
      :data="dataForChid" 
      @datachange="handleDataChange"
      inline  //官网要加的属性
      disableSandbox //官网要加的属性,关闭沙箱
      keep-alive 
      style="height: 100%"
    ></micro-app>

好了,大功告成了,可以试试启动主应用,有没有报错,进行调试;

三、报错案例

(1)错1:

说明子应用的vue()没加上,或者不小心给删掉了,记得给加上

(2)错2:

这个说明主应用的microApp.start()里面的配置写错了,或者和子应用配置的basename不一致,再去检查一下;

以上都是亲自踩过的错,能够解决的,另外可以去看官方的demo案例,看不同版本的实际写法,能够帮助你调试出错的问题:https://github.com/micro-zoe/micro-app-demo

四,公测版:

另外官网现在有了公测版,如果是公测beta版本接入vite不需要修改vite.config.js也不需要在基座设置插件处理;可以参考这个的链接方法:https://micro-zoe.com/docs/1.x/#/zh-cn/framework/vite

1,步骤一:主应用下载依赖

npm i @micro-zoe/micro-app@beta --save
yarn add @micro-zoe/micro-app@beta --save

2,步骤二:切换iframe沙箱

3,步骤三:关闭虚拟路由

microApp.start({
  'disable-memory-router': true, // 关闭虚拟路由系统
  'disable-patch-request': true, // 关闭对子应用请求的拦截
})

亲测了,其他不是vite的子应用不受影响,至于会不会有后续的问题,可以关注官网的情况。希望对大家能够有所帮助,可以进官网的官方群里问问里面的大佬们,另外vite版本好像9月份会再更新,记得关注官网的消息哦,创作不易,多多点赞。

### microapp 子应用样式错乱解决方案 #### 1. 使用 CSS Modules 为了防止多个子应用间的样式冲突,推荐使用 CSS Modules 来编写样式文件。CSS Modules 可以让类名作用域化,从而避免全局污染。 ```css /* Button.module.css */ .button { background-color: blue; } ``` ```javascript // button.jsx import styles from './Button.module.css'; function Button() { return ( <button className={styles.button}>Click me</button> ); } export default Button; ``` [^1] #### 2. Shadow DOM 采用 Web Components 的 Shadow DOM 技术封装组件,使内部样式仅应用于该组件而不影响页面上其他部分。 ```html <custom-element></custom-element> <script type="module"> class CustomElement extends HTMLElement { constructor() { super(); const shadowRoot = this.attachShadow({ mode: 'open' }); shadowRoot.innerHTML = ` <style> p { color: red } </style> <p>Hello, world!</p>`; } } window.customElements.define('custom-element', CustomElement); </script> ``` #### 3. 命名空间前缀 如果不想引入新的技术栈,则可以在所有选择器前面加上唯一的命名空间作为前缀,比如 `subapp-` 开头的选择器名称。 ```css .subapp-button { padding: 8px 16px; font-size: 1rem; } ``` #### 4. 配置 Micro App 插件 对于基于 micro-app 构建的应用程序来说,还可以考虑配置插件来处理样式隔离问题。例如: ```json { "plugins": [ ["@micro-zoe/micro-app-plugin-style-isolation", {}] ] } ``` 此插件会自动为每个子应用程序创建独立的作用范围并注入必要的样式标签。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值