我构建了一个比 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