)
LikeC4 Vite 插件演进与原理深度解析从虚拟模块到项目级 Web Componentsv1.49.0–v1.59.3【免费下载链接】likec4Visualize, collaborate, and evolve the software architecture with always actual and live diagrams from your code项目地址: https://gitcode.com/GitHub_Trending/li/likec4本指南以 packages/vite-plugin/CHANGELOG.md 为主体脉络结合仓库内插件源码系统解读 LikeC4 Vite 插件likec4/vite-plugin从 1.49.0 到 1.59.3 的核心变更包括项目级 Web Components 虚拟模块、图标按需加载与 CDN 回源链、landingPage配置、Draw.io 导出、AI 聊天自动探测等能力并深入剖析其虚拟模块架构、HMR 机制与完整配置选项。读完你将掌握该插件的内部工作原理并能在自己的 Vite 工程中正确接入与调优。插件定位与发布形态在深入版本变更之前先明确这个包在 LikeC4 技术栈中的位置。根据 packages/vite-plugin/package.jsonlikec4/vite-plugin是一个private不直接发布到 npm的包README 中明确标注This package is intended for internal usage and not published to npm插件以likec4/vite-plugin子路径从主包likec4对外提供。从包结构看它的关键设计约束包括ESM onlytype: module构建产物为dist/index.mjs并额外暴露./internal、./ai/tools、./modules等子入口peerDependencies要求vite与react同时把tanstack/ai系列tanstack/ai-anthropic、tanstack/ai-gemini、tanstack/ai-ollama、tanstack/ai-openai、tanstack/ai-openrouter全部声明为可选 peer 依赖——这正是 1.56.0 前后 AI 能力按需加载设计的基础运行时依赖likec4/config、likec4/core、likec4/generators、likec4/layouts、likec4/language-services、likec4/log、likec4/icons等工作区包因此 CHANGELOG 中每次版本发布几乎都伴随这组依赖的同步更新。对外 API 极简src/index.ts 仅导出LikeC4VitePlugin与LikeC4VitePluginOptions两个符号。版本脉络总览1.49.0 → 1.59.3版本关键变更性质1.59.3新增项目级 Web Components 虚拟模块likec4:webcomponents/project-id#3161关系视图中自定义 SVG 图标渲染可靠性修复本地currentColor图标跟随iconColor#3155功能 修复1.56.0将 Web 应用抽取为独立likec4/spa包与 CLI 解耦#2689图标改为按需从 CDN 加载以减小包体#2906架构重构1.55.0修复 codegen react 与 view hooks 未应用手动布局的问题视图统一经$layoutedLikeC4ViewModel处理#2876修复1.53.0新增landingPage配置项redirect: true跳过落地页直达 index 视图include/exclude选择器过滤落地页网格中的视图#2733功能1.50.0在应用导出菜单中启用 Export to Draw.io打开app.diagrams.net并预载当前图表#2639功能其余版本1.59.2、1.59.1、1.59.0、1.57.1、1.57.0、1.54.0、1.52.0、1.51.0、1.49.0 等均为依赖同步更新Updated dependencies实际功能演进集中在上述五个版本。下面逐一展开其背后的源码实现。插件核心机制虚拟模块系统整个插件的骨架是Vite/Rolldown 虚拟模块系统。src/plugin.ts 中把虚拟模块划分为三类每项目 HMR 虚拟模块hmrProjectVirtualslikec4:model/id、likec4:icons/id、likec4:d2/id、likec4:dot/id、likec4:mmd/id、likec4:puml/id、likec4:drawio/id——模型变化时逐个触发热更新项目级导出能力聚合模块hmrProjectListVirtualslikec4:d2、likec4:dot、likec4:mmd、likec4:puml、likec4:drawio——缓存项目级导出能力映射根级虚拟模块_virtualslikec4:projects、likec4:model、likec4:projects-overview、likec4:plugin/single-project.js、likec4:react默认项目、likec4:icons、likec4:rpc外加动态创建的 app-config 模块。项目级虚拟模块的 ID 匹配与生成逻辑集中在 src/virtuals/_shared.ts 的generateMatchesmatches: (id: string): ProjectId | null { let { module, projectId } id.match(/likec4:plugin\/(?projectId.)\/(?module.)$/)?.groups ?? id.match(/likec4:(?module.)\/(?projectId.)$/)?.groups ?? {} ... if (module moduleId) { return projectId as ProjectId } return null }, virtualId: (projectId: ProjectId): string joinURL(likec4:plugin, projectId, moduleId) extension,resolveId钩子以/^likec4:/为过滤条件先匹配项目级模块再匹配根级模块load钩子则通过likec4.project(projectId)拿到对应项目数据注入共享选项后生成代码。初始化与共享选项configResolved阶段完成核心初始化src/plugin.ts通过fromWorkspace(workspace ?? config.root, ...)从工作区创建语言服务实例默认启用manualLayouts、graphviz: wasm、logLevel: warning、printErrors: truerpcEnabled config.command serve——只有在 dev server 模式下才启用 RPC 与 AIwatch默认值dev 模式为true生产构建为false。共享选项moduleopts统一注入rpcEnabled、isAIAvailable、ai、assetsDir、likec4、logger再与各模块特定选项合并。错误上报与 HMR 节流configureServer中src/plugin.ts实现了两套热更新通道模型解析错误通过hotChannel.send({ type: error, ... })将LikeC4ValidationError推给浏览器携带sourceFsPath、line、column基于range.start.character 1等定位信息模型变更刷新onModelParsedBatched使用funnel把多个项目的解析事件聚合成批量回调minQuietPeriodMs: 130、maxBurstDurationMs: 500projectsChangeDetector则用isDeepEqual比较项目 id/title/path/folder/landingPage/exportFormats 判断是否需要刷新likec4:projects等根级模块项目级更新经pDebounce(reloadProjects, 100)防抖。1.59.3 核心功能项目级 Web Components1.59.3 最重要的变更是按项目作用域定义 LikeC4 Web Components虚拟模块地址为likec4:webcomponents/project-id#3161。实现位于 src/virtuals/webcomponents.ts。生成的代码以一个自定义元素类为核心支持四个可观察属性属性默认值取值view-idindex视图 IDbrowsertrue布尔属性字符串false不区分大小写视为falsedynamic-variant不设置diagram|sequencecolor-scheme不设置light|dark关键实现细节const projectIdSymbol Symbol.for(likec4.webcomponent.projectId) export function defineWebcomponent(name) { const existing customElements.get(name) if (existing) { if (existing[projectIdSymbol] projectId) { return existing } throw new Error(Custom element name is already defined) } const LikeC4ViewElement createLikeC4ViewElement() Object.defineProperty(LikeC4ViewElement, projectIdSymbol, { value: projectId }) customElements.define(name, LikeC4ViewElement) return LikeC4ViewElement }使用attachShadow({ mode: open, delegatesFocus: true })创建 Shadow DOM宿主样式为display: contents不会污染页面布局通过Symbol.for(likec4.webcomponent.projectId)给自定义元素打上项目 ID 标记同项目重复调用defineWebcomponent会幂等返回既有类跨项目同名冲突则直接抛错生成代码内部从likec4:react/project-id导入LikeC4View并注入属性因此 Web Components 层实际上是 React 渲染层的薄封装。对应的单元测试 src/virtuals/webcomponents.spec.ts 验证了ID 匹配likec4:webcomponents/project-a与likec4:plugin/project-a/webcomponents.js都解析到project-a、生成代码包含customElements.define、以及通过hardenJsonStringLiteralForEmbeddedScript对嵌入 JS 的项目 ID 做字符串字面量加固防止注入。1.59.3 的另一项修复关系视图 SVG 图标#3155 修复了关系视图中自定义 SVG 图标渲染不可靠的问题并让使用currentColor的本地 SVG 图标正确跟随iconColor。这与图标渲染链路相关——项目级图标通过likec4:icons/id虚拟模块注入IconRenderer见 src/virtuals/react.tscurrentColor的 SVG 只有在正确传递iconColor属性时才能随主题/着色变化。图标按需加载与 CDN 回源链1.56.0 的 #2906 是包体优化的重要一步不再把全部图标组件打进 bundle改为按需加载。实现位于 src/icon-bundle-plugin.ts 的likec4:icon-bundle插件图标解析顺序为本地缓存config.cacheDir/likec4-icons/group/icon.jslikec4/icons包通过createRequirerequire.resolve(likec4/icons/group/icon)从 cwd、workspace、vite root 依次解析远程 CDN 兜底fetch远程图标服务成功后再写入本地缓存。图标按group:icon分桶aws/azure/gcp/tech经DefaultMap缓存避免重复请求解析失败时回退为一个返回null的NotFoundIcon组件保证构建不中断。加载返回的模块类型为jsxmoduleSideEffects: false便于 tree-shaking。AI 聊天能力与自动探测插件在 dev server 下默认启用 AIai: auto自动探测逻辑位于 src/ai/detect-ai.ts。探测优先级与对应环境变量、默认模型如下优先级触发环境变量Adapter默认模型可用环境变量覆盖1OPENAI_API_KEYopenaiTextgpt-5.2OPENAI_CHAT_MODELreasoning.effort: medium2OPENROUTER_API_KEYopenRouterTextopenai/gpt-5.4OPENROUTER_CHAT_MODEL3ANTHROPIC_API_KEYanthropicTextclaude-sonnet-4-6ANTHROPIC_CHAT_MODEL4GEMINI_API_KEYgeminiTextgemini-2.5-proGEMINI_CHAT_MODEL5OLLAMA_HOSTollamaTextqwen3OLLAMA_CHAT_MODELthink: low6MINIMAX_API_KEYcreateOpenaiChatOpenAI 兼容协议MiniMax-M3MINIMAX_CHAT_MODEL按MINIMAX_REGION选择global_en/cn_zh端点探测到的 provider 对应包通过ensurePackage动态加载所以声明为可选 peer统一maxTokens: 16000。注意探测顺序是固定的先到先得任何配置了 key 的 provider 都会优先于后续项。ai选项支持disabled | auto | AIOptions其中AIOptions需显式提供adapter例如openRouterText(openai/gpt-5)传入布尔值会直接抛错见 src/plugin.ts 的initAI。AI 仅在rpcEnabled即 dev serve 模式时初始化AI Chat 服务由./ai/enableServer动态启用其中包含applySemanticLayout、calcAdhocView、updateView等 RPC 函数见 src/rpc/functions。landingPage 配置1.53.0#2733 为项目配置新增landingPage选项redirect: true跳过落地页直接进入 index 视图include/exclude选择器过滤落地页网格中展示的视图。插件侧通过projectsChangeDetector把landingPage纳入变更比较见 src/plugin.ts因此修改该配置会触发likec4:projects根级模块刷新。项目配置 schema 定义于 packages/config/src/schema.ts落地页渲染对应projectsOverviewModulesrc/virtuals/projectsOverview.ts。导出能力与 Draw.io 集成1.50.01.50.0 在应用导出菜单中加入 Export to Draw.io#2639打开app.diagrams.net并预载当前图表。该功能背后是完整的导出格式矩阵——effectiveWebappExportFormats会根据webapp.exportFormats配置裁剪可用格式未配置时默认启用全部格式见 src/virtuals/export-formats.ts 与 packages/config/src/webapp-export-formats.ts。项目级导出模块likec4:d2/id、likec4:dot/id、likec4:drawio/id、likec4:mmd/id、likec4:puml/id由generateCombinedProjects生成动态 import 注册表src/virtuals/_shared.ts根模块维护xxxRegistry按 projectId 懒加载对应子模块请求不存在的 projectId 时若该格式有导出开关则直接抛错否则回退到第一个项目并给出警告。该代码还内置了import.meta.hot.accept热更新逻辑模型变更时动态合并注册表。其他修复与重构1.55.0#2876修复 codegen react 与 view hooks 未应用手动布局的问题。此前生成代码未走$layouted导致manualLayouts配置失效修复后视图统一通过LikeC4ViewModel的$layouted读取布局数据。这与插件初始化时fromWorkspace(..., { manualLayouts: true })的默认行为相互印证。1.56.0#2689Web 应用抽取为独立likec4/spa包与 CLI 解耦消除 CLI 包中“魔法”依赖带来更清晰的模块边界、更快的构建与更小的 bundle。对应仓库中 packages/likec4-spa 与 packages/likec4 的分工。配置选项速查表综合 src/plugin.ts 的类型定义LikeC4VitePluginOptions完整选项如下选项类型默认值说明workspacestringVite 项目根目录初始化 LikeC4 实例的工作区路径languageServicesLikeC4LanguageServices—传入已创建的语言服务实例与workspace互斥此时其余工作区选项不可用printErrorsbooleantrue模型无效时是否打印错误到控制台throwIfInvalidbooleanfalse为true时初始化返回 rejected promise可经getErrors()读取错误graphvizwasm \| binarywasm布局引擎使用 WASM 版还是系统dot二进制watchbooleandev 为true否则false是否监听工作区变化logLeveltrace \| debug \| info \| warning \| errorwarning日志级别aidisabled \| auto \| AIOptionsautoAI 配置见上文探测表environmentsstring \| string[]全部环境插件生效的 Vite 环境名appConfigAppConfig—静态应用配置在 likec4 中的实际使用likec4/vite-plugin由主包likec4的 vite 配置层消费。例如 packages/likec4/src/vite/config-react.ts 在生成 React 库产物时这样接入plugins: [ LikeC4VitePlugin({ ai: disabled, languageServices: languageServices.languageServices, }), ],生产模式下显式关闭 AI、复用既有语言服务实例config-app.ts则用于构建单文件应用。主包通过 packages/likec4/package.json 的./vite-plugin、./vite-plugin/internal、./vite-plugin-modules子入口对外暴露该插件。小结从 1.49.0 到 1.59.3likec4/vite-plugin的演进清晰指向三个方向模块化虚拟模块体系 likec4/spa解耦、轻量化图标按需加载与 CDN 回源、集成化Web Components、Draw.io 导出、AI 聊天、落地页定制。理解其虚拟模块注册表、项目作用域 ID 约定与 HMR 通道是进一步在 LikeC4 之上构建自定义集成的基础。若需深入某个模块可继续阅读 src/virtuals、src/rpc、src/ai 下的源码与对应*.spec.ts测试。【免费下载链接】likec4Visualize, collaborate, and evolve the software architecture with always actual and live diagrams from your code项目地址: https://gitcode.com/GitHub_Trending/li/likec4创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考