UNPKG

weapp-vite

Version:

weapp-vite 一个现代化的小程序打包工具

125 lines (124 loc) 4.44 kB
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 };