From f7612a50ceeefb3d70ca68c40ddabd4f570ba07d Mon Sep 17 00:00:00 2001 From: bailicangdu <1264889788@qq.com> Date: Fri, 17 Mar 2023 20:41:36 +0800 Subject: [PATCH] docs(1.0.0-beta.0): update docs --- dev/main-react16/src/pages/vite2/vite2.js | 2 +- docs/1.x/zh-cn/changelog.md | 16 +- docs/1.x/zh-cn/configure.md | 12 ++ docs/1.x/zh-cn/framework/angular.md | 7 +- docs/1.x/zh-cn/framework/introduce.md | 12 +- docs/1.x/zh-cn/framework/nextjs.md | 8 +- docs/1.x/zh-cn/framework/nuxtjs.md | 8 +- docs/1.x/zh-cn/framework/react.md | 7 +- docs/1.x/zh-cn/framework/vite.md | 181 ++-------------------- docs/1.x/zh-cn/framework/vue.md | 25 ++- docs/1.x/zh-cn/start.md | 2 +- docs/1.x/zh-cn/transfer.md | 2 +- package.json | 2 +- 13 files changed, 93 insertions(+), 191 deletions(-) diff --git a/dev/main-react16/src/pages/vite2/vite2.js b/dev/main-react16/src/pages/vite2/vite2.js index c51d4ab1a..a7e984790 100644 --- a/dev/main-react16/src/pages/vite2/vite2.js +++ b/dev/main-react16/src/pages/vite2/vite2.js @@ -105,7 +105,7 @@ function vite2 (props) { iframe keep-router-state // disable-patch-request - keep-alive + // keep-alive // default-page='/micro-app/vite2/page2' > diff --git a/docs/1.x/zh-cn/changelog.md b/docs/1.x/zh-cn/changelog.md index 211edca54..0a1a06c29 100644 --- a/docs/1.x/zh-cn/changelog.md +++ b/docs/1.x/zh-cn/changelog.md @@ -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 diff --git a/docs/1.x/zh-cn/configure.md b/docs/1.x/zh-cn/configure.md index ecdb02a1b..a06b51523 100644 --- a/docs/1.x/zh-cn/configure.md +++ b/docs/1.x/zh-cn/configure.md @@ -23,6 +23,16 @@ MicroApp会根据url地址自动补全子应用的静态资源,如js、css、 当`url`的值发生变化时,会卸载当前应用并根据新的`url`值重新渲染。 +## iframe +- Desc: `开启iframe沙箱` +- Default: `false` +- 使用方式: `` + +MicroApp有两种沙箱方案:`with沙箱`和`iframe沙箱`。 + +默认开启with沙箱,如果with沙箱无法正常运行,可以尝试切换到iframe沙箱,比如vite。 + + ## inline - Desc: `使用内联script` - Default: `false` @@ -207,6 +217,7 @@ shadowDOM具有更强的样式隔离能力,开启后,``标签会 import microApp from '@micro-zoe/micro-app' microApp.start({ + iframe: true, // 默认值false inline: true, // 默认值false destroy: true, // 默认值false shadowDOM: true, // 默认值false @@ -225,6 +236,7 @@ microApp.start({ [!TIP] > 以上框架可以任意组合,换句话说任何一个框架都可以作为主应用嵌入其它类型的子应用,任何一个框架也可以作为子应用被其它框架嵌入,包括上面没有列举出的其它库,如 svelte、umi ... diff --git a/docs/1.x/zh-cn/framework/nextjs.md b/docs/1.x/zh-cn/framework/nextjs.md index ff0e4083d..aca0c4fe0 100644 --- a/docs/1.x/zh-cn/framework/nextjs.md +++ b/docs/1.x/zh-cn/framework/nextjs.md @@ -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 @@ -167,6 +167,12 @@ window.addEventListener('unmount', function () { > [!NOTE] > nextjs默认支持css module功能,如果你使用了此功能,建议关闭样式隔离以提升性能:`` +#### 5、切换到iframe沙箱 +MicroApp有两种沙箱方案:`with沙箱`和`iframe沙箱`。 + +默认开启with沙箱,如果with沙箱无法正常运行,可以尝试切换到iframe沙箱。 + + ## 常见问题 #### 1、使用`next/image`组件加载图片失败 diff --git a/docs/1.x/zh-cn/framework/nuxtjs.md b/docs/1.x/zh-cn/framework/nuxtjs.md index 825bcf014..d3d94a7bc 100644 --- a/docs/1.x/zh-cn/framework/nuxtjs.md +++ b/docs/1.x/zh-cn/framework/nuxtjs.md @@ -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 @@ -175,6 +175,12 @@ window.addEventListener('unmount', function () { }) ``` +#### 5、切换到iframe沙箱 +MicroApp有两种沙箱方案:`with沙箱`和`iframe沙箱`。 + +默认开启with沙箱,如果with沙箱无法正常运行,可以尝试切换到iframe沙箱。 + + ## 常见问题 #### 1、控制台抛出警告`[Vue warn]: Unknown custom element: ` diff --git a/docs/1.x/zh-cn/framework/react.md b/docs/1.x/zh-cn/framework/react.md index 264053e84..c91e0fac9 100644 --- a/docs/1.x/zh-cn/framework/react.md +++ b/docs/1.x/zh-cn/framework/react.md @@ -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 @@ -149,6 +149,11 @@ if (window.__MICRO_APP_ENVIRONMENT__) { import './public-path' ``` +#### 4、切换到iframe沙箱 +MicroApp有两种沙箱方案:`with沙箱`和`iframe沙箱`。 + +默认开启with沙箱,如果with沙箱无法正常运行,可以尝试切换到iframe沙箱。 + ## 常见问题 无 diff --git a/docs/1.x/zh-cn/framework/vite.md b/docs/1.x/zh-cn/framework/vite.md index c71ae3d34..5d4447c37 100644 --- a/docs/1.x/zh-cn/framework/vite.md +++ b/docs/1.x/zh-cn/framework/vite.md @@ -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 - - -
- + ``` -*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 - -``` - -**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 diff --git a/docs/1.x/zh-cn/framework/vue.md b/docs/1.x/zh-cn/framework/vue.md index 06ff3fc26..8b34b252e 100644 --- a/docs/1.x/zh-cn/framework/vue.md +++ b/docs/1.x/zh-cn/framework/vue.md @@ -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 @@ -36,16 +36,25 @@ microApp.start() #### 1、设置跨域支持 -在`vue.config.js`中添加配置 + + +#### ** vue.config.js ** ```js -devServer: { - headers: { - 'Access-Control-Allow-Origin': '*', +module.exports = { + devServer: { + headers: { + 'Access-Control-Allow-Origin': '*', + } } } ``` +#### ** vite.config.js ** +vite默认开启跨域支持,不需要额外配置。 + + + #### 2、注册卸载函数 子应用卸载时会自动执行`window.unmount`,在此可以进行卸载相关操作。 @@ -232,6 +241,12 @@ if (window.__MICRO_APP_ENVIRONMENT__) { import './public-path' ``` +#### 4、切换到iframe沙箱 +MicroApp有两种沙箱方案:`with沙箱`和`iframe沙箱`。 + +默认开启with沙箱,如果with沙箱无法正常运行,可以尝试切换到iframe沙箱。 + + ## 常见问题 #### 1、主应用中抛出警告,micro-app未定义 diff --git a/docs/1.x/zh-cn/start.md b/docs/1.x/zh-cn/start.md index a8b1002e0..6884afe8c 100755 --- a/docs/1.x/zh-cn/start.md +++ b/docs/1.x/zh-cn/start.md @@ -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` diff --git a/docs/1.x/zh-cn/transfer.md b/docs/1.x/zh-cn/transfer.md index fdfe68910..729a25d3b 100644 --- a/docs/1.x/zh-cn/transfer.md +++ b/docs/1.x/zh-cn/transfer.md @@ -3,7 +3,7 @@ ### 迁移步骤 **1、安装最新版本** ```bash -npm i @micro-zoe/micro-app@alpha --save +npm i @micro-zoe/micro-app@beta --save ``` **2、在start中增加配置** diff --git a/package.json b/package.json index 327528c7a..67b2ea25d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@micro-zoe/micro-app", - "version": "1.0.0-alpha.10", + "version": "1.0.0-beta.0", "description": "A lightweight, efficient and powerful micro front-end framework", "private": false, "main": "lib/index.min.js",