110 lines
4.2 KiB
TypeScript
110 lines
4.2 KiB
TypeScript
import { Router, routesMapRule, RoutesRule, pageTypeRule} from '../options/base';
|
||
import {createRouteMap} from '../helpers/createRouteMap'
|
||
import {buildVueRoutes, buildVueRouter} from '../H5/buildRouter'
|
||
import {proxyEachHook} from '../H5/proxyHook'
|
||
import {registerLoddingPage} from '../app/appPatch';
|
||
import { proxyPageHook } from '../public/page';
|
||
import { forceGuardEach } from '../public/methods';
|
||
import { assertParentChild, voidFun } from './utils';
|
||
import { getEnterPath } from '../applets/appletPatch';
|
||
import { mpPlatformReg } from './config';
|
||
|
||
let registerRouter:boolean = false;
|
||
let onloadProxyOk:boolean = false;
|
||
|
||
const appletProxy:{
|
||
app:boolean;
|
||
page:string;
|
||
} = {
|
||
app: false,
|
||
page: ''
|
||
}
|
||
|
||
export function getMixins(Vue:any, router: Router):{
|
||
beforeCreate(this: any): void;
|
||
} | {
|
||
beforeCreate(): void;
|
||
} | {
|
||
onLaunch(): void;
|
||
} {
|
||
let platform = router.options.platform;
|
||
if (new RegExp(mpPlatformReg, 'g').test(platform)) {
|
||
platform = 'app-lets';
|
||
}
|
||
const toggleHooks = {
|
||
h5: {
|
||
beforeCreate(this: any): void {
|
||
if (this.$options.router) {
|
||
router.$route = this.$options.router; // 挂载vue-router到路由对象下
|
||
let vueRouteMap:RoutesRule[]|RoutesRule = [];
|
||
if (router.options.h5?.vueRouterDev) {
|
||
vueRouteMap = router.options.routes;
|
||
} else {
|
||
vueRouteMap = createRouteMap(router, this.$options.router.options.routes).finallyPathMap;
|
||
(router.routesMap as routesMapRule).vueRouteMap = vueRouteMap;
|
||
buildVueRoutes(router, vueRouteMap);
|
||
}
|
||
buildVueRouter(router, this.$options.router, vueRouteMap);
|
||
proxyEachHook(router, this.$options.router);
|
||
}
|
||
}
|
||
},
|
||
'app-plus': {
|
||
beforeCreate(this: any): void {
|
||
if (!registerRouter) {
|
||
registerRouter = true;
|
||
proxyPageHook(this, router, 'app');
|
||
registerLoddingPage(router);
|
||
}
|
||
}
|
||
},
|
||
'app-lets': {
|
||
beforeCreate(this: any): void {
|
||
// 保证这个函数不会被重写
|
||
const pluginMark = $npm_package_name;
|
||
voidFun(pluginMark);
|
||
|
||
let isProxy:boolean = true;
|
||
const pageType:pageTypeRule = this.$options.mpType;
|
||
|
||
if (onloadProxyOk) {
|
||
return
|
||
}
|
||
|
||
if (pageType === 'component') {
|
||
isProxy = assertParentChild(appletProxy['page'], this);
|
||
} else {
|
||
if (pageType === 'page') {
|
||
appletProxy[pageType] = getEnterPath(this, router);
|
||
router.enterPath = appletProxy[pageType]; // 我不确定在不同端是否都是同样的变现?可能有的为非绝对路径?
|
||
} else {
|
||
appletProxy[pageType] = true;
|
||
}
|
||
}
|
||
if (isProxy) {
|
||
proxyPageHook(this, router, pageType);
|
||
}
|
||
},
|
||
onLoad(this: any):void{
|
||
// 保证这个函数不会被重写,否则必须在启动页写onLoad
|
||
const pluginMark = $npm_package_name;
|
||
voidFun(pluginMark);
|
||
|
||
if (!onloadProxyOk && assertParentChild(appletProxy['page'], this)) {
|
||
onloadProxyOk = true;
|
||
forceGuardEach(router);
|
||
}
|
||
}
|
||
}
|
||
};
|
||
return toggleHooks[(platform as 'h5'|'app-plus'|'app-lets')];
|
||
}
|
||
export function initMixins(Vue: any, router: Router) {
|
||
const routesMap = createRouteMap(router, router.options.routes);
|
||
router.routesMap = routesMap; // 挂载自身路由表到路由对象下
|
||
// Vue.util.defineReactive(router, '_Route', createRoute(router, 19970806))
|
||
Vue.mixin({
|
||
...getMixins(Vue, router)
|
||
});
|
||
}
|