发布于 2026-01-06 6 阅读
0

我构建了一个比 EJS 快 3 倍的 JS 模板引擎。

我构建了一个比 EJS 快 3 倍的 JS 模板引擎。

经过数百小时的开发,我终于在上周发布了我的开源项目。Eta是一个可插拔、轻量级且速度极快的 JavaScript 模板引擎,我创建它的目的是为了替代 doT 和 EJS。

不过,在开始讨论我的开发历程之前,让我先概述一下 Eta 和 EJS 之间的一些区别。

Eta 与 EJS:
Eta 的语法与 EJS 非常相似(大多数模板应该可以同时兼容这两个引擎),Eta 的 API 也类似,并且 Eta 和 EJS 使用相同的文件处理逻辑。以下是 Eta 和 EJS 之间的区别:

  • Eta 更轻量级。Eta压缩后的大小约为 2KB,而 EJS压缩后的大小为 4.4KB。
  • Eta 编译和渲染模板的速度比 EJS 快得多请查看以下基准测试:https://ghcdn.rawgit.org/eta-dev/eta/master/browser-tests/benchmark.html
  • Eta 允许左侧空格控制(使用 `\n` -),这在 EJS 中不起作用,因为 EJS-在左侧使用 `\n` 来指示该值不应被转义。相反,Eta 使用 `\n`~来输出原始值。
  • Eta 提供了更灵活的分隔符设置——例如,你可以将它们设置为 `\`{{和 `\ }}`,而 EJS 则无法做到这一点。
  • Eta 增加了插件支持
  • Eta 中的注释功能/* ... */允许围绕模板标签添加注释,并且更加一致。
  • Eta 可以正确解析字符串。例如:<%= "%>" %>在 Eta 中可以正常工作,但在 EJS 中会出错。
  • Eta 公开了 TypeScript 类型并分发了 UMD 构建版本。
  • 自定义标签类型前缀。例如:您可以更改<%=<%*

Eta 和 EJS 共享的特性

  • 异步支持
  • 部分支持
  • 文件处理支持
    • Eta 的文件处理代码借鉴自 EJS,EJS 每周下载量超过 150 万次,非常可靠 😉
  • Express.js 支持
  • EJS 语法高亮工具在一定程度上可以与 Eta 兼容。

我为什么要建造 Eta?

我的这段旅程始于大约两年前,当时我创建了一个名为Squirrelly的模板引擎。经过数百小时的性能基准测试和尝试数十种不同的解析方法后,我最终突破了所有其他流行模板引擎的速度瓶颈。

过去一年,我一直在开发 Squirrelly 的下一个版本,它添加了一些重要功能,例如模板继承和更完善的字符串解析。在对 Squirrelly 进行基准测试时,我发现它比其他模板引擎(例如 EJS)快得多——即使它支持辅助函数、过滤器、模板继承等功能。

我决定利用 Squirrelly 的框架(所有幕后代码),我已经对其进行了充分的优化和测试,并在此基础上创建一个简单的嵌入式模板引擎。新的模板引擎将比大多数其他模板引擎更易于配置,极其轻量级,速度非常快,而且比大多数其他模板引擎更可靠。

我将新的模板引擎命名为“eta”,原因有几个:
1)Eta 在世界语中是“微小的”的意思,而 Eta 本身就是一个很小的模板引擎;
2)Eta 是希腊字母表中的一个字母,我把它用作一个很酷的标志;
3)“Eta”只有三个字母,这使得编写模板文件变得容易(例如footer.eta)。

几周之内,我就创建了 Eta 版本。由于无需操心 Squirrelly 的高级功能,Eta 的创建和测试时间大大缩短。借助 Docusaurus v2,我搭建了一个文档网站并编写了一个 Playground

吸取的一些教训

  • 在 JavaScript(至少在 V8 引擎中)中,正则表达式经过高度优化,速度远超遍历字符串中的每个字符并进行处理。
  • TypeScript 能捕获很多愚蠢的错误。
  • 运行代码覆盖率测试有助于发现不必要的(无用)代码。
  • 通过大量的反复试验,性能可以得到显著提升。
  • with () {}在 JavaScript 中,这会减慢执行速度,并可能导致令人困惑的错误。

伊塔的堆栈

  • 使用 TypeScript 编写
  • 使用 Rollup 编译(对于库文件而言,它生成的构建文件比 Webpack小得多)。
  • 使用 rollup-plugin-terser 压缩
  • 使用 Jest 进行测试
  • 使用 Coveralls 进行代码覆盖率分析
  • Travis CI 用于持续集成
  • 更美观的格式
  • 兼容 StandardJS 的 ESLint 用于代码检查
  • 用于自动生成 API 文档的 TypeDoc

希望您喜欢阅读我创建 Eta 的历程!如果您在未来的项目中需要嵌入式 JavaScript 模板引擎,不妨考虑使用 Eta 而不是像 EJS 或 doT 这样的库。

文章来源:https://dev.to/bgub/i-built-a-js-template-engine-3x-faster-than-ejs-lj8