core-js 在 Deno 中的使用指南:用 `deno/corejs` 一键补齐 JavaScript 标准库
2026/9/12 3:28:46 网站建设 项目流程

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 seecore-jsdocumentation。

即它是面向Deno 1.0 及以上版本的全局版本:polyfill 直接注入全局对象(ObjectArrayPromiseSymbol等),与 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/undefinedTypeError、现代行为下不调用参数的toString等语义。运行方式为deno run --allow-read https://.../index.js加载后,直接调用Object.hasOwn即可验证。

三、能力全景:一份打包版能提供什么

根据 README.md 的定位描述,core-js 是模块化的 JavaScript 标准库,包含以下能力域:

能力域涵盖内容
ECMAScript(截至 2021 已定稿)PromiseSymbol、集合(Map/Set/WeakMap/WeakSet)、迭代器、TypedArray 等
ECMAScript 提案Array.prototype.group、迭代器辅助方法(drop/take/filter/map/toArray)等
跨平台 WHATWG / W3C 特性与提案URLURLSearchParams
  • 按需加载: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.versionsDeno.version,说明打包版显式考虑 Deno 运行时的 V8 版本信息,用于特性能力判断,见 index.js。

可见这份"单文件"不是简单拼接,而是保留了 core-js 全部运行时探测与能力降级逻辑的完整产物。

四、用测试印证文档中的示例行为

文档示例中的每一个 API 都能在仓库测试中找到对应的行为约定:

示例 API测试文件关键断言
Array#grouptests/unit-global/esnext.array.group.js回调收到 3 个参数(value/index/that)、结果对象原型为null、不受@@species影响
Array#attests/unit-global/es.array.at.js[1,2,3].at(-1) === 3[1,2,3].at(-3) === 1
Object.hasOwntests/unit-global/es.object.has-own.js自有属性才返回true;对null/undefinedTypeError
Promise.anytests/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.jses.iterator.take.jses.iterator.filter.jses.iterator.map.jses.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交付物是经过持续测试的正式产物。

六、适用前提与注意事项

  1. 版本前提deno/corejs要求 Deno 1.0+(见 README.md);示例导入 URL 锚定@v3.50.0,升级 core-js 时应同步更新 URL 中的版本号;
  2. 全局注入语义:它是 global 版本,会修改全局对象与内建原型(例如在Array.prototype上注入atgroup),适合应用入口统一垫底;若需隔离性,请改用 npm 生态的core-js-pure
  3. 只提供运行时 polyfilldeno/corejs不做语法转译(如可选链、装饰器等需要编译器处理),它只负责补齐运行时缺失的标准库 API;
  4. 入口顶部导入:务必放在所有依赖与业务模块执行之前,否则可能因初始化顺序导致部分 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询