# Jazor **Repository Path**: devhxj/Jazor ## Basic Information - **Project Name**: Jazor - **Description**: C# to Javascript Compiler implemented via Roslyn. - **Primary Language**: C# - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-04-08 - **Last Updated**: 2026-08-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: Csharp, roslyn ## README
![今日诗词](https://v2.jinrishici.com/one.svg?font-size=20&spacing=2&color=Chocolate)

Jazor

将强类型 C# 与 Razor 编译为确定性 ECMAScript 模块和 Vue 渲染函数的 .NET 工具链。

.NET 11 Preview 6 NuGet GitHub release RazorVue CI MIT 许可证

10297 项编译器测试通过 编译器行覆盖率 98.94% 编译器分支覆盖率 96.01%

English · 简体中文

> [!IMPORTANT] > Jazor 仍处于实验阶段。公共 API、生成产物形态和工具链可能继续演进;编译器核心、`Jazor.Emit` 管线和 Razor SG 绑定边界是当前最稳定的基础。 Jazor 是一套使用 C# 和 Razor 构建 JavaScript 与 Vue 应用的 .NET 工具链。 核心包提供编译器、运行时契约、分析器、emit 工具和 MSBuild 集成。Razor-to-Vue 转换通过 `Jazor.Vue` 显式启用:官方 Razor 源生成器的输出会绑定为 Roslyn `IOperation`,并降低为 Vue render-function `.mjs` 产物。 实现由 `Jazor.Compiler`、`Jazor.CLR`、`Jazor.Analyzer`、`Jazor.Emit`、`Jazor.Common` 以及 ECMAScript / Vue 绑定程序集组成。 ## 已验证的编译器基线 `Jazor.Compiler` 使用真实 Roslyn `IOperation` 操作图进行验证,并通过 Acornima ESTree 生成 JavaScript。当前可复验基线记录于 2026-08-05: | 指标 | 验证结果 | 当前强制阈值 | |------|----------|--------------| | 编译器回归测试 | 10297 / 10297 通过 | 至少通过 10000 项 | | 行覆盖率 | 16369 / 16545(98.94%) | 98% | | 分支覆盖率 | 6324 / 6587(96.01%) | 96% | 在仓库根目录运行正式覆盖率门禁: ```bash dotnet run --file scripts/csharp/verify-compiler-coverage.cs ``` 该门禁会运行完整编译器测试套件,读取本次 TRX 与 Cobertura 报告;测试数量或覆盖率未达到阈值时以非零状态退出。96.01% 是已验证的 `v0.1.45` 发布基线,已达到当前 96% 分支门槛。当前范围和统计方法见[编译器状态](docs/03-%E5%AE%8C%E6%88%90/compiler/status.md)与[编译器测试指南](src/Jazor.CompilerTest/README.md)。 ## RazorVue 验证基线 官方 Razor SG 输出会经过 Roslyn 绑定、直接 Vue render-function 生成、源映射、catalog 产物与 Deno.host 运行时场景验证。当前可复验基线为: | 指标 | 验证结果 | 强制阈值 | |------|----------|----------| | RazorVue SG 场景 | 4484 / 4484 通过 | 至少通过 4000 项 | | 行覆盖率 | 8147 / 8719(93.44%) | 90% | | 分支覆盖率 | 3568 / 4265(83.66%) | 80% | 在仓库根目录运行 RazorVue 覆盖率门禁: ```bash dotnet run --file scripts/csharp/verify-razorvue-coverage.cs ``` ## 架构 - **语义降低**:Roslyn `IOperation` 被转换为 Acornima ESTree,并保持明确的支持边界与确定性输出。 - **Razor 集成**:`Jazor.Vue` 从 `GeneratorDriver.RunGeneratorsAndUpdateCompilation` 取得最终 `Compilation`,并绑定生成的 `BuildRenderTree` 操作。Razor DR/IR、宿主输出文档和生成 C# 的二次解析不属于生产边界。 - **产物契约**:Razor 组件生成 Vue render-function `.mjs` 模块;`Jazor.Emit` 负责物化模块、源映射、清单、运行时资产和生产包。 - **类型化绑定**:Vue 3 核心绑定随 `Jazor` 提供;Pinia、Vue Router、Vuetify 和其他生态绑定以独立包方式引用。 ## 能力 - **语义级 C# 降低**:基于 Roslyn `IOperation`,而非语法字符串替换。 - **快速失败的宿主边界**:不支持的外部运行时语义会在实际降低使用点明确报错,不会静默生成近似 JavaScript。 - **白名单约束的 CLR API**:常用 CLR API 由 `Jazor.CLR` 与生成的白名单元数据映射;分析器可提前诊断大量不支持的用法。 - **ECMAScript 模块输出**:`[ECMAScriptModule]` 类生成具名导出的 `.mjs` 模块,并提供稳定的导入收集、源位置跟踪和源映射载体。 - **Razor-to-Vue 产物生成**:Razor 组件语义从官方 Razor SG 生成的 C# 出发,经 Roslyn 绑定和编译器持有的 `IOperation` 降低。 - **类型化 Vue 编写**:`ECMAScript.Vue3` 提供 Vue 3 `defineComponent`、`h`、响应式引用、生命周期、props、slots 和组件契约绑定。 - **面向宿主的构建支持**:MSBuild 为 ECMAScript 与 RazorVue 产物选择一种输出模式:不输出、`debug` 模块与清单,或通过 Deno / Netpack 工具链生成 `release` 生产包。 ## 最新更新 ### 2026-08-05 - 绑定扩展方法组作为 delegate 使用时现在保留 receiver,包括标识符 receiver;生成的 callback 不会丢失原始调用上下文。 - 复合赋值、无符号右移、隐式派生类构造函数、属性初始化、插值格式 intrinsic 与 host-bound member dispatch 现在均有聚焦的 Roslyn operation 回归,覆盖求值顺序和运行时形状契约。 - 白名单生成会在生成阶段拒绝不完整的 alias 声明,避免 catalog 出现没有可用 runtime 名称的条目。 - 公开名称与已声明或保留 module binding 冲突的 import 现在会分配稳定的生成别名;继承泛型静态成员仍会使用具体 runtime host。 - 插值 `dynamic` 值现在会和其他无稳定文本契约的运行时载体一样给出明确诊断,不再泄漏内部 cast 异常。 - Compiler 门禁已验证 10,297 个真实场景,行覆盖率 98.94%、分支覆盖率 96.01%,达到 10,000 / 98% / 96% 发布门槛。 完整历史见 [release notes](docs/releases/release-notes.md)。 ## 安装 ```bash dotnet add package Jazor --version 0.1.46 ``` `Jazor` 包包含核心运行时契约、`ECMAScript`、`ECMAScript.Vue3`、`ECMAScript.VueContract`、`Jazor.Compiler`、`Jazor.Analyzer`、ASP.NET Core 集成程序集、emit 工具和 MSBuild props/targets。Razor-to-Vue 生成由独立的 `Jazor.Vue` 包提供。 Razor SDK 项目需显式启用: ```xml ``` 按需显式添加生态包: ```xml ``` ## 编写方式 ### ECMAScript 模块 使用 `[ECMAScriptModule]` 将普通 C# 生成 JavaScript 模块: ```csharp using ECMAScript; namespace MyApp; [ECMAScriptModule("shared/greetings.mjs")] public static class GreetingModule { public static string Prefix() => "Hello"; public static string Compose(string name) => $"{Prefix()}, {name}"; } ``` 编译器会生成具名导出的 ECMAScript 模块。其他模块调用 `GreetingModule.Compose(...)` 时,跨模块导入会自动解析。 ### Vue 3 `h()` 组件 直接使用 C# 编写 Vue 组件时,引用 `ECMAScript.Vue3`: ```csharp using ECMAScript; using static ECMAScript.Vue3; namespace MyApp; [ECMAScriptModule("app/counter.mjs")] public static class CounterModule { public static IVueComponent Counter => DefineComponent(new VueComponentOptions { Setup = () => { var count = Ref(0); return () => H("button", new VueObject { Events = new VueDictionary { ["click"] = (Action)(() => count.Value++) } }, $"Count: {count.Value}"); } }); } ``` ### Razor-to-Vue 组件 Razor 组件仅以最终 Roslyn 编译结果作为生产输入: - 在声明 `.razor` 或 `.razor.cs` 组件的项目中引用 `Jazor.Vue`。 - 集成层从完成后的 Razor 源生成器编译结果中绑定生成的 `BuildRenderTree` 操作。 - `Jazor.Compiler` 降低已绑定的语义,`Jazor.Emit` 物化 Vue render-function 产物。 - 不需要 `EnableRazorHostOutputs`、Razor 宿主输出设置、Razor IR/文档模型或生成 C# 的二次解析。 实现细节见 [Razor-to-Vue 设计](docs/01-%E7%9B%AE%E6%A0%87/razorvue/README.md)。 ### 确定性 CSS-in-JS 应用需要结构化运行时样式时,显式引用 `ECMAScript.Style`: ```csharp using ECMAScript.Style; using static ECMAScript.Style.css; var actionClass = style(new CssRule { Display = inlineFlex, Gap = rem(0.5), Width = percent(100) - rem(2), Color = varOr("--action-color", color("white")), BackgroundColor = hex("1769aa"), Children = [ new(CssChildKind.Selector, "&:hover", new CssRule { BackgroundColor = hex("125486") }) ] }); ``` 该包依据锁定的 Webref 语法快照生成 705 个标准属性。C# 原生 union 区分长度、百分比、颜色、时间、display 等值域;`raw(...)` 显式承载未来或尚未建模的语法。稳定内容命名、支持 nonce 的 `document` / `ShadowRoot` 所有权、detached 提取与水合共享同一运行时合同。`style(...)` 返回普通字符串,可直接用于常规模块和 RazorVue `class` 属性;构建不增加 CSS 专用 MSBuild 属性,debug 模式在 `JazorDir` 下物化 `style.mjs`。 详细合同见 [ECMAScript.Style 包指南](src/ECMAScript.Style/README.md) 与 [目标边界](docs/01-%E7%9B%AE%E6%A0%87/ecmascript.style/README.md)。 ## MSBuild 属性 由于 `JazorMode` 默认值为 `none`,类库无需配置输出。 开发构建使用 debug 产物时,配置如下: ```xml debug $(MSBuildProjectDirectory)\wwwroot\jazor\ ``` 生产发布生成 bundle 时,配置如下: ```xml release $(MSBuildProjectDirectory)\wwwroot\jazor\ Deno ``` `debug` 与 `release` 互斥。`release` 在内部完成中间物化,清空 `JazorDir` 后仅在该目录写出 `bundle.js` 和 `bundle.js.map`。 | 属性 | 默认值 | 说明 | |------|--------|------| | `JazorMode` | `none` | `none` 不输出;`debug` 写出模块和清单;`release` 写出生产包。 | | `JazorDir` | `$(MSBuildProjectDirectory)\wwwroot\jazor\` | debug 模块或 release 生产包的输出根目录。 | | `JazorTool` | `Deno` | 选择 release 工具链,目前支持 `Deno` 或 `Netpack`。 | 包和 emit 细节见 [src/Jazor/README.md](src/Jazor/README.md) 与 [src/Jazor.Emit/README.md](src/Jazor.Emit/README.md)。 ## 仓库结构 ```text Jazor/ ├── src/ │ ├── Jazor.Compiler/ # C# -> JavaScript 编译器核心 │ ├── Jazor.CLR/ # CLR runtime 映射和 JavaScript helper │ ├── Jazor.Analyzer/ # 静态分析诊断 │ ├── Jazor.RazorVue/ # Generator 集成、SG 结果绑定与 Vue render framing │ ├── Jazor.Emit/ # 物化、manifest、source map 与打包 │ ├── Jazor.Admin/ # UI 无关的管理后台外壳契约与 Razor 组件 │ ├── JazorAdmin/ # TDesign 集成示例与包消费冒烟验证 │ ├── ECMAScript.Style/ # 强类型、确定的 CSS-in-JS runtime │ ├── Jazor.Common/ # 共享格式化 / source-map 工具和契约 │ ├── Jazor.AspNetCore*/ # ASP.NET Core runtime 与开发期集成 │ ├── Jazor/ # NuGet 包,打包核心 SDK 资产 │ ├── Jazor.Vue/ # 显式启用的 Razor-to-Vue NuGet 包 │ ├── ECMAScript*/ # ECMAScript AST/contract 与 Vue 生态绑定 │ └── *Test/ # MSTest 回归项目 ├── samples/ │ ├── Jazor.MultiProject/ # 多项目模块发射基线示例 │ ├── ECMAScript.Pinia.Counter/ # Vue 3 + Pinia 示例 │ └── RazorVue.TodoList/ # 待转型的旧示例 ├── docs/ # 目标、计划、状态快照、补充规则、遗弃材料 └── scripts/csharp/ # 仓库自动化脚本 ``` ## 开发 环境要求: - 与 [global.json](global.json) 匹配的 .NET 11 SDK preview - Windows、Linux 或 macOS - 只有 `src/ECMAScript.WebIDL` 下已归档的 WebIDL TypeScript generator 需要 Node/npm 从仓库根目录运行常用命令: ```bash dotnet restore Jazor.slnx dotnet build Jazor.slnx # 仓库主测试入口 dotnet run --file scripts/csharp/test-dotnet.cs # 聚焦测试套件 dotnet test src/Jazor.CompilerTest/Jazor.CompilerTest.csproj dotnet run --file scripts/csharp/verify-compiler-coverage.cs dotnet run --file scripts/csharp/test-dotnet.cs -- --project style dotnet run --file scripts/csharp/test-dotnet.cs -- --project style-browser dotnet test src/Jazor.RazorVue.Sg.Test/Jazor.RazorVue.Sg.Test.csproj dotnet test src/Jazor.EmitTest/Jazor.EmitTest.csproj # 单个测试类示例 dotnet test src/Jazor.CompilerTest/Jazor.CompilerTest.csproj --filter "SemanticWalkerPatternTest" ``` 仓库自动化脚本应使用 `scripts/csharp/` 下的单文件 C# 入口;避免新增 PowerShell build/test wrapper。 ## 文档 | 需求 | 入口 | |------|------| | 仓库文档中心 | [docs/README.md](docs/README.md) | | 当前工作流总览 | [docs/02-计划/workstream-dashboard.md](docs/02-%E8%AE%A1%E5%88%92/workstream-dashboard.md) | | 编译器实现原则 | [src/Jazor.Compiler/ImplementationPrinciples.md](src/Jazor.Compiler/ImplementationPrinciples.md) | | 编译器状态 | [docs/03-完成/compiler/status.md](docs/03-%E5%AE%8C%E6%88%90/compiler/status.md) | | RazorVue 设计 | [docs/01-目标/razorvue/README.md](docs/01-%E7%9B%AE%E6%A0%87/razorvue/README.md) | | ECMAScript.Style 设计与状态 | [docs/01-目标/ecmascript.style/README.md](docs/01-%E7%9B%AE%E6%A0%87/ecmascript.style/README.md)、[docs/03-完成/ecmascript.style/status.md](docs/03-%E5%AE%8C%E6%88%90/ecmascript.style/status.md) | | 架构转型计划 | [docs/02-计划/Jazor 架构转型开发计划.md](docs/02-%E8%AE%A1%E5%88%92/Jazor%20%E6%9E%B6%E6%9E%84%E8%BD%AC%E5%9E%8B%E5%BC%80%E5%8F%91%E8%AE%A1%E5%88%92.md) | | G0 决策记录 | [docs/02-计划/RazorSgFinalDocument.G0.DecisionRecord.md](docs/02-%E8%AE%A1%E5%88%92/RazorSgFinalDocument.G0.DecisionRecord.md) | | Emit 状态 | [docs/03-完成/emit/status.md](docs/03-%E5%AE%8C%E6%88%90/emit/status.md) | 文档按以下目录组织: - `docs/01-目标/`:目标和设计理由 - `docs/02-计划/`:计划、里程碑和工作拆分 - `docs/03-完成/`:状态快照和评审结果 - `docs/04-补充/`:治理规则和补充约束 - `docs/05-遗弃/`:已遗弃历史材料 `docs/03-完成/compiler/testing/` 应视为历史审计材料。判断当前 compiler 事实时,优先阅读 `src/Jazor.Compiler/ImplementationPrinciples.md`、`docs/03-完成/compiler/status.md` 和当前 compiler / test README。 ## 贡献 欢迎贡献。请保持改动范围清晰,遵守仓库约定;当工作流边界或公共契约变化时,同步更新相关文档 / 状态页。 ## 许可证 本项目采用 MIT 许可证。详见 [LICENSE.txt](LICENSE.txt)。 ## 致谢 - [Roslyn](https://github.com/dotnet/roslyn) — C# 编译器平台 - [Acornima](https://github.com/adams85/acornima) — JavaScript 解析器和 AST 库 - [WebRef](https://github.com/w3c/webref) — Web 规范引用 - [DenoHost](https://github.com/thomas3577/DenoHost) — .NET 的 Deno runtime host - [WootzJs](https://github.com/kswoll/WootzJs)、[h5](https://github.com/curiosity-ai/h5)、[SharpKit](https://github.com/SharpKit/SharpKit) — 早期 C# 到 JavaScript 编译器 ## 安全策略 如果你发现安全漏洞,请通过 [GitHub Security Advisories](https://github.com/devhxj/Jazor/security/advisories/new) 私下报告。不要为安全问题创建公开 Issue。 ## 反馈 - [报告 Bug](https://github.com/devhxj/Jazor/issues/new?template=bug_report.md) - [功能请求](https://github.com/devhxj/Jazor/issues/new?template=feature_request.md) - [讨论区](https://github.com/devhxj/Jazor/discussions)