# wujie-demo
**Repository Path**: sk20020228/wujie-demo
## Basic Information
- **Project Name**: wujie-demo
- **Description**: 无界微前端示例代码
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-11-13
- **Last Updated**: 2025-11-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 无界微前端
> 无界微前端示例代码
> lord-app(主应用)、sub-app(子应用)
官网文档:https://wujie-micro.github.io/doc/
## 主应用
### 安装依赖
```bash
npm i wujie-vue3 -S
```
### 在主应用中注册无界
```typescript
import WujieVue from "wujie-vue3";
app.use(WujieVue); // 注册无界组件
```
### 在组件中使用 WujieVue
> views/SubApp.vue
```vue
```
需要在路由中增加一个
```javascript
{
path: "/subApp",
name: "subApp",
component: () => import("@/views/SubApp.vue"),
},
```
## 子应用
> 子应用需要改造一点内容
### 改造main.ts
> 需要根据__POWERED_BY_WUJIE__判断环境,抽离出了渲染执行的函数
```typescript
import "./assets/main.css";
import { createApp } from "vue";
import App from "./App.vue";
import { createRouterInstance } from "./router";
let app: ReturnType;
const render = (props: any = {}) => {
let { container, baseUrl } = props;
app = createApp(App);
app.use(createRouterInstance(baseUrl || "/"));
app.mount(container ? container.querySelector("#app") : "#app");
};
// 判断是否运行在无界环境中
if ((window as any).__POWERED_BY_WUJIE__) {
// 声明 mount 函数,供无界在适当时机调用
(window as any).__WUJIE_MOUNT = () => {
const props = (window as any).$wujie?.props;
render(props);
};
// 声明 unmount 函数,供无界在适当时机调用
(window as any).__WUJIE_UNMOUNT = () => {
app?.unmount();
};
} else {
// 正常启动
render();
}
```
### 改造路由
> 需要给路由加上前缀
```typescript
import { createRouter, createWebHistory } from "vue-router";
import HomeView from "../views/HomeView.vue";
let routerInstance: ReturnType | null = null;
// 获取路由示例
export function getRouter() {
if (!routerInstance) {
throw new Error("[Router] 路由实例未初始化!请在 main.ts 中先调用 createRouterInstance()");
}
return routerInstance;
}
// 工厂函数
export function createRouterInstance(basePath: string = "/") {
// 单例模式:防止重复创建
if (routerInstance) {
console.warn("[Router] 路由实例已存在,返回现有实例");
return routerInstance;
}
const router = createRouter({
history: createWebHistory(basePath),
routes: [
{
path: "/",
name: "home",
component: HomeView,
},
{
path: "/about",
name: "about",
// route level code-splitting
// this generates a separate chunk (About.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () => import("../views/AboutView.vue"),
},
],
});
// 注册守卫
// 缓存实例
routerInstance = router;
return router;
}
```
### 改造vite.config.ts
> 本地调试需要开启cors或者headers请求头Access-Control-Allow-Origin改成*
>
> 后续发布到正式服务器还是得设置这种
```typescript
server: {
cors: true,
headers: {
"Access-Control-Allow-Origin": "*",
},
},
```
## 注意点
- 关闭浏览器的`Vue.js devtools`
- 如果没有关闭会出现报错,Vue DevTools 在多应用环境下重复定义全局钩子
```
Uncaught TypeError: Cannot redefine property: __VUE_DEVTOOLS_GLOBAL_HOOK__
at Object.defineProperty ()
at detectIframeApp (:33:10)
at :69:3
```