Sinon.JS 兼容性指南:ECMAScript 目标版本、浏览器运行时与 Node.js 支持策略全解析
测试开发工具【免费下载链接】sinonTest spies, stubs and mocks for JavaScript.项目地址https://gitcode.com/gh_mirrors/si/sinon点击查看免费下载Sinon.JS 是 JavaScript 领域使用最广泛的测试替身库spies、stubs、mocks之一。本文以仓库根目录下的权威文档 COMPATIBILITY.md 为核心骨架系统梳理 Sinon.JS 的兼容性承诺ECMAScript 版本目标从 ES5 演进到 ES2023 的移动靶策略、由 browserslist 查询定义的浏览器与 Node.js 运行时支持范围、基于 eslint-plugin-compat 与云端浏览器矩阵的自动化保障机制以及各历史大版本对应的 Node.js 支持表。读完本文你将能准确判断自己的浏览器、Node.js 环境是否处于 Sinon.JS 的支持范围之内并为旧环境选型做出正确决策。COMPATIBILITY.mdSinon.JS 兼容性目标的权威文档COMPATIBILITY.md 被定位为组成 Sinon.JS 的各库兼容性目标的权威资源canonical resource这意味着它不是一份随意的说明文档而是所有关于Sinon 支持什么环境、不承诺支持什么环境的最终裁决依据。它回答了三个层面的问题源码使用哪个版本的 ECMAScript 编写语言级别哪些浏览器与 Node.js 运行时在官方支持矩阵内运行时级别历史版本的 Node.js 支持情况版本回溯参考。文档全文精简却浓缩了项目的工程决策。下面逐节深入拆解并结合仓库源码与配置印证其落地方式。ECMAScript 版本目标从 ES5 走向 ES2023 的移动靶历史沿革与破坏性变更文档明确记载Sinon 历史上以ES5编写但从Sinon 102021 年 3 月开始官方做出了破坏性变更允许使用更现代的 ECMAScript 版本起点是ECMAScript 2017ES2017。这一变更的动机很直接测试库本身运行在开发者环境Node.js 或现代浏览器中而不是最终用户浏览器里。坚持 ES5 意味着源码要承受大量过时的语法约束而现代运行时的能力完全可以支撑更高效的实现。因此 Sinon 选择让源码跟上时代把兼容旧环境的成本转移给确实需要旧环境的少数使用者。移动靶的含义版本级别不固定文档将该节标题定为Moving target: ES2023并强调这不是一个固定级别。它暗示当前源码的实际语言水平已经远超 ES2017且会随时间继续推进——文档本身不会同步更新这个数字虽然偶尔也会更新。因此不要以Sinon 10 ES2017来推断当前版本的语言级别不要以文档标题中的 ES2023 作为精确的引擎要求它更像一个下限语义的占位标记唯一确定的承诺是在受支持的运行时中源码无需 transpiler 或 polyfill 即可直接运行。对旧运行时的处理建议文档给出的明确指导是对于旧运行时如老版本浏览器或过期 Node.js依赖 Sinon 的项目可以自行使用 transpiler如 Babel将 Sinon 源码转译到目标语法级别但使用更新的 API 可能会破坏功能——即 transpiler 只能解决语法层面的转换无法为运行时缺失的新 API 提供完整的语义 polyfill。如果确实需要支持旧浏览器官方建议回退到 Sinon 9那是最后一个基于 ES5 编写的主线版本。从仓库源码与打包配置验证现状当前仓库package.json中的版本号为22.0.0其分发配置印证了面向现代运行时的取向type: module源码以 ES 模块形式组织exports字段为 CommonJS 与 ESM 双通道分发require指向./lib/sinon.jsimport与browser条件均指向./pkg/sinon-esm.js见 package.json入口文件包括 src/sinon.js、src/sinon-esm.js 与 src/create-sinon-api.js。仓库还专门维护了 ESM 相关的验证脚本例如 test/es2015/module-support-assessment-test.mjs对应npm run test-esm-support用于评估运行环境的模块支持能力。这些工程细节都指向同一结论Sinon 面向现代 JavaScript 环境持续演进旧环境依赖是例外而非常态。运行时支持browserslist 配置逐条拆解配置全文Sinon.JS 的运行时支持目标来自共享的sinonjs/eslint-config以 browserslist 查询表达式表达文档与仓库根目录的 .browserslistrc 中完全一致 0.5% last 2 versions Firefox ESR not dead not IE 11 not op_mini all maintained node versions逐条语义解读这是一组标准的 browserslist 查询取并集语义含义如下查询含义 0.5%全球浏览器市场占有率超过 0.5% 的浏览器版本last 2 versions每个主流浏览器最近的两个稳定版本Firefox ESRFirefox 的扩展支持版本Extended Support Release面向企业用户长期维护not dead排除官方已停止维护超过 24 个月的浏览器not IE 11明确排除 IE 11这是 Sinon 放弃 IE 支持的最直接证据not op_mini all排除所有 Opera Mini 版本该浏览器对现代 JS 支持极差maintained node versions当前处于官方维护期内的 Node.js 版本含活跃版与 LTS整个查询以现代浏览器 维护中的 Node.js为锚点同时叠加 0.5%与last 2 versions两个维度覆盖市场主流版本再用not dead剔除僵尸浏览器。not IE 11与not op_mini all两条硬排除是最值得注意的信号Sinon 从 10.x 时代起就彻底不再为这两类受限环境做任何兼容承诺。若想查看该查询展开后的具体浏览器版本清单可以使用 browserslist.dev 这类可视化工具输入上述表达式进行实时解析这也是 COMPATIBILITY.md 原文推荐的实践方式。配置的单一事实来源值得注意的工程细节是运行时目标并非手工维护。browserslist 查询的真正源头是sinonjs/eslint-config包见 package.json 中sinonjs/eslint-config: ^7.0.3依赖仓库根目录的 .browserslistrc 与 COMPATIBILITY.md 中内嵌的代码块都是从该包同步而来避免多份配置漂移。这一同步机制详见下一节。兼容性的自动化保障eslint-plugin-compat 与同步脚本静态检查强制eslint-plugin-compat文档明确声明运行时兼容性由eslint-plugin-compat在 CI 层面强制执行。该插件的工作原理是解析项目的.browserslistrc配置得到受支持环境清单然后在 lint 阶段扫描源码中使用的 API一旦发现某个 API如Promise.finally、Object.fromEntries等在目标环境中不可用就报出兼容性错误。这保证了源码不会悄悄引入超出目标矩阵的语法或 API。仓库根目录的 eslint.config.js 直接展开引用了sinonjs/eslint-config...sinonConfig且lint脚本为eslint --max-warnings 0 **/*.{js,cjs,mjs}见 package.json即零警告容忍——任何兼容性违规都会导致 lint 失败从而阻断发布。保持文档与配置同步的脚本机制COMPATIBILITY.md 中内嵌的 browserslist 代码块被!-- browserslist start --与!-- browserslist end --注释标记包围不是手写的而是由 scripts/update-compatibility.cjs 自动生成该脚本从node_modules/sinonjs/eslint-config/.browserslistrc读取权威配置将其复制到仓库根目录供 eslint-plugin-compat 使用以流式方式读取 COMPATIBILITY.md把两个标记之间的内容替换为最新配置支持DRY_RUN环境变量进行演练而不落盘。该脚本挂在package.json的prebuild钩子中rimraf pkg npm run update-compatibility见 package.json因此每次构建发布前都会强制对齐文档与配置从机制上杜绝文档说的支持范围与实际 CI 检查的支持范围不一致。云端浏览器矩阵测试Sauce Labs除了静态 lint 检查Sinon 还通过Sauce Labs 云测试服务跑真实浏览器矩阵。COMPATIBILITY.md 中嵌有 Sauce Labs 测试状态徽章browser-matrix实时展示各浏览器上的测试通过情况。仓库中的落地配置佐证了这一流程scripts/test-cloud.sh 在MicrosoftEdge、chrome、firefox三种浏览器上依次执行测试对应npm run test-cloud脚本见 package.jsonmochify.webdriver.cjs 是 WebDriver 驱动配置它会断言必须提供BROWSER_NAME、SAUCE_USERNAME、SAUCE_ACCESS_KEY三个环境变量然后通过ondemand.saucelabs.com的 WebDriver Hub 在 Sauce Labs 云端启动browserVersion: latest的浏览器实例运行测试。这构成了静态检查lint 云端真实浏览器运行Sauce Labs的双层验证体系前者保证源码 API 在目标矩阵内可用后者验证行为在真实浏览器中不回归。此外scripts/run-browser-suite.mjs 还负责 headlessPuppeteer与 Web Worker 场景的浏览器测试进一步覆盖无头环境与 Web Worker 运行时。历史 Node.js 版本支持表文档末尾提供了一张回溯表用于需要支持某个已不支持的旧 Node.js 版本时的定向参考。原文信息必须完整保留Sinon.JS支持的 Node.js1818, 20, 221718, 201616, 18, 201514, 16, 181414, 16, 181312, 14, 161212, 14, 161112, 141010, 12, 14910, 1288, 10, 12读这张表可以得到几条规律每个 Sinon 大版本通常同时支持 3 个 Node.js 版本覆盖范围随时间滚动例如 Sinon 18 支持 18/20/22而 Sinon 15 则支持 14/16/18相邻大版本的支持窗口存在两年左右的平移例如 Sinon 12 和 13 都支持 12/14/16说明这两个版本生命周期高度重叠Sinon 9 是 ES5 时代的最后版本支持 Node.js 10/12而 Sinon 8 是唯一还覆盖 Node.js 8 的版本。需要强调该表仅作为旧环境定向支持的参考。当前版本仓库 package.json 显示为 22.0.0的 Node.js 支持范围由 browserslist 中的maintained node versions动态决定即只承诺官方仍在维护期内的 Node.js 版本。实践指引如何判断你的运行环境是否受支持判断浏览器支持将前文 browserslist 查询表达式输入 browserslist.dev 等可视化工具即可得到展开后的浏览器清单。若你的目标浏览器不在此清单内有两种选择升级浏览器让目标环境进入 0.5%、last 2 versions或Firefox ESR的覆盖范围回退到 Sinon 9如果目标环境属于 IE 11 或 Opera Mini 这类被硬排除的浏览器Sinon 9 是官方推荐的 ES5 兼容方案。判断 Node.js 支持对照上表确认你的 Node.js 版本落在某个 Sinon 大版本的支持行内对于当前版本则确认 Node.js 处于官方维护期活跃版或 LTS。若 Node.js 已过期但仍需使用最新 Sinon可以自行引入 transpiler 转译源码但要意识到新 API 的运行时缺失无法被完全 polyfill。一个关键的测试时机提示Sinon 是测试库它运行在测试执行环境中而非被测应用的线上环境。这意味着即使你的应用需要兼容 IE 11只要测试在 Node.js 或现代浏览器中执行使用最新 Sinon 并不会把语言级别要求传导到线上环境。只有当你坚持在受限的旧浏览器中直接运行测试用例时才需要严格对照支持矩阵。相关仓库文件速查以下文件是理解与验证 Sinon.JS 兼容性工程的关键路径可在当前仓库中直接查阅COMPATIBILITY.md —— 兼容性目标的权威文档本文骨架.browserslistrc —— 根目录 browserslist 配置与文档内嵌块一致scripts/update-compatibility.cjs —— 自动同步.browserslistrc与文档的脚本package.json —— 版本号22.0.0、exports双通道分发、prebuild/test-cloud/lint等脚本eslint.config.js —— 展开sinonjs/eslint-config零警告 lint 强制scripts/test-cloud.sh 与 mochify.webdriver.cjs —— Sauce Labs 云端浏览器矩阵测试的驱动与配置scripts/run-browser-suite.mjs —— headless 与 Web Worker 浏览器测试入口。综上Sinon.JS 的兼容性策略可以概括为一句话面向现代 ECMAScript 与维护中的运行时持续前进用 browserslist eslint-plugin-compat Sauce Labs 矩阵把支持什么变成可检查、可验证、不漂移的工程承诺同时用 Sinon 9 守住 ES5 时代最后的退路。赞分享测试开发工具【免费下载链接】sinonTest spies, stubs and mocks for JavaScript.项目地址https://gitcode.com/gh_mirrors/si/sinon点击查看免费下载相关推荐Angular 版本兼容性完全指南Node.js、TypeScript、RxJS 与浏览器支持策略详解Angular 版本兼容性完全指南Node.js、TypeScript、RxJS 与浏览器支持策略详解 本文以 Angular 官方文档中心本仓库 adev前端Web框架终极Piped浏览器兼容性指南支持与不支持的浏览器版本全解析终极Piped浏览器兼容性指南支持与不支持的浏览器版本全解析 想要享受Piped这个隐私友好的YouTube替代前端带来的流畅体验吗了解浏览器兼容性是关键第音视频前端Apollo Client 版本策略全解析SemVer 原则、浏览器兼容目标与依赖支持窗口Apollo Client 版本策略全解析SemVer 原则、浏览器兼容目标与依赖支持窗口 导读 本文基于仓库根目录的 VERSIONING_POLICY.前端GraphQL创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考