core-js 在 Deno 中的使用指南:用deno/corejs一键补齐 JavaScript 标准库
【免费下载链接】core-jsStandard Library项目地址: https://gitcode.com/GitHub_Trending/co/core-js
导读
deno/corejs是 core-js 为 Deno 运行时专门发布的打包版全局模块(Bundled Global Version),它把 core-js 的核心 polyfill 通过 webpack 压缩为单一文件index.js,开发者只需在入口文件顶部执行一次import,即可让 Deno 1.0+ 环境获得 ECMAScript 标准特性、提案特性和跨平台 Web 标准的完整支持。阅读本文后,你将掌握在 Deno 项目中安装与加载deno/corejs的正确姿势,理解它提供的能力边界(Promise、Symbol、集合、迭代器、TypedArray 与提案特性等),并学会用源码与测试印证其行为。
一、deno/corejs是什么
在仓库中,deno/corejs目录只包含三个文件:入口文件 index.js、说明文档 README.md 与 LICENSE。根据 index.js 头部的版权注释,该文件是core-js 3.50.0的产物,由 webpack 打包生成(文件中包含完整的 webpackBootstrap 模块缓存、__webpack_require__模块加载器以及 500+ 个模块定义),共 18366 行。
从文档定位看,README.md 明确指出:
It's a bundled global version for Deno 1.0+,for more info see
core-jsdocumentation。
即它是面向Deno 1.0 及以上版本的全局版本:polyfill 直接注入全局对象(Object、Array、Promise、Symbol等),与 npm 生态中core-js的"全局污染"模式一致,而仓库根目录 README.md 中演示的core-js-pure才是"不污染全局命名空间"的纯函数版本。二者能力相同,区别在于挂载方式。
二、快速上手:安装与加载
deno/corejs不走 npm,而是通过Deno 的 URL 导入机制直接引用。文档给出的唯一官方用法是在入口文件顶部导入:
import 'https://deno.land/x/corejs@v3.50.0/index.js'; // <- at the top of your entry point要点:
- 必须放在入口文件的最顶部,先于任何业务代码执行,确保后续代码运行时 polyfill 已就位;
- URL 中的
@v3.50.0是版本锚点,与 index.js 中声明的 core-js 版本3.50.0一致。Deno 默认缓存远程模块,重复运行不会重复下载; - 该 URL 指向 Deno 官方模块托管平台(deno.land/x),
deno/corejs目录本身即是该托管包的仓库源。
加载完成后,即可直接使用标准库能力,无需任何额外 import:
Object.hasOwn({ foo: 42 }, 'foo'); // => true [1, 2, 3, 4, 5, 6, 7].at(-3); // => 5 [1, 2, 3, 4, 5].group(it => it % 2); // => { 1: [1, 3, 5], 0: [2, 4] } Promise.any([ Promise.resolve(1), Promise.reject(2), Promise.resolve(3), ]).then(console.log); // => 1 (function * (i) { while (true) yield i++; })(1) .drop(1).take(5) .filter(it => it % 2) .map(it => it ** 2) .toArray(); // => [9, 25]验证运行时行为:以Object.hasOwn为例
Object.hasOwn在 index.js 中的实现是:优先复用引擎原生方法,否则回退为"自有属性检查"抽象操作:
module.exports = Object.hasOwn || function hasOwn(it, key) { return hasOwnProperty(toObject(it), key); };对应的单元测试位于 tests/unit-global/es.object.has-own.js,覆盖了:仅返回自有属性(create({ q: 42 })继承的属性返回false)、对null/undefined抛TypeError、现代行为下不调用参数的toString等语义。运行方式为deno run --allow-read https://.../index.js加载后,直接调用Object.hasOwn即可验证。
三、能力全景:一份打包版能提供什么
根据 README.md 的定位描述,core-js 是模块化的 JavaScript 标准库,包含以下能力域:
| 能力域 | 涵盖内容 |
|---|---|
| ECMAScript(截至 2021 已定稿) | Promise、Symbol、集合(Map/Set/WeakMap/WeakSet)、迭代器、TypedArray 等 |
| ECMAScript 提案 | 如Array.prototype.group、迭代器辅助方法(drop/take/filter/map/toArray)等 |
| 跨平台 WHATWG / W3C 特性与提案 | 如URL与URLSearchParams |
- 按需加载:core-js 生态支持只加载所需特性(npm 版通过
import 'core-js/actual/promise'等子路径实现,见 README.md),而deno/corejs是全量捆绑版,一次导入覆盖所有能力,适合作为 Deno 应用的全局基础垫片; - 无全局命名空间污染的需求,则应改用 npm 生态的
core-js-pure(纯函数版,不修改原型与全局对象),见 README.md。
打包版内部结构速览
从源码结构看,index.js 的入口模块(第 95 行起)依次__webpack_require__数百个模块,随后导出一个汇总模块。模块内部大量复用了 core-js 经典的基础设施,例如:
- 全局对象探测(模块 2):依次检测
globalThis/window/self/global/this,最终回退到Function('return this')(),见 index.js; - well-known Symbol 注册(模块 1):如
Symbol.asyncDispose,并带 Node.js 20.4 的 descriptor 修复 workaround,见 index.js; - 运行时版本检测(模块 20):同时读取
process.versions与Deno.version,说明打包版显式考虑 Deno 运行时的 V8 版本信息,用于特性能力判断,见 index.js。
可见这份"单文件"不是简单拼接,而是保留了 core-js 全部运行时探测与能力降级逻辑的完整产物。
四、用测试印证文档中的示例行为
文档示例中的每一个 API 都能在仓库测试中找到对应的行为约定:
| 示例 API | 测试文件 | 关键断言 |
|---|---|---|
Array#group | tests/unit-global/esnext.array.group.js | 回调收到 3 个参数(value/index/that)、结果对象原型为null、不受@@species影响 |
Array#at | tests/unit-global/es.array.at.js | [1,2,3].at(-1) === 3、[1,2,3].at(-3) === 1 |
Object.hasOwn | tests/unit-global/es.object.has-own.js | 自有属性才返回true;对null/undefined抛TypeError |
Promise.any | tests/unit-global/es.promise.any.js | 返回Promise实例、短路返回第一个成功结果 |
其中Array#group的测试与文档示例口径完全一致(如[1,2,3].group(it => it % 2)的结果在 esnext.array.group.js 中同样得到{ 1: [1, 3], 0: [2] }),说明文档示例并非示意,而是严格对标的既定语义。
迭代器链式操作(drop(1).take(5).filter(...).map(...).toArray())对应 esnext 迭代器辅助方法提案,测试同样位于 tests/unit-global 目录下(如es.iterator.drop.js、es.iterator.take.js、es.iterator.filter.js、es.iterator.map.js、es.iterator.to-array.js)。
五、配套的 Deno 兼容性测试设施
仓库对 Deno 的支持不止于交付打包版,还提供了专门的兼容性测试入口 tests/compat/deno-runner.mjs:
import './tests.js'; import './compat-data.js'; import './common-runner.js'; if (Deno.args.includes('json')) { console.log(JSON.stringify(globalThis.results, null, ' ')); } else globalThis.showResults('deno', console.log);该 runner 导入统一的测试与兼容数据,执行后把结果写入globalThis.results,可通过deno run tests/compat/deno-runner.mjs json输出 JSON 格式的兼容性报告。这意味着在 Deno 上验证 polyfill 行为、生成引擎兼容性数据是仓库 CI/研究流程的一部分,也印证了deno/corejs交付物是经过持续测试的正式产物。
六、适用前提与注意事项
- 版本前提:
deno/corejs要求 Deno 1.0+(见 README.md);示例导入 URL 锚定@v3.50.0,升级 core-js 时应同步更新 URL 中的版本号; - 全局注入语义:它是 global 版本,会修改全局对象与内建原型(例如在
Array.prototype上注入at、group),适合应用入口统一垫底;若需隔离性,请改用 npm 生态的core-js-pure; - 只提供运行时 polyfill:
deno/corejs不做语法转译(如可选链、装饰器等需要编译器处理),它只负责补齐运行时缺失的标准库 API; - 入口顶部导入:务必放在所有依赖与业务模块执行之前,否则可能因初始化顺序导致部分 API 在使用时尚未注入。
七、进一步阅读
- 完整特性清单与 npm 版安装/构建说明:README.md
- 打包版源码(webpack 产物,含全部运行时探测逻辑):deno/corejs/index.js
- Deno 兼容性测试入口:tests/compat/deno-runner.mjs
- 特性行为约定测试:tests/unit-global(如 es.object.has-own.js、esnext.array.group.js)
【免费下载链接】core-jsStandard Library项目地址: https://gitcode.com/GitHub_Trending/co/core-js
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考