# genesis-app

它提供了快速创建APP的方法,以及包装了 vue-router,它帮你解决了在历史模式下,多个 Router 实例冲突的问题

# 安装

npm install vue-router @fmfe/genesis-app

# 使用

# 路由配置

// import VueRouter from 'vue-router';
import { Router } from '@fmfe/genesis-app';
const router = new Router({
    mode: 'history'
});

只需要将 VueRouter (opens new window) 修改成 @fmfe/genesis-app 的 Router 即可,其它的还是和 VueRouter (opens new window) 的使用方式一样

# 客户端使用

// entry-client.ts
import { ClientOptions } from '@fmfe/genesis-core';
import { createClientApp } from '@fmfe/genesis-app';
import Vue from 'vue';
import App from './app.vue';

export default async (clientOptions: ClientOptions): Promise<Vue> => {
    return createClientApp({
        App,
        clientOptions,
        vueOptions: {
            // 传递给 new Vue({}) 的选项
            // 默认将 renderContext 传递给 new Vue({ clientOptions })
        }
    });
};

# 服务端

// entry-server.ts
import { RenderContext } from '@fmfe/genesis-core';
import { createServerApp } from '@fmfe/genesis-app';
import Vue from 'vue';
import App from './app.vue';

export default async (renderContext: RenderContext): Promise<Vue> => {
    return createServerApp({
        App,
        renderContext,
        vueOptions: {
            // 传递给 new Vue({}) 的选项
            // 默认将 renderContext 传递给 new Vue({ renderContext })
        }
    });
};

# 远程组件

有的时候,我们我们希望自己的服务,可以提供给其它的服务使用,这样时候就需要对外提供远程组件了,让其它服务使用远程组件来调用。调用远程组件渲染的时候,一般来说路由模式都会使用 abstract 来渲染对应的组件,但是我们又期望远程组件内部跳转的时候,可以使用 history 模式。所以我们给 Router 拓展了 syncHistory 选项,你可以以此来实现 React Server Components 类似的功能

// Express 例子,对外提供远程组件
app.use('/remote-component', async (req, res, next) => {
    const r = await renderer
        .renderJson({
            // 下面的参数,你都可以通过 get 或者 post请求接收对应的参数,这里就不多作介绍
            // 具体的传参,可以去了解一下渲染器相关的API
            url: '/remote/component/my',
            mode: 'ssr-json',
            state: {
                mode: 'abstract',
                syncHistory: true
            }
        })
        .catch(next);
    if (r) {
        res.send(r.data);
    }
});
// entry-client.ts
import Vue from 'vue';
import { ClientOptions } from '@fmfe/genesis-core';
import { createClientApp, Router } from '@fmfe/genesis-app';
import App from './app.vue';

export default async (clientOptions: ClientOptions): Promise<Vue> => {
    return createClientApp({
        App,
        clientOptions,
        vueOptions: {
            router: new Router({
                mode: clientOptions.state.mode,
                syncHistory: clientOptions.state.syncHistory,
                routes: [
                    {
                        path: '/remote/component/my',
                        component: My
                    }
                ]
            })
        }
    });
};

// entry-server.ts
import Vue from 'vue';
import { RenderContext } from '@fmfe/genesis-core';
import { createServerApp, Router } from '@fmfe/genesis-app';
import App from './app.vue';

export default async (renderContext: RenderContext): Promise<Vue> => {
    return createServerApp({
        App,
        renderContext,
        vueOptions: {
            router: new Router({
                mode: renderContext.data.state.mode,
                syncHistory: renderContext.data.state.syncHistory,
                routes: [
                    {
                        path: '/remote/component/my',
                        component: My
                    }
                ]
            })
        }
    });
};

实现上面的功能后,你在其它服务就可以使用远程组件来渲染了。