Jasmine.Format - 一个高性能、线程安全的 .NET HTML 生成库

发布时间:2026/7/5 2:59:02

Jasmine.Format - 一个高性能、线程安全的 .NET HTML 生成库 为什么需要 Jasmine.Format传统的 HTML 字符串拼接方式存在以下问题安全隐患手动拼接容易忘记 HTML 编码导致 XSS 攻击风险代码冗长字符串拼接代码难以阅读和维护性能问题频繁的字符串分配造成 GC 压力线程安全可变对象在多线程环境下需要额外同步Jasmine.Format 旨在解决这些问题提供一个流畅、安全、高效的 HTML 生成解决方案。核心特性1. 自动 HTML 编码防止 XSS 攻击var p new HtmlP().Add(scriptalert(XSS)/script); // 输出: plt;scriptgt;alert(#39;XSS#39;)lt;/scriptgt;/p所有通过Add()方法添加的文本都会自动进行 HTML 编码有效防止 XSS 攻击。只有在明确信任内容时才使用AddRaw()方法。2. 流畅的 API 设计var html new HtmlP() .Add(您好) .Add(new HtmlSpan(张三, #0066cc)) .Add(欢迎使用系统。) .WithStyle(font-size: 14px; line-height: 1.5;) .ToHtml(); // 输出: p stylefont-size: 14px; line-height: 1.5;您好span stylecolor:#0066cc;张三/span欢迎使用系统。/p链式方法调用让代码简洁直观易于阅读和维护。3. 不可变模式天然线程安全var original new HtmlP().Add(原始内容); var modified original.Add(新增内容); // original 保持不变 Console.WriteLine(original.ToHtml()); // p原始内容/p Console.WriteLine(modified.ToHtml()); // p原始内容新增内容/p每次操作返回新实例原始实例保持不变。这种不可变设计使得对象可以在多线程环境下安全共享无需任何同步机制。4. 高性能优化对象池复用 List 对象减少 GC 压力StringBuilder 缓存线程本地缓存提高字符串构建效率容量预估预先分配 StringBuilder 容量避免重新分配// 对象池配置 private static readonly ObjectPoolListobject _listPool new ObjectPoolListobject(() new Listobject(), 32);5. 多框架支持支持 .NET Standard 2.0、.NET 6/7/8/9/10可在各种 .NET 项目中使用。快速入门安装dotnet add package Jasmine.Format基础用法创建段落using Jasmine.Format; using Jasmine.Format.Elements.Text; using Jasmine.Format.Elements.Basic; // 简单段落 var p new HtmlP().Add(Hello, World!); // 带样式的段落 var p new HtmlP().Add(内容).WithStyle(text-align: center;); // 混合内容 var p new HtmlP() .Add(访问 ) .Add(new HtmlA(示例网站, https://example.com, _blank)) .Add( 了解更多);创建列表using Jasmine.Format.Elements.List; // 无序列表 var ul new HtmlList(ListType.Unordered) .AddItem(项目一) .AddItem(项目二) .AddItem(项目三); // 有序列表从 5 开始 var ol new HtmlList(ListType.Ordered, 5) .AddItem(第五步) .AddItem(第六步); // 批量添加 var items new[] { A, B, C }; var ul new HtmlList(ListType.Unordered).AddRange(items);创建容器using Jasmine.Format.Elements.Container; var div new HtmlDiv(border: 1px solid #ccc; padding: 10px;) .Add(new HtmlP().Add(标题)) .Add(new HtmlP().Add(new HtmlSpan(高亮文本, #ff6600)));高级用法条件渲染var isAdmin true; var p new HtmlP() .Add(用户) .Add(userName) .Add(isAdmin ? (管理员) : );批量操作var trains new[] { new { Station 北京, TrainNo G123, Status 正常 }, new { Station 上海, TrainNo G456, Status 晚点 } }; var p new HtmlP() .Add(列车信息) .AddSpanRange(trains, t new HtmlSpan( ${t.Station}开{t.TrainNo}次, t.Status 正常 ? green : red ));模板格式化using Jasmine.Format.Utilities; // 位置参数 var html HtmlFormatHelper.Format( 欢迎 {0}, 年龄: {1}, 张三, 25 ); // 命名参数 var dict new Dictionarystring, string { { name, 李四 }, { age, 30 } }; var html HtmlFormatHelper.FormatTemplate( 姓名: {name}, 年龄: {age}, dict );性能测试在内部测试中Jasmine.Format 在高并发场景下表现优异测试场景传统字符串拼接Jasmine.Format1000 次循环生成~15ms~8ms内存分配次数~2000 次~500 次多线程并发需要同步无需同步实际应用场景1. 邮件模板生成var emailBody new HtmlDiv(font-family: Arial;) .Add(new HtmlP().Add($尊敬的 {userName})) .Add(new HtmlP().Add(您的订单已发货详情如下)) .Add(new HtmlList(ListType.Unordered) .AddRange(orderItems.Select(i ${i.Name} - {i.Price}元))) .ToHtml();2. 报表生成var report new HtmlDiv() .Add(new HtmlP($报告日期{DateTime.Now:yyyy-MM-dd}).WithStyle(font-weight: bold;)) .Add(new HtmlList(ListType.Ordered) .AddRange(summaryItems)) .ToHtml();3. 动态通知内容var notification new HtmlP() .Add(new HtmlSpan(系统通知, #ff6600, font-weight: bold;)) .AddRaw(br/) .Add(messageContent) .ToHtml();最佳实践始终使用 Add() 方法除非内容完全可信否则不要使用AddRaw()利用不可变性在多线程环境下放心共享 HtmlP、HtmlDiv 等对象批量操作使用AddSpanRange、AddRange等方法处理集合数据样式分离将样式集中管理便于维护开源与贡献Jasmine.Format 是一个开源项目欢迎社区贡献GitHub: [项目地址]MIT 许可证129 单元测试覆盖

相关新闻