前一段时间, 写了强盛集团管理系统(基于BPMN引擎的工作流系统), 打算使用qiankun改造下项目架构, 迈向微前端, 今天开始第一章。
npm install -g @vue/cli
# OR
yarn global add @vue/cli
vue create base
基座可以是 Vue、React、等
yarn add qiankun # 或者 npm i qiankun -S
在 main.js 加入
import { registerMicroApps, start } from "qiankun"; registerMicroApps([ [ { name: "vueApp", entry: "//localhost:1100", // 默认vue启动的入口是1100端口 activeRule: "/vue", // 当路径是 /vue的时候启动 container: "#container", // 应用挂载的位置 loader, props: { a: 1, util: {} }, }, ], ]); start();
或
新建register-apps.js
import { registerMicroApps, start, initGlobalState } from "qiankun"; const loader = (loading) => { console.log("加载状态", loading); }; const actions = initGlobalState({ name: "前端小溪", age: 27, }); actions.onGlobalStateChange((newVal, oldVal) => { console.log("parent", newVal, oldVal); }); registerMicroApps( [ { name: "vueApp", entry: "//localhost:1100", // 默认vue启动的入口是1100端口 activeRule: "/vue", // 当路径是 /vue的时候启动 container: "#container", // 应用挂载的位置 loader, props: { a: 1, util: {} }, }, ], { beforeLoad() { console.log("before load"); }, beforeMount() { console.log("before mount"); }, afterMount() { console.log("after mount"); }, beforeUnmount() { console.log("before unmount"); }, afterUnmount() { console.log("after unmount"); }, } ); start({});
在main.js 中 引入 register-apps.js
import "./register-apps.js";
vue.config.jsconst { defineConfig } = require("@vue/cli-service"); module.exports = defineConfig({ transpileDependencies: true, devServer: { port: 1000, }, });
App.vue中添加挂载节点<template>
<div id="app">
<nav>
<router-link to="/">基座首页</router-link> |
<router-link to="/about">基座关于页</router-link> |
<router-link to="/vue/">微应用首页</router-link> |
<router-link to="/vue/about">微应用关于页</router-link>
</nav>
<div id="container"></div>
<router-view />
</div>
</template>
main.js中添加三个函数import Vue from "vue"; import App from "./App.vue"; import router from "./router"; import store from "./store"; // new Vue({ // router, // store, // render: h => h(App) // }).$mount('#app') Vue.config.productionTip = false; let instance = null; function render(props = {}) { const { container } = props; instance = new Vue({ router, store, render: (h) => h(App), }).$mount(container ? container.querySelector("#app") : "#app"); } // 独立运行时 if (!window.__POWERED_BY_QIANKUN__) { render(); } export async function bootstrap() { console.log("[vue] vue app bootstraped"); } export async function mount(props) { console.log("[vue] props from main framework", props); render(props); } export async function unmount() { instance.$destroy(); instance.$el.innerHTML = ""; instance = null; }
vue.config.jsconst { defineConfig } = require("@vue/cli-service"); module.exports = defineConfig({ transpileDependencies: true, devServer: { port: 1100, headers: { "Access-Control-Allow-Origin": "*", }, }, configureWebpack: { output: { libraryTarget: "umd", library: "m-system", }, }, });
/*eslint disable no undef*/ // 上方这一行用于eslint的忽略,因为下方代码的指向其实是不存在的,在有eslint的环境中不加入此行会报错 if (window.__POWERED_BY_QIANKUN__) { __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__; }
import "./public-path.js"; import Vue from "vue"; import App from "./App.vue"; import router from "./router"; import store from "./store";
router/index.js的 baseimport Vue from "vue"; import VueRouter from "vue-router"; import HomeView from "../views/HomeView.vue"; Vue.use(VueRouter); const routes = [ { path: "/", name: "home", component: HomeView, }, { path: "/about", name: "about", component: () => import(/* webpackChunkName: "about" */ "../views/AboutView.vue"), }, ]; const router = new VueRouter({ mode: "history", base: window.__POWERED_BY_QIANKUN__ ? "/vue/" : "/", routes, }); export default router;
至此, 一个以 Vue2.x 搭建的乾坤入门框架就搭建好了, 可以依照此文章快速搭建入门乾坤框架。
而本专栏就是打算将Vue2.x的老项目完成技术架构升级,从而达到技术栈更新、迁移、重构、重写等架构演进。