--- url: /packages/mcp.md description: '@weapp-vite/mcp 是 weapp-vite 与 wevu 的 MCP 服务实现,面向 AI 助手提供源码检索、命令执行与文档资源能力。' --- # @weapp-vite/mcp `@weapp-vite/mcp` 是 `weapp-vite` 官方维护的 MCP 服务实现,目标是把 `weapp-vite / wevu / wevu-compiler` 的关键研发能力暴露给 AI 助手。 在当前版本中,`weapp-vite` 已集成该能力,你通常不需要单独使用此包,而是直接通过 `weapp-vite mcp` 启动。 ## 何时使用 1. 你要让 AI 助手直接读取 `weapp-vite` 仓库源码与文档。 2. 你要让 AI 在受限命令白名单下完成“修改 + 验证”闭环。 3. 你要基于官方 MCP 能力扩展团队内部 AI 工作流。 ## 安装 ```bash pnpm add @weapp-vite/mcp ``` ## 启动方式 推荐直接使用 `weapp-vite` CLI: ```bash weapp-vite mcp ``` 不在仓库目录执行时,可选追加 `--workspace-root /path/to/weapp-vite`。 如果你只想单独运行包本身: ```bash pnpm --filter @weapp-vite/mcp start ``` ## 主要能力 Tools: 1. `workspace_catalog` 2. `list_source_files` 3. `read_source_file` 4. `search_source_code` 5. `run_package_script` 6. `run_weapp_vite_cli` 7. `run_repo_command` Resources: 1. `weapp-vite://workspace/catalog` 2. `weapp-vite://docs/{package}/README.md` 3. `weapp-vite://docs/{package}/CHANGELOG.md` 4. `weapp-vite://source/{package}?path={path}` Prompts: 1. `plan-weapp-vite-change` 2. `debug-wevu-runtime` ## 安全约束 1. 文件读取限制在 workspace 根目录内。 2. 命令执行限制在白名单(`pnpm/node/git/rg`)。 3. 输出内容有截断与超时保护。 ## 二次开发建议 若你要扩展能力,建议从以下文件开始: 1. `packages/mcp/src/server.ts`:工具/资源/Prompt 注册入口。 2. `packages/mcp/src/fileOps.ts`:文件读取与搜索策略。 3. `packages/mcp/src/commandOps.ts`:命令白名单与执行约束。 ## 关联阅读 1. [AI 协作指南](/guide/ai) 2. [AI 学习入口](/ai) --- --- url: /packages/volar.md description: '@weapp-vite/volar 为 Weapp-vite 项目提供 Volar 语言服务能力,重点增强 配置块的补全与校验。' --- # @weapp-vite/volar `@weapp-vite/volar` 为 Weapp-vite 项目提供 Volar 语言服务能力,重点增强 `` 配置块的补全与校验。 ## 何时使用 * 你在 `.vue` 文件里使用 `` 自定义块 * 你希望拿到配置字段的类型提示和错误检查 * 你在 VSCode + Volar 环境下做小程序配置开发 ## 安装说明 通常不需要单独安装。使用 `weapp-vite` 时会自动带上该能力。 ```bash pnpm add -D @weapp-vite/volar ``` ## 主要能力 * `` 块配置提示与校验 * JSON Schema 语义支持 * 依据路径自动推断 `App/Page/Component` 配置类型 * 支持 `json/jsonc/json5` 与 js/ts 配置表达 ## 推荐阅读 * [JSON 配置智能提示](/guide/json-intelli-sense) * [使用 TS/JS 生成 JSON](/guide/json-enhance) --- --- url: /packages/web.md description: '@weapp-vite/web 是实验性的 H5 运行时与 Vite 插件,用于把小程序模板能力映射到浏览器环境做验证。' --- # @weapp-vite/web `@weapp-vite/web` 是实验性的 H5 运行时与 Vite 插件,用于把小程序模板能力映射到浏览器环境做验证。 > 当前仍是 POC 阶段,适合技术验证,不建议直接作为生产方案。 ## 何时使用 * 你要在浏览器快速验证小程序页面逻辑 * 你要做模板编译、事件桥接、路由行为的实验 * 你要为小程序 DSL 做 Web 演示或调试 ## 安装 ```bash pnpm add -D @weapp-vite/web ``` ## Vite 插件接入 ```ts import { weappWebPlugin } from '@weapp-vite/web' import { defineConfig } from 'vite' export default defineConfig({ plugins: [ weappWebPlugin({ srcDir: 'src', runtime: { executionMode: 'compat', }, }), ], }) ``` ## 运行时能力 包内同时导出运行时 API,例如: * `defineComponent` * `registerApp` / `registerPage` / `registerComponent` * `navigateTo` / `navigateBack` / `getCurrentPages` * `request` / `showToast` 等 polyfill API ## 能力边界 * 支持 `wx:if` / `wx:for` / 插值等常见语法 * 支持小程序到 DOM 事件桥接(如 `bindtap`) * 样式与 API 兼容度仍在持续补齐 --- --- url: /packages/weapi.md description: '@wevu/api 独立文档入口,按总览、全量目录、兼容矩阵与差异说明组织。' --- --- --- url: /packages/weapi/compat-overview.md description: '@wevu/api 三端 API 兼容报告总览,覆盖覆盖率、对齐结论与核心差异映射。' --- # `@wevu/api` 兼容总览 本页展示 `@wevu/api` 当前三端 API 兼容报告的总览数据。 相关页面: * [微信基准 API 全量清单](/packages/weapi/wx-method-list) * [支付宝兼容矩阵](/packages/weapi/alipay-compat-matrix) * [抖音兼容矩阵](/packages/weapi/douyin-compat-matrix) * [兼容差异说明](/packages/weapi/gap-notes) * [平台独有 API 清单](/packages/weapi/platform-only-methods) # 01 Overview ## 覆盖结论 * 微信基准命名方法总数:481 * 支付宝可调用兼容方法数:201 * 支付宝语义对齐方法数:201 * 支付宝 fallback 方法数:0 * 抖音可调用兼容方法数:133 * 抖音语义对齐方法数:133 * 抖音 fallback 方法数:0 * 三端可调用完全对齐方法数:117 * 三端语义完全对齐方法数:117 * 三端命名交集方法数(wx∩my∩tt):112 * 三端命名交集可调用完全对齐方法数:112 * 三端命名交集可调用覆盖率:100.00% * 三端命名交集语义完全对齐方法数:112 * 三端命名交集语义对齐覆盖率:100.00% ## 不兼容规模 * 支付宝侧不兼容(按微信命名调用失败)方法:280 * 抖音侧不兼容(按微信命名调用失败)方法:348 ## 不兼容示例(前 40 项) ### 支付宝不兼容示例 * `addCard` -> 目标 `addCard`(unsupported) * `addFileToFavorites` -> 目标 `addFileToFavorites`(unsupported) * `addPaymentPassFinish` -> 目标 `addPaymentPassFinish`(unsupported) * `addPaymentPassGetCertificateData` -> 目标 `addPaymentPassGetCertificateData`(unsupported) * `addPhoneCalendar` -> 目标 `addPhoneCalendar`(unsupported) * `addPhoneRepeatCalendar` -> 目标 `addPhoneRepeatCalendar`(unsupported) * `addVideoToFavorites` -> 目标 `addVideoToFavorites`(unsupported) * `authorize` -> 目标 `authorize`(unsupported) * `authorizeForMiniProgram` -> 目标 `authorizeForMiniProgram`(unsupported) * `authPrivateMessage` -> 目标 `authPrivateMessage`(unsupported) * `batchGetStorage` -> 目标 `batchGetStorage`(unsupported) * `batchGetStorageSync` -> 目标 `batchGetStorageSync`(unsupported) * `batchSetStorage` -> 目标 `batchSetStorage`(unsupported) * `batchSetStorageSync` -> 目标 `batchSetStorageSync`(unsupported) * `bindEmployeeRelation` -> 目标 `bindEmployeeRelation`(unsupported) * `canAddSecureElementPass` -> 目标 `canAddSecureElementPass`(unsupported) * `cancelIdleCallback` -> 目标 `cancelIdleCallback`(unsupported) * `canvasGetImageData` -> 目标 `canvasGetImageData`(unsupported) * `canvasPutImageData` -> 目标 `canvasPutImageData`(unsupported) * `checkDeviceSupportHevc` -> 目标 `checkDeviceSupportHevc`(unsupported) * `checkEmployeeRelation` -> 目标 `checkEmployeeRelation`(unsupported) * `checkIsAddedToMyMiniProgram` -> 目标 `checkIsAddedToMyMiniProgram`(unsupported) * `checkIsOpenAccessibility` -> 目标 `checkIsOpenAccessibility`(unsupported) * `checkIsPictureInPictureActive` -> 目标 `checkIsPictureInPictureActive`(unsupported) * `checkSession` -> 目标 `checkSession`(unsupported) * `chooseAddress` -> 目标 `chooseAddress`(unsupported) * `chooseInvoice` -> 目标 `chooseInvoice`(unsupported) * `chooseInvoiceTitle` -> 目标 `chooseInvoiceTitle`(unsupported) * `chooseLicensePlate` -> 目标 `chooseLicensePlate`(unsupported) * `chooseMedia` -> 目标 `chooseMedia`(unsupported) * `chooseMessageFile` -> 目标 `chooseMessageFile`(unsupported) * `choosePoi` -> 目标 `choosePoi`(unsupported) * `compressVideo` -> 目标 `compressVideo`(unsupported) * `createAudioContext` -> 目标 `createAudioContext`(unsupported) * `createBLEPeripheralServer` -> 目标 `createBLEPeripheralServer`(unsupported) * `createBufferURL` -> 目标 `createBufferURL`(unsupported) * `createCacheManager` -> 目标 `createCacheManager`(unsupported) * `createCameraContext` -> 目标 `createCameraContext`(unsupported) * `createGlobalPayment` -> 目标 `createGlobalPayment`(unsupported) * `createInferenceSession` -> 目标 `createInferenceSession`(unsupported) ### 抖音不兼容示例 * `addCard` -> 目标 `addCard`(unsupported) * `addFileToFavorites` -> 目标 `addFileToFavorites`(unsupported) * `addPaymentPassFinish` -> 目标 `addPaymentPassFinish`(unsupported) * `addPaymentPassGetCertificateData` -> 目标 `addPaymentPassGetCertificateData`(unsupported) * `addPhoneCalendar` -> 目标 `addPhoneCalendar`(unsupported) * `addPhoneContact` -> 目标 `addPhoneContact`(unsupported) * `addPhoneRepeatCalendar` -> 目标 `addPhoneRepeatCalendar`(unsupported) * `addVideoToFavorites` -> 目标 `addVideoToFavorites`(unsupported) * `authorizeForMiniProgram` -> 目标 `authorizeForMiniProgram`(unsupported) * `authPrivateMessage` -> 目标 `authPrivateMessage`(unsupported) * `batchGetStorage` -> 目标 `batchGetStorage`(unsupported) * `batchGetStorageSync` -> 目标 `batchGetStorageSync`(unsupported) * `batchSetStorage` -> 目标 `batchSetStorage`(unsupported) * `batchSetStorageSync` -> 目标 `batchSetStorageSync`(unsupported) * `bindEmployeeRelation` -> 目标 `bindEmployeeRelation`(unsupported) * `canAddSecureElementPass` -> 目标 `canAddSecureElementPass`(unsupported) * `cancelIdleCallback` -> 目标 `cancelIdleCallback`(unsupported) * `canvasGetImageData` -> 目标 `canvasGetImageData`(unsupported) * `canvasPutImageData` -> 目标 `canvasPutImageData`(unsupported) * `checkDeviceSupportHevc` -> 目标 `checkDeviceSupportHevc`(unsupported) * `checkEmployeeRelation` -> 目标 `checkEmployeeRelation`(unsupported) * `checkIsAddedToMyMiniProgram` -> 目标 `checkIsAddedToMyMiniProgram`(unsupported) * `checkIsOpenAccessibility` -> 目标 `checkIsOpenAccessibility`(unsupported) * `checkIsPictureInPictureActive` -> 目标 `checkIsPictureInPictureActive`(unsupported) * `checkIsSoterEnrolledInDevice` -> 目标 `checkIsSoterEnrolledInDevice`(unsupported) * `checkIsSupportSoterAuthentication` -> 目标 `checkIsSupportSoterAuthentication`(unsupported) * `chooseContact` -> 目标 `chooseContact`(unsupported) * `chooseInvoice` -> 目标 `chooseInvoice`(unsupported) * `chooseInvoiceTitle` -> 目标 `chooseInvoiceTitle`(unsupported) * `chooseLicensePlate` -> 目标 `chooseLicensePlate`(unsupported) * `chooseMessageFile` -> 目标 `chooseMessageFile`(unsupported) * `choosePoi` -> 目标 `choosePoi`(unsupported) * `chooseVideo` -> 目标 `chooseVideo`(unsupported) * `closeBLEConnection` -> 目标 `closeBLEConnection`(unsupported) * `closeBluetoothAdapter` -> 目标 `closeBluetoothAdapter`(unsupported) * `closeSocket` -> 目标 `closeSocket`(unsupported) * `compressVideo` -> 目标 `compressVideo`(unsupported) * `connectWifi` -> 目标 `connectWifi`(unsupported) * `createAudioContext` -> 目标 `createAudioContext`(unsupported) * `createBLEConnection` -> 目标 `createBLEConnection`(unsupported) --- --- url: /packages/wevu-compiler.md description: '@wevu/compiler 是 Wevu 的编译能力底座,提供 Vue SFC 与小程序模板的解析、转换和输出能力。' --- # @wevu/compiler `@wevu/compiler` 是 Wevu 的编译能力底座,提供 Vue SFC 与小程序模板的解析、转换和输出能力。 ## 何时使用 * 你要在非 Vite 场景复用 Wevu 编译链路 * 你要独立处理 SFC 的 script/template/style/config * 你要在构建阶段做页面特性分析与注入 ## 安装 ```bash pnpm add @wevu/compiler ``` ## 最小示例:编译 SFC ```ts import { compileSfc } from '@wevu/compiler' const result = await compileSfc(sourceCode, 'pages/index/index.vue', { isPage: true, json: { kind: 'page' }, }) console.log(result.script) console.log(result.template) console.log(result.style) ``` ## 常用导出 * `compileSfc` / `compileVueFile` * `compileTemplate` / `compileStyle` * `collectWevuPageFeatureFlags` * `injectWevuPageFeaturesInJs` ## 与 Weapp-vite 的关系 `weapp-vite` 在上层整合构建流程,`@wevu/compiler` 提供底层编译能力。若你只是常规业务开发,优先看 [Weapp-vite 指引](/guide/)。 --- --- url: /guide/directory-structure/src-root.md description: Weapp-vite 的源码根目录概念,所有 pages、components、分包、自动生成类型文件都基于它定位。 --- # `/` `/` 是这组目录文档里最重要的概念。 `weapp-vite` 真正依赖的是 `weapp.srcRoot`,不是某个固定叫 `src/` 的文件夹。 ## 默认值 大多数模板会把它设成: ```ts export default defineConfig({ weapp: { srcRoot: 'src', }, }) ``` 但你也可以改成: ```ts export default defineConfig({ weapp: { srcRoot: 'miniprogram', }, }) ``` ## 它会影响什么 * `pages/` 的扫描根目录 * `components/` 的扫描根目录 * `custom-tab-bar/`、`app-bar/` 的固定位置 * `typed-router.d.ts`、`typed-components.d.ts`、`components.d.ts` 的默认输出位置 ## 一个简单判断 如果某条文档写的是 `/pages/**`,你应该先自动在脑中把它理解为: `/pages/**` --- --- url: /guide/directory-structure/subpackages.md description: 分包目录与分包 root 的关系说明,weapp.subPackages 才是分包边界的权威配置。 --- # `/` `weapp-vite` 不要求分包必须叫 `packages/` 或 `subpackages/`。 真正决定“这是不是分包”的,是你是否把该目录声明到 `weapp.subPackages`。 ## 推荐配置 ```ts export default defineConfig({ weapp: { subPackages: { 'packageA': {}, 'subpackages/marketing': { independent: true, }, }, }, }) ``` ## 对应目录 ```text / / pages/ components/ subpackages/ marketing/ pages/ components/ ``` ## 默认行为 * `//pages/**` 会被识别为分包页面 * `//components/**` 会被识别为分包组件 * 页面会进入自动路由的 `subPackages` 结果 如果你只建目录,不声明 `weapp.subPackages`,那它就不是稳定的分包边界。 --- --- url: /guide/ai.md description: 面向 weapp-vite 团队的 AI 协作入口,聚焦 Skills、MCP 与 llms.txt 三大章节。 --- # AI 协作指南 ## Skills `Skills` 负责给 AI 注入稳定的工程流程,减少“回答看起来对、执行却跑偏”的情况。 这里分两层理解: 1. `skills/*`:公开分发给用户的通用技能,适合安装到自己的 Codex / Claude 环境。 2. `.claude/skills/*`:这个项目仓库内附带的本地附加技能,通常跟本仓库工作流或本地工具链强绑定。 如果你是直接使用公开技能仓库,先安装: ```bash npx skills add sonofmagic/skills ``` 如果你正在这个 monorepo 里开发,优先把仓库自带技能链接到本地环境: ```bash pnpm skills:link ``` 只想预览链接结果而不改本地环境时: ```bash pnpm skills:link:dry ``` 公开 skills(`skills/*`)里当前常用的有: ```text $weapp-vite-best-practices $docs-and-website-sync $github-issue-fix-workflow $release-and-changeset-best-practices $weapp-devtools-e2e-best-practices $weapp-vite-wevu-performance-best-practices $weapp-vite-vue-sfc-best-practices $wevu-best-practices $native-to-weapp-vite-wevu-migration $weapp-ide-cli-best-practices ``` 项目本地附加 skills(当前位于 `.claude/skills/*`)按需通过 `pnpm skills:link` 一起同步。 当前仓库内的本地附加 skill 示例: ```text $playwright-cli ``` 建议: 1. 面向用户公开分发的流程优先沉淀到 `skills/*`。 2. 仅对本仓库有效、依赖本地工具链或本地 agent 能力的内容,更适合放到 `.claude/skills/*`。 3. 项目架构、分包、构建编排问题优先用 `weapp-vite-best-practices`。 4. 根据现有代码同步 `website`、`skills`、AI 指南时优先用 `docs-and-website-sync`。 5. GitHub issue 修复、`e2e-apps/github-issues` 复现、PR 闭环优先用 `github-issue-fix-workflow`。 6. changeset、发布、`create-weapp-vite` 联动和提交规范优先用 `release-and-changeset-best-practices`。 7. WeChat DevTools runtime e2e、automator 复用、`reLaunch` 方案优先用 `weapp-devtools-e2e-best-practices`。 8. 卡顿、掉帧、白屏、内存告警优先用 `weapp-vite-wevu-performance-best-practices`。 9. `.vue` 宏、模板兼容、`v-model`/`usingComponents` 问题优先用 `weapp-vite-vue-sfc-best-practices`。 10. `wevu` 生命周期、状态、事件、store 问题优先用 `wevu-best-practices`。 11. 原生小程序迁移到 `weapp-vite + wevu + Vue SFC` 优先用 `native-to-weapp-vite-wevu-migration`。 12. DevTools 自动化、`preview/upload/automator/config` 命令治理优先用 `weapp-ide-cli-best-practices`。 13. 先让 AI 明确使用哪个 Skill,再开始具体任务。 ## MCP `MCP` 负责把仓库真实能力暴露给 AI(读代码、搜代码、执行受限命令、调用 weapp-vite CLI)。 默认行为: 1. `weapp-vite` 默认启用 MCP 能力。 2. 默认不会自动启动 MCP 服务(`autoStart: false`)。 手动启动(推荐): ```bash weapp-vite mcp ``` 需要 HTTP 连接时: ```bash weapp-vite mcp --transport streamable-http --host 127.0.0.1 --port 3088 --endpoint /mcp ``` 可选:不在仓库目录执行时,再加 `--workspace-root /path/to/weapp-vite`。 ### 示例:驱动 weapp-vite screenshot 做验收 前置条件: 1. AI 客户端已接入 `weapp-vite` MCP。 2. 微信开发者工具已登录,并开启「设置 -> 安全设置 -> 服务端口」。 可直接复制的提示词: ```text 你现在连接的是 weapp-vite MCP。请帮我完成一次小程序截图验收: 1. 构建 e2e-apps/auto-routes-define-app-json(platform=weapp)。 2. 执行 weapp-vite screenshot,参数如下: - project: e2e-apps/auto-routes-define-app-json/dist/build/mp-weixin - page: pages/home/index - output: .tmp/mcp-screenshot.png - 使用 --json 返回结果 3. 检查 .tmp/mcp-screenshot.png 是否存在: - 存在输出 screenshot-ok - 不存在输出 screenshot-missing 4. 最后汇总:执行命令、关键输出、最终结论。 ``` 期望结果: 1. AI 输出 `screenshot-ok`。 2. 工作区产出 `.tmp/mcp-screenshot.png`。 ## llms.txt `llms.txt` 负责给模型稳定喂上下文,减少遗漏与误判。 可用资源: 1. `/llms.txt`:轻量索引。 2. `/llms-full.txt`:完整语料。 3. `/llms-index.json`:结构化索引。 推荐喂给顺序: 1. 先 `/llms.txt` 建立目录语义。 2. 再按需读取 `/llms-full.txt`。 3. 最后结合 `/llms-index.json` 做结构化定位。 ## 关联阅读 1. [CLI 命令参考](/guide/cli) 2. [共享配置:weapp.mcp](/config/shared#weapp-mcp) 3. [@weapp-vite/mcp 包说明](/packages/mcp) 4. [AI 学习入口](/ai) --- --- url: /ai.md description: 统一的 AI 学习入口,聚合 llms 语料、MCP 接入与 Weapp-vite / Wevu 技能安装方式。 --- --- --- url: /packages/rolldown-require/options.md description: >- rolldown-require exposes three APIs: bundleRequire, bundleFile, and loadFromBundledFile. Prefer the one-stop bundleRequ… --- # API & options > Language: English | [中文](/packages/rolldown-require/options.zh) `rolldown-require` exposes three APIs: `bundleRequire`, `bundleFile`, and `loadFromBundledFile`. Prefer the one-stop `bundleRequire`, which resolves the entry, bundles with rolldown, writes the temp output, loads it, and returns: * `mod`: the executed module (automatically unwraps `default` if present) * `dependencies`: the file paths touched during bundling ## Common options ### filepath / cwd * `filepath` is required and accepts relative or absolute paths. * `cwd` defaults to `process.cwd()` for resolving the relative entry and `tsconfig`. ### format * If omitted, format is inferred from extension and `package.json.type` (`.mjs`/`.mts`/`type:module` -> `esm`, `.cjs`/`.cts` -> `cjs`). * Pass `cjs`/`esm` to skip inference, e.g. force ESM for `.js`. ### require Customize how the temp output is loaded: `(outfile, { format }) => any`. * ESM: `import(outfile)` (temp file or data URL is written during bundling) * CJS: compiles the source via a temporary `_require.extensions` hook Use this to plug in your own loader, add custom `import` logic for ESM output, or inject mocks in tests. ### rolldownOptions Pass through parts of rolldown options: * `input`: add plugins, `resolve` rules, transforms, etc. Internally `platform: 'node'` and `treeshake: false` are fixed, and `define` injects `__dirname`/`__filename`/`import.meta.url`. * `output`: merged with defaults; `format` is overridden by the `format` option, `inlineDynamicImports` is always `true`. > Avoid overriding `platform`, `input`, or `inlineDynamicImports`, otherwise resolution/dependency collection may break. ### external Forwarded to rolldown. The plugin already externalizes most `node_modules` deps while keeping JSON inlined; use this option to exclude or force-inline specific deps. ### tsconfig * Auto-searches upward for `tsconfig.json` and reads `paths` for alias resolution during bundling. * Pass a string to set the path explicitly; pass `false` to disable tsconfig handling. ### getOutputFile Customize where the temp output is written (defaults to `node_modules/.rolldown-require` or the system temp dir with a random suffix). Handy for writing to a debuggable location. ### preserveTemporaryFile Temp files are cleaned after CJS load or ESM import by default. Set to `true` (or `BUNDLE_REQUIRE_PRESERVE`) to keep them for inspection. ### cache Disabled when `false`/unset. Pass `true` or an object to enable persistent + memory cache; see [Loading flow & cache](/packages/rolldown-require/cache) for details. ## Example configuration ```ts import { bundleRequire } from 'rolldown-require' const { mod } = await bundleRequire({ cwd: process.cwd(), filepath: './tooling/config.ts', format: 'esm', tsconfig: './tsconfig.node.json', external: ['fsevents'], cache: { enabled: true, dir: './node_modules/.rolldown-require-cache', onEvent: e => console.log('[rolldown-require cache]', e), }, rolldownOptions: { input: { plugins: [ myCustomPlugin(), ], }, }, }) ``` This setup will: 1. Bundle `tooling/config.ts` as ESM using the specified `tsconfig`. 2. Mark `fsevents` as external while keeping the default externalization behaviour for others. 3. Cache the temp output in the given directory and emit cache events via `onEvent`. --- --- url: /packages/rolldown-require/options.zh.md description: >- rolldown-require 暴露了 bundleRequire / bundleFile / loadFromBundledFile 三个 API,但推荐优先使用一站式的 bundleRequire。它会完成入口解析、rolldow… --- # API 与选项说明 > 语言: [English](/packages/rolldown-require/options) | 中文 `rolldown-require` 暴露了 `bundleRequire` / `bundleFile` / `loadFromBundledFile` 三个 API,但推荐优先使用一站式的 `bundleRequire`。它会完成入口解析、rolldown 打包、临时产物生成与最终加载,并返回: * `mod`: 已执行的模块(若存在 `default`,会自动返回 `default`) * `dependencies`: 打包阶段命中的文件路径列表 ## 常用选项 ### filepath / cwd * `filepath` 必填,支持相对路径或绝对路径。 * `cwd` 默认使用 `process.cwd()`,用于解析相对入口和 `tsconfig`。 ### format * 不传则自动根据后缀与 `package.json.type` 推断(`.mjs`/`.mts`/`type:module` -> `esm`,`.cjs`/`.cts` -> `cjs`)。 * 手动传入 `cjs`/`esm` 可跳过推断,例如希望强制以 ESM 方式加载 `.js`。 ### require 自定义产物的加载方式,签名为 `(outfile, { format }) => any`。默认行为: * ESM:`import(outfile)`(在打包时会写入临时文件或 data: URL) * CJS:通过 `_require.extensions` 临时钩子编译并 `require` 源文件 典型用途:接入你自己的 loader、为 ESM 产物追加自定义 `import` 逻辑,或在测试环境中注入 mock。 ### rolldownOptions 允许透传部分 rolldown 选项: * `input`: 可加入自定义插件、`resolve` 规则、`transform` 等。内部会固定 `platform: 'node'`、`treeshake: false`,并注入 `define` 保持 `__dirname`/`__filename`/`import.meta.url`。 * `output`: 会与内部默认项合并,但 `format` 会被 `format` 选项覆盖,`inlineDynamicImports` 固定为 `true`。 > 避免覆写 `platform`、`input` 或 `inlineDynamicImports`,否则可能导致运行时与依赖收集异常。 ### external 传递给 rolldown 的 `external` 配置。插件会自动外部化大部分 `node_modules` 依赖并保留 JSON 内联;通过该选项可进一步排除或强制内联特定依赖。 ### tsconfig * 默认自动向上查找 `tsconfig.json` 并读取 `paths`,让打包阶段能解析别名。 * 传入字符串可指定路径;传入 `false` 可禁用 `tsconfig` 解析。 ### getOutputFile 自定义临时产物的落盘路径(默认生成到 `node_modules/.rolldown-require` 或系统临时目录,并带随机后缀)。可用于将产物写入更易调试的位置。 ### preserveTemporaryFile 默认会在 CJS 加载完成或 ESM 加载后清理临时文件。将其设为 `true`(或设置环境变量 `BUNDLE_REQUIRE_PRESERVE`)可保留产物,便于问题排查。 ### cache `false`/未设置时关闭缓存。传入 `true` 或配置对象可以打开持久化 + 内存缓存,详见 [加载流程与缓存策略](/packages/rolldown-require/cache.zh)。 ## 组合示例 ```ts import { bundleRequire } from 'rolldown-require' const { mod } = await bundleRequire({ cwd: process.cwd(), filepath: './tooling/config.ts', format: 'esm', tsconfig: './tsconfig.node.json', external: ['fsevents'], cache: { enabled: true, dir: './node_modules/.rolldown-require-cache', onEvent: e => console.log('[rolldown-require cache]', e), }, rolldownOptions: { input: { plugins: [ myCustomPlugin(), ], }, }, }) ``` 上述配置会: 1. 强制以 ESM 格式打包 `tooling/config.ts` 并使用指定的 `tsconfig` 解析路径。 2. 将 `fsevents` 标记为外部依赖,其余依赖遵循默认外部化策略。 3. 把临时产物缓存到指定目录,并通过 `onEvent` 输出命中/失效信息。 --- --- url: /packages/weapi/wx-method-list.md description: '@wevu/api 基于微信命名体系的全量 API 目录,包含每个 API 的用途、示例与微信开放文档搜索入口。' --- # API 全量清单 本页按微信开放文档的能力域来组织 `@wevu/api` 当前收录的完整 API 目录。 能力域入口: * [基础](/packages/weapi/wx-method-list/base) * [路由](/packages/weapi/wx-method-list/route) * [跳转](/packages/weapi/wx-method-list/navigate) * [聊天工具](/packages/weapi/wx-method-list/chattool) * [转发](/packages/weapi/wx-method-list/share) * [界面](/packages/weapi/wx-method-list/ui) * [网络](/packages/weapi/wx-method-list/network) * [支付](/packages/weapi/wx-method-list/payment) * [数据缓存](/packages/weapi/wx-method-list/storage) * [数据分析](/packages/weapi/wx-method-list/data-analysis) * [画布](/packages/weapi/wx-method-list/canvas) * [媒体](/packages/weapi/wx-method-list/media) * [位置](/packages/weapi/wx-method-list/location) * [文件](/packages/weapi/wx-method-list/file) * [开放接口](/packages/weapi/wx-method-list/open-api) * [设备](/packages/weapi/wx-method-list/device) * [AI](/packages/weapi/wx-method-list/ai) * [Worker](/packages/weapi/wx-method-list/worker) * [WXML](/packages/weapi/wx-method-list/wxml) * [第三方平台](/packages/weapi/wx-method-list/ext) * [广告](/packages/weapi/wx-method-list/ad) * [XR-FRAME](/packages/weapi/wx-method-list/xr-frame) 每个能力域下都保留: * API 是什么 * 一段最小用法示例 * 微信开放文档搜索入口 * 微信 / 支付宝 / 抖音三端的当前策略 --- --- url: /packages/weapi/wx-method-list/ai.md description: '@wevu/api API 全量清单中的 AI 能力。' --- # API 全量清单 · AI --- --- url: /packages/weapi/wx-method-list/worker.md description: '@wevu/api API 全量清单中的 Worker 能力。' --- # API 全量清单 · Worker --- --- url: /packages/weapi/wx-method-list/wxml.md description: '@wevu/api API 全量清单中的 WXML 能力。' --- # API 全量清单 · WXML --- --- url: /packages/weapi/wx-method-list/xr-frame.md description: '@wevu/api API 全量清单中的 XR-FRAME 能力。' --- # API 全量清单 · XR-FRAME --- --- url: /packages/weapi/wx-method-list/location.md description: '@wevu/api API 全量清单中的位置能力。' --- # API 全量清单 · 位置 --- --- url: /packages/weapi/wx-method-list/base.md description: '@wevu/api API 全量清单中的基础能力。' --- # API 全量清单 · 基础 --- --- url: /packages/weapi/wx-method-list/media.md description: '@wevu/api API 全量清单中的媒体能力。' --- # API 全量清单 · 媒体 --- --- url: /packages/weapi/wx-method-list/ad.md description: '@wevu/api API 全量清单中的广告能力。' --- # API 全量清单 · 广告 --- --- url: /packages/weapi/wx-method-list/open-api.md description: '@wevu/api API 全量清单中的开放接口能力。' --- # API 全量清单 · 开放接口 --- --- url: /packages/weapi/wx-method-list/payment.md description: '@wevu/api API 全量清单中的支付能力。' --- # API 全量清单 · 支付 --- --- url: /packages/weapi/wx-method-list/data-analysis.md description: '@wevu/api API 全量清单中的数据分析能力。' --- # API 全量清单 · 数据分析 --- --- url: /packages/weapi/wx-method-list/storage.md description: '@wevu/api API 全量清单中的数据缓存能力。' --- # API 全量清单 · 数据缓存 --- --- url: /packages/weapi/wx-method-list/file.md description: '@wevu/api API 全量清单中的文件能力。' --- # API 全量清单 · 文件 --- --- url: /packages/weapi/wx-method-list/canvas.md description: '@wevu/api API 全量清单中的画布能力。' --- # API 全量清单 · 画布 --- --- url: /packages/weapi/wx-method-list/ui.md description: '@wevu/api API 全量清单中的界面能力。' --- # API 全量清单 · 界面 --- --- url: /packages/weapi/wx-method-list/ext.md description: '@wevu/api API 全量清单中的第三方平台能力。' --- # API 全量清单 · 第三方平台 --- --- url: /packages/weapi/wx-method-list/network.md description: '@wevu/api API 全量清单中的网络能力。' --- # API 全量清单 · 网络 --- --- url: /packages/weapi/wx-method-list/chattool.md description: '@wevu/api API 全量清单中的聊天工具能力。' --- # API 全量清单 · 聊天工具 --- --- url: /packages/weapi/wx-method-list/device.md description: '@wevu/api API 全量清单中的设备能力。' --- # API 全量清单 · 设备 --- --- url: /packages/weapi/wx-method-list/route.md description: '@wevu/api API 全量清单中的路由能力。' --- # API 全量清单 · 路由 --- --- url: /packages/weapi/wx-method-list/navigate.md description: '@wevu/api API 全量清单中的跳转能力。' --- # API 全量清单 · 跳转 --- --- url: /packages/weapi/wx-method-list/share.md description: '@wevu/api API 全量清单中的转发能力。' --- # API 全量清单 · 转发 --- --- url: /wevu/api-reference.md description: Wevu API 参考首页。按 Vue API 风格提供分组导航,先定位能力域,再跳转到对应 API 分页。 --- # Wevu API 参考 本页参考了 Vue 官方 API 导航方式:先按能力域分组,再进入具体条目。 ## 全局 API ### 入口与应用 * [Core API(入口、组件、宏)](/wevu/api/core.html) * `defineComponent` / `createApp` / `defineProps` / `defineEmits` / `defineModel` ### 通用调度 * [Reactivity API(响应式与调度)](/wevu/api/reactivity.html) * `ref` / `reactive` / `computed` / `watch` / `nextTick` ## 组合式 API ### 生命周期 * [Lifecycle API(生命周期)](/wevu/api/lifecycle.html) * `onLoad` / `onShow` / `onReady` / `onUnload` ### setup 上下文 * [Setup Context API(setup 上下文)](/wevu/api/setup-context.html) * `ctx.emit` / `useBindModel` / `useIntersectionObserver` / `getCurrentInstance` / `provide` / `inject` ### 状态管理 * [Store API(状态管理)](/wevu/api/store.html) * `defineStore` / `createStore` / `storeToRefs` ## 进阶 API ### 运行时桥接 * [Runtime Bridge API(桥接与调试)](/wevu/api/runtime-bridge.html) * 小程序实例桥接、`setData` 策略、调试与性能开关 ### 类型与工具 * [Type Reference(类型总览)](/wevu/api/types.html) * 核心类型、上下文类型、Store 类型、桥接类型 ## 子路径导出 这些页面不属于 `wevu` 主入口的“逐函数分组 API”,但它们同样是 Wevu 当前公开的 namespace 导出: * [wevu/api](/wevu/api-package) * 透传 `@wevu/api`,用于统一多端小程序 API 调用 * [wevu/fetch](/wevu/fetch) * 基于 `wpi.request` 的 Fetch 风格接口 * [wevu/router](/wevu/router) * 路径式导航、守卫、失败分类与调试能力 * [wevu/jsx-runtime](/wevu/jsx-runtime) * TSX / JSX 类型入口 ## 建议阅读路径 1. 先读 `Core`,建立 Wevu 的组件与宏心智。 2. 再读 `Reactivity` + `Lifecycle`,形成页面更新与生命周期调度模型。 3. 业务接入 `Setup Context` + `Store`。 4. 需要排障或优化时再进入 `Runtime Bridge` 与 `Type Reference`。 ## 使用约定 * 业务代码统一从 `wevu` 主入口导入。 * `wevu/compiler` 主要用于编译工具链,不建议在业务运行时代码中直接依赖。 * `wevu` 请安装在 `devDependencies` 中,而不是 `dependencies`。 * 本目录是“按场景组织”的人工参考;精确签名、泛型和重载以对应 API 分页为准。 --- --- url: /guide/directory-structure/app-bar.md description: Skyline 全局工具栏的固定保留目录,与 appBar 配置一一对应。 --- # `app-bar/` 这是 Skyline 全局工具栏的固定目录。 ## 触发条件 当 `app.json` 中声明了 `appBar` 配置时,`weapp-vite` 会把 `app-bar/index` 当成固定入口。 ## 位置要求 * 目录名必须是 `app-bar` * 必须和 `app.json` 处于同一个 `srcRoot` 下 ## 它和普通页面的区别 * 不参与自动路由扫描 * 不应放进 `pages/` * 语义来自平台配置,而不是约定式页面目录 --- --- url: /guide/directory-structure/app-style.md description: 应用级全局样式入口,支持 CSS、WXSS 与常见预处理器后缀。 --- # `app.(css|scss|wxss|...)` `app.(css|scss|wxss|...)` 是全局样式入口。 ## 常见后缀 * `app.css` * `app.wxss` * `app.scss` * `app.less` * `app.sass` * `app.styl` ## 常见用途 * reset * 主题变量 * 公共样式 token * tabBar、navigation 相关样式 它不是必须文件,但大多数项目值得保留一个全局样式入口。 如果你使用的是 `app.vue`,也可以通过 ` ``` ## 它和 `app.(js|ts)` / `app.json(.js|.ts)?` / `app.(css|scss|wxss|...)` 的关系 可以把 `app.vue` 理解为一种“组合式入口”: * 脚本逻辑在 ` ``` ```vue [JavaScript] ``` ::: ## 3. 模板和 class/style 工具 | API | 类型入口 | 说明 | | ------------------- | ---------------------------------- | ----------------------------------------------------------- | | `useAttrs` | `SetupContext` | 获取 attrs(透传属性)。 | | `useSlots` | `TemplateRefs` | 获取 slots。 | | `useTemplateRef` | `TemplateRef` / `TemplateRefValue` | 获取模板 `ref` 对应实例。 | | `useNativeInstance` | `SetupContextNativeInstance` | 访问 setup 绑定的原生实例。 | | `useRouter` | `Router` | 组件路径语义 Router(`router -> pageRouter -> wx/my/tt`)。 | | `usePageRouter` | `Router` | 页面路径语义 Router(`pageRouter -> router -> wx/my/tt`)。 | | `normalizeClass` | `string` | 归一化 class 输入(对象/数组/字符串)。 | | `normalizeStyle` | `Record` | 归一化 style 输入。 | ### 模板工具示例(script setup) ::: code-group ```vue [TypeScript] ``` ```vue [JavaScript] ``` ::: ## 4. 相关页 * 响应式能力:[/wevu/api-reference/reactivity](/wevu/api-reference/reactivity) * setup 上下文与原生实例:[/wevu/api-reference/setup-context](/wevu/api-reference/setup-context) * 完整函数索引:/wevu/api/ --- --- url: /wevu/api/core.md description: 本页聚焦 Wevu 的入口能力、组件定义、script setup 宏与模板工具,采用逐 API 讲解结构。 --- # Core API(入口、组件、宏) 本页覆盖 `wevu` 中最先接触的一组 API:应用入口、组件定义、` ``` ```vue [JavaScript] ``` ::: --- --- url: /packages/create-weapp-vite.md description: create-weapp-vite 是官方脚手架,用于快速创建小程序工程,并在模板中对齐 Weapp-vite / Wevu 的版本组合。 --- # create-weapp-vite `create-weapp-vite` 是官方脚手架,用于快速创建小程序工程,并在模板中对齐 `weapp-vite` / `wevu` 的版本组合。 > \[!IMPORTANT] > 如果你在已有项目里手动安装 `weapp-vite` 与 `wevu`,也请保持两者版本号一致(例如 `weapp-vite@x.y.z` 与 `wevu@x.y.z`)。 ## 何时使用 * 你想快速初始化新项目 * 你希望通过模板统一团队目录结构与依赖版本 * 你要在 CI 或自动化脚本里做非交互创建 ## 快速开始 ```bash pnpm create weapp-vite # 或 npx create-weapp-vite ``` ### 非交互模式 ```bash pnpm create weapp-vite my-app wevu ``` 第二个参数是模板名,内部对应 `TemplateName` 枚举。 ## 可编程 API ```ts import { createProject, TemplateName } from 'create-weapp-vite' await createProject('my-app', TemplateName.wevu) ``` ## 可选模板(当前实现) * `default` * `wevu` * `tailwindcss` * `vant` * `tdesign` * `wevu-tdesign` * `wevu-retail` ## 与主文档的关系 * 工程创建后,日常开发请转到 [指引](/guide/) 与 [配置](/config/)。 --- --- url: /guide/directory-structure/custom-tab-bar.md description: 微信自定义 tabBar 的固定保留目录,必须与 app.json 处于同一个 srcRoot 下。 --- # `custom-tab-bar/` 这是微信自定义 tabBar 的固定目录。 ## 触发条件 当 `app.json` 中存在: ```json { "tabBar": { "custom": true } } ``` `weapp-vite` 会把 `custom-tab-bar/index` 当成固定入口分析。 ## 位置要求 * 目录名必须是 `custom-tab-bar` * 必须和 `app.json` 位于同一个 `srcRoot` 下 如果 `app.json` 在 `/`,那它就应该是: ```text / app.json custom-tab-bar/ index.vue ``` 它不是普通页面目录,也不通过自动路由发现。 --- --- url: /dashboard.md description: >- const Dashboard = defineClientComponent(()=>{ return import('./.vitepress/components/Dashboard.vue') }) // import Dashb… --- --- --- url: /wevu/component.md description: >- defineComponent() 是对原生 Component() 的一层封装/增强:在组件 lifetimes.created 阶段初始化运行时并同步执行 setup();setup() 返回对象会合并到组件实例,模板可直接使用。 --- # defineComponent(组件) `defineComponent()` 是对原生 `Component()` 的一层封装/增强:在组件 `lifetimes.created` 阶段初始化运行时并同步执行 `setup()`;`setup()` 返回对象会合并到组件实例,模板可直接使用。 > 注意:小程序在 `created` 阶段禁止调用 `setData`。因此 Wevu 会在 `created` 阶段**缓冲**由响应式更新产生的 `setData`,并在首次安全时机(组件 `attached` / 页面 `onLoad`)再统一 flush。 此外,`defineComponent` 的 `data` **必须是函数**(与 Vue 3 一致,和小程序原生对象写法不同)。原因是原生小程序会在实例化时拷贝 `data` 对象以隔离实例;Wevu 需要为每个实例创建独立的响应式 state/代理与快照 diff,因此要求返回新对象,避免共享引用污染与 diff 不稳定。 本页主要回答两类问题: * “我原来写 `Component({ ... })` 的字段,放到 `defineComponent({ ... })` 里怎么写?” * “组件/页面生命周期到底什么时候触发?为什么 created 里更新不生效?” ## 页面也用 defineComponent(统一模型) 在 Wevu 里,页面与组件都通过 `Component()` 注册,这是统一模型的一部分: * 页面特有能力(滚动/分享/触底/下拉刷新等)通过 Wevu 的页面 hooks 注册(详见 `/wevu/runtime`)。 * 小程序“按需派发”的页面事件,需要对应页面方法存在才会触发;配合 Weapp-vite 构建时,通常由编译阶段自动补齐 `features.enableOnXxx`(详见 `/wevu/vue-sfc`)。 ## 原生 Component 选项在 Wevu 的写法 结论先说:除了 `data / computed / methods / watch / setup / props` 这些由 Wevu 接管的“增强选项”外,其余原生 `Component({ ... })` 的字段,都可以**直接写到** `defineComponent({ ... })` 里(Wevu 会透传给原生 `Component()`)。 下面按你列出的字段逐项对照(类型定义可参考 `miniprogram-api-typings` 中的 `WechatMiniprogram.Component.*`)。 | 原生字段 | Wevu 写法 | 说明 | | ------------------ | --------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `behaviors` | `defineComponent({ behaviors: [...] })` | 原样透传给 `Component()`。 | | `data` | `defineComponent({ data: () => ({ ... }) })` 或 `setup()` return 非函数字段 | `data` 必须是函数(Vue 3 一致);`setup()` 返回的非函数字段会进入运行时 state。原生小程序会拷贝对象避免实例间共享,而 Wevu 需创建独立响应式 state/快照 diff。 | | `methods` | `defineComponent({ methods: { ... } })` 或 `setup()` return 函数 | `methods` 与 `setup()` 返回函数都会成为实例方法;同名时原生 `methods` 会在 Wevu 包装后仍可执行(内部会先尝试运行 Wevu 方法)。 | | `definitionFilter` | `defineComponent({ definitionFilter(defFields, arr) { ... } })` | 原生组件扩展能力,Wevu 不改写,直接透传。 | | `export` | `defineComponent({ export() { return ... } })` 或 `setup(_, { expose }) { expose({ ... }) }` | 原生导出用于 `behavior: wx://component-export`:Wevu 默认会把 `setup()` 里 `expose({ ... })` 的结果作为 `export()` 返回值,因此通常无需再手写 `export()`;若同时提供了 `export()`,会与 `expose()` 结果浅合并(`export()` 优先级更高)。 | | `externalClasses` | `defineComponent({ externalClasses: [...] })` | 原样透传。 | | `lifetimes` | 推荐用 `setup()` + Wevu hooks;也可写 `defineComponent({ lifetimes: { ... } })` | `lifetimes.ready/detached/moved/error` 会被 Wevu 包装以派发对应 hook,但你的原生回调仍会被调用;`lifetimes.created` 用于执行 Wevu 的 `setup()`,并会在后续首次安全时机(`attached/onLoad`)flush 缓冲的 `setData`。 | | `observers` | 推荐用 `watch()`/`watchEffect()` 或 `defineComponent({ watch: { 'a.b': fn } })`;也可写 `defineComponent({ observers: { ... } })` | `observers` 是原生数据监听器(支持更复杂的表达式/通配),Wevu 不改写,直接透传;Wevu 的 `watch` 是基于运行时代理的路径监听(更像 Vue 的 `watch` 选项)。 | | `options` | `defineComponent({ options: { ... } })` | 原生 `ComponentOptions`(`multipleSlots/styleIsolation/pureDataPattern/virtualHost/...`)。注意:Wevu 默认会把 `options.multipleSlots` 置为 `true`(用户显式传入则以用户为准)。 | | `pageLifetimes` | 推荐用 `onShow/onHide/onResize/onRouteDone`;也可写 `defineComponent({ pageLifetimes: { ... } })` | `show/hide/resize/routeDone` 会被 Wevu 包装以派发 hook;其他字段按原生透传执行。 | | `properties` | 推荐:`props`;也可:`defineComponent({ properties: { ... } })` | `props` 会被 Wevu 规范化为原生 `properties`;如果同时传了 `props` 与 `properties`,以 `props` 生成的 `properties` 为准。 | | `relations` | `defineComponent({ relations: { ... } })` | 原样透传。 | > 小提示:如果你在 Wevu 里需要使用“原生 this”(例如访问 `this.setData`、`this.triggerEvent`、`selectComponent` 等),可以在 `setup(props, ctx)` 里通过 `ctx.instance` 访问小程序实例。 ## Behavior 迁移补充(SFC 场景) 结论先说: * `wevu` 运行时不会重写 `behaviors` 合并规则,`behaviors` 仍由小程序原生 `Component()` 处理。 * 迁移原生 `Behavior()` 时,推荐优先保持“Behavior 文件 + 组件引用”模式,不要把 behavior 内容手动改写成 Wevu 私有逻辑。 ### 写法 1:` ``` ### 写法 2:` ``` 补充说明: * 如果 `behaviors` 里是内建 behavior(例如 `wx://component-export`),直接写字符串数组即可。 * 如果 `behaviors` 来自原生 `Behavior()` 返回值,`defineOptions` 会在编译阶段保留该表达式并继续编译,不会因为构建环境没有全局 `Behavior` 而中断。 * `definitionFilter`、`observers`、`lifetimes` 的执行顺序与覆盖关系,仍以微信官方 `behaviors` 规则为准。 ## lifetimes / pageLifetimes 对应的 hooks > 说明:Wevu 的 `onXXX()` 必须在 `setup()` **同步阶段**注册;由于 Wevu 会在 `lifetimes.created` 内执行 `setup()`,因此你可以在 `setup()` 里注册所有 Wevu hooks(包括 `onBeforeMount` 等)。 ### lifetimes(组件生命周期) | 小程序字段 | 回调名 | 对应 Wevu hook | 说明 | | -------------------- | ---------- | -------------------------- | ------------------------------------------------------------------------------ | | `lifetimes.created` | `created` | `setup()` | Wevu 在此阶段 mount 并执行 `setup()`(`setData` 会被延迟到 `attached/onLoad`) | | `lifetimes.attached` | `attached` | - | 组件进入节点树;Wevu 会在此阶段 flush `created` 阶段缓冲的 `setData` | | `lifetimes.ready` | `ready` | `onReady` / `onMounted` | 组件就绪(内部做了重复触发去重) | | `lifetimes.moved` | `moved` | `onMoved` | 组件移动(例如在节点树中被移动) | | `lifetimes.detached` | `detached` | `onUnload` / `onUnmounted` | detached 时 teardown,并触发 `onUnload` | | `lifetimes.error` | `error` | `onError` | 组件错误(参数透传原生回调) | ### pageLifetimes(页面对组件的影响) | 小程序字段 | 回调名 | 对应 Wevu hook | 说明 | | ------------------------- | ----------- | -------------------------- | ---------------------------------------- | | `pageLifetimes.show` | `show` | `onShow` / `onActivated` | 所在页面显示 | | `pageLifetimes.hide` | `hide` | `onHide` / `onDeactivated` | 所在页面隐藏 | | `pageLifetimes.resize` | `resize` | `onResize` | 所在页面尺寸变化(参数透传原生回调) | | `pageLifetimes.routeDone` | `routeDone` | `onRouteDone` | 所在页面路由动画完成(基础库 `2.31.2+`) | --- --- url: /config/js.md description: >- Weapp-vite 默认使用 Vite 8 原生的 resolve.tsconfigPaths 读取 tsconfig.json/jsconfig.json 的 paths/baseUrl,并在需要高级选项时兼容 vite-tsconfig-paths。 --- # JS 配置 {#js-config} `weapp-vite` 默认使用 Vite 8 原生的 `resolve.tsconfigPaths` 读取 `tsconfig.json/jsconfig.json` 的 `paths/baseUrl`,把别名映射到 Vite / Rolldown 流程中;只有在你传入高级选项对象时,才会回退到 `vite-tsconfig-paths` 插件。 \[\[toc]] ## `weapp.tsconfigPaths` {#weapp-tsconfigpaths} * **类型**:`boolean | TsconfigPathsOptions | false` * **默认值**:`undefined`(按需自动启用) 启用规则: * 当 `tsconfig.json` 或 `jsconfig.json` **存在 `paths` 或 `baseUrl`** 时,会自动启用 Vite 原生 `resolve.tsconfigPaths`; * 传入 `true` 时,会强制启用原生 `resolve.tsconfigPaths`; * 传入对象时,会启用 `vite-tsconfig-paths` 插件以支持 `projects`、`exclude` 等高级选项; * 传入 `false` 可完全禁用(适合没有别名需求、追求更快启动的项目)。 推荐优先使用默认行为或 `true`,这样不会触发 Vite 8 对 `vite-tsconfig-paths` 的提示信息。 ```ts import { defineConfig } from 'weapp-vite/config' export default defineConfig({ weapp: { tsconfigPaths: true, }, }) ``` ```ts import { defineConfig } from 'weapp-vite/config' import type { PluginOptions } from 'vite-tsconfig-paths' const tsconfigOptions: PluginOptions = { projects: ['./tsconfig.base.json'], extensions: ['.ts', '.js', '.vue'], exclude: ['**/__tests__/**'], } export default defineConfig({ weapp: { tsconfigPaths: tsconfigOptions, }, }) ``` ### 与 `resolve.alias` 的关系 * `weapp.tsconfigPaths` / `resolve.tsconfigPaths` 负责把 **tsconfig 的 paths/baseUrl** 转成 Vite alias。 * 你仍然可以在 `resolve.alias` 中补充或覆盖特定映射,两者可共存。 ```ts export default defineConfig({ resolve: { alias: { '@shared': '/packages/shared/src', }, }, weapp: { tsconfigPaths: { projects: ['./tsconfig.base.json'], }, }, }) ``` ### 常见问题 * **修改 `paths` 没生效?** 需要重启 `pnpm dev`,并确认 tsconfig 在 `projects` 列表内。 * **JSON 别名怎么配?** JSON 使用 `weapp.jsonAlias`(见 [JSON 配置](/config/json.md#weapp-jsonalias)),与 JS/TS 别名相互独立。 *** 更多 alias 实战与疑难排查,请参考 [路径别名指南](/guide/alias)。 --- --- url: /config/json.md description: >- Weapp-vite 支持原生 json/jsonc,并提供 **JSON 别名** 与 **JSON 合并策略**,方便在 app.json / page.json / component.json 中复用配置。 --- # JSON 配置 {#json-config} `weapp-vite` 支持原生 `json/jsonc`,并提供 **JSON 别名** 与 **JSON 合并策略**,方便在 `app.json / page.json / component.json` 中复用配置。 \[\[toc]] ## `weapp.jsonAlias` {#weapp-jsonalias} * **类型**:`{ entries?: Record | { find: string | RegExp; replacement: string }[] }` * **默认值**:`undefined` * **作用范围**:**仅作用于 `usingComponents`**(其他字段保持原样)。 ```ts import path from 'node:path' import { defineConfig } from 'weapp-vite/config' export default defineConfig({ weapp: { jsonAlias: { entries: [ { find: '@/components/', replacement: path.resolve(import.meta.dirname, 'src/components/') }, { find: /^@icons\//, replacement: path.resolve(import.meta.dirname, 'src/assets/icons/') }, ], }, }, }) ``` JSON/JSONC 中可直接使用别名: ```jsonc { "usingComponents": { "nav-bar": "@/components/navigation-bar", "logo-icon": "@icons/logo" } } ``` 构建产物会转换为相对路径: ```json { "usingComponents": { "nav-bar": "../../components/navigation-bar", "logo-icon": "../../assets/icons/logo" } } ``` > \[!TIP] > `replacement` 推荐使用**绝对路径**,避免因工作目录变化导致解析失败。 ## `weapp.json.defaults` {#weapp-json-defaults} * **类型**:`{ app?: Record; page?: Record; component?: Record }` * **默认值**:`undefined` * **作用**:给 app/page/component JSON 注入统一默认值。 ```ts import { defineConfig } from 'weapp-vite/config' export default defineConfig({ weapp: { json: { defaults: { app: { entryPagePath: 'pages/index/index', }, page: { navigationStyle: 'custom', }, component: { styleIsolation: 'apply-shared', }, }, }, }, }) ``` 说明: * 默认值会在生成 `.json` 产物时合并。 * 页面/组件自身的 JSON(或 SFC `` / 宏)会覆盖默认值。 ## `weapp.json.mergeStrategy` {#weapp-json-merge-strategy} * **类型**:`'deep' | 'assign' | 'replace' | (target, source, ctx) => Record | void` * **默认值**:`'deep'` ```ts export default defineConfig({ weapp: { json: { mergeStrategy: 'assign', }, }, }) ``` 函数策略会收到上下文: ```ts export default defineConfig({ weapp: { json: { mergeStrategy(target, source, ctx) { if (ctx.kind === 'page' && ctx.stage === 'defaults') { return { ...target, ...source } } return { ...source, ...target } }, }, }, }) ``` 常见 `ctx.stage`:`defaults` / `json-block` / `auto-using-components` / `component-generics` / `macro` / `emit` / `merge-existing`。 *** 需要配置脚本别名?请前往 [JS 配置](/config/js.md#weapp-tsconfigpaths)。 --- --- url: /guide/json-intelli-sense.md description: 给 app.json、page.json 等文件加上 $schema 字段后,VS Code、微信开发者工具等编辑器就能提供: --- # JSON 配置文件的智能提示 给 `app.json`、`page.json` 等文件加上 `$schema` 字段后,VS Code、微信开发者工具等编辑器就能提供: * 字段补全 * 取值提示 * 错误校验 本页提供现成的 Schema 地址,复制到文件开头即可使用。 > \[!TIP] > 使用 Weapp-vite 的脚手架(`pnpm g`)生成的页面/组件,默认已经包含对应的 `$schema`,你只需确认编辑器支持 JSON Schema 即可。工作区已在 `.vscode/settings.json` 里把在线地址映射到本地 `node_modules/@weapp-core/schematics/schemas/*.json`,既保留短链接又支持离线补全。 ## 如何添加 `$schema` 在目标配置文件的开头写入对应的 `$schema` 字段,例如: ```jsonc { "$schema": "https://vite.icebreaker.top/page.json", "navigationBarTitleText": "Home" } ``` `$schema` 只在编辑器里生效;构建阶段会自动剥离,不会影响最终产物。 ## 常用 Schema 列表 | 文件 | `$schema` 地址 | | ---------------- | ----------------------------------------------- | | 组件 `component.json` | `"https://vite.icebreaker.top/component.json"` | | 页面 `page.json` | `"https://vite.icebreaker.top/page.json"` | | 应用 `app.json` | `"https://vite.icebreaker.top/app.json"` | | `sitemap.json` | `"https://vite.icebreaker.top/sitemap.json"` | | `theme.json` | `"https://vite.icebreaker.top/theme.json"` | 直接复制右侧的地址粘贴即可。如果编辑器支持“悬浮后复制按钮”,也可以将整行复制下来放入文件中。VS Code 用户无需修改 `$schema`,工作区设置会自动将在线地址重定向到本地 Schema 文件。 ## 效果展示 ![vscode-json-intel](/vscode-json-intel.png) ## 常见问题 * **需要联网吗?** 默认 `$schema` 仍是在线地址,但 VS Code 会把它映射到本地 `node_modules/@weapp-core/schematics/schemas/*.json`,离线也能补全。如果换用其他编辑器,可手动做类似映射或直接改成本地路径。 * **生成器能输出本地 `$schema` 吗?** 可以,通过环境变量 `WEAPP_SCHEMA_BASE=file:///<你的项目绝对路径>/node_modules/@weapp-core/schematics/schemas` 让 `@weapp-core/schematics` 生成时使用本地 Schema(非必需,仅想让文件自带本地路径时启用)。 * **脚手架已生成 `$schema`,但仍没有提示?** 请确认编辑器启用了 JSON Schema 支持:VS Code 需安装官方小程序扩展或开启原生 JSON 支持;微信开发者工具需升级到较新的版本。 * **和 `json.ts` / `json.js` 配合?** 可以。在脚本文件里同样可以导出 `$schema` 字段,Weapp-vite 在构建时会一并剥离。 --- --- url: /wevu/api-reference/lifecycle.md description: Wevu 生命周期 API 都需要在 setup() 的同步阶段调用。 --- # Lifecycle API(生命周期) `wevu` 生命周期 API 都需要在 `setup()` 的同步阶段调用。 ## 1. App 生命周期 | API | 类型入口 | 说明 | | ---------------------- | ------------------ | -------------------------- | | `onLaunch` | `DefineAppOptions` | 小程序 App 启动。 | | `onShow` | `RuntimeApp` | App 进入前台。 | | `onHide` | `RuntimeApp` | App 进入后台。 | | `onError` | `RuntimeApp` | 运行时错误回调。 | | `onPageNotFound` | `RuntimeApp` | 路由未命中。 | | `onUnhandledRejection` | `RuntimeApp` | 未处理 Promise rejection。 | | `onThemeChange` | `RuntimeApp` | 系统主题变化。 | | `onMemoryWarning` | `RuntimeApp` | 内存告警回调。 | ## 2. 页面与组件通用生命周期 | API | 类型入口 | 说明 | | ---------- | ----------------- | -------------------------- | | `onLoad` | `RuntimeInstance` | 页面参数加载(页面常用)。 | | `onReady` | `RuntimeInstance` | 首次渲染完成。 | | `onShow` | `RuntimeInstance` | 页面/组件显示。 | | `onHide` | `RuntimeInstance` | 页面/组件隐藏。 | | `onUnload` | `RuntimeInstance` | 页面卸载。 | ## 3. 组件渲染阶段(Vue 风格) | API | 类型入口 | 说明 | | ------------------ | ----------------- | ------------------------- | | `onBeforeMount` | `RuntimeInstance` | 挂载前。 | | `onMounted` | `RuntimeInstance` | 挂载后。 | | `onBeforeUpdate` | `RuntimeInstance` | 更新前。 | | `onUpdated` | `RuntimeInstance` | 更新后。 | | `onBeforeUnmount` | `RuntimeInstance` | 卸载前。 | | `onUnmounted` | `RuntimeInstance` | 卸载后。 | | `onActivated` | `RuntimeInstance` | 激活(缓存场景)。 | | `onDeactivated` | `RuntimeInstance` | 失活(缓存场景)。 | | `onErrorCaptured` | `RuntimeInstance` | 捕获子树错误。 | | `onServerPrefetch` | `RuntimeInstance` | 兼容 Vue 语义的预取钩子。 | ## 4. 小程序特有页面事件 | API | 类型入口 | 说明 | | ------------------- | -------------- | -------------- | | `onPageScroll` | `PageFeatures` | 页面滚动。 | | `onPullDownRefresh` | `PageFeatures` | 下拉刷新。 | | `onReachBottom` | `PageFeatures` | 触底事件。 | | `onRouteDone` | `PageFeatures` | 页面路由完成。 | | `onTabItemTap` | `PageFeatures` | Tab 点击。 | | `onResize` | `PageFeatures` | 视图尺寸变化。 | ## 5. 带返回值的页面钩子 | API | 类型入口 | 说明 | | ------------------- | -------------- | ---------------------- | | `onShareAppMessage` | `PageFeatures` | 自定义转发内容。 | | `onShareTimeline` | `PageFeatures` | 自定义朋友圈分享内容。 | | `onAddToFavorites` | `PageFeatures` | 添加收藏。 | | `onSaveExitState` | `PageFeatures` | 离开时保存状态。 | ## 6. 小程序组件生命周期(lifetimes / pageLifetimes) ### 6.1 官方生命周期清单(组件侧) | 分类 | 官方生命周期 | | --------------- | ------------------------------------------------------- | | `lifetimes` | `created / attached / ready / moved / detached / error` | | `pageLifetimes` | `show / hide / resize / routeDone` | ### 6.2 Wevu 对应能力(组合式 + 桥接) | 官方生命周期 | Wevu 对应能力 | 说明 | | ------------------------- | -------------------------------------------------- | -------------------------------------------- | | `lifetimes.created` | 组件注册时内部桥接(无独立 `onCreated` Hook) | 已覆盖;可继续使用原生 `lifetimes.created`。 | | `lifetimes.attached` | 组件注册时内部桥接 + `onMounted`(组合式) | 已覆盖;常用组合式写法是 `onMounted`。 | | `lifetimes.ready` | `onReady` | 已覆盖。 | | `lifetimes.moved` | `onMoved` | 已覆盖。 | | `lifetimes.detached` | 组件注册时内部桥接 + `onBeforeUnmount/onUnmounted` | 已覆盖。 | | `lifetimes.error` | `onError` | 已覆盖。 | | `pageLifetimes.show` | `onShow` | 已覆盖。 | | `pageLifetimes.hide` | `onHide` | 已覆盖。 | | `pageLifetimes.resize` | `onResize` | 已覆盖。 | | `pageLifetimes.routeDone` | `onRouteDone` | 已覆盖(微信官方基础库 `2.31.2+`)。 | ## 7. 小程序组件扩展 Hook(组合式) | API | 类型入口 | 说明 | | ----------------- | -------------------------- | -------------------------------------------------------------- | | `onAttached` | `RuntimeInstance` | 组件 attached 时触发(对应 `lifetimes.attached`)。 | | `onDetached` | `RuntimeInstance` | 组件 detached 时触发(对应 `lifetimes.detached`)。 | | `onMoved` | `MiniProgramPageLifetimes` | 组件节点位置变更。 | | `onError` | `MiniProgramPageLifetimes` | 组件或 App 错误(按上下文桥接)。 | | `onShow` | `RuntimeInstance` | 组件在页面 show 时触发(由 `pageLifetimes.show` 桥接)。 | | `onHide` | `RuntimeInstance` | 组件在页面 hide 时触发(由 `pageLifetimes.hide` 桥接)。 | | `onResize` | `PageFeatures` | 组件所在页面 resize 时触发(由 `pageLifetimes.resize` 桥接)。 | | `onMounted` | `RuntimeInstance` | 组件 attached 后触发(对应 `lifetimes.attached`)。 | | `onBeforeUnmount` | `RuntimeInstance` | 组件 detached 前触发(对应 `lifetimes.detached`)。 | | `onUnmounted` | `RuntimeInstance` | 组件 detached 后触发(对应 `lifetimes.detached`)。 | | `onRouteDone` | `PageFeatures` | 页面路由动画完成时触发(微信官方基础库 `2.31.2+`)。 | ## 8. 示例:滚动 + 分享(script setup) ::: code-group ```vue [TypeScript] ``` ```vue [JavaScript] ``` ::: --- --- url: /wevu/api/lifecycle.md description: >- 本页仅覆盖 wevu 实际导出的生命周期 Hook(源码:runtime/hooks.ts),并补充与小程序 lifetimes/pageLifetimes 的映射说明。 --- # Lifecycle API(生命周期) 以下条目严格对应 `packages/wevu/src/runtime/hooks.ts` 的导出函数。所有 Hook 都要求在 `setup()` 同步阶段调用。 ## App 生命周期 Hook ### `onLaunch()` {#onlaunch} * 作用域:`App` * 源码行为:注册到 `onLaunch`。 ### `onShow()` {#onshow} * 作用域:`App / Page / Component` * 源码行为:统一注册到 `onShow`(App 与页面/组件共用函数名)。 ### `onHide()` {#onhide} * 作用域:`App / Page / Component` * 源码行为:统一注册到 `onHide`。 ### `onError()` {#onerror} * 作用域:`App / Component` * 源码行为:注册到 `onError`。 ### `onPageNotFound()` {#onpagenotfound} * 作用域:`App` * 源码行为:注册到 `onPageNotFound`。 ### `onUnhandledRejection()` {#onunhandledrejection} * 作用域:`App` * 源码行为:注册到 `onUnhandledRejection`。 ### `onThemeChange()` {#onthemechange} * 作用域:`App` * 源码行为:注册到 `onThemeChange`。 ### `onMemoryWarning()` {#onmemorywarning} * 作用域:`App` * 源码行为:通过 `wx.onMemoryWarning` 注册监听,并在重复绑定时自动调用 `wx.offMemoryWarning` 清理旧监听。 * 建议:回调内优先释放大缓存、长列表临时数据与不必要的订阅/定时器。 ## 页面生命周期 Hook ### `onLoad()` {#onload} * 作用域:`Page` * 源码行为:注册到页面 `onLoad`。 ### `onReady()` {#onready} * 作用域:`Page / Component` * 源码行为:注册到 `onReady`;组件通过 `lifetimes.ready` 触发。 ### `onUnload()` {#onunload} * 作用域:`Page / Component` * 源码行为:在页面 `onUnload` 或组件 teardown 时统一触发。 ## 页面事件 Hook ### `onPullDownRefresh()` {#onpulldownrefresh} * 作用域:`Page` * 源码行为:注册到页面 `onPullDownRefresh`。 ### `onReachBottom()` {#onreachbottom} * 作用域:`Page` * 源码行为:注册到页面 `onReachBottom`。 ### `onPageScroll()` {#onpagescroll} * 作用域:`Page` * 源码行为:注册到页面 `onPageScroll`。 ### `onRouteDone()` {#onroutedone} * 作用域:`Page / Component` * 源码行为:注册到 `onRouteDone`;组件通过 `pageLifetimes.routeDone` 桥接触发。 ### `onTabItemTap()` {#ontabitemtap} * 作用域:`Page` * 源码行为:注册到页面 `onTabItemTap`。 ### `onResize()` {#onresize} * 作用域:`Page / Component` * 源码行为:注册到 `onResize`;组件通过 `pageLifetimes.resize` 桥接触发。 ## 返回值型页面 Hook ### `onShareAppMessage()` {#onshareappmessage} * 作用域:`Page` * 源码行为:单实例 Hook(`single: true`),返回值用于分享配置。 ### `onShareTimeline()` {#onsharetimeline} * 作用域:`Page` * 源码行为:单实例 Hook(`single: true`),返回值用于朋友圈分享配置。 ### `onAddToFavorites()` {#onaddtofavorites} * 作用域:`Page` * 源码行为:单实例 Hook(`single: true`),返回值用于收藏配置。 ### `onSaveExitState()` {#onsaveexitstate} * 作用域:`Page` * 源码行为:单实例 Hook(`single: true`),返回值用于退出状态保存。 ## 组件扩展 Hook ### `onAttached()` {#onattached} * 作用域:`Component` * 源码行为:在组件 `lifetimes.attached` 阶段触发。 ### `onDetached()` {#ondetached} * 作用域:`Component` * 源码行为:在组件 `lifetimes.detached` 阶段触发。 ### `onMoved()` {#onmoved} * 作用域:`Component` * 源码行为:注册到 `lifetimes.moved`。 ## Vue 语义对齐 Hook ### `onBeforeMount()` {#onbeforemount} * 对齐语义:Vue `beforeMount` * 源码行为:在 `setup()` 内同步立即执行。 ### `onMounted()` {#onmounted} * 对齐语义:Vue `mounted` * 源码行为:映射到 `onReady`。 ### `onBeforeUpdate()` {#onbeforeupdate} * 对齐语义:Vue `beforeUpdate` * 源码行为:映射到内部 `__wevuOnBeforeUpdate`。 ### `onUpdated()` {#onupdated} * 对齐语义:Vue `updated` * 源码行为:映射到内部 `__wevuOnUpdated`。 ### `onBeforeUnmount()` {#onbeforeunmount} * 对齐语义:Vue `beforeUnmount` * 源码行为:在 `setup()` 内同步立即执行(小程序无对应原生 before-unmount)。 ### `onUnmounted()` {#onunmounted} * 对齐语义:Vue `unmounted` * 源码行为:映射到 `onUnload`。 ### `onActivated()` {#onactivated} * 对齐语义:Vue `activated` * 源码行为:映射到 `onShow`。 ### `onDeactivated()` {#ondeactivated} * 对齐语义:Vue `deactivated` * 源码行为:映射到 `onHide`。 ### `onErrorCaptured()` {#onerrorcaptured} * 对齐语义:Vue `errorCaptured` * 源码行为:映射到 `onError` 包装调用。 ### `onServerPrefetch()` {#onserverprefetch} * 对齐语义:Vue `serverPrefetch` * 源码行为:保留 API 形态,仅做调用时机校验,不执行实际逻辑。 ## 小程序原生生命周期映射(说明) 以下是桥接关系说明,不是 `wevu` 直接导出的 Hook API。 ### `lifetimes.created` {#lifetimes-created} * 映射:组件初始化桥接(无独立 `onCreated` 导出)。 ### `lifetimes.attached` {#lifetimes-attached} * 映射:组件挂载流程(可使用 `onAttached`;`onMounted` 仍映射 `onReady`)。 ### `lifetimes.ready` {#lifetimes-ready} * 映射:`onReady`。 ### `lifetimes.moved` {#lifetimes-moved} * 映射:`onMoved`。 ### `lifetimes.detached` {#lifetimes-detached} * 映射:组件 teardown(可使用 `onDetached`)+ `onUnload` 钩子链(含 `onUnmounted`)。 ### `lifetimes.error` {#lifetimes-error} * 映射:`onError`。 ### `pageLifetimes.show` {#pagelifetimes-show} * 映射:`onShow`。 ### `pageLifetimes.hide` {#pagelifetimes-hide} * 映射:`onHide`。 ### `pageLifetimes.resize` {#pagelifetimes-resize} * 映射:`onResize`。 ### `pageLifetimes.routeDone` {#pagelifetimes-routedone} * 映射:`onRouteDone`。 ## 示例 ::: code-group ```vue [TypeScript] ``` ```vue [JavaScript] ``` ::: --- --- url: /packages/rolldown-require/cache.md description: >- This page outlines how bundleRequire bundles, writes, and loads under the hood, plus practical cache settings. --- # Loading flow & cache > Language: English | [中文](/packages/rolldown-require/cache.zh) This page outlines how `bundleRequire` bundles, writes, and loads under the hood, plus practical cache settings. ## End-to-end flow 1. **Resolve entry**: turn `filepath` + `cwd` into an absolute path and infer `format` from the extension/`package.json.type` (overrideable). 2. **Bundle with rolldown**: * Fix `platform: 'node'`, `inlineDynamicImports: true`, `treeshake: false` to emit a single entry output and collect dependencies. * Inject `__dirname`/`__filename`/`import.meta.url` so runtime code sees the real source path. * Externalize most `node_modules` via the externalize-deps plugin, keep JSON inlined, and respect `module-sync` conditions. 3. **Execute the temp output**: * ESM: write a temp `.mjs`/`.cjs` or data URL, then `import()` it. * CJS: compile the source via a temporary `_require.extensions` hook. 4. **Return results**: provide `mod` plus `dependencies` (excluding the entry) for watching or debugging. ## Externalization & resolution * Resolution aligns with Vite/rolldown: same main-field priority and `tsconfig` path support (when enabled). * Node built-ins and `node:`/`npm:` namespace imports are marked external. * Dependencies inside nested `node_modules` under the entry directory are inlined to keep the temp output runnable. * JSON resources are always handled by rolldown (never externalized). ## Temp output control * Defaults to the nearest `node_modules/.rolldown-require`; falls back to the system temp dir. Filenames include a random hash to avoid contention. * Customize the path via `getOutputFile`; set `preserveTemporaryFile: true` to skip cleanup for direct inspection. * If all disk attempts fail for ESM, it falls back to a `data:` URL. ## Cache strategy Caching is off by default. Set `cache: true` or pass an object to enable persistent + in-memory cache: * **Location**: nearest `node_modules/.rolldown-require-cache`, else `os.tmpdir()/rolldown-require-cache`; override with `cache.dir`. * **Cache key**: entry path, `mtime`/`size`, `format`, `tsconfig` path, Node version, and a hash of `rolldownOptions`. * **Validation**: after a hit, each entry/dependency `mtime`/`size` is compared; any change invalidates the cache. * **Memory cache**: on by default (`cache.memory !== false`); returns the loaded module directly to avoid extra fs I/O. * **Reset & events**: * `cache.reset: true` removes prior code/meta before writing. * `cache.onEvent` receives `hit`/`miss`/`store`/`skip-invalid`; `skip-invalid.reason` may be `missing-entry`, `format-mismatch`, `stale-deps`, etc. Example: log cache events and set a custom directory ```ts await bundleRequire({ filepath: './config/vite.config.ts', cache: { enabled: true, dir: './.cache/rolldown-require', onEvent: (e) => { console.log(`[cache] ${e.type}`, e) }, }, }) ``` ## Debugging tips * Watch `dependencies` to decide when to call `bundleRequire` again. * Pair with `preserveTemporaryFile: true` to inspect temp code, or compare `*.code.mjs/cjs` directly inside the cache dir. * To debug suspicious hits, temporarily set `cache.reset: true` or disable cache entirely. * When the entry extension and `package.json.type` disagree, pass `format` explicitly to avoid Node/rolldown differences. --- --- url: /integration/miniprogram-computed.md description: >- miniprogram-computed 的用法基本和官方一致。需要注意的是:为了确保构建产物里依赖齐全,建议把它的运行时依赖也显式安装到项目里(避免构建时被裁剪/遗漏)。 --- # miniprogram-computed 集成 `miniprogram-computed` 的用法基本和官方一致。需要注意的是:为了确保构建产物里依赖齐全,建议把它的运行时依赖也显式安装到项目里(避免构建时被裁剪/遗漏)。 ## 安装 ```sh pnpm add miniprogram-computed fast-deep-equal rfdc ``` > \[!TIP] > `miniprogram-computed` 是运行时要用的库,更推荐放在 `dependencies` 而不是 `devDependencies`。 ## 使用方式 ```ts import { ComponentWithComputed } from 'miniprogram-computed' // js 中也可以使用 import { behavior as computedBehavior } from 'miniprogram-computed' ComponentWithComputed({ data: { a: 1, b: 1, }, computed: { sum(data) { // 注意: computed 函数中不能访问 this ,只有 data 对象可供访问 // 这个函数的返回值会被设置到 this.data.sum 字段中 return data.a + data.b }, }, methods: { onTap() { this.setData({ a: this.data.b, b: this.data.a + this.data.b, }) }, }, }) ``` 相关 `issues`: 1. [miniprogram-computed](https://github.com/weapp-vite/weapp-vite/issues/65) 2. [fast-deep-equal和rfdc可以放在peer-dependencies里面吗?](https://github.com/wechat-miniprogram/computed/issues/87) --- --- url: /guide/npm.md description: Weapp-vite 会尽量帮你把“npm 依赖怎么进小程序”这件事自动化:默认提供 **2 种自动策略**,以及 **1 个手动触发**命令。 --- # npm 自动构建 `weapp-vite` 会尽量帮你把“npm 依赖怎么进小程序”这件事自动化:默认提供 **2 种自动策略**,以及 **1 个手动触发**命令。 ::: tip 配置速记 若需要关闭自动打包、切换缓存策略或为特定依赖覆写 Vite 库模式的构建选项,请在 `vite.config.ts` 中调整 [`weapp.npm`](/config/npm.md#weapp-npm)。 ::: ## 自动构建 自动构建时会发生两类事情(你不需要手动二选一,框架会按规则处理): 1. **把依赖构建到 `miniprogram_npm`**(适合保留 `require('xxx')` 的形式) 2. **把依赖内联进页面/组件脚本**(适合减少 npm 目录或处理非运行时依赖) ### 1. 构建到 `miniprogram_npm`(来自 `dependencies`) 你在 `package.json.dependencies` 里声明的依赖,会在构建时被打包成小程序可用的格式,并输出到 `project.config.json` 的 `miniprogramNpmDistDir` 目录下(也就是 `miniprogram_npm/`)。 ### 2. 内联到脚本产物(不在 `dependencies` 的依赖) 没有出现在 `package.json.dependencies` 里的依赖(例如写在 `devDependencies`、或来自 monorepo 更上层的依赖),在被 `import`/`require` 后会被构建器打包并**内联**到对应的页面/组件脚本里。 ### 详细解释 看一个最常见的例子: ```json { "dependencies": { "lodash": "^4.17.21" }, "devDependencies": { "lodash-es": "^4.17.21" } } ``` 其中 `lodash` 在 `dependencies`,`lodash-es` 在 `devDependencies`。在页面里分别引入它们时,Weapp-vite 的处理方式不同: * **`dependencies` → 构建 `miniprogram_npm`**:产物保留 `require('lodash')`,依赖会被同步到 `miniprogram_npm`,保持最小化的页面代码。 ```js const lodash = require('lodash') Page({ data: { num0: lodash.add(1, 1), }, }) ``` * **`devDependencies` → 内联到页面脚本**:开发依赖会在构建时转成普通 JavaScript,并直接合并进页面入口,避免额外的 npm 目录。 ```js var add = /* lodash-es add 的实现主体 */ Page({ data: { num1: add(2, 2), }, }) ``` > \[!TIP] > 实际内联出来的代码会比示例长得多(可能包含工具函数等),但你不需要手动维护。只要把依赖放在合适的字段里,Weapp-vite 会自动选择“进 `miniprogram_npm`”还是“直接内联”。 ### 怎么选(建议) * **运行时确实要用、并且希望复用的库**:放进 `dependencies`,让它进 `miniprogram_npm`。 * **仅开发/构建期使用的工具**:放进 `devDependencies`。 * **想减少 `miniprogram_npm`,接受包体变大**:也可以把运行时依赖放到非 `dependencies`,让它被内联(不推荐作为默认策略)。 ## 手动构建 执行命令 `weapp-vite npm` 会调用「微信开发者工具 → 工具 → 构建 npm」,手动构建 `miniprogram_npm`。 这相当于你在开发者工具里手动点了一遍“构建 npm”。 > `weapp-vite npm` 别名 `weapp-vite build:npm` / `weapp-vite build-npm` --- --- url: /config/npm.md description: >- Weapp-vite 会自动把 **dependencies** 里的依赖构建成 miniprogram_npm/,而把 **devDependencies** 视为“仅构建期依赖”,直接内联进产物。 --- # npm 配置 {#config-npm} `weapp-vite` 会自动把 **dependencies** 里的依赖构建成 `miniprogram_npm/`,而把 **devDependencies** 视为“仅构建期依赖”,直接内联进产物。 \[\[toc]] ## 依赖分类规则(默认) ```jsonc { "dependencies": { "lodash": "^4.17.21" }, "devDependencies": { "lodash-es": "^4.17.21" } } ``` * 引入 `lodash` ⇒ 产物保留 `require('lodash')`,并生成 `miniprogram_npm/lodash`。 * 引入 `lodash-es` ⇒ 相关实现会被打包并内联到页面/组件脚本。 > \[!TIP] > 建议团队统一约定:**运行时依赖放 `dependencies`**,构建期依赖放 `devDependencies`。 ## `weapp.npm` {#weapp-npm} * **类型**: ```ts { enable?: boolean cache?: boolean mainPackage?: { dependencies?: false | (string | RegExp)[] } subPackages?: Record buildOptions?: (options: NpmBuildOptions, meta: { name: string; entry: InputOption }) => NpmBuildOptions | undefined alipayNpmMode?: 'node_modules' | 'miniprogram_npm' } ``` * **默认值**:`{ enable: true, cache: true, alipayNpmMode: 'node_modules' }` ```ts import { defineConfig } from 'weapp-vite/config' export default defineConfig({ weapp: { npm: { enable: true, cache: true, mainPackage: { dependencies: false, }, subPackages: { 'packages/order': { dependencies: [/^tdesign-miniprogram/], }, }, buildOptions(options, { name }) { if (name === 'lodash') { return { ...options, build: { ...options.build, target: 'es2018', }, } } return options }, }, }, }) ``` 字段说明: * `enable`:关闭后 **不会自动构建** `miniprogram_npm`。如果你的代码仍保留 `require('pkg')`,需要自行处理(如 devtools 构建 npm)。 * `cache`:是否启用 npm 构建缓存(缓存目录:`node_modules/weapp-vite/.cache/`)。 * `mainPackage.dependencies`: * `undefined`:默认行为,按根 `package.json.dependencies` 输出到主包; * `false`:禁止输出主包 `miniprogram_npm`; * `string[] | RegExp[]`:只把命中的依赖输出到主包。 * `subPackages`:为特定分包声明本地 npm 依赖范围。命中的分包会输出自己的 `miniprogram_npm`,并将分包内命中的 npm 引用重写到本地目录。 * `buildOptions`:为单个包覆写 Vite 库模式构建参数。 * `alipayNpmMode`:支付宝平台 npm 目录风格。默认 `node_modules`,若要兼容微信风格目录,可切到 `miniprogram_npm`。 ## 主包 / 分包依赖落位 默认情况下,`weapp-vite` 会把根 `package.json.dependencies` 视为运行时依赖,输出到主包 `miniprogram_npm`。 如果你希望把依赖尽量下沉到独立分包,可以这样做: ```ts export default defineConfig({ weapp: { npm: { mainPackage: { dependencies: false, }, subPackages: { 'packages/order': { dependencies: [/^tdesign-miniprogram/, 'dayjs'], }, 'packages/member': { dependencies: ['@scope/member-sdk'], }, }, }, }, }) ``` 适用场景: * 想把只被独立分包使用的依赖留在分包内,减少主包体积。 * 想精确控制不同分包的 `miniprogram_npm` 内容。 ## 控制 npm 依赖的压缩与 sourcemap `weapp.npm` 内部依赖构建默认是: * `minify: true` * `sourcemap: false` 如果你希望 `miniprogram_npm` 里的某些包不压缩并生成 sourcemap,可以在 `buildOptions` 中覆写: ```ts import { defineConfig } from 'weapp-vite/config' export default defineConfig({ weapp: { npm: { buildOptions(options, { name }) { if (name === 'lodash') { return { ...options, build: { ...options.build, minify: false, sourcemap: true, }, } } return options }, }, }, }) ``` > \[!NOTE] > `build.minify/build.sourcemap` 只影响你的主项目产物;\ > `weapp.npm.buildOptions` 用于控制 `miniprogram_npm` 依赖包的构建行为。 ## 手动构建命令 如需在命令行触发开发者工具的 npm 构建: ```json { "scripts": { "build:npm": "weapp-vite build:npm", "npm": "weapp-vite npm" } } ``` > \[!NOTE] > 该命令依赖 **weapp-ide-cli**,请确保微信开发者工具已开启“服务端口”。 ## 常见问题 * **npm 构建内容未更新**:尝试将 `cache` 设为 `false`,或清理 `node_modules/weapp-vite/.cache/`。 * **分包体积过大**:使用 `weapp.npm.mainPackage.dependencies` 和 `weapp.npm.subPackages..dependencies` 精确控制依赖落位。 * **支付宝平台下 npm 目录不符合预期**:检查 `weapp.npm.alipayNpmMode`,默认是 `node_modules` 而不是 `miniprogram_npm`。 *** 下一步:需要分包能力?请前往 [分包配置](./subpackages.md)。 --- --- url: /guide/directory-structure/package-json.md description: 项目脚本与依赖入口,通常承载 dev、build、open 等 weapp-vite 命令。 --- # `package.json` `package.json` 不负责页面扫描,但它是项目工作流的入口。 ## 通常会放什么 * `dev` * `build` * `open` * `analyze` ```json { "scripts": { "dev": "weapp-vite dev", "build": "weapp-vite build", "open": "weapp-vite open" } } ``` ## 为什么目录结构页要提它 因为它和 `vite.config.ts` 一起构成了项目根目录的最小工程化入口。 如果别人接手你的项目,通常先看这两个文件。 --- --- url: /guide/directory-structure/pages.md description: 主包页面目录,是自动路由的默认扫描入口之一。 --- # `pages/` 这是主包页面目录,也是自动路由的默认扫描入口之一。 ## 默认扫描规则 开启 `weapp.autoRoutes` 后,默认只扫描: * `/pages/**` * 已声明分包 root 下的 `pages/**` 不会直接扫描全局 `**/pages/**`。 ## 这样设计的原因 为了避免误伤,例如这些目录不应该被当成页面: * `/components/pages/**` * `/features/demo/pages/**` ## 页面目录的常见形态 ```text / pages/ profile/ index.ts index.wxml index.json index.scss ``` 或: ```text / pages/ profile/ index.vue index.json ``` ## 识别规则 只要命中页面扫描规则,并且同一路径下存在脚本、模板、配置之一,就可以被识别成页面;但如果 `json.component === true`,则会被视为组件。 --- --- url: /guide/directory-structure/project-config.md description: 微信开发者工具项目配置文件,定义 miniprogramRoot、appid 等平台侧参数。 --- # `project.config.json` 这是微信开发者工具项目配置,不属于 `weapp-vite` 的目录约定能力本身,但它决定开发者工具怎样打开和编译你的项目。 ## 常见职责 * 指定 `miniprogramRoot` * 保存 `appid` * 控制开发者工具的编译选项 ## 与目录结构的关系 最常见的一点是:它通常需要把 `miniprogramRoot` 指向 `dist/`,因为 `weapp-vite` 的源码目录和最终小程序运行目录不是同一个位置。 ```json { "miniprogramRoot": "dist/", "compileType": "miniprogram" } ``` 如果你发现开发者工具打开后目录不对、页面不出现,先检查这里。 --- --- url: /guide/directory-structure/public.md description: 构建时原样复制到产物目录的静态资源目录。 --- # `public/` `public/` 用来放不需要参与模块依赖分析的静态资源。 ## 适合放这里的内容 * 图标 * 纯静态配置 * 需要按原文件名复制的资源 ## 不适合放这里的内容 * 页面 * 组件 * 想通过 `import` 参与构建处理的资源 它不会被自动路由扫描,也不会被自动导入组件扫描。 --- --- url: /wevu/api-reference/reactivity.md description: 本页覆盖 Wevu 响应式层的公共 API,聚焦业务可直接使用的能力。 --- # Reactivity API(响应式与调度) 本页覆盖 `wevu` 响应式层的公共 API,聚焦业务可直接使用的能力。 ## 1. 状态创建与派生 | API | 类型入口 | 说明 | | ----------------- | ------------------------------------- | --------------------------- | | `ref` | `Ref` | 创建基础响应式引用。 | | `reactive` | `object` | 创建深层响应式对象。 | | `shallowRef` | `ShallowRef` | 只追踪 `.value` 变更。 | | `shallowReactive` | `object` | 仅顶层属性响应式。 | | `readonly` | `Readonly` | 只读代理。 | | `computed` | `ComputedRef` / `WritableComputedRef` | 声明计算属性(只读/可写)。 | ## 2. 监听与副作用 | API | 类型入口 | 说明 | | ----------------- | ---------------------------------- | -------------------------- | | `watch` | `WatchOptions` / `WatchStopHandle` | 侦听 source 变化。 | | `watchEffect` | `WatchStopHandle` | 自动收集依赖并执行副作用。 | | `effect` | `WatchStopHandle` | 底层副作用 API。 | | `effectScope` | `EffectScope` | 作用域级管理 effect。 | | `getCurrentScope` | `EffectScope` | 获取当前 effect scope。 | | `onScopeDispose` | `() => void` | scope 销毁时回调。 | | `stop` | `void` | 停止某个 effect/watch。 | ## 3. Ref/Proxy 工具 | API | 类型入口 | 说明 | | ------------ | ------------------ | -------------------------- | | `toRef` | `Ref` | 把对象属性转换为 ref。 | | `toRefs` | `ToRefs` | 批量转换对象属性为 ref。 | | `unref` | `T` | 取 ref.value 或原值。 | | `toValue` | `MaybeRefOrGetter` | 统一展开值/Ref/getter。 | | `triggerRef` | `void` | 手动触发 shallowRef 更新。 | | `toRaw` | `T` | 获取原始对象。 | | `markRaw` | `T` | 标记对象跳过代理。 | ## 4. 响应式判定 | API | 类型入口 | 说明 | | ------------------- | -------------- | -------------------------- | | `isRef` | type predicate | 判定是否 Ref。 | | `isReactive` | type predicate | 判定是否 reactive 代理。 | | `isShallowRef` | type predicate | 判定是否 shallowRef。 | | `isShallowReactive` | type predicate | 判定是否 shallowReactive。 | | `isRaw` | `boolean` | 判定对象是否被 `markRaw`。 | ## 5. 批处理与调度 | API | 类型入口 | 说明 | | ------------ | --------------- | ------------------------ | | `nextTick` | `Promise` | 等待当前微任务批次完成。 | | `batch` | `() => void` | 在单次批处理中执行函数。 | | `startBatch` | `void` | 手动开始批处理。 | | `endBatch` | `void` | 手动结束批处理。 | ## 6. 内部能力说明 `wevu` 在响应式实现里存在少量内部能力,用于框架运行时与测试场景;这些接口不属于业务稳定 API,不建议在应用代码中直接调用。 ## 7. 组合示例(script setup) ::: code-group ```vue [TypeScript] ``` ```vue [JavaScript] ``` ::: --- --- url: /wevu/api/reactivity.md description: 本页覆盖 Wevu 响应式层的全部公开函数,包括状态创建、监听副作用、工具函数与调度能力。 --- # Reactivity API(响应式与调度) 本页按「一个 API 一个小节」组织,结构参考 Vue 官方 API 文档。每个小节都包含用途、类型入口与使用建议,便于快速定位与深入阅读。 ## 状态创建与派生 ### `ref()` {#ref} * 类型入口:`Ref` * 用途:创建最常用的基础响应式引用,适合原始值或独立状态。 * 说明:读取使用 `ref.value`;在模板中会自动解包。 ### `customRef()` {#customref} * 类型入口:`CustomRefFactory` / `CustomRefOptions` * 用途:自定义 `track/trigger` 行为。 * 说明:适合防抖输入、手动控制触发时机等高级场景。 ### `reactive()` {#reactive} * 类型入口:`object` * 用途:创建深层响应式对象,适合聚合状态。 * 说明:对嵌套对象也会做代理;适合表单、复杂页面状态。 ### `shallowRef()` {#shallowref} * 类型入口:`ShallowRef` * 用途:只追踪 `.value` 本身是否变更,不做深层代理。 * 说明:用于大对象/第三方实例,减少深层响应式开销。 ### `shallowReactive()` {#shallowreactive} * 类型入口:`object` * 用途:仅顶层属性响应式,内部对象保持原值。 * 说明:常用于“只关心顶层替换”的场景。 ### `readonly()` {#readonly} * 类型入口:`Readonly` * 用途:创建只读代理,防止误修改。 * 说明:常用于向下游暴露状态快照。 ### `computed()` {#computed} * 类型入口:`ComputedRef` / `WritableComputedRef` * 用途:声明派生状态,自动缓存并按依赖更新。 * 说明:支持只读与可写两种形式;优先用于“纯函数派生”。 ## 监听与副作用 ### `watch()` {#watch} * 类型入口:`WatchOptions` / `WatchStopHandle` * 用途:侦听 source 变化并执行回调。 * 说明:适合精确观察某个字段、computed 或 getter。 ### `watchEffect()` {#watcheffect} * 类型入口:`WatchStopHandle` * 用途:自动收集依赖并立即执行副作用。 * 说明:适合快速联动逻辑与调试输出。 ### `effect()` {#effect} * 类型入口:`WatchStopHandle` * 用途:底层副作用 API,通常框架层/高级场景使用。 * 说明:业务代码优先使用 `watchEffect`。 ### `effectScope()` {#effectscope} * 类型入口:`EffectScope` * 用途:把一组 effect/watch 放在同一作用域统一管理。 * 说明:在组件外组合逻辑、插件场景很有用。 ### `getCurrentScope()` {#getcurrentscope} * 类型入口:`EffectScope | undefined` * 用途:获取当前激活的 effect scope。 * 说明:常与 `onScopeDispose` 配合使用。 ### `onScopeDispose()` {#onscopedispose} * 类型入口:`() => void` * 用途:在 scope 销毁时执行清理逻辑。 * 说明:适合解绑事件、释放资源。 ### `stop()` {#stop} * 类型入口:`void` * 用途:停止指定 effect/watch。 * 说明:用于手动中断监听链路。 ## Ref / Proxy 工具 ### `toRef()` {#toref} * 类型入口:`Ref` * 用途:把对象某个属性映射为 ref。 * 说明:常用于解构后保持响应式引用。 ### `toRefs()` {#torefs} * 类型入口:`ToRefs` * 用途:批量把对象属性转换为 ref。 * 说明:适合从 `reactive` 安全解构。 ### `unref()` {#unref} * 类型入口:`T` * 用途:统一读取 `ref.value` 或普通值。 * 说明:减少“值/Ref 双形态”判断分支。 ### `toValue()` {#tovalue} * 类型入口:`MaybeRefOrGetter` * 用途:统一展开普通值、Ref 或 getter。 * 说明:编写可复用工具函数时很常见。 ### `triggerRef()` {#triggerref} * 类型入口:`void` * 用途:手动触发 `shallowRef` 依赖更新。 * 说明:用于“对象内部变更但引用未变”场景。 ### `toRaw()` {#toraw} * 类型入口:`T` * 用途:拿到代理前的原始对象。 * 说明:调试或与第三方库交互时使用。 ### `markRaw()` {#markraw} * 类型入口:`T` * 用途:标记对象跳过响应式代理。 * 说明:适用于大型类实例、SDK 对象。 ## 响应式判定 ### `isRef()` {#isref} * 类型入口:type predicate * 用途:判断某值是否为 Ref。 ### `isReactive()` {#isreactive} * 类型入口:type predicate * 用途:判断对象是否是 `reactive` 代理。 ### `isShallowRef()` {#isshallowref} * 类型入口:type predicate * 用途:判断是否为 `shallowRef`。 ### `isShallowReactive()` {#isshallowreactive} * 类型入口:type predicate * 用途:判断是否为 `shallowReactive`。 ### `isRaw()` {#israw} * 类型入口:`boolean` * 用途:判断对象是否被 `markRaw` 标记。 ## 批处理与调度 ### `nextTick()` {#nexttick} * 类型入口:`Promise` * 用途:等待当前批次响应式更新完成。 * 说明:常用于更新后读取最新渲染状态。 ### `batch()` {#batch} * 类型入口:`() => void` * 用途:在同一批处理中执行一组状态改动。 * 说明:减少中间态触发的无效计算与更新。 ### `startBatch()` {#startbatch} * 类型入口:`void` * 用途:手动开启批处理。 * 说明:需要与 `endBatch` 成对调用。 ### `endBatch()` {#endbatch} * 类型入口:`void` * 用途:手动结束批处理并触发提交。 ## 内部能力说明 响应式内部调度与调试函数(如 reactive 树预链接、深度策略切换、内部遍历)属于框架内部能力,文档页不再展开展示。若你在业务侧需要类似能力,建议优先使用本页已列出的公开 API 组合实现。 ## 示例 ::: code-group ```vue [TypeScript] ``` ```vue [JavaScript] ``` ::: --- --- url: /packages/rolldown-require.md description: >- rolldown-require bundles and then loads config files of any flavor (TS / MJS / CJS / JSX, etc.) using rolldown, so CLI … --- # rolldown-require Guide > Language: English | [中文](/packages/rolldown-require/index.zh) `rolldown-require` bundles and then loads config files of any flavor (TS / MJS / CJS / JSX, etc.) using `rolldown`, so CLI tools or Node scripts can execute them safely. Its API mirrors `bundle-require` while reusing `rolldown` resolution and plugins to stay close to `rolldown-vite` runtime behaviour. ## What problems it solves * **Cross-format loading**: infers entry module type automatically and works with ESM/CJS/TypeScript and more. * **Consistent resolution**: follows Vite/rolldown resolution and externalization (including `module-sync`), avoiding require/import mismatches. * **Source context preserved**: restores `__dirname`, `__filename`, and `import.meta.url` after bundling so temp output matches the source path. * **Observable dependencies**: returns the dependency list from bundling, ready for watchers or cache validation. * **Optional caching**: built-in persistent + in-memory cache to speed up repeated config loads. ## Install ```sh pnpm add rolldown-require rolldown -D # or npm / yarn / bun ``` > `rolldown` is a peer dependency and must be installed alongside. ## Quick start ```ts import { bundleRequire } from 'rolldown-require' const { mod, dependencies } = await bundleRequire({ filepath: './vite.config.ts', cache: true, // optional: enable cache for faster reruns }) // mod is the executed module (default export is unwrapped automatically) // dependencies can drive a watcher to decide when to re-bundle ``` `bundleRequire` will: 1. Infer ESM/CJS from the entry path (override with `format` if needed). 2. Bundle the entry with `rolldown`, externalizing most `node_modules` to match `rolldown-vite` behaviour. 3. Execute the temp output (ESM via `import()`, CJS via `require`) and return the module plus dependency list. ## How it differs from bundle-require * Uses `rolldown` as the bundler, matching the ecosystem and respecting conditional exports and module-sync flags. * Injects file-scope variables so changing the temp output path does not break `__dirname`/`__filename`. * Supports optional persistent and memory cache to reuse the same bundle across cold and warm starts. ## Next steps * See [API & options](/packages/rolldown-require/options) for defaults and scenarios. * Read [Loading flow & cache](/packages/rolldown-require/cache) for externalization details, temp files, and debugging tips. --- --- url: /packages/rolldown-require/index.zh.md description: >- rolldown-require 是基于 rolldown 的「打包再加载」工具,帮助 CLI 或 Node 脚本安全地执行任意格式的配置文件(ts / mjs / cjs / JSX 等)。API 与 bundle-require 保持… --- # rolldown-require 使用指南 > 语言: [English](/packages/rolldown-require/) | 中文 `rolldown-require` 是基于 `rolldown` 的「打包再加载」工具,帮助 CLI 或 Node 脚本安全地执行任意格式的配置文件(`ts` / `mjs` / `cjs` / JSX 等)。API 与 `bundle-require` 保持相似,却复用了 `rolldown` 的解析与插件生态,更贴近 `rolldown-vite` 的运行时行为。 ## 它解决什么问题 * **跨格式加载**:自动判定入口模块类型,支持 ESM/CJS/TypeScript 等多种后缀。 * **一致的解析策略**:沿用 Vite/rolldown 的解析与外部化逻辑(含 `module-sync` 条件),避免 `require`/`import` 行为不一致。 * **源码上下文保持**:在打包后恢复 `__dirname`、`__filename`、`import.meta.url`,让临时产物与源文件路径一致。 * **依赖可观察**:返回打包时命中的依赖列表,可直接用于文件监听或缓存校验。 * **可选缓存**:内置持久化 + 进程内缓存,重复加载配置时可显著缩短启动时间。 ## 安装 ```sh pnpm add rolldown-require rolldown -D # 或 npm / yarn / bun 等等 ``` > `rolldown` 是 peer 依赖,需要一同安装。 ## 快速开始 ```ts import { bundleRequire } from 'rolldown-require' const { mod, dependencies } = await bundleRequire({ filepath: './vite.config.ts', cache: true, // 可选:启用缓存,重复执行更快 }) // mod 即为被加载的模块(默认导出会被解包) // dependencies 可用于 watcher,决定何时重新 bundle ``` `bundleRequire` 会: 1. 基于入口路径推断 ESM/CJS 格式,并支持通过 `format` 手动覆盖。 2. 使用 `rolldown` 打包入口文件,排除大多数 `node_modules` 依赖,保持解析结果与 `rolldown-vite` 一致。 3. 写入临时产物后执行(ESM 用 `import()`,CJS 用 `require`),最终返回模块与依赖列表。 ## 和 bundle-require 的区别 * 换用 `rolldown` 作为打包引擎,更贴合 rolldown 生态,也能利用它的条件导出、模块同步标记等能力。 * 内置文件作用域变量注入,避免因为临时产物路径改变而让 `__dirname`/`__filename` 失真。 * 支持可选的持久化/内存缓存,冷启动和多次加载都能复用同一份 bundle。 ## 下一步 * 查阅 [API 与选项说明](/packages/rolldown-require/options.zh) 理解各配置项的默认值与适用场景。 * 参考 [加载流程与缓存策略](/packages/rolldown-require/cache.zh) 了解外部化、临时文件与调试技巧。 --- --- url: /wevu/api-reference/runtime-bridge.md description: 本页覆盖 Wevu 与小程序原生运行时之间的桥接能力,以及用于排错/调优的公共 API。 --- # Runtime Bridge API(桥接与调试) 本页覆盖 Wevu 与小程序原生运行时之间的桥接能力,以及用于排错/调优的公共 API。 ## 1. 全局默认值与行为开关 | API | 类型入口 | 说明 | | ------------------- | -------------- | ------------------------------------------- | | `setWevuDefaults` | `WevuDefaults` | 配置 `createApp/defineComponent` 默认行为。 | | `resetWevuDefaults` | `void` | 重置默认值(测试/热更新常用)。 | | `markNoSetData` | `T` | 标记对象不参与 `setData` 快照。 | | `isNoSetData` | `boolean` | 判断对象是否被标记为 no-setData。 | ## 2. 调试与观测 | API | 类型入口 | 说明 | 场景 | | ------------------------ | ---------------- | ---------------------- | --------------------- | | `addMutationRecorder` | `MutationRecord` | 注册 mutation 记录器。 | 调试 state 变化来源。 | | `removeMutationRecorder` | `MutationRecord` | 移除 mutation 记录器。 | 测试结束清理。 | ## 3. 编译侧常量(`wevu/compiler`) `wevu/compiler` 主要给编译工具使用,业务代码不建议直接依赖。 | 常量/类型 | 链接 | 说明 | | ---------------------------- | ---------------------------- | ------------------------------- | | `WE_VU_MODULE_ID` | `WE_VU_MODULE_ID` | 运行时模块 ID(`wevu`)。 | | `WE_VU_RUNTIME_APIS` | `WE_VU_RUNTIME_APIS` | 编译器识别的运行时 API 名单。 | | `WE_VU_PAGE_HOOK_TO_FEATURE` | `WE_VU_PAGE_HOOK_TO_FEATURE` | 页面 hook 与 feature 标记映射。 | | `WevuRuntimeApiName` | `WevuRuntimeApiName` | 运行时 API 名称联合类型。 | | `WevuPageHookName` | `WevuPageHookName` | 页面 hook 名称联合类型。 | | `WevuPageFeatureFlag` | `WevuPageFeatureFlag` | 页面 feature 标记联合类型。 | ## 4. 示例:默认值 + mutation 记录(script setup) ::: code-group ```vue [TypeScript] ``` ```vue [JavaScript] ``` ::: --- --- url: /wevu/api/runtime-bridge.md description: 本页仅展示面向业务与配置层的 Wevu 运行时 API。框架内部桥接函数不会在文档中展开。 --- # Runtime Bridge API(运行时配置) 本页聚焦可在业务工程中直接使用的运行时能力。内部注册与调度函数已从文档目录中移除。 ## 全局默认值 ### `setWevuDefaults()` {#setwevudefaults} * 类型入口:`WevuDefaults` * 用途:配置 `createApp/defineComponent` 的默认行为。 ### `resetWevuDefaults()` {#resetwevudefaults} * 类型入口:`void` * 用途:重置默认配置。 * 场景:测试隔离、开发调试。 ## setData 排除标记 ### `markNoSetData()` {#marknosetdata} * 类型入口:`(value: T) => T` * 用途:标记对象不参与 `setData` 快照同步。 ### `isNoSetData()` {#isnosetdata} * 类型入口:`boolean` * 用途:判断对象是否被标记为 no-setData。 ## 调试记录 ### `addMutationRecorder()` {#addmutationrecorder} * 类型入口:`MutationRecord` * 用途:注册状态 mutation 记录器。 ### `removeMutationRecorder()` {#removemutationrecorder} * 类型入口:`MutationRecord` * 用途:移除状态 mutation 记录器。 ## 示例 ::: code-group ```vue [TypeScript] ``` ```vue [JavaScript] ``` ::: --- --- url: /guide/seo-governance.md description: 说明 Weapp-vite 文档站的 SEO/GEO 自动化治理流程,包括审计、质量检查、llms 索引生成与 CI 严格门禁。 --- # SEO/GEO 质量门禁 本文档说明文档站的 SEO(传统搜索可见性)与 GEO(Generative Engine Optimization,生成式引擎优化)治理策略,目标是保证内容在搜索引擎和大模型检索场景下都可持续演进。 ## 核心命令 * `pnpm seo-audit` * 输出覆盖率审计(title/description/keywords/date)和站点策略完整度。 * `pnpm seo-audit:strict` * 按阈值执行严格检查,不达标直接失败。 * `pnpm seo-quality-check` * 检查模板化描述、过短描述、关键词不足、关键词未标准化等问题。 * `pnpm seo:quality:strict` * CI 门禁命令,要求质量问题为 `0`。 * `pnpm seo-quality-report` * 生成 `website/public/seo-quality-report.json`。 * `pnpm seo-generate-llms-index` * 生成 `website/public/llms-index.json`。 ## 构建接入 `website/package.json` 的 `build` 会先执行: ```bash pnpm -w seo:prepare ``` 该命令会生成以下产物: * `/llms-index.json` * `/seo-quality-report.json` 随后再进行 `vitepress build`,确保构建产物与当前文档内容同步。 ## CI 门禁 PR 流程中的 `CI Policy` 已接入: ```bash pnpm seo:quality:strict ``` 只要出现描述模板化、关键词不规范或覆盖缺失等问题,门禁会直接失败,从而阻止质量回归。 ## frontmatter 自动治理约束 * 自动补齐默认跳过 `_*.md` / `_*.mdx`(partial 文档)。 * 兼容历史裸 YAML 头(无 `---` 包裹)文档,避免改写破坏构建。 * 关键词统一去噪、去重、限长,并转为可维护的标准词形。 --- --- url: /wevu/api-reference/setup-context.md description: >- Wevu 的 setup(props, ctx) 除了 Vue 语义,还补齐了小程序运行时场景,特别是 ctx.instance(原生实例)和 ctx.emit(事件派发)。 --- # Setup Context API(setup 上下文) `wevu` 的 `setup(props, ctx)` 除了 Vue 语义,还补齐了小程序运行时场景,特别是 `ctx.instance`(原生实例)和 `ctx.emit`(事件派发)。 ## 1. `setup` 签名与核心类型 | 类型/接口 | 链接 | 说明 | | ------------------- | --------------------- | -------------------------------------------- | | `setup(props, ctx)` | `SetupFunction` | 组件/页面 setup 函数签名。 | | `ctx` | `SetupContext` | setup 上下文总入口。 | | `ctx.runtime` | `RuntimeInstance` | 运行时实例(watch、snapshot、teardown 等)。 | | `ctx.instance` | `MiniProgramInstance` | 小程序原生实例。 | | `ctx.emit` | `TriggerEventOptions` | 自定义事件派发入口。 | ## 2. setup 上下文相关 API | API | 类型入口 | 说明 | | ------------------------ | ----------------- | ------------------------ | | `getCurrentInstance` | `RuntimeInstance` | 获取当前运行时实例。 | | `getCurrentSetupContext` | `SetupContext` | 获取当前 setup context。 | ## 3. provide/inject | API | 类型入口 | 说明 | | --------- | ---------------------- | ---------------------- | | `provide` | `InjectionKey` 兼容 | 在当前组件树提供依赖。 | | `inject` | `T \| undefined` | 从当前组件树读取依赖。 | ## 4. 推荐:通过 `ctx.instance` 操作原生实例 在 Wevu 里,和小程序实例直接耦合的方法,推荐放在 `ctx.instance` 上调用,而不是依赖 `this`: * `ctx.instance.triggerEvent(...)` * `ctx.instance.createSelectorQuery()` * `ctx.instance.createIntersectionObserver(...)` * `ctx.instance.setData(...)` * `ctx.instance.router` / `ctx.instance.pageRouter`(基础库 `2.16.1+`) * 以及平台原生 `wx` 组件实例 API ### 示例(script setup) ::: code-group ```vue [TypeScript] ``` ```vue [JavaScript] ``` ::: ## 5. 双向绑定辅助 | API | 类型入口 | 说明 | | -------------- | -------------------------------------- | ----------------------------------------- | | `useBindModel` | `ModelBindingOptions` / `ModelBinding` | 生成小程序可直接绑定的数据 + 事件处理器。 | ## 5.1 路由辅助 | API | 类型入口 | 说明 | | --------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `useRouter` | `Router` | 获取组件路径语义 Router。优先 `this.router`,再回退 `this.pageRouter`,低版本基础库降级到全局 `wx/my/tt`;可通过 `WevuTypedRouterRouteMap.entries` 收窄 `url`,并可用 `tabBarEntries` 收窄 `switchTab`。 | | `usePageRouter` | `Router` | 获取页面路径语义 Router。优先 `this.pageRouter`,再回退 `this.router`,低版本基础库降级到全局 `wx/my/tt`;可通过 `WevuTypedRouterRouteMap.entries` 收窄 `url`,并可用 `tabBarEntries` 收窄 `switchTab`。 | ### 5.1.1 Router 语义矩阵 Router 原生对象从微信基础库 `2.16.1+` 可用。`wevu` 会按顺序做能力回退,因此建议你在设计路由 API 时明确“语义优先级”: | 调用位置 | `useRouter()` 基准 | `usePageRouter()` 基准 | | ------------------ | -------------------------- | -------------------------- | | 页面 `setup()` | 页面路径 | 页面路径 | | 组件 `setup()` | 组件路径 | 组件所在页面路径 | | 低版本全局回退场景 | 当前激活页(全局路由对象) | 当前激活页(全局路由对象) | ### 5.1.2 兼容建议 * 需要跨版本基路径稳定时,优先 `usePageRouter()`。 * 只在“组件目录相对路径”是业务需求时使用 `useRouter()`。 * 对低版本必须一致的路由,优先绝对路径(`/pages/**`、`/packageA/pages/**`)。 ## 5.2 可见性监听辅助 | API | 类型入口 | 说明 | | ------------------------- | ---------------------- | --------------------------------------------------------------- | | `useIntersectionObserver` | `IntersectionObserver` | setup 内创建观察器,自动在 `onUnload/onDetached` 阶段断开连接。 | ## 6. 相关页 * 生命周期与页面事件:[/wevu/api-reference/lifecycle](/wevu/api-reference/lifecycle) * 运行时桥接与调试:[/wevu/api-reference/runtime-bridge](/wevu/api-reference/runtime-bridge) --- --- url: /wevu/api/setup-context.md description: >- 本页严格对应 wevu 源码中的 setup 上下文相关导出(runtime/hooks.ts、runtime/provide.ts、runtime/register.ts、runtime/vueCompat.ts)。 --- # Setup Context API(setup 上下文) `setup(props, ctx)` 的字段语义来自 `SetupContext` 类型;本页重点列出可直接导入调用的公开 API。 `ctx` 常见字段(类型定义语义): * `ctx.runtime`:当前 `RuntimeInstance` * `ctx.instance`:原生小程序实例 * `ctx.emit`:事件派发函数 ## 实例与上下文访问 API ### `getCurrentInstance()` {#getcurrentinstance} * 用途:获取当前运行时实例。 * 源码:`runtime/hooks.ts`。 ### `getCurrentSetupContext()` {#getcurrentsetupcontext} * 用途:获取当前 setup context。 * 源码:`runtime/hooks.ts`。 ## 依赖注入 API ### `provide()` {#provide} * 用途:在当前组件树提供依赖。 * 源码:`runtime/provide.ts`。 ### `inject()` {#inject} * 用途:从上层读取依赖。 * 源码:`runtime/provide.ts`。 ## Setup 兼容工具 API ### `useNativeInstance()` {#usenativeinstance} * 用途:获取当前 setup 对应的原生实例。 * 源码:`runtime/vueCompat.ts`。 ### `useRouter()` {#userouter} * 用途:获取当前组件路径语义的 Router 对象。 * 行为:优先使用 `this.router`;不可用时回退 `this.pageRouter`;低版本基础库(`< 2.16.1`)再回退全局路由方法(`wx`/`my`/`tt`)。 * 类型:可通过声明合并 `WevuTypedRouterRouteMap.entries` 收窄 `url` 字面量;可选 `tabBarEntries` 进一步收窄 `switchTab`(`weapp-vite autoRoutes` 会自动注入 `entries`)。 * 源码:`runtime/vueCompat.ts`。 ### `usePageRouter()` {#usepagerouter} * 用途:获取当前页面路径语义的 Router 对象。 * 行为:优先使用 `this.pageRouter`;不可用时回退 `this.router`;低版本基础库(`< 2.16.1`)再回退全局路由方法(`wx`/`my`/`tt`)。 * 类型:与 `useRouter()` 共享 `WevuTypedRouterRouteMap.entries / tabBarEntries` 收窄能力。 * 源码:`runtime/vueCompat.ts`。 ### Router 语义与兼容建议 `Router` 能力在微信基础库 `2.16.1+` 才有原生对象。`wevu` 在低版本会自动降级到全局路由方法,所以建议你明确区分“路径语义”与“兼容语义”。 | 场景 | 推荐 API | 相对路径基准 | | -------------- | ----------------- | ------------------------------------------ | | 页面内跳转 | `usePageRouter()` | 当前页面路径(更稳定) | | 组件内组件路径 | `useRouter()` | 当前组件路径 | | 组件内页面路径 | `usePageRouter()` | 组件所在页面路径 | | 低版本降级路径 | 自动回退 | 回退为全局 `wx/my/tt` 语义(按当前激活页) | **实践建议:** * 需要跨版本稳定时,优先使用 `usePageRouter()`(尤其是页面方法被延迟调用、跨页调用时)。 * 当你明确要“相对组件目录”导航时,使用 `useRouter()`。 * 对低版本必须严格一致的跳转,优先使用绝对路径(如 `/pages/foo/index`),避免依赖相对路径基准。 * 若开启 `autoRoutes`,可结合路由联合类型减少拼写错误(见 `/guide/auto-routes`)。 ### `useBindModel()` {#usebindmodel} * 用途:创建绑定 payload(`value + onXxx`)辅助函数。 * 源码:`runtime/vueCompat.ts`。 ### `useIntersectionObserver()` {#useintersectionobserver} * 用途:在 `setup()` 中创建 `IntersectionObserver`,并在卸载时自动 `disconnect()`。 * 建议:优先用它替代 `onPageScroll + setData` 的可见性轮询逻辑。 * 源码:`runtime/intersectionObserver.ts`。 ## 示例 ::: code-group ```vue [TypeScript] ``` ```vue [JavaScript] ``` ::: ### IntersectionObserver 示例 ```vue ``` ### Router 示例 ```vue ``` --- --- url: /guide/directory-structure/shared.md description: 跨主包与分包共享模块的推荐目录。 --- # `shared/` `shared/` 不是框架保留目录,但它是很推荐的共享层位置。 ## 适合放什么 * 共享样式 * 常量 * 类型 * 请求层封装 * 跨包复用的 composable / helper ## 为什么它常见 因为页面、组件、分包都容易不断增长,提前给共享代码一个稳定位置,长期维护成本会更低。 --- --- url: /wevu/api-reference/store.md description: Wevu 的 store 设计接近 Pinia:defineStore 定义,createStore 创建管理器,storeToRefs 安全解构。 --- # Store API(状态管理) `wevu` 的 store 设计接近 Pinia:`defineStore` 定义,`createStore` 创建管理器,`storeToRefs` 安全解构。 ## 1. 核心函数 | API | 类型入口 | 说明 | | ------------- | -------------------- | --------------------------------------- | | `defineStore` | `DefineStoreOptions` | 定义 store(setup/option 两种风格)。 | | `createStore` | `StoreManager` | 创建 store 管理器(插件、作用域隔离)。 | | `storeToRefs` | `ToRefs` | 将 store 状态安全转换为 ref。 | ## 2. 常用类型 | 类型 | 链接 | 用途 | | ---------------------- | ---------------------- | ------------------------ | | `StoreManager` | `StoreManager` | store 根管理器。 | | `DefineStoreOptions` | `DefineStoreOptions` | 选项式 store 定义类型。 | | `ActionSubscriber` | `ActionSubscriber` | action 订阅回调签名。 | | `SubscriptionCallback` | `SubscriptionCallback` | 状态变更订阅回调。 | | `MutationRecord` | `MutationRecord` | mutation 记录结构。 | | `MutationKind` | `MutationKind` | mutation 大类。 | | `MutationType` | `MutationType` | mutation 类型枚举。 | | `MutationOp` | `MutationOp` | mutation 操作类型。 | | `WevuPlugin` | `WevuPlugin` | store/runtime 插件类型。 | ## 3. 端到端示例(script setup) ::: code-group ```vue [TypeScript] ``` ```vue [JavaScript] ``` ::: ## 4. 调试建议 * 如果要统计状态变化路径,可结合 `addMutationRecorder` / `removeMutationRecorder`。 * 如果要确认 `setData` 最终快照,可配合 `SetDataSnapshotOptions` 和运行时调试日志。 ## 5. 相关页 * 响应式 API:[/wevu/api-reference/reactivity](/wevu/api-reference/reactivity) * 运行时桥接 API:[/wevu/api-reference/runtime-bridge](/wevu/api-reference/runtime-bridge) --- --- url: /wevu/api/store.md description: 本页严格对应 wevu/store 的公开导出,包含 defineStore、createStore、storeToRefs 及相关类型。 --- # Store API(状态管理) 以下条目来源于 `packages/wevu/src/store/index.ts` 的公开导出。 ## 核心函数 ### `defineStore()` {#definestore} * 类型入口:`DefineStoreOptions` * 用途:定义 store(setup 风格或 option 风格)。 ### `createStore()` {#createstore} * 类型入口:`StoreManager` * 用途:创建 store 管理器(可用于作用域隔离和测试隔离)。 ### `storeToRefs()` {#storetorefs} * 类型入口:`StoreToRefsResult` * 用途:将 store 状态转换为 refs,避免解构丢失响应性。 ## Store 类型 ### `StoreManager` {#storemanager} * 用途:store 根管理器类型。 ### `DefineStoreOptions` {#definestoreoptions} * 用途:定义 option 风格 store 的类型约束。 ### `StoreToRefsResult` {#storetorefsresult} * 用途:`storeToRefs()` 返回结果类型。 ### `ActionContext` {#actioncontext} * 用途:`$onAction` 回调上下文。 ### `ActionSubscriber` {#actionsubscriber} * 用途:action 订阅回调签名。 ### `SubscriptionCallback` {#subscriptioncallback} * 用途:状态变更订阅回调签名。 ### `StoreSubscribeOptions` {#storesubscribeoptions} * 用途:`$subscribe` 的订阅选项类型。 ### `MutationType` {#mutationtype} * 用途:store mutation 类型(`'patch object' | 'patch function' | 'direct'`)。 ## 示例 ::: code-group ```vue [TypeScript] ``` ```vue [JavaScript] ``` ::: --- --- url: /wevu/store.md description: Store(状态管理),聚焦 Wevu / store 相关场景,覆盖 Weapp-vite 与 Wevu 的能力、配置和实践要点。 --- # Store(状态管理) Wevu 内置了类 Pinia 的 Store: * 用 `defineStore()` 定义 Store * 用 `useXxx()` 获取**单例**实例 * 用 `storeToRefs()` 解构 state/getter,避免丢失响应式 :::tip 导入约定 运行时 API 均从 `wevu` 主入口导入;`wevu/compiler` 仅供 Weapp-vite 等编译侧工具使用(非稳定用户 API)。 ::: ## 导入与核心 API * `defineStore(id, setup | options)`:定义 Store,返回 `useXxx()` 获取单例实例。 * `storeToRefs(store)`:将 state/getter 包装为 `ref`,函数保持原样,解构不丢失响应式。 * `createStore()`:可选的插件入口;只有需要插件时才调用(见下文)。 ## Setup Store 示例(推荐) ```ts // stores/counter.ts import { computed, defineStore, ref } from 'wevu' export const useCounter = defineStore('counter', () => { const count = ref(0) const doubled = computed(() => count.value * 2) const inc = () => count.value++ return { count, doubled, inc } }) ``` 特点: * 你可以返回任意字段;函数会被当作 action(除 `$` 开头的保留字段)。 * `$patch/$subscribe/$onAction` 等基础 API 会自动合并进返回对象。 ## Options Store 示例 ```ts // stores/user.ts import { defineStore } from 'wevu' export const useUser = defineStore('user', { state: () => ({ name: '', age: 0 }), getters: { label(state) { return `${state.name}:${state.age}` }, canVote() { return this.age >= 18 }, }, actions: { grow() { this.age += 1 }, }, }) ``` ## 在页面/组件中使用 ```ts // pages/counter/index.ts import { defineComponent, storeToRefs } from 'wevu' import { useCounter } from '@/stores/counter' export default defineComponent({ setup() { const counter = useCounter() const { count, doubled } = storeToRefs(counter) counter.$subscribe((mutation) => { console.log('[counter]', mutation.type, mutation.storeId) }) return { count, doubled, inc: counter.inc } }, }) ``` 要点: * Store 是单例,在页面/组件 `setup` 里调用 `useXxx()` 即可复用。 * 解构 state/getter 请使用 `storeToRefs`,actions 可以直接解构。 ## 插件与订阅 * 默认无需插件即可使用;只有当你需要统一扩展所有 Store 时再调用 `createStore()` 并注册插件。 * 插件需在第一次 `useXxx()` 之前注册。`createStore()` 会记录为全局单例,之后创建的 Store 会自动应用插件(插件参数为 `{ store }`)。 ```ts import { createStore, defineStore } from 'wevu' const manager = createStore() manager.use(({ store }) => { store.$onAction((ctx) => { ctx.after(res => console.log('[after]', ctx.name, res)) ctx.onError(err => console.error('[error]', ctx.name, err)) }) store.$subscribe((mutation, state) => { console.log(`[${store.$id}]`, mutation.type, state) }) }) // 之后定义的任何 store 都会自动套用上述插件 export const useCart = defineStore('cart', { state: () => ({ items: [] as Array<{ id: string, count: number }> }), actions: { add(id: string, count = 1) { const found = this.items.find(i => i.id === id) if (found) { found.count += count } else { this.items.push({ id, count }) } }, }, }) ``` ## 持久化(storage)与初始化顺序 Store 是单例,适合承载登录态、用户偏好、缓存索引等“跨页面共享”的状态。常见诉求是把部分 state 持久化到本地存储(`wx.setStorageSync` / `wx.setStorage`)。 推荐做法: * 只持久化必要字段(避免把大对象/列表直接塞进 storage) * 统一在插件中处理(避免每个 store 手写重复逻辑) * 注意初始化顺序:在第一次 `useXxx()` 之前完成“读取 → 回填” 示例(简化版,仅展示形态): ```ts import { createStore, defineStore } from 'wevu' const manager = createStore() manager.use(({ store }) => { const key = `wevu:${store.$id}` try { const raw = wx.getStorageSync(key) if (raw) { store.$patch(JSON.parse(raw)) } } catch {} store.$subscribe((_mutation, state) => { try { wx.setStorageSync(key, JSON.stringify(state)) } catch {} }) }) export const usePrefs = defineStore('prefs', { state: () => ({ theme: 'light' as 'light' | 'dark' }), }) ``` :::warning 注意 上面示例直接读取/写入 `wx` 存储,必须在小程序运行时执行;如果你在 Node/Vitest 环境跑测试,需要 stub `wx` 或把持久化逻辑封装到可替换的 adapter。 ::: ## Store 实例 API * `$id`:当前 Store 的唯一标识。 * `$state`(Options Store):读取/替换整个 state;赋值会做浅合并并触发 `patch object`。 * `$patch(patch | fn)`:批量修改;Setup/Options Store 均可用,支持对象合并或回调方式。 * `$reset()`(Options Store):将 state 重置为初始值。 * `$subscribe((mutation, state) => void)`:订阅变更,返回取消订阅函数;`mutation.type` 为 `patch object` 或 `patch function`。 * `$onAction(({ name, store, args, after, onError }) => void)`:订阅 action 调用,支持成功/失败回调。 * `storeToRefs(store)`:将所有非函数字段转换为可写 `ref`,函数保持原样,避免解构丢失响应式。 ## TypeScript 与最佳实践 * Setup Store 会自动推导返回对象的类型;Options Store 可通过泛型精确声明 `state/getters/actions`。 * Store 文件按功能域组织(例如 `stores/user.ts`、`stores/cart.ts`),Store ID 使用小写单数。 * 避免直接解构 state:使用 `storeToRefs`;actions 可以直接解构。 * SSR/HMR/Devtools:Wevu 面向小程序运行环境,暂未提供这些 Web 专属能力。 ## 常见问题 * 所有运行时 API 均从 `wevu` 主入口导入。 * 不需要为了使用 store 先调用 `createStore()`;仅在使用插件时才需要。 --- --- url: /integration/tailwindcss.md description: 如果你是新项目,直接用官方模板创建即可,模板已集成 Tailwind CSS: --- # Tailwindcss 集成 ## 直接使用模板(推荐) 如果你是新项目,直接用官方模板创建即可,模板已集成 Tailwind CSS: ```sh pnpm create weapp-vite ``` ## 手动集成 如果你要在现有项目里手动接入 Tailwind CSS,请按下面文档操作: * https://tw.icebreaker.top/docs/quick-start/native/install --- --- url: /integration/tdesign.md description: 在 Weapp-vite 项目里接入 tdesign-miniprogram 的整体思路很简单: --- # tdesign-miniprogram 集成 在 `weapp-vite` 项目里接入 `tdesign-miniprogram` 的整体思路很简单: * 安装依赖 * 按官方文档完成基础配置 * (可选)开启 Weapp-vite 的自动导入组件,让你不用手写 `usingComponents` 官方快速开始: ## 安装包 ```sh pnpm add tdesign-miniprogram ``` 如果你的 `tdesign-miniprogram` 版本 `>= 1.9.0`,还需要安装 `tslib`: ```sh pnpm add -D tslib ``` ## 构建成功后勾选 `将 JS 编译成 ES5` 在微信开发者工具的“详情”里勾选 `将 JS 编译成 ES5`(按官方建议配置即可)。 ## 修改 app.json 将 `app.json` 中的 `"style": "v2"` 移除(按官方要求)。 ## 修改 tsconfig.json (与官方文档不同) 如果你用 TypeScript 开发,建议在 `tsconfig.json` 里补上 `paths`,让编辑器能正确跳转到组件源码(避免路径报红): ```json { "paths": { "tdesign-miniprogram/*": ["./node_modules/tdesign-miniprogram/miniprogram_dist/*"] } } ``` ## 使用组件 以按钮组件为例:在页面/组件的 JSON 里引入对应组件,然后在 WXML 里使用。 ```json { "usingComponents": { "t-button": "tdesign-miniprogram/button/button" } } ``` WXML: ```html 按钮 ``` ## 自动导入组件 如果你不想手写 `usingComponents`,可以开启 Weapp-vite 的自动导入组件:之后你在 WXML 里写 `` 这类标签,构建器会自动补齐注册信息。 ::: code-group ```ts [vite.config.ts] import { TDesignResolver } from 'weapp-vite/auto-import-components/resolvers' // [!code highlight] import { defineConfig } from 'weapp-vite/config' export default defineConfig({ weapp: { autoImportComponents: { resolvers: [TDesignResolver()], // [!code highlight] }, }, }) ``` ::: > \[!TIP] > 旧版本 Weapp-vite 可能仍支持 `weapp.enhance.autoImportComponents`,但该写法已废弃,建议使用上面的顶层 `weapp.autoImportComponents`。 --- --- url: /wevu/api-reference/types.md description: 本页先给出“高频类型速查”,然后提供 Wevu 当前导出的接口/类型别名全量索引。 --- # Type Reference(类型总览) 本页先给出“高频类型速查”,然后提供 `wevu` 当前导出的接口/类型别名全量索引。 ## 1. 高频类型速查 | 类型 | 链接 | 说明 | | ------------------------ | ------------------------ | ---------------------------------------------------- | | `SetupContext` | `SetupContext` | `setup(props, ctx)` 的上下文类型。 | | `RuntimeInstance` | `RuntimeInstance` | 运行时实例,含 snapshot/watch/bindModel 等能力。 | | `ComponentDefinition` | `ComponentDefinition` | 小程序组件定义结构。 | | `DefineComponentOptions` | `DefineComponentOptions` | `defineComponent` 参数类型。 | | `CreateAppOptions` | `CreateAppOptions` | `createApp` 参数类型。 | | `DefineStoreOptions` | `DefineStoreOptions` | `defineStore` 参数类型。 | | `WatchOptions` | `WatchOptions` | `watch/watchEffect` 配置。 | | `ModelBinding` | `ModelBinding` | `bindModel/useModel` 绑定结果。 | | `NativeComponent` | `NativeComponent` | 原生组件导入时的轻量类型包装。 | | `InferNativeProps` | `InferNativeProps` | 从原生 `properties` 自动推导 props。 | | `NativePropType` | `NativePropType` | 原生 `properties.type` 的泛型提示(类 `PropType`)。 | | `TriggerEventOptions` | `TriggerEventOptions` | `emit/triggerEvent` 选项类型。 | | `WevuDefaults` | `WevuDefaults` | `setWevuDefaults` 配置结构。 | | `MiniProgramInstance` | `MiniProgramInstance` | setup 中原生实例类型。 | | `WevuPlugin` | `WevuPlugin` | 插件函数类型。 | ## 2. 接口(Interfaces)全量索引 | 接口 | 领域 | | ----------------------------- | -------------------- | | `ActionSubscriber` | Store/action 订阅 | | `AppConfig` | App 配置 | | `ComponentDefinition` | 组件定义 | | `ComputedRef` | 只读 computed | | `CreateAppOptions` | createApp 参数 | | `DefineAppOptions` | App 定义参数 | | `DefineComponentOptions` | defineComponent 参数 | | `DefineStoreOptions` | defineStore 参数 | | `EffectScope` | effect 作用域 | | `GlobalComponents` | 全局组件扩展 | | `GlobalDirectives` | 全局指令扩展 | | `InternalRuntimeStateFields` | 运行时内部状态 | | `MiniProgramAdapter` | 平台适配器 | | `MiniProgramComponentOptions` | 小程序组件配置 | | `ModelBinding` | 双向绑定结果 | | `ModelBindingOptions` | 双向绑定选项 | | `MutationRecord` | mutation 记录 | | `PageFeatures` | 页面 feature 开关 | | `PrelinkReactiveTreeOptions` | reactive 预链接选项 | | `PropOptions` | prop 选项 | | `RuntimeApp` | App 运行时实例 | | `RuntimeInstance` | 页面/组件运行时实例 | | `SetDataDebugInfo` | setData 调试信息 | | `SetDataSnapshotOptions` | setData 快照选项 | | `SetupContext` | setup 上下文 | | `StoreManager` | store 管理器 | | `SubscriptionCallback` | 订阅回调 | | `TemplateRefs` | 模板 ref 集合 | | `TemplateRefValue` | 模板 ref 值类型 | | `WatchOptions` | watch 配置 | | `WevuDefaults` | 全局默认值配置 | | `WevuGlobalComponents` | Wevu 全局组件 | | `WevuGlobalDirectives` | Wevu 全局指令 | | `WritableComputedOptions` | 可写 computed 配置 | | `WritableComputedRef` | 可写 computed 引用 | ## 3. 类型别名(Type Aliases)全量索引 ### 3.1 组件、Props、宏相关 | 类型别名 | 说明 | | ------------------------- | -------------------------- | | `AllowedComponentProps` | 允许透传的组件属性 | | `ComponentCustomProps` | 自定义组件属性扩展 | | `ComponentOptionsMixin` | 组件选项 mixin | | `ComponentPropsOptions` | props 选项定义 | | `ComponentPublicInstance` | 公共实例类型 | | `DefineComponent` | defineComponent 类型签名 | | `EmitsOptions` | emits 配置类型 | | `ExtractDefaultPropTypes` | 默认值推断 | | `ExtractPropTypes` | props 推断结果 | | `ExtractPublicPropTypes` | 对外 props 推断 | | `InferPropType` | 单个 prop 类型推断 | | `InferProps` | props 对象推断 | | `InferNativePropType` | 原生 property 单项推断 | | `InferNativeProps` | 原生 properties 对象推断 | | `NativeComponent` | 原生组件类型包装 | | `NativePropType` | 原生 property type 泛型 | | `NativeTypedProperty` | 原生 property 进阶兜底提示 | | `PropConstructor` | prop 构造器类型 | | `PropType` | prop 类型声明 | | `PublicProps` | 公共 props 合集 | | `SetupFunction` | setup 函数签名 | | `TriggerEventOptions` | triggerEvent 选项 | | `VNode` | VNode 兼容类型 | | `VNodeProps` | VNode props 兼容类型 | ### 3.2 响应式与工具类型 | 类型别名 | 说明 | | --------------------- | -------------------- | | `ComputedDefinitions` | computed 定义集合 | | `ComputedGetter` | computed getter | | `ComputedSetter` | computed setter | | `ExtractComputed` | 提取 computed 返回值 | | `ExtractMethods` | 提取 methods 返回值 | | `MaybeRef` | 值或 Ref | | `MaybeRefOrGetter` | 值或 Ref 或 getter | | `MethodDefinitions` | methods 定义集合 | | `Ref` | Ref 类型 | | `ShallowRef` | ShallowRef 类型 | | `ShallowUnwrapRef` | shallow 解包类型 | | `ToRefs` | toRefs 返回类型 | | `WatchStopHandle` | watch 停止句柄 | ### 3.3 小程序桥接与运行时内部 | 类型别名 | 说明 | | ------------------------------------- | ------------------ | | `InternalRuntimeState` | 运行时内部状态 | | `MiniProgramAppOptions` | App 原生配置 | | `MiniProgramBehaviorIdentifier` | Behavior 标识符 | | `MiniProgramComponentBehaviorOptions` | 组件 behavior 配置 | | `MiniProgramComponentRawOptions` | 组件原始配置 | | `MiniProgramInstance` | 原生组件/页面实例 | | `MiniProgramPageLifetimes` | 页面生命周期类型 | | `ObjectDirective` | 指令对象类型 | | `TemplateRef` | 模板 ref 类型 | ### 3.4 store / model / mutation | 类型别名 | 说明 | | --------------------- | ------------------ | | `ModelBindingPayload` | model 绑定 payload | | `MutationKind` | mutation 种类 | | `MutationOp` | mutation 操作 | | `MutationType` | mutation 类型 | | `WevuPlugin` | 插件类型 | ## 4. 编译侧类型(`wevu/compiler`) | 类型别名 | 链接 | 说明 | | --------------------- | --------------------- | --------------------------------- | | `WevuRuntimeApiName` | `WevuRuntimeApiName` | 编译器识别的运行时 API 名字联合。 | | `WevuPageHookName` | `WevuPageHookName` | 页面 hook 名字联合。 | | `WevuPageFeatureFlag` | `WevuPageFeatureFlag` | 页面 feature 开关联合。 | ## 5. 相关页 * Core API:[/wevu/api-reference/core](/wevu/api-reference/core) * Reactivity API:[/wevu/api-reference/reactivity](/wevu/api-reference/reactivity) * Runtime Bridge API:[/wevu/api-reference/runtime-bridge](/wevu/api-reference/runtime-bridge) --- --- url: /wevu/api/types.md description: 本页仅保留业务开发最常用的公开类型。内部运行时类型不会在文档中展开。 --- # Type Reference(类型总览) 本页提供最常用的公开类型速查,避免把内部实现类型暴露为常规 API。 ## 组件与应用 ### `CreateAppOptions` {#createappoptions} `createApp()` 的参数类型。 ### `DefineComponentOptions` {#definecomponentoptions} `defineComponent()` 的参数类型。 ### `ComponentDefinition` {#componentdefinition} `defineComponent()` 返回定义结构类型。 ### `SetupContext` {#setupcontext} `setup(props, ctx)` 中 `ctx` 的类型。 ### `RuntimeInstance` {#runtimeinstance} 页面/组件运行时实例类型。 ## 响应式与监听 ### `Ref` {#ref-type} 基础响应式引用类型。 ### `ShallowRef` {#shallowref-type} 浅层响应式引用类型。 ### `WatchOptions` {#watchoptions} `watch/watchEffect` 配置类型。 ### `WatchStopHandle` {#watchstophandle} watch 停止句柄类型。 ### `MaybeRefOrGetter` {#maybereforgetter} 可接收值、Ref 或 getter 的联合类型。 ## Store ### `StoreManager` {#storemanager} store 根管理器类型。 ### `DefineStoreOptions` {#definestoreoptions} defineStore 选项类型。 ### `StoreToRefsResult` {#storetorefsresult} `storeToRefs()` 返回类型。 ### `MutationType` {#mutationtype} store mutation 类型。 ## 运行时配置 ### `WevuDefaults` {#wevudefaults} `setWevuDefaults()` 配置类型。 ### `ModelBinding` {#modelbinding} `defineModel/useModel/useBindModel` 相关绑定类型。 ### `TriggerEventOptions` {#triggereventoptions} 事件触发选项类型。 ## 说明 更多底层与内部类型仍可在类型声明文件中找到,但不属于推荐直接依赖的公共 API 文档范围。 --- --- url: /guide/directory-structure/utils.md description: 通用工具函数的推荐目录。 --- # `utils/` `utils/` 是通用工具函数目录。 它没有框架保留语义,但非常适合作为纯函数和轻量工具层的落点。 ## 常见内容 * 格式化函数 * URL/路径辅助函数 * 时间、数字、字符串处理 * 与业务无关的通用 helper 如果这里的模块同时被主包和多个分包引用,最终代码落盘位置还会受到 chunk 策略影响。 --- --- url: /integration/vant.md description: Vant Weapp 集成,聚焦 integration / vant 相关场景,覆盖 Weapp-vite 与 Wevu 的能力、配置和实践要点。 --- # Vant Weapp 集成 官方文档: ## 安装 ```sh pnpm i @vant/weapp ``` ## 修改 app.json 将 `app.json` 中的 `"style": "v2"` 移除(按官方要求)。 ## 修改 tsconfig.json (与官方文档不同) 如果你用 TypeScript 开发,建议在 `tsconfig.json` 里补上 `paths`,让编辑器能正确跳转到 Vant 组件源码(避免路径报红): ```json { "paths": { "@vant/weapp/*": ["./node_modules/@vant/weapp/dist/*"] } } ``` ## 使用组件 以按钮组件为例:在页面/组件的 JSON 里引入对应组件,然后在 WXML 里使用。 ```json { "usingComponents": { "van-button": "@vant/weapp/button/index" } } ``` WXML: ```html 按钮 ``` ## 自动导入组件 如果你不想手写 `usingComponents`,可以开启 Weapp-vite 的自动导入组件:之后你在 WXML 里写 ``,构建器会自动补齐注册信息。 ::: code-group ```ts [vite.config.ts] import { VantResolver } from 'weapp-vite/auto-import-components/resolvers' // [!code highlight] import { defineConfig } from 'weapp-vite/config' export default defineConfig({ weapp: { autoImportComponents: { resolvers: [VantResolver()], // [!code highlight] }, }, }) ``` ::: > \[!TIP] > 旧版本 Weapp-vite 可能仍支持 `weapp.enhance.autoImportComponents`,但该写法已废弃,建议使用顶层 `weapp.autoImportComponents`。 --- --- url: /guide/vite-plugin-host.md description: 在自定义 Vite 插件中判断当前运行环境是否由 weapp-vite 创建,并区分 miniprogram 与 web 两种运行面。 --- # Vite 插件识别 weapp-vite 宿主 当你把一个自定义 Vite 插件同时用于 `weapp-vite` 和普通 `vite` 项目时,常见需求是: * 只在 `weapp-vite` 场景下注入额外逻辑; * 在 `weapp-vite` 里继续区分 `miniprogram` 与 `web` 两种运行面; * 避免使用 `process.env` 这类进程级变量,防止同进程里的其他 Vite 实例被误判。 从当前版本开始,`weapp-vite` 会给自己创建的 Vite 实例注入 `config.weappVite` 宿主元信息。你可以在插件的 `config`、`configResolved` 等阶段读取这份信息来做判断。 ## 宿主元信息结构 `weapp-vite` 会向 Vite 配置对象注入下面这个字段: ```ts interface WeappViteHostMeta { name: 'weapp-vite' runtime: 'miniprogram' | 'web' } ``` * `name` 固定为 `'weapp-vite'`,用于判断当前实例是否由 `weapp-vite` 创建。 * `runtime` 用于区分当前运行面: * `miniprogram`:小程序构建链路,包括主包、分包、pluginRoot、workers。 * `web`:`weapp.web` 启用后的 Web 运行时与对应的 Vite 实例。 普通 `vite` 项目不会自动带上这个字段。 ## 推荐写法 最直接的写法是在 `configResolved` 中读取 `config.weappVite`: ```ts import type { Plugin } from 'vite' export function myPlugin(): Plugin { return { name: 'my-plugin', configResolved(config) { if (config.weappVite?.name !== 'weapp-vite') { return } if (config.weappVite.runtime === 'miniprogram') { // 只在 weapp-vite 小程序运行面生效 } if (config.weappVite.runtime === 'web') { // 只在 weapp-vite web 运行面生效 } }, } } ``` 如果你希望把判断逻辑收敛到一个 helper,也可以直接使用 `weapp-vite` 导出的工具函数: ```ts import type { Plugin } from 'vite' import { isWeappViteHost, resolveWeappViteHostMeta } from 'weapp-vite' export function myPlugin(): Plugin { return { name: 'my-plugin', configResolved(config) { if (!isWeappViteHost(config)) { return } const host = resolveWeappViteHostMeta(config) if (!host) { return } if (host.runtime === 'miniprogram') { // 小程序逻辑 } }, } } ``` ## 对应处理方式 拿到宿主信息后,推荐按下面的粒度处理,而不是只做一个粗糙的布尔判断。 ### 1. 普通 Vite ```ts if (!config.weappVite) { // 保持普通 Vite 行为 } ``` 适合的处理方式: * 走插件默认逻辑; * 跳过 weapp-vite 专属 transform、文件发射或小程序路径重写; * 不要假设存在 `weapp` 配置、WXML/WXSS 产物或小程序输出目录。 ### 2. weapp-vite + miniprogram ```ts if (config.weappVite?.runtime === 'miniprogram') { // 小程序运行面 } ``` 适合的处理方式: * 启用只服务于小程序构建的逻辑; * 处理小程序专属文件类型、路径规则、产物后缀或构建阶段行为; * 针对 pluginRoot、workers、分包等链路复用同一套判断,因为它们都属于 `miniprogram`。 ### 3. weapp-vite + web ```ts if (config.weappVite?.runtime === 'web') { // Web 运行面 } ``` 适合的处理方式: * 使用浏览器可运行的分支; * 跳过只能在小程序产物里成立的 emit/rename 逻辑; * 如果你的插件既处理小程序源码,又支持 H5 调试,可以把浏览器兼容逻辑集中到这里。 ## 为什么不推荐 `process.env` 不推荐用下面这种方式判断: ```ts if (process.env.WEAPP_VITE) { // 不推荐 } ``` 原因很直接: * `process.env` 是进程级共享状态,不是当前 Vite 实例私有状态; * 同一个 Node 进程里可能同时存在多个 Vite 实例; * 这类标记很难可靠地区分 `miniprogram` 和 `web` 两种运行面。 `config.weappVite` 则是当前实例级别的元信息,作用域更清晰,也更适合插件判断。 ## 类型与导入位置 你可以从下面两个入口获得类型与 helper: ```ts import type { WeappViteHostMeta, WeappViteRuntime } from 'weapp-vite' import { isWeappViteHost, resolveWeappViteHostMeta } from 'weapp-vite' ``` 或: ```ts import type { WeappViteHostMeta, WeappViteRuntime } from 'weapp-vite/config' import { isWeappViteHost, resolveWeappViteHostMeta } from 'weapp-vite/config' ``` 如果你只是在插件内部读取 `config.weappVite`,不引入 helper 也完全可以。 ## 适用范围说明 当前宿主元信息由 `weapp-vite` 在内部合并配置时注入,因此以下链路都可以读取到: * 常规小程序 `dev/build` * 启用 `pluginRoot` 的插件构建 * workers 构建 * `weapp.web` 对应的 Web 运行面 如果你自己直接调用原生 `vite.createServer()` 或 `vite.build()`,且没有经过 `weapp-vite` 的配置合并链路,那么不会自动得到该字段,这属于预期行为。 --- --- url: /packages/vite-plugin-performance.md description: vite-plugin-performance 用于包装一个或多个 Vite 插件,并统计每个生命周期 Hook 的执行耗时。 --- # vite-plugin-performance `vite-plugin-performance` 用于包装一个或多个 Vite 插件,并统计每个生命周期 Hook 的执行耗时。 ## 何时使用 * 你要定位构建慢点来自哪个插件/Hook * 你要为插件性能监控打点 * 你要在不改插件实现的前提下测量耗时 ## 安装 ```bash pnpm add -D vite-plugin-performance ``` ## 最小示例 ```ts import { defineConfig } from 'vite' import Inspect from 'vite-plugin-inspect' import { wrapPlugin } from 'vite-plugin-performance' export default defineConfig({ plugins: [ wrapPlugin(Inspect(), { threshold: 50, }), ], }) ``` ## 常用选项 * `hooks`: 指定要统计的 Hook,或传 `'all'` * `threshold`: 仅输出大于等于阈值的耗时 * `silent`: 关闭默认日志 * `logger`: 自定义日志输出 * `formatter`: 自定义日志格式 * `onHookExecution`: 每次统计完成后的回调 ## 相关导出 * `wrapPlugin` * `DEFAULT_PLUGIN_HOOKS` * `DEFAULT_THRESHOLD` --- --- url: /guide/directory-structure/vite-config.md description: Weapp-vite 目录结构能力的总开关,负责定义 srcRoot、自动路由、分包、自动导入组件等行为。 --- # `vite.config.ts` `vite.config.ts` 是这组目录约定的真正入口。很多“目录为什么会生效”的答案,最终都在这里。 ## 它决定什么 * `weapp.srcRoot`:源码根目录在哪里 * `weapp.autoRoutes`:哪些页面目录会被扫描 * `weapp.subPackages`:哪些目录被当成分包 root * `weapp.autoImportComponents`:哪些组件目录参与自动导入 ## 最小示例 ```ts import { defineConfig } from 'weapp-vite' export default defineConfig({ weapp: { srcRoot: 'src', autoRoutes: true, autoImportComponents: true, subPackages: { packageA: {}, }, }, }) ``` ## 什么时候先看它 * 页面没被扫描到 * 分包页面被识别错了 * 类型文件生成到了意料之外的位置 * 你把源码目录从 `src/` 改到了 `miniprogram/` 相关文档:[srcRoot](/guide/directory-structure/src-root) / [subPackages](/guide/directory-structure/subpackages) --- --- url: /wevu/vue-sfc/vue3-vs-weapp-sfc.md description: >- 本文聚焦“写法层面”的相同与不同:当你用 Weapp-vite + Wevu 写 .vue 时,哪些与 Vue 3 SFC 一致,哪些会因为小程序编译/运行时而发生变化。 --- # Vue 3 SFC vs Weapp-vite SFC:写法对比 本文聚焦“写法层面”的相同与不同:当你用 Weapp-vite + Wevu 写 `.vue` 时,哪些与 Vue 3 SFC 一致,哪些会因为小程序编译/运行时而发生变化。 ## 相同点(写法层面) * **SFC 结构一致**:`