新闻详情

新闻详情

首页 / 资讯中心 / 详情

EJS 4.0.1 发布解读:双模块(CommonJS/ES Modules)架构重构与从 3.x 升级的迁移指南

发布时间:2026/9/26 10:29:01来源:尧图网络
EJS 4.0.1 发布解读:双模块(CommonJS/ES Modules)架构重构与从 3.x 升级的迁移指南
后端【免费下载链接】ejsEmbedded JavaScript templates -- http://ejs.co项目地址https://gitcode.com/gh_mirrors/ej/ejs点击查看免费下载导读本文基于 EJS 仓库中的 RELEASE_NOTES_v4.md 发布说明深入解读 4.0.1 这一里程碑版本它以 TypeScript 编译器重构了 CommonJS 构建流程引入了 CommonJS 与 ES Modules 双模块发布架构并通过exports字段实现了对使用方完全透明的模块路由。读完本文你将掌握 4.0.1 的架构改动全貌、破坏性变更清单以及从 3.x 无痛升级的完整迁移步骤同时我们还会结合仓库源码package.json、jakefile.js、tsconfig.json、lib/esm/ejs.js 等验证这些改动背后的真实实现。版本概览EJS 4.0.1 是一次主版本发布核心目标可以概括为三点架构改进将 CommonJS 构建改为由 TypeScript 编译器生成代码质量、可维护性与向后兼容性都得到了系统性提升模块能力增强同时发布 CommonJS 与 ES Modules 两种构建产物并补齐package.json的exports字段让 Node.js、Deno 乃至浏览器打包工具都能按标准方式解析 EJS兼容性延续保持对 Node.js 0.12.18 及更早版本的兼容当前仓库的 package.json 中engines.node仍声明为0.12.18并改进了模板代码生成中对 JavaScript 关键字的处理。值得注意的是当前仓库的package.json版本号已演进至 6.0.1依然完整保留着 4.0.1 奠定的双模块结构因此本文引用的源码事实既来自 4.0.1 的发布说明也经当前仓库实现交叉印证。模块系统大改造一次彻底的双格式发布双模块支持CJS 与 ESM 两套构建产物4.0.1 之前EJS 只有一个 CommonJS 入口lib/ejs.js。4.0.1 起仓库同时维护两套产物lib/cjs/ejs.jsCommonJS 构建供require()使用lib/esm/ejs.js原生 ES Modules 源码供import使用。从当前仓库的目录结构看lib/esm/ 下直接存放了ejs.js、parseargs.js、utils.js三个 ESM 源文件并通过 lib/esm/package.json内容为{type: module}显式声明该目录为 ESM 作用域。而lib/cjs/目录并不存在于源码中它是由构建任务生成的产物目录。构建流程TypeScript 编译器把 ESM 编译为 CJS这是 4.0.1 最核心的架构变化CommonJS 构建不再手写维护而是用 TypeScript 编译器tsc从 ESM 源码自动生成。构建任务定义在 jakefile.js 的compile任务中task(compile, function () { // Compile CJS version exec(npx tsc); // ...后处理步骤 });而 tsconfig.json 中的关键配置决定了编译产物形态target: es5输出 ES5 语法配合engines.node: 0.12.18确保能在老版本 Node.js 上运行module: commonjs将 ESM 源码编译为 CommonJS 模块outDir: ./lib/cjs产物输出到lib/cjs/目录include: [./lib/esm/ejs.js, ./lib/esm/parseargs.js]以 ESM 源码为编译输入。compile任务在tsc之后还有三步后处理见 jakefile.js每一步都对应发布说明中的一项改动去除node:前缀ESM 源码为了 Deno 兼容使用了node:fs、node:path、node:url这类显式前缀可参考 lib/esm/ejs.js 的import fs from node:fs但 Browserify 无法解析带前缀的require(node:fs)因此编译后会把require(node:fs)替换回require(fs)同时修正node_fs_1这类标识符关键字替换let→var在代码生成字符串中把DECLARATION_KEYWORD let替换为var。这正对应发布说明中的 Replacedletin code-generation strings for CommonJS compatibility——在 ESM 源码中模板函数内部声明的变量使用let见 lib/esm/ejs.js而编译为 CommonJS 后改为var以兼容更老的 JavaScript 运行环境导出重写将 TypeScript 生成的exports.default ejs改写为module.exports ejsutils与parseargs同理从而保持require(ejs) ejs的直接引用语义。发布说明中 Namespace Node builtins将 Node 内建模块命名空间化正是由这套node:前缀 编译期去前缀机制实现的。最后任务还会写入 lib/cjs/package.json 为{type:commonjs}与lib/esm/的{type:module}形成互补确保两套产物在各自目录下都被 Node.js 正确识别。Package exports面向使用方的统一路由package.json 中 4.0.1 引入的字段结构至今未变main: ./lib/cjs/ejs.js, module: ./lib/esm/ejs.js, exports: { import: ./lib/esm/ejs.js, require: ./lib/cjs/ejs.js }mainCommonJS 时代的默认入口指向lib/cjs/ejs.jsmodule供支持module字段的打包工具如 Webpack、Rollup使用的 ESM 入口exportsNode.js 12.7 支持的标准字段按条件路由——import语句命中 ESM 构建require()调用命中 CJS 构建。它既约束了包的外部可见路径增强封装性也让使用方无需关心内部目录结构。兼容性改进向后兼容至 Node.js 0.12.184.0.1 明确将 Node.js 0.12.18 作为兼容下限。这一承诺由两处实现支撑engines.node字段package.json以及tsc的target: es5输出。对于需要运行在老旧 Node 环境中的项目4.0.1 意味着你可以直接升级而无需担心语法级不兼容。更干净的关键字替换模板引擎在生成 JavaScript 代码时需要避免与 JavaScript 保留字冲突。4.0.1 改进了代码生成中对关键字如delete、new等的处理方式配合上文的let→var调整保证生成的模板函数在各类运行环境下都能正确执行。构建系统的工程化改造4.0.1 同时对构建与测试流水线做了系统升级这些任务全部定义在 jakefile.js 中任务作用源码位置build总构建入口依次执行 lint → clean → compile → browserify → minifyjakefile.jscompile用tsc将 ESM 编译为 CJS 并做后处理jakefile.jslint分别用eslint.config_esm.mjs与eslint.config_cjs.mjs检查 ESM/CJS 代码jakefile.jstestOnly仅运行 Mocha 测试mocha --u tdd不重新构建jakefile.jstest:unit先 build 再 testOnly保证测试运行在最新构建产物上jakefile.js构建先于测试test:unit依赖build确保任何一次测试都针对刚刚编译出的产物进行避免源码已改、产物未更新导致的误判testOnly的用途在无需改动代码、只想快速回归的场景下跳过完整构建直接跑测试显著缩短反馈周期版本号在打包时注入发布说明提到 Version string is now baked in during packaging process。在 jakelib/ecosystem.js 中可以看到打包任务从package.json读取当前版本号并生成pkg/ejs-vversion.tar.gz版本信息在打包环节被固定进发布物避免发布内容与元数据不一致。此外browserify生成浏览器可用的一体化 ejs.js与minify生成 ejs.min.js任务继续存在配合package.json中的browser、jsdelivr、unpkg字段为 CDN 与浏览器直引场景提供产物。文档与依赖清理4.0.1 还包含一批质量性改动JSDoc 全面翻新路径与引用全部更新文档生成任务doc/devdoc直接以lib/esm/*与docs/jsdoc/*为输入见 jakefile.js两个具体修复修正了 async 选项描述中缺失的右括号issue #766由 Adnan Tahir 提交将 JSDoc 引用从 usejsdoc.org 更新为 jsdoc.appissue #778由 Thomas Skardal 提交删除过时文档清理了仓库中不再适用的旧文档开发依赖升级更新 ESLint、TypeScript 及构建工具链版本当前仓库的 package.json 中可见typescript ^5.4.5、eslint ^9.1.1等移除 package-lock.json仓库不再提交锁文件代码清理与测试修复移除未使用的 import修复失败的测试保持测试套件稳定。破坏性变更包结构三处变化升级到 4.0.1 需要知悉以下三处包结构变更它们都属于内部路径变化、外部 API 不变的性质main入口变更从./lib/ejs.js改为./lib/cjs/ejs.js新增module字段指向./lib/esm/ejs.js新增exports字段定义import/require各自的路由。对绝大多数用户而言这些变化完全透明——你既不需要改require(ejs)也不需要改import ejs from ejs因为exports字段已经替你完成了路由。但如果你在代码中直接引用了 EJS 包内部的深层路径例如require(ejs/lib/ejs)exports字段的引入会让这类越界引用失效这正是它作为包边界保护器的设计意图。从 3.x 升级到 4.0.1 的迁移指南发布说明给出了三条明确指引以下逐一展开1. ES Modules 用户直接升级即可// 在 Node.js、Deno 以及其他 ESM 环境中均可用 import ejs from ejs;该语句会被exports.import条件解析到lib/esm/ejs.js。如果使用 TypeScript项目中通常还需要配置esModuleInterop: true与 EJS 自身 tsconfig.json 的做法一致。Deno 用户4.0.1 起 EJS 支持通过 npm 说明符直接导入import ejs from npm:ejs;这一能力并非偶然——ESM 源码中所有 Node 内建模块均以node:前缀导入见 lib/esm/ejs.js而compile任务在后处理时才去掉该前缀以适配 Browserify从而保证 ESM 产物可以在 Deno 这类严格 ESM 运行时中被直接加载。仓库的生态测试jakelib/ecosystem.js也专门为 Deno 编写了 smoke test直接以import ejs from ./vendor/ejs/lib/esm/ejs.js方式验证渲染结果% name %配合{name: }输出lt;gt;amp;。2. CommonJS 用户直接升级即可const ejs require(ejs);exports.require条件会自动路由到lib/cjs/ejs.js。仓库的打包兼容性测试jakefile.js用cjs-smoke.cjs验证了require(ejs)后ejs.render可用、HTML 转义行为正确。3. 无需修改任何业务代码得益于exports字段的透明路由3.x 时代的既有代码无需任何改动即可在 4.0.1 上运行。唯一需要留意的场景是如果你曾直接引用包内部文件路径请改为顶层导入此外建议在升级后跑一遍测试确认无异常。安装npm install ejs4.0.1安装完成后可通过以下方式快速验证双模块是否都工作正常# CommonJS 验证 node -e const ejs require(ejs); console.log(ejs.render(% name %, {name: EJS})) # ESM 验证Node.js 13.2 或使用 .mjs 文件 node --input-typemodule -e import ejs from ejs; console.log(ejs.render(% name %, {name: EJS}))若本地有仓库源码并安装了依赖还可以运行npx jake build亲手观察 ESM → CJS 的完整编译与后处理过程或运行npx jake testOnly直接执行测试套件jakefile.js。小结EJS 4.0.1 是一次对内重构、对外透明的主版本发布它用 TypeScript 编译器统一了构建链让 CommonJS 产物从手写转为自动生成降低了长期维护成本双模块发布配合exports字段使 EJS 在 Node.jsCJS/ESM、Deno、浏览器打包器之间拥有了标准、一致的模块解析体验而let→var、node:前缀等编译期细节处理则同时守护了老版本 Node.js 与严格 ESM 运行时的兼容性。从 3.x 升级到 4.0.1绝大多数项目只需重新安装依赖即可真正的工程量早已被构建系统代劳。对于希望深入了解实现细节的读者建议对照阅读 jakefile.js构建与测试编排、tsconfig.jsonCJS 编译配置、package.json模块入口与 exports 路由以及 lib/esm/ejs.jsESM 源码与代码生成逻辑。赞分享后端【免费下载链接】ejsEmbedded JavaScript templates -- http://ejs.co项目地址https://gitcode.com/gh_mirrors/ej/ejs点击查看免费下载相关推荐使用 ES Modulesimport/export重构前端代码从 CommonJS 迁移到原生模块规范使用 ES Modulesimport/export重构前端代码从 CommonJS 迁移到原生模块规范 本指南以 Front End ChecklistDCGAN在医学影像生成中的应用基于DLTK的脑部MRI合成DCGAN在医学影像生成中的应用基于DLTK的脑部MRI合成 DLTKDeep Learning Toolkit for Medical Image Ana深度学习计算机视觉10分钟渲染你的第一个3D高斯场景gauss-splat快速上手教程Rasterizer相机参数渲染流水线10分钟渲染你的第一个3D高斯场景gauss splat快速上手教程Rasterizer相机参数渲染流水线 gauss splat 是一个基于华为 C图形学算子库计算机视觉人工智能CANNAscend上一篇完整Cocos SDK集成指南三步把广告与分析SDK接入Cocos Creator游戏下一篇AI Research Skills让 AI 代理自主完成 AI 研究的 98 项技能库创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

NC57+Oracle10g在Win2012R2上的兼容部署实战 2026/9/26 15:25:00

NC57+Oracle10g在Win2012R2上的兼容部署实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
尼康VMR-1515影像测量仪二手采购与实操精度解析 2026/9/26 15:24:59

尼康VMR-1515影像测量仪二手采购与实操精度解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
MySQL 8.0 实战学习路径:Docker 环境搭建+故障排查+性能分析 2026/9/26 15:24:53

MySQL 8.0 实战学习路径:Docker 环境搭建+故障排查+性能分析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
2025年从微软官网手动下载Win10原版ISO完整指南 2026/9/26 15:24:47

2025年从微软官网手动下载Win10原版ISO完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Excel双击才生效?揭秘单元格格式与存储值机制及批量转换方案 2026/9/26 15:24:40

Excel双击才生效?揭秘单元格格式与存储值机制及批量转换方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
如何“训练” Codex 的 Skill:从 SKILL.md 到 config.toml 的实战配置 2026/9/26 15:24:40

如何“训练” Codex 的 Skill:从 SKILL.md 到 config.toml 的实战配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉