1.5.1 • Published 2 years ago

mini-single-spa v1.5.1

Weekly downloads
-
License
-
Repository
github
Last release
2 years ago

mini-single-spa

一个微前端教学项目

功能

  • 支持不同框架的子应用
  • 支持子应用 HTML 入口
  • 支持沙箱功能,子应用 window 作用域隔离、元素隔离
  • 支持子应用样式隔离
  • 支持各应用之间的数据通信

Examples

所有示例均在 examples 目录下。

运行 demo

安装

pnpm install:all

运行开发环境

pnpm dev:all

访问 http://localhost:8000,即可查看多个 spa 子应用的示例。

使用

安装

npm i mini-single-spa

主应用

在主应用上注册子应用

import { registerApplication, start } from 'mini-single-spa'

registerApplication({
    name: 'vue',
    pageEntry: 'http://localhost:8001',
    activeRule: pathPrefix('/vue'),
    container: $('#subapp-viewport')
})

registerApplication({
    name: 'react',
    pageEntry: 'http://localhost:8002',
    activeRule:pathPrefix('/react'),
    container: $('#subapp-viewport')
})

start()

首先使用 registerApplication() 注册所有的子应用,然后执行 start() 启动。

子应用

子应用必须向外暴露 mount()unmount() 两个函数,并将它们挂在全局的子应用名称 window.__SINGLE_SPA__ 下:

mount: (props: AnyObject) => Promise<any>
unmount: (props: AnyObject) => Promise<any>

window.__SINGLE_SPA__= {
    mount,
    unmount
}

mount() 在子应用每次挂载时启用,unmount() 在子应用每次卸载时使用。

子应用跨域和资源路径

子应用需要开启 cors 和指定生成的资源路径,假如你使用 vue-cli 进行开发,可以这样配置:

module.exports = {
    devServer: {
        port: 8001, // 设置子应用访问端口
        headers: {
            'Access-Control-Allow-Origin': '*' // 解决跨域问题
        }
    },
    publicPath: "//localhost:8001/", // 资源路径前缀
}

registerApplication(Application)

registerApplication(Application) 接收的参数如下:

interface Application {
    /**
     * app 名称
     */
    name: string
    /**
     * app 匹配规则,值为 true 时加载 app
     * 例如传入 /vue,当 url 的路径变为 /vue 时,激活当前子应用。
     * 如果 activeRule 为函数,则会传入 location 作为参数,activeRule(location) 返回 true 时,激活当前子应用。
     */
    activeRule: Function | string
    /**
     * 父应用传过来的自定义属性
     */
    props: Function | AnyObject
    /**
     * app 挂载的 dom
     */
    container: HTMLElement
    /**
     * app 访问入口,一个 URL 链接
     */
    pageEntry: string
    /**
     * enabled: 是否开启 js 作用域隔离、元素隔离,默认开启
     * css: 是否开启样式隔离,默认关闭
     */
    sandboxConfig: { enabled: boolean, css: boolean }
    /**
     * app 生命周期钩子,加载页面资源前触发,只会触发一次
     */
    beforeBootstrap?: () => void
    /**
     * app 生命周期钩子,页面入口的资源被加载并执行后触发,只会触发一次
     */
    bootstrapped?: () => void
    /**
     * app 生命周期钩子,挂载前触发
     */
    beforeMount?: () => void
    /**
     * app 生命周期钩子,挂载后触发
     */
    mounted?: () => void
    /**
     * app 生命周期钩子,卸载前触发
     */
    beforeUmount?: () => void
    /**
     * app 生命周期钩子,卸载后触发
     */
    unmounted?: () => void
    /**
     * js 代码的 loader,每次获取到 js 代码后会传给 loader() 并将返回值作为新的代码
     */
    loader?: (code: string) => string
}
1.5.1

2 years ago

1.5.0

2 years ago

1.4.1

2 years ago

1.4.0

2 years ago

1.3.0

2 years ago

1.2.0

2 years ago

1.1.0

2 years ago

1.0.0

2 years ago

0.2.7

2 years ago

0.2.6

2 years ago

0.2.5

2 years ago

0.2.4

2 years ago

0.2.3

2 years ago

0.2.2

2 years ago

0.2.1

2 years ago

0.2.0

2 years ago

0.1.0

2 years ago