weapp-vite
Version:
weapp-vite 一个现代化的小程序打包工具
125 lines (124 loc) • 4.44 kB
JavaScript
import { WEVU_PAGE_LAYOUT_SETTER_KEY } from "@weapp-core/constants";
import { createMiniProgramLayoutHostRegistry, resolveMiniProgramPageKeys, resolveMiniProgramPlatform, supportsMiniProgramRuntimeCapability } from "@weapp-core/shared";
import { defineComponent } from "wevu";
//#region src/plugins/vue/createWevuComponent.ts
/**
* 从 Vue SFC 的 options 创建 wevu 组件
* 同时支持 Vue 2 风格(Options API)与 Vue 3 风格(Composition API)
*
* 始终使用 defineComponent(其内部会调用小程序的 Component())。
* 在微信小程序中,Component() 可以同时定义页面与组件。
*/
function createWevuComponent(options) {
const { properties, ...restOptions } = options;
const mpOptions = {};
if (properties) mpOptions.properties = properties;
defineComponent({
...restOptions,
...mpOptions
});
}
//#endregion
//#region src/plugins/vue/nativeLayoutHost.ts
const layoutHostRegistry = createMiniProgramLayoutHostRegistry();
function resolveCurrentPageInstance$1() {
const compiledPlatform = resolveMiniProgramPlatform(import.meta.env?.PLATFORM);
if (!supportsMiniProgramRuntimeCapability(compiledPlatform, "globalPageStack")) return;
const getCurrentPagesFn = globalThis.getCurrentPages;
if (typeof getCurrentPagesFn !== "function") return;
try {
const pages = getCurrentPagesFn();
return pages[pages.length - 1];
} catch {
return;
}
}
function resolvePageKeys(page) {
return resolveMiniProgramPageKeys(page);
}
function resolvePageFromContext(context) {
return context ?? resolveCurrentPageInstance$1();
}
function resolveHostEntry(entry) {
return typeof entry === "function" ? entry() : entry;
}
/**
* 为当前原生 layout 注册宿主组件,页面可通过 resolveLayoutHost()/waitForLayoutHost() 访问。
*/
function registerLayoutHosts(hosts, context) {
const keys = Array.isArray(hosts) ? hosts : Object.keys(hosts);
if (!keys.length) return null;
const pageKeys = resolvePageKeys(resolvePageFromContext());
if (pageKeys.length === 0) return null;
const bridge = {
context,
keys,
resolveHost(key) {
if (!keys.includes(key)) return null;
if (!Array.isArray(hosts)) return resolveHostEntry(hosts[key]) ?? null;
return context?.selectComponent?.(key) ?? null;
}
};
return layoutHostRegistry.register(keys, bridge, pageKeys) ? bridge : null;
}
/**
* 移除当前原生 layout 注册的宿主组件。
*/
function unregisterLayoutHosts(bridge) {
if (!bridge) return false;
return layoutHostRegistry.unregisterBridge(bridge);
}
/**
* 解析当前页面 layout 内暴露的宿主组件。
*/
function resolveLayoutHost(key, options = {}) {
const page = resolvePageFromContext(options.context);
return layoutHostRegistry.resolveHost(key, resolvePageKeys(page), (bridge, key) => bridge.resolveHost(key));
}
/**
* 等待当前页面 layout 宿主组件可用。
*/
function waitForLayoutHost(key, options = {}) {
return layoutHostRegistry.waitForHost(key, () => resolvePageKeys(resolvePageFromContext(options.context)), (bridge, key) => bridge.resolveHost(key), options);
}
//#endregion
//#region src/plugins/vue/nativePageLayout.ts
function resolveCurrentPageInstance() {
const compiledPlatform = resolveMiniProgramPlatform(import.meta.env?.PLATFORM);
if (!supportsMiniProgramRuntimeCapability(compiledPlatform, "globalPageStack")) return;
const getCurrentPagesFn = globalThis.getCurrentPages;
if (typeof getCurrentPagesFn !== "function") return;
try {
const pages = getCurrentPagesFn();
return pages[pages.length - 1];
} catch {
return;
}
}
/**
* 为原生 Page() 页面切换 layout。
*/
function setPageLayout(layout, props) {
const pageSetter = resolveCurrentPageInstance()?.[WEVU_PAGE_LAYOUT_SETTER_KEY];
if (typeof pageSetter === "function") {
pageSetter(layout, props);
return;
}
throw new Error("setPageLayout() 未找到当前页面实例。请在页面生命周期、事件回调或当前页面上下文中调用。");
}
//#endregion
//#region src/plugins/vue/runtimeMacros.ts
/**
* 说明:Vue 3 风格的 props 声明(用于类型提示)
*/
function defineProps(props) {
return props;
}
/**
* 说明:Vue 3 风格的 emits 声明(用于类型提示)
*/
function defineEmits(emits) {
return emits;
}
//#endregion
export { resolveLayoutHost as a, createWevuComponent as c, registerLayoutHosts as i, defineProps as n, unregisterLayoutHosts as o, setPageLayout as r, waitForLayoutHost as s, defineEmits as t };