Coder Social home page Coder Social logo

vite-plugin-legacy-qiankun's Introduction

vite-plugin-legacy-qiankun

让 vite 丝滑兼容 qiankun,且生产环境保证沙箱环境。

example

安装

npm i vite-plugin-legacy-qiankun @vitejs/plugin-legacy -D

版本需要

vite >= 3

特性

  • 保留 native module
  • 生产环境 js 沙箱
  • 生产环境 css 沙箱
  • 开发环境 css 沙箱
  • 开发环境 js 沙箱(设置 devSandbox = true 使用,还在测试中)

使用

vue3 + vite

// main.js
import { createLifecyle, getMicroApp } from 'vite-plugin-legacy-qiankun'
import { createRouter, createWebHistory } from 'vue-router'
import pkg from '../package.json' // your micro app name (pkg.name)

const microApp = getMicroApp(pkg.name)

const router = createRouter({
  history: createWebHistory(microApp.__POWERED_BY_QIANKUN__ ? pkg.name : '/'),
  routes: [
    {
      path: '/',
      name: 'home',
      component: () => import('./home.vue')
    },
    {
      path: '/about',
      name: 'about',
      component: () => import('./about.vue')
    }
  ]
})

const render = () => {
  createApp(App)
    .use(router)
    .mount(`#app_p3`)
}

if (microApp.__POWERED_BY_QIANKUN__) {
  createLifecyle(pkg.name, {
    mount(props) {
      console.log('mount', pkg.name);
      render();
    },
    bootstrap() {
      console.log('bootstrap', pkg.name);
    },
    unmount() {
      console.log('unmount', pkg.name)
    }
  })
} else {
  render();
}

vue2 + vite

// main.js
import { createLifecyle, getMicroApp } from 'vite-plugin-legacy-qiankun'
import VueRouter from 'vue-router'
import pkg from '../package.json' // your micro app name (pkg.name)

const microApp = getMicroApp(pkg.name)

const router = new VueRouter({
  mode: 'history',
  base: microApp.__POWERED_BY_QIANKUN__ ? pkg.name : '/',
  routes: [
    {
      path: '/',
      name: 'home',
      component: () => import('./home.vue')
    },
    {
      path: '/about',
      name: 'about',
      component: () => import('./about.vue')
    }
  ]
})

const render = () => {
  new Vue({
    router,
    render: (h) => h(App)
  }).$mount('#app_p3')
}

if (microApp.__POWERED_BY_QIANKUN__) {
  createLifecyle(pkg.name, {
    mount(props) {
      console.log('mount', pkg.name);
      render();
    },
    bootstrap() {
      console.log('bootstrap', pkg.name);
    },
    unmount() {
      console.log('unmount', pkg.name)
    }
  })
} else {
  render();
}

react + vite

// main.jsx
import { createLifecyle, getMicroApp } from 'vite-plugin-legacy-qiankun'

const render = () => {
  ReactDOM.createRoot(document.getElementById('root')).render(
    <React.StrictMode>
      <App />
    </React.StrictMode>
  )
}

const microApp = getMicroApp(pkg.name)

if (microApp.__POWERED_BY_QIANKUN__) {
  createLifecyle(pkg.name, {
    mount(props) {
      console.log('mount', pkg.name);
      render();
    },
    bootstrap() {
      console.log('bootstrap', pkg.name);
    },
    unmount() {
      console.log('unmount', pkg.name)
    }
  })
} else {
  render();
}

vite.config

react

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import legacy from '@vitejs/plugin-legacy' // need this
import { legacyQiankun } from 'vite-plugin-legacy-qiankun'

export default defineConfig({
  server: {
    origin: 'http://127.0.0.1:xxx', // 解决资源访问
  },
  plugins: [
    react({ fastRefresh: false }),
    legacy(),
    legacyQiankun({
      name: 'your micro app name',
      devSandbox: true  
    })
  ]
})

vue2

import { defineConfig } from 'vite'
import { createVuePlugin } from 'vite-plugin-vue2'
import legacy from '@vitejs/plugin-legacy' // need this
import { legacyQiankun } from 'vite-plugin-legacy-qiankun'

export default defineConfig({
  server: {
    origin: 'http://127.0.0.1:xxx', // 解决资源访问
  },
  plugins: [
    createVuePlugin(),
    legacy(),
    legacyQiankun({
      name: 'your micro app name',
      devSandbox: true  
    })
  ]
})

vue3

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import legacy from '@vitejs/plugin-legacy' // need this
import { legacyQiankun } from 'vite-plugin-legacy-qiankun'

export default defineConfig({
  server: {
    origin: 'http://127.0.0.1:xxx', // 解决资源访问
  },
  plugins: [
    vue(),
    legacy(),
    legacyQiankun({
      name: 'your micro app name',
      devSandbox: true  
    })
  ]
})

vite-plugin-legacy-qiankun's People

Contributors

cuiluc avatar glennliao avatar lishaobos avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

vite-plugin-legacy-qiankun's Issues

主子应用根节点元素冲突

主子应用都是vite+vue,因为渲染的根节点都是#app所以子应用一加载就把主应用的#app替换了导致崩溃

image

只要使用手动加载就报错,在mac和window平台试过都这样

  • node:18.7.0
  • vite:4.5.0
  • 主应用:vue3.3
  • 子应用:vue2.7
image
import { loadMicroApp } from 'qiankun'

loadMicroApp({
    name: 'demo2',
    entry: '//localhost:5175',
    container: '#appContainer',
    activeRule: '/',
    props: {
      parentStore: '11111',
      msg: '我是父应用传过来的值,传递给B应用'
    }
  })

同时加载两个同名的子应用会出现错乱

当主应用加载两个同名的子应用时,真实window上的legacyQiankun对象中子应用名称对应的沙箱实例、生命周期函数等会被后加载的子应用覆盖,build和dev下第二个子应用都无法加载,请问有什么解决方案吗

主应用访问子应用报'import.meta' outside a module

主应用和子应用都是jeecg这个开源项目,都是vue3 + vite。子应用中用了vite-plugin-legacy-qiankun插件。但是我在主应用中访问子应用会报SyntaxError: Cannot use 'import.meta' outside a module这个错误。请问有遇到过或者有什么解决方法么?

子应用React18+vite 搭建报错

你好,我的应用构建是这样的:
主应用基座是 React18+vite (正常)
子应用Vu3+vite (正常)
子应用React18+vite (报错) ,报错显示:
app-errors.js:11 Uncaught Error: application 'react-app' died in status BOOTSTRAPPING: React refresh runtime was loaded twice. Maybe you forgot the base path? at @react-refresh:665:11
如果React子应用 中使用了 函数式 组件就会报上述错误

pkg.name含有空格或横线时会报错

// vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue2'
import legacy from '@vitejs/plugin-legacy' // need this
import { legacyQiankun } from 'vite-plugin-legacy-qiankun'

export default defineConfig({
  ...
  plugins: [
    vue(),
    legacy(),
    legacyQiankun({ name: 'your micro app name' })
  ],
  ...
}

开发环境报错:
image

同时加载一个组件包的两个入口作为子应用,加载异常

基座:vue2+webpack,多入口组件:vue3+vite
使用qiankun.loadMicroApp同时加载两个入口作为两个组件使用,先加载的legacy-6d7ac40c.js会被后加载的legacy-3ef1ad60.js
阻断,导致只能成功加载后面加载的自入口
报错如下
image
如果等待前一个加载完再加载后一个就能正常运行,配置同插件文档的配置

是否支持主应用和子应用的样式隔离

qiankun目前在使用中存在主应用和子应用样式污染问题。这个插件是否支持主应用和子应用的样式隔离,比如:
1、子应用挂载在body的dialog样式丢失(由于样式在qiankun-header中,但弹窗加载到body层级,header中不存在子应用弹窗的样式);
2、主应用和子应用相同的class、标签样式(比如body标签样式);
3、子应用重写的一些样式被主应用样式覆盖;
4、...

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.