新闻详情

新闻详情

首页 / 资讯中心 / 详情

深入解析 @wordpress/babel-preset-default:WordPress/Gutenberg 官方 Babel 预设的配置、扩展与 Polyfill 机制

发布时间:2026/9/16 23:21:02来源:尧图网络
深入解析 @wordpress/babel-preset-default:WordPress/Gutenberg 官方 Babel 预设的配置、扩展与 Polyfill 机制
深入解析 wordpress/babel-preset-defaultWordPress/Gutenberg 官方 Babel 预设的配置、扩展与 Polyfill 机制【免费下载链接】gutenbergThe Block Editor project for WordPress and beyond. Plugin is available from the official repository.项目地址: https://gitcode.com/GitHub_Trending/gu/gutenberg本文围绕 Gutenberg 仓库中的wordpress/babel-preset-default展开系统讲解这一官方 Babel 预设的安装、使用、扩展配置与 Polyfill 机制。读者在阅读后将掌握如何在 WordPress 插件、Gutenberg 扩展或任意 npm 项目中使用该预设理解它内置的 ECMAScript 语言特性与 JSX/TypeScript 支持范围并学会通过wp:polyfill魔法注释与build/polyfill.js完成浏览器兼容层的接入。一、预设是什么为 WordPress 开发定制的默认 Babel 配置wordpress/babel-preset-default是 WordPress 官方提供的默认 Babel 预设属于 Gutenberg monorepo 中的一个独立 npm 包版本 8.55.0见 package.json。它的职责是当你的代码需要被 WordPress 生态包括 Gutenberg 编辑器本身、插件、主题运行时由它统一决定哪些语言特性可以被转换、如何转换、以及如何注入运行时辅助代码。它覆盖两类语法来源ECMAScript 提案仅支持已进入 TC39 Stage 4Finished 中的相关章节。JSX 语法扩展通过babel/plugin-transform-react-jsx以runtime: automatic模式转换无需手动引入React即可使用新的 JSX 转换。从源码看预设的实际组成查看预设的入口实现 index.js可以看到最终输出的配置结构return { presets: [ getPresetEnv(), require.resolve( babel/preset-typescript ), ], plugins: [ require.resolve( babel/plugin-syntax-import-attributes ), require.resolve( wordpress/warning/babel-plugin ), [ require.resolve( babel/plugin-transform-react-jsx ), { runtime: automatic } ], maybeGetPluginTransformRuntime(), wpBuildOpts.addPolyfillComments replacePolyfills, ].filter( Boolean ), };也就是说除babel/preset-env外该预设还默认开启TypeScript 支持内置babel/preset-typescript因此.ts/.tsx文件可以直接编译类型检查仍由 tsc 负责Babel 只做语法剥离。Import Attributes通过babel/plugin-syntax-import-attributes支持import data from ./x.json with { type: json }这类语法。JSX 自动运行时采用runtime: automatic编译产物引用react/jsx-runtime无需在源码中显式import React。WordPress 警告插件wordpress/warning/babel-plugin会在生产构建时移除warning()调用。二、安装与使用三条命令接入官方预设安装预设本身只负责配置实际转换仍由babel/core完成该预设将其声明为依赖见 package.json。在项目根目录执行npm install wordpress/babel-preset-default --save-dev注意该包要求长期支持LTS状态的 Node.js 版本engines字段声明为node 18.12.0、npm 8.19.2见 package.json不兼容旧版本 Node。在 Babel 配置中启用Babel 支持多种配置方式.babelrc、babel.config.js、package.json中的babel字段等核心做法是把预设名放入presets数组。使用.babelrc的示例{ presets: [ wordpress/babel-preset-default ] }三、预设内部逻辑按环境自动选择 targets从源码可以看到该预设是一个函数式配置module.exports ( api ) {...}它会根据api.env()与api.caller()动态决定编译目标测试环境envName为testtargets固定为{ node: current }且modules保持默认可被 Node 直接执行并跳过babel/plugin-transform-runtime见 index.js 中isTestEnv分支。生产/构建环境modules: false保留 ES Module 供打包器 tree-shakingtargets优先读取项目根目录的browserslist配置若无则回退到wordpress/browserslist-config定义的默认浏览器矩阵 1%, last 1 Android versions, last 1 ChromeAndroid versions, last 2 Chrome versions, last 2 Firefox versions, last 2 Safari versions, last 2 iOS versions, last 2 Edge versions, last 2 Opera versions,这正好对应 WordPress 项目支持的浏览器基线也是build/polyfill.js选择 polyfill 条目的依据。Gutenberg 官方构建caller 名为WP_BUILD_MAIN/WP_BUILD_MODULE时会读取 caller 传入的modules、useESModules、addPolyfillComments等选项实现主入口与 ESM 模块产物的差异化输出。此外babel/preset-env开启了bugfixes: true让 Babel 只做最小必要的语法转换减少多余输出。四、扩展配置在官方预设之上叠加插件该预设是一份有主见opinionated的配置。若想增加或覆盖其行为只需要在自身 Babel 配置的plugins/presets中追加插件——Babel 保证plugins先于presets执行因此追加的插件可以覆盖预设内置的同名转换。例如某个 Stage 3 提案特性尚未被 WordPress 采纳但你的项目确实需要可以显式加入对应插件{ presets: [ wordpress/babel-preset-default ], plugins: [ babel/plugin-transform-class-properties ] }需要精确了解默认启用了哪些插件时可直接阅读预设实现 packages/babel-preset-default/index.js 中的presets与plugins数组。五、Polyfill 机制build/polyfill.js与wp:polyfill魔法注释5.1 独立的 Polyfill 文件该包提供一个配套的build/polyfill.js压缩版build/polyfill.min.js用于补齐 WordPress 支持浏览器中缺失的 ECMAScript 特性参考 WordPress 官方浏览器支持政策引入于 PR #31279。它的定位是作为已废弃的babel/polyfill包的直接替代品drop-in replacement底层基于core-js构建core-js同时是该包依赖见 package.json通过构建脚本 bin/index.js 生成先产出build/polyfill.js再经 terser 压缩为build/polyfill.min.js。使用方式有两种把 polyfill 内容前置拼接到编译后的代码之前或作为一个独立的script在业务代码之前加载script srcpath/to/polyfill.min.js/script script srcpath/to/your-bundle.js/script注意polyfill 只覆盖已进入 Stage 4 的特性。若你使用了尚未定稿的 TC39 提案非 Stage 4该 polyfill 不会自动导入对应补丁你需要自行从core-js等方案按需引入。5.2 按需注入与wp:polyfill魔法注释预设内部有一个自定义 Babel 插件 replace-polyfills.js它遍历代码中所有import core-js/...与require( core-js/... )语句将其删除并在文件顶部写入一条魔法注释/* wp:polyfill */标记该文件依赖全局 polyfill// 编译前 import core-js/stable/array/flat-map; // 编译后 /* wp:polyfill */这一机制在 Gutenberg 官方构建caller 提供addPolyfillComments: true时配合babel/preset-env的useBuiltIns: usage下生效让打包器能据此把文件归属到依赖wp-polyfill的资源清单中避免重复注入。5.3 刻意排除的 polyfill 清单polyfill-exclusions.js 定义了一组被刻意排除的 polyfill排除项原因es.array.push规避非可写数组non-writable arrays相关的 Chromium 罕见 bug见 Chromium issue 42202623web.immediateIE 专属特性WordPress 不使用也不希望为其补丁见 PR #49234/^es(next)?\.set\./Babel/core-js 会对所有new Set()无差别注入全部实例方法 polyfill造成不必要的体积与性能开销因此整体关闭见 PR #67230/^es(next)?\.iterator\./与 Set 同理排除全部 iterator helper polyfill其中 Set 与 Iterator 需要同时以es.与esnext.前缀声明这是 Babel/core-js 内部依赖关系的特殊性决定的。开发者在面向旧浏览器时需自行确保不使用这些特性。六、测试与验证预设行为有据可查该包使用 Vitest 编写测试见 test/index.js覆盖两类场景基础转译以 fixtures/input.js 为输入包含 async generator 函数、可选链obj?.foo?.bar等现代语法在envName: production下转译并与快照对比验证 Stage 4 特性被正确保留/转换快照见 index.js.snap。魔法注释注入以 fixtures/polyfill.js内部使用Promise.try这类需要 polyfill 的特性为输入传入caller: { name: WP_BUILD_MAIN, addPolyfillComments: true }断言输出包含/* wp:polyfill */注释。这为预设确实启用了哪些特性、polyfill 标记如何产生提供了可运行、可复现的验证入口。七、小结与适用场景wordpress/babel-preset-default的价值在于把 WordPress 的语法与兼容策略收敛为一套可复用的官方配置生产构建保持 ESM、测试环境针对当前 Node、JSX 自动运行时开箱即用、TypeScript 语法直接支持同时通过build/polyfill.js与wp:polyfill注释建立了与 Gutenberg 构建流水线一致的 polyfill 分工。适用场景包括WordPress 插件/主题使用现代 JavaScript 或 JSX 开发希望遵循官方编译标准在 Gutenberg 生态中开发独立包需要与官方构建产物保持一致的转译口径需要替代已废弃的babel/polyfill获得一个基于core-js、面向 WordPress 浏览器基线的即用 polyfill。若需深度定制建议以 index.js 为蓝本结合自身browserslist配置与 Babel 插件优先级在项目级配置中逐步叠加或覆盖。【免费下载链接】gutenbergThe Block Editor project for WordPress and beyond. Plugin is available from the official repository.项目地址: https://gitcode.com/GitHub_Trending/gu/gutenberg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

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

较早相关资讯

最新相关资讯

Python面向对象编程:类的基础与高级特性详解 2026/9/17 0:00:18

Python面向对象编程:类的基础与高级特性详解

1. Python类的基础概念与核心语法在Python中,类(Class)是面向对象编程(OOP)的基础构建块。它允许我们将数据和操作数据的方法捆绑在一起,形成一个独立的逻辑单元。让我们从最基本的类定义开始讲起。1.1 类的定义与实例化定义一个类需要使用class关键字&a…

阅读更多 →
VHawk-Lint实战:FPGA静态代码检查如何补齐仿真验证的盲区 2026/9/17 0:00:18

VHawk-Lint实战:FPGA静态代码检查如何补齐仿真验证的盲区

做FPGA开发这些年,我最大的感受是:仿真跑得再欢,也不如代码规范本身不出事。去年接手一个通信基带项目,RTL代码量冲到几十万行,每次上板前集成仿真要跑大半天,结果ovl断言报出来的是个三年前遗留的多驱动—…

阅读更多 →
MATLAB手写紧束缚模型计算石墨烯能带结构 2026/9/17 0:00:18

MATLAB手写紧束缚模型计算石墨烯能带结构

简介:本资源是一套面向凝聚态物理与计算材料学初学者及研究者的石墨烯能带结构仿真MATLAB代码集,聚焦于理解石墨烯电子性质的核心——线性色散关系与Dirac点特征。代码基于紧束缚模型,完整覆盖晶格建模、布里渊区定义、薛定谔方程数值求解及能…

阅读更多 →
SpringBoot+Vue人事系统实战:解决HR数据断点与事务一致性 2026/9/17 0:00:18

SpringBoot+Vue人事系统实战:解决HR数据断点与事务一致性

简介:本资源是一套基于SpringBoot后端与Vue.js前端构建的完整人事管理系统,专为计算机专业本科生毕业设计及课程实践打造,面向正在完成毕设、期末大作业或项目实战训练的学习者。系统覆盖员工信息管理、考勤、薪资核算等核心HR模块&#xff0…

阅读更多 →
AWS无服务器应用开发指南:从Lambda到SAM的架构与实践 2026/9/17 0:00:18

AWS无服务器应用开发指南:从Lambda到SAM的架构与实践

从一份目录开始,重新理解AWS无服务器应用开发很多人学AWS无服务器,第一反应是去翻Lambda的API文档,或者找几个现成的SAM模板直接部署。这种学法不是不可以,但容易陷入一个怪圈:函数能跑通,却说不清楚整个架…

阅读更多 →
BrowserAct 多网页抓取指令丢失?TaoToken 这样改模型通道 2026/9/16 23:57:16

BrowserAct 多网页抓取指令丢失?TaoToken 这样改模型通道

/* 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
📞