Skip to content

Commit

Permalink
docs(1.0.0-beta.0): update docs
Browse files Browse the repository at this point in the history
  • Loading branch information
bailicangdu committed Mar 17, 2023
1 parent 3efca23 commit f7612a5
Show file tree
Hide file tree
Showing 13 changed files with 93 additions and 191 deletions.
2 changes: 1 addition & 1 deletion dev/main-react16/src/pages/vite2/vite2.js
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ function vite2 (props) {
iframe
keep-router-state
// disable-patch-request
keep-alive
// keep-alive
// default-page='/micro-app/vite2/page2'
>
</micro-app>
Expand Down
16 changes: 12 additions & 4 deletions docs/1.x/zh-cn/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,26 @@

- **New**

- 🆕 新增了iframe沙箱功能,更好的兼容vite等开发工具。
- 🆕 新增了iframe沙箱功能,兼容vite等开发环境。
- 🆕 新增了虚拟路由系统的iframe沙箱模式。
- 🆕 新增了`video``audio``source``embed`等资源标签的自动补全功能。

- **Bug Fix**

- 🐞 修复了`unmountApp`无法卸载预渲染应用的问题
- 🐞 修复了通过`unmountApp`方法卸载预渲染应用报错的问题
- 🐞 修复了主动卸载keep-alive、预渲染应用时全局事件缓存错误的问题。
- 🐞 修复了html静态元素无法标记和处理的问题。
- 🐞 修复了根元素下`parentNode`表现异常的问题。
- 🐞 修复了低版本浏览器不支持`String.prototype.replaceAll`的问题。
- 🐞 修复了忽略的脚本内获取 currentScript 出错的问题。
- 🐞 修复了数据通信在部分场景下快照备份数据监听函数报错的问题。

- **Update**

- 🚀 优化了虚拟路由,增加对iframe沙箱的支持。
- 🚀 优化了资源管理系统,提升资源复用效率。
- 🚀 优化了资源管理系统,支持多种沙箱之间动态切换,提升资源复用效率。
- 🚀 移除了`esmodule`配置,iframe沙箱环境下默认开启。
- 🚀 优化了预加载、预渲染相关功能,增加用户体验。
- 🚀 优化了umd模式下对子应用定时器的处理逻辑。


### 1.0.0-alpha.10
Expand Down
12 changes: 12 additions & 0 deletions docs/1.x/zh-cn/configure.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,16 @@ MicroApp会根据url地址自动补全子应用的静态资源,如js、css、

`url`的值发生变化时,会卸载当前应用并根据新的`url`值重新渲染。

## iframe
- Desc: `开启iframe沙箱`
- Default: `false`
- 使用方式: `<micro-app iframe></micro-app>`

MicroApp有两种沙箱方案:`with沙箱``iframe沙箱`

默认开启with沙箱,如果with沙箱无法正常运行,可以尝试切换到iframe沙箱,比如vite。


## inline
- Desc: `使用内联script`
- Default: `false`
Expand Down Expand Up @@ -207,6 +217,7 @@ shadowDOM具有更强的样式隔离能力,开启后,`<micro-app>`标签会
import microApp from '@micro-zoe/micro-app'

microApp.start({
iframe: true, // 默认值false
inline: true, // 默认值false
destroy: true, // 默认值false
shadowDOM: true, // 默认值false
Expand All @@ -225,6 +236,7 @@ microApp.start({
<micro-app
name='xx'
url='xx'
iframe='false'
inline='false'
destroy='false'
shadowDOM='false'
Expand Down
7 changes: 6 additions & 1 deletion docs/1.x/zh-cn/framework/angular.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

#### 1、安装依赖
```bash
npm i @micro-zoe/micro-app@alpha --save
npm i @micro-zoe/micro-app@beta --save
```

#### 2、初始化micro-app
Expand Down Expand Up @@ -199,6 +199,11 @@ if (window.__MICRO_APP_ENVIRONMENT__) {
import './public-path'
```

#### 4、切换到iframe沙箱
MicroApp有两种沙箱方案:`with沙箱``iframe沙箱`

默认开启with沙箱,如果with沙箱无法正常运行,可以尝试切换到iframe沙箱。


## 常见问题
#### 1、通过micro-app数据通信修改angular组件数据后视图不更新
Expand Down
12 changes: 6 additions & 6 deletions docs/1.x/zh-cn/framework/introduce.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
我们列举比较流行的前端框架,指出各框架的注意事项,规避各种可能出现的问题。

**目前有:**
- react (version 16, 17)
- vue (version 2, 3)
- vite (version 2)
- angular (version 11)
- nextjs (version 11)
- nuxtjs (version 2)
- react
- vue
- vite
- angular
- nextjs
- nuxtjs

> [!TIP]
> 以上框架可以任意组合,换句话说任何一个框架都可以作为主应用嵌入其它类型的子应用,任何一个框架也可以作为子应用被其它框架嵌入,包括上面没有列举出的其它库,如 svelte、umi ...
Expand Down
8 changes: 7 additions & 1 deletion docs/1.x/zh-cn/framework/nextjs.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

#### 1、安装依赖
```bash
npm i @micro-zoe/micro-app@alpha --save
npm i @micro-zoe/micro-app@beta --save
```

#### 2、初始化micro-app
Expand Down Expand Up @@ -167,6 +167,12 @@ window.addEventListener('unmount', function () {
> [!NOTE]
> nextjs默认支持css module功能,如果你使用了此功能,建议关闭样式隔离以提升性能:`<micro-app name='xx' url='xx' disableScopecss></micro-app>`
#### 5、切换到iframe沙箱
MicroApp有两种沙箱方案:`with沙箱``iframe沙箱`

默认开启with沙箱,如果with沙箱无法正常运行,可以尝试切换到iframe沙箱。



## 常见问题
#### 1、使用`next/image`组件加载图片失败
Expand Down
8 changes: 7 additions & 1 deletion docs/1.x/zh-cn/framework/nuxtjs.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

#### 1、安装依赖
```bash
npm i @micro-zoe/micro-app@alpha --save
npm i @micro-zoe/micro-app@beta --save
```

#### 2、初始化micro-app
Expand Down Expand Up @@ -175,6 +175,12 @@ window.addEventListener('unmount', function () {
})
```

#### 5、切换到iframe沙箱
MicroApp有两种沙箱方案:`with沙箱``iframe沙箱`

默认开启with沙箱,如果with沙箱无法正常运行,可以尝试切换到iframe沙箱。



## 常见问题
#### 1、控制台抛出警告`[Vue warn]: Unknown custom element: <micro-app>`
Expand Down
7 changes: 6 additions & 1 deletion docs/1.x/zh-cn/framework/react.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

#### 1、安装依赖
```bash
npm i @micro-zoe/micro-app@alpha --save
npm i @micro-zoe/micro-app@beta --save
```

#### 2、初始化micro-app
Expand Down Expand Up @@ -149,6 +149,11 @@ if (window.__MICRO_APP_ENVIRONMENT__) {
import './public-path'
```

#### 4、切换到iframe沙箱
MicroApp有两种沙箱方案:`with沙箱``iframe沙箱`

默认开启with沙箱,如果with沙箱无法正常运行,可以尝试切换到iframe沙箱。


## 常见问题
181 changes: 13 additions & 168 deletions docs/1.x/zh-cn/framework/vite.md
Original file line number Diff line number Diff line change
@@ -1,185 +1,30 @@
> [!ATTENTION]
> vite作为子应用时需要关闭沙箱,这会导致很多问题,暂时不建议接入。
>
> 我们正在规划为vite打造一套独立的沙箱方案,敬请期待。
本篇介绍了`vite 2`的接入方式,vite1暂不支持。
本篇介绍了`vite`的接入方式,如果在使用时出现问题,请在github上联系我们。

## 作为主应用
vite作为主应用时没有特殊之处,具体方式参考各框架接入文档。

## 作为子应用
vite作为子应用只需`切换到iframe沙箱`,其它操作参考各框架接入文档。

当子应用是vite应用时需要做特别的适配,适配vite的代价是巨大的,我们必须关闭沙箱功能,因为沙箱在`module script`下不支持,这导致大部分功能失效,包括:环境变量、样式隔离、元素隔离、资源路径补全、baseroute 等。

在嵌入vite子应用时,`micro-app`的功能只负责渲染,其它的行为由应用自行决定,这包括如何防止样式、JS变量、元素的冲突。

在module模式下,引入的资源大多为相对地址,兼容主要做的事情就是将地址补全。

### 👇 子应用的修改

**1、修改vite.config.js**
```js
import { join } from 'path'
import { writeFileSync } from 'fs'

// vite.config.js
export default defineConfig({
base: `${process.env.NODE_ENV === 'production' ? 'http://my-site.com' : ''}/basename/`,
plugins: [
// 自定义插件
(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)
}
}
}
},
}
})(),
],
})
```

**2、修改容器元素id**

因为vite子应用没有元素隔离的保护,建议修改容器元素的id值,以确保与其它元素不冲突。

*1、修改index.html中容器元素的id值*
##### 切换到iframe沙箱

```html
<!-- index.html -->
<body>
<div id="my-vite-app"></div>
</body>
<micro-app name='xxx' url='xxx' iframe></micro-app>
```

*2、使用新的id渲染*
```js
// main.js
createApp(App).mount('#my-vite-app')
```

当多个vite子应用同时渲染时,必须修改容器元素的id值,确保每个子应用容器元素id的唯一性,否则无法正常渲染。
## 常见问题

**3、路由**
#### 1、子应用中操作location异常

推荐主应用使用history路由,vite子应用使用hash路由,避免一些可能出现的问题
**原因:**vite构建script的type为module,导致无法拦截location操作

子应用如果是vue3,在初始化时路由时,createWebHashHistory不要传入参数,如下:
**解决方式:** 使用MicroApp提供的location进行操作

如:
```js
import { createRouter, createWebHashHistory } from 'vue-router'

const router = createRouter({
history: createWebHashHistory(),
routes,
})
window.microApp.location.host
window.microApp.location.origin
window.microApp.location.href = 'xxx'
window.microApp.location.pathname = 'xxx'
```

**4、静态资源**

图片等静态资源需要使用绝对地址,可以使用 `new URL('../assets/logo.png', import.meta.url).href` 等方式获取资源的全链接地址。

### 👇 主应用的修改
注意这里的主应用是指嵌入了vite子应用的主应用,它可以是任何框架,和上面`作为主应用`一节无关。

**1、关闭沙箱并使用内联script模式**
```js
<micro-app
name='child-name'
url='http://localhost:3001/basename/'
inline // 使用内联script模式
disableSandbox // 关闭沙箱
>
```

**2、处理子应用静态资源**

写一个简易的插件,对开发环境的子应用进行处理,补全静态资源路径。

```js
import microApp from '@micro-zoe/micro-app'

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

return code
}
}]
}
}
})
```

### 👇 数据通信
沙箱关闭后,子应用默认的通信功能失效,此时可以通过手动注册通信对象实现一致的功能。

**注册方式:在主应用中为子应用初始化通信对象**

```js
import { EventCenterForMicroApp } from '@micro-zoe/micro-app'

// 注意:每个vite子应用根据appName单独分配一个通信对象
window.eventCenterForViteApp1 = new EventCenterForMicroApp(appName)
```

vite子应用就可以通过注册的`eventCenterForViteApp1`对象进行通信,其api和`window.microApp`一致,*主应用通信方式没有任何变化。*

**子应用通信方式:**
```js
/**
* 绑定监听函数
* dataListener: 绑定函数
* autoTrigger: 在初次绑定监听函数时有缓存数据,是否需要主动触发一次,默认为false
*/
window.eventCenterForViteApp1.addDataListener(dataListener: (data: Object) => void, autoTrigger?: boolean)

// 解绑指定函数
window.eventCenterForViteApp1.removeDataListener(dataListener)

// 清空当前子应用的所有绑定函数(全局数据函数除外)
window.eventCenterForViteApp1.clearDataListener()

// 主动获取数据
window.eventCenterForViteApp1.getData()

// 子应用向主应用发送数据
window.eventCenterForViteApp1.dispatch({type: '子应用发送的数据'})
```

> [!WARNING]
> 1、请确保vite版本>=2.5.0
>
> 2、适配vite本质上是适配module脚本,其它非vite构建的module脚本也可以采用相同的思路处理。

## 实战案例
以上介绍了vite如何接入微前端,但在实际使用中会涉及更多功能,如数据通信、路由跳转、打包部署,为此我们提供了一套案例,用于展示vite作为主应用嵌入(或作为子应用被嵌入) react、vue、angular、vite、nextjs、nuxtjs等框架,在案例中我们使用尽可能少的代码实现尽可能多的功能。

案例地址:https://github.com/micro-zoe/micro-app-demo
Loading

0 comments on commit f7612a5

Please sign in to comment.