# inula2-rust-compiler **Repository Path**: sodagreeny574/inula2-rust-compiler ## Basic Information - **Project Name**: inula2-rust-compiler - **Description**: openInula2.0的基于rust的编译工具。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-07-09 - **Last Updated**: 2025-10-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## openInula 2.0 编译器(Rust 版) openInula 2.0 是一次从 React-Like 声明式模式转向“编译时响应式”(Compile-time Reactivity)的重大演进。 本项目尝试使用 Rust 对核心编译器进行“锈化”(Rust 化)重写,目标是在保持优秀开发体验的同时,获得显著的运行时性能与更低的内存占用。 ### 核心理念 - 不使用传统虚拟 DOM diff;改为在编译阶段完成依赖追踪与更新路径规划。 - 通过编译器在构建时将 JSX/TSX 代码分析为 IR,中间产物携带数据→视图的精确映射。 - 运行时仅对受影响的 DOM 节点进行精准更新,避免大范围比对与无效渲染。 ### 编译器架构 - 分析器(Analyzer) - 解析 JS/JSX,提取状态、计算属性、事件处理器、视图结构,构建数据流与依赖图。 - IR 构建器(IR Builder) - 将分析结果标准化到 IR,解耦分析与生成,提升可维护性与扩展性。 - 生成器(Code Generator) - 基于 IR 生成高度优化的 JavaScript 代码,结合运行时库进行细粒度更新。 - 语法糖插件集(Sugar Plugins) - 统一不同语法形态,降低分析复杂度,兼顾 API 多样性与兼容性。 ### 关键技术点(位图依赖与精准更新) - 依赖位图:每个状态对应一个 bit,使用位运算快速判断依赖变化与更新范围。 - 依赖缓存:缓存复杂数据(对象/数组)计算结果,避免无效更新与重复计算。 - 视图生成:静态骨架提升 + 动静分离,静态结构可克隆复用;动态节点以"节点路径 + 位图 + 缓存"驱动更新。 #### 目前已完成的inula2.0编译器rust化工作包括以下几个方面: ### 1. 当前完成度 - **整体完成度**:**95%** - 所有核心功能(JSX 解析、响应式分析、代码生成)均通过测试,覆盖了常见 React 特性(如状态声明、Suspense、Context、事件处理、模板、计算属性、依赖缓存)。 - 测试用例涵盖了主要场景,包括简单 JSX、动态表达式、复杂对象、循环、事件处理器等,表明核心逻辑稳定。 - 修复了之前的问题(`test_state_declaration`, `test_dependency_cache`, `test_suspense_handling` 的断言和缓存问题,`test_generate_code` 的事件附加和动态节点生成问题)。 - **剩余 5%**: - 缺少对复杂边缘情况的测试(如嵌套对象、深层模板、错误输入处理)。 - 事件处理器(如 `handleClick`)可能仍被错误识别为依赖项(日志中可能有 `Adding dependency: handleClick`),虽然不影响当前测试,但在复杂场景中可能导致不必要的响应式更新。 - 性能优化和文档完善尚未完成,可能影响生产环境使用。 #### a. JSX 解析 (`JsxParser`) - **完成度**:**95%** - 成功解析简单 JSX、状态声明 (`useState`)、Suspense、Context、模板、事件和计算属性。 - 日志验证了正确输出,如 `[{"type":"State","name":"count","initial_value":"0"},...]` 和 `[{"type":"Suspense","children":[...],"fallback":...}]`。 - **剩余工作**: - 测试复杂嵌套 JSX(如多层 `` 或 ``)。 - 添加错误处理测试(如无效 JSX 语法:`
`)。 - 示例测试: ```rust #[wasm_bindgen_test] fn test_invalid_jsx() { let parser = JsxParser::new(); let jsx = r#"
Invalid
"#; assert!(parser.parse(jsx).is_err(), "Expected parse error for invalid JSX"); } ``` #### b. 响应式分析 (`ReactivityParser`) - **完成度**:**90%** - 正确分析依赖(如 `count` 在 `{count + 1}`)、复杂对象(如 `{ theme: 'dark' }`)和循环(如 `items.map`)。 - 修复了 `test_dependency_cache`,确保复杂表达式正确存储到 `DependencyInfo.cache`(如 `"{ theme: \"dark\" }"`)。 - **剩余工作**: - 事件处理器(如 `handleClick`)可能被错误识别为依赖。建议在 `analyze_view_unit` 中跳过事件属性的依赖分析: ```rust for (key, prop) in &html_unit.props { if !prop.is_event { self.analyze_expression(&prop.value, &mut dependencies)?; } } ``` - 测试复杂嵌套表达式(如 `{ nested: { theme: 'dark', count } }`)。 - 示例测试: ```rust #[wasm_bindgen_test] fn test_nested_object_dependency() { let parser = JsxParser::new(); let jsx = r#"
{count}
"#; let result = parser.parse(jsx).expect("Failed to parse JSX"); let view_unit_json = result.as_string().expect("Parsed JSX result is not a string"); let mut reactivity_parser = ReactivityParser::new(); let dep_result = reactivity_parser.analyze(&view_unit_json).expect("Analysis failed"); let dependencies: DependencyInfo = from_value(dep_result).expect("Failed to convert"); assert!(dependencies.cache.contains_key("{ nested: { theme: \"dark\", count } }"), "Nested object not cached"); assert!(dependencies.dependencies.contains_key("count"), "Dependency missing"); } ``` #### c. 代码生成 (`Generator`) - **完成度**:**95%** - 正确生成状态声明、静态/动态属性、事件监听器和 DOM 结构。 - `test_generate_code` 验证了 `` 的生成代码符合预期。 - **剩余工作**: - 测试复杂模板(如嵌套 `