
前端CMS【免费下载链接】wp-calypsoThe JavaScript and API powered WordPress.com项目地址https://gitcode.com/gh_mirrors/wp/wp-calypso点击查看免费下载这篇技术指南以packages/calypso-babel-config包的变更记录CHANGELOG为线索结合包内源码与 wp-calypso 仓库根目录的babel.config.js实际用法完整解析 Calypso 项目中这套共享 Babel 配置体系的组成结构、三大 Preset 的内部实现以及最新引入的importSource预设选项与IMPORT_SOURCE环境变量机制。读完本文你将掌握如何在自己的 Babel 工程中复用这套配置、如何按需切换babel/preset-react的 import source、如何通过MODULES环境变量控制模块输出格式以及 POT 翻译文件与测试环境的配置策略。一、包概览Calypso 为什么需要一份共享 Babel 配置automattic/calypso-babel-config是 wp-calypso monorepo 中专门存放 Babel 配置的包其职责在 package.json 中被描述为 Shared babel configuration used in Calypso projects。它以babel/preset-env、babel/preset-react、babel/preset-typescript为底座叠加了 Calypso 特有的 i18n 提取、Emotion 样式、运行时 helpers 去重等插件把散落在各个子项目里的 Babel 配置收敛成可编程、可按环境切换的单一入口。从 tsconfig.json 可以看出这个包实际交付的源码文件只有两个组成部分config.js包的main入口与presets/目录下的三个预设default.js、dependencies.js、wordpress-element.js。关于版本信息该包当前版本为1.0.0其 CHANGELOG.md 记录的 Unreleased 变更正是本文要重点展开的importSource改造。由于变更尚未发布涉及新选项时请在 README 之外以 presets/default.js 与 config.js 的源码为准。二、babelConfig 工厂函数一行接入 Calypso 的 Babel 管线包的入口config.js导出一个工厂函数babelConfig调用后返回完整的 Babel 配置对象。按 README.md 的推荐做法每个项目在自己的根目录维护一份babel.config.js从中扩展本包配置const { babelConfig } require( automattic/calypso-babel-config ); module.exports babelConfig();该工厂函数支持三个配置项配置项类型默认值作用isBrowserboolean—配置是否面向浏览器README 中声明实际传递到 preset 的bugfixes开关见下文outputPOTstringbuild.POT翻译文件的输出目录供build_pot环境使用importSourcestring未定义传给babel/preset-react的 import sourceCHANGELOG 新增带默认值的完整示例const { babelConfig } require( automattic/calypso-babel-config ); module.exports babelConfig( { isBrowser: true, outputPOT: ./build, } );对照 config.js 的源码实现工厂函数内部做了三件事默认启用bugfixespresets: [ [ require.resolve( ./presets/default ), { bugfixes: true, importSource } ] ]即调用方无需关心bugfixes默认即开启 Babel 的 bugfixes 转换合并能力透传importSource工厂函数接收的importSource选项被直接传给default预设按环境叠加插件通过env字段区分production、build_pot、test三种 Babel 环境分别注入 prop-types 移除、i18n POT 提取、动态 import 兼容等插件。三、default 预设Calypso 的主编译管线default预设是最常用的编译管线源码在 presets/default.js由三个官方 preset 和四个插件组成。3.1 babel/preset-env面向目标环境的语法降级[ require.resolve( babel/preset-env ), { corejs: opts.corejs ? opts.corejs : 3.6, debug: opts.debug ? opts.debug : false, bugfixes: opts.bugfixes ? opts.bugfixes : false, modules: modulesOption( opts ), useBuiltIns: opts.useBuiltIns ? opts.useBuiltIns : entry, exclude: [ transform-typeof-symbol, web.immediate ], }, ]关键参数corejs: 3.6配合useBuiltIns使用的 core-js 版本构建产物所需的 polyfill 由外部统一注入useBuiltIns: entry在入口处按目标环境引入全部所需 polyfill而不是按需逐处注入exclude排除了两个转换transform-typeof-symbol源码注释指出该转换会让所有代码变慢参考自 create-react-app 的讨论与web.immediate非标准的setImmediate在目标浏览器中无人使用目标浏览器集合browserslist由宿主项目的package.json隐式提供——wp-calypso 根目录 babel.config.js 中的注释明确写道 We implicitly use browserslist configuration in package.json for build targets。3.2 babel/preset-react 与 importSource本次变更的核心CHANGELOG 的 Unreleased 段记录了两条互为因果的变更Removeemotion/reactimport source configuration forbabel/preset-reactfrom the default presetIntroduceimportSourcepreset option andIMPORT_SOURCEenv variable to allow configuring import source forbabel/preset-react翻译过来就是默认预设不再硬编码emotion/react作为 JSX 的 import source改为通过预设选项或环境变量动态指定。在 presets/default.js 中可以看到新实现[ require.resolve( babel/preset-react ), { runtime: automatic, importSource: opts.importSource ?? process.env.IMPORT_SOURCE, }, ],两个值得注意的细节runtime: automatic表示使用 React 17 的 JSX 自动运行时编译出的代码会从importSource指向的模块自动导入 JSX 转换函数importSource的取值优先级是预设选项优先于环境变量opts.importSource ?? process.env.IMPORT_SOURCE采用空值合并运算符只有当选项未提供时才回退到IMPORT_SOURCE环境变量。这条变更在仓库根目录的 babel.config.js 中已经落地——Calypso 主项目通过工厂函数显式传入importSource: emotion/react既保留了原有的 Emotion 行为又把选择权交给了每个消费方module.exports babelConfig( { isBrowser: process.env.BROWSERSLIST_ENV ! server, outputPOT: path.join( __dirname, build/i18n-calypso/ ), importSource: emotion/react, } );如果你的项目不使用 Emotion完全可以不传importSource或者通过IMPORT_SOURCEemotion/react之类的环境变量在 CI/命令行场景下临时指定。3.3 babel/preset-typescript 与插件链预设还包含babel/preset-typescript开启allowDeclareFields允许在 class 中使用 TS 的 declare 字段语法以及四个插件babel/plugin-proposal-class-propertiesclass 属性语法支持babel/plugin-transform-runtime将 helpers 抽取为公共引用以避免重复注入配置中corejs: falsepolyfill 已由useBuiltIns负责、regenerator: falseregenerator runtime 由外部 polyfill 提供、version直接读取babel/helpers/package.json的版本确保 helpers 版本与 Babel 内部保持一致automattic/babel-plugin-preserve-i18n保留 i18n 翻译标记供后续提取emotion/babel-pluginEmotion 样式编译支持。四、dependencies 预设按需转译第三方依赖dependencies预设presets/dependencies.js专门用于把选定的 NPM 依赖从 ESNext 转译到目标 ES 版本与主源码管线解耦module.exports () ( { sourceType: unambiguous, presets: [ [ babel/preset-env, { modules: false, useBuiltIns: entry, corejs: 3.6, exclude: [ transform-typeof-symbol, web.immediate ], }, ], ], plugins: [ [ babel/transform-runtime, { /* 与 default 一致 */ } ] ], } );它的两个设计要点sourceType: unambiguous允许 Babel 根据文件内容自动判断是 ESM 还是 CommonJS源码注释引用了 webpack 对依赖转译场景的经典讨论modules: false保留 ESM 语句原样输出让 webpack 等打包器拿到原生 ES 模块做 tree-shaking。五、wordpress-element 预设为 WordPress 生态定制 JSXwordpress-element预设presets/wordpress-element.js面向需要运行在 WordPress 环境中的代码如 Gutenberg 区块它不启用 preset 而是直接用两个插件把 JSX 编译成wordpress/element的调用plugins: [ [ require.resolve( wordpress/babel-plugin-import-jsx-pragma ), { scopeVariable: createElement, scopeVariableFrag: Fragment, source: wordpress/element, isDefault: false, }, ], [ require.resolve( babel/plugin-transform-react-jsx ), { pragma: createElement, pragmaFrag: Fragment }, ], ],其效果是源码中每个 JSX 元素都会被编译为createElement( ... )调用Fragment对应wordpress/element导出的Fragment从而让区块代码在 WordPress 提供的 React 副本上运行无需单独打包一份 React。README 给出了组合使用的例子module.exports { presets: [ automattic/calypso-babel-config/presets/wordpress-element, automattic/calypso-babel-config/presets/default, ], plugins: [ my-custom-babel-plugin ], };六、modules 选项与 MODULES 环境变量控制模块输出格式default预设的modules选项决定import/export语句是否被转译语义与官方babel/preset-env一致false保留 ESM 原样输出commonjs转译为 CommonJS。其解析逻辑位于 presets/default.js 的modulesOption函数function modulesOption( opts ) { if ( opts opts.modules ! undefined ) { return opts.modules; } if ( typeof process.env.MODULES ! undefined ) { return process.env.MODULES esm ? false : process.env.MODULES; } return false; // Default }优先级依次为显式选项 MODULES环境变量 默认false。其中环境变量MODULES有个特殊映射当值为esm时等价于false即保留 ESM。这一设计的实用价值在于Babel CLI 不支持为--presets中的预设传参因此在命令行场景下只能通过环境变量来切换模块格式例如# 保持 ESM 输出等价于 modules: false MODULESesm babel src --out-dir dist # 输出 CommonJS MODULEScommonjs babel src --out-dir dist在配置文件中显式指定的用法则是module.exports { presets: [ [ automattic/calypso-babel-config/presets/default, { modules: commonjs } ] ], };七、env 环境配置production / build_pot / test 三套策略babelConfig工厂函数利用 Babel 的env字段针对三种BABEL_ENV/NODE_ENV场景注入差异化插件config.js环境注入内容用途productionbabel-plugin-transform-react-remove-prop-types移除生产包中的 React PropTypes 校验代码减小体积build_potautomattic/babel-plugin-i18n-calypso扫描源码中的翻译标记并输出.POT文件dir指向outputPOT参数文件头写入content-type与x-generator: calypsotestbabel/preset-envtargets 为node: currentbabel-plugin-dynamic-import-node让 Jest 在 Node 环境中无需原生支持动态 import 即可运行测试其中build_pot环境与outputPOT选项直接关联Calypso 主项目在 babel.config.js 中把 POT 输出目录指向build/i18n-calypso/从而在BABEL_ENVbuild_pot的构建流程中统一收集全项目翻译串。八、在 wp-calypso 中的落地方式与扩展建议wp-calypso 根目录的 babel.config.js 是这套配置的真实消费示例可以作为自己项目的接入模板const path require( path ); const babelConfig require( automattic/calypso-babel-config ); module.exports babelConfig( { isBrowser: process.env.BROWSERSLIST_ENV ! server, outputPOT: path.join( __dirname, build/i18n-calypso/ ), importSource: emotion/react, } );这份配置展示了三个实战要点服务端/浏览器分流通过BROWSERSLIST_ENV环境变量区分 SSR 与浏览器构建目标为两者复用同一份 Babel 管线POT 输出位置与根目录绑定使用path.join( __dirname, ... )保证翻译文件稳定输出到仓库根目录下importSource 显式声明将 Emotion 的 import source 显式传入验证了 CHANGELOG 新特性的实际用法。如果需要在本仓库中进一步追踪这套配置的上下游可以继续阅读 babel-plugin-i18n-calypsoPOT 提取插件的具体实现、babel-plugin-preserve-i18n翻译标记保留插件以及 babel.config.js根级接入示例。所有预设源码均集中在 presets 目录配置工厂入口为 config.js适合作为二次开发或移植到其他工程时的对照参考。赞分享前端CMS【免费下载链接】wp-calypsoThe JavaScript and API powered WordPress.com项目地址https://gitcode.com/gh_mirrors/wp/wp-calypso点击查看免费下载相关推荐基于 automattic/calypso-babel-config 的 Calypso 统一 Babel 构建配置实战指南基于 automattic/calypso babel config 的 Calypso 统一 Babel 构建配置实战指南 导读 automattic/c前端CMSWordPress.com Calypso 配置体系与 Feature Flags 实战指南深入 automattic/calypso-configWordPress.com Calypso 配置体系与 Feature Flags 实战指南深入 automattic/calypso config 导读前端CMSwp-calypso 的 Storybook 统一配置包automattic/calypso-storybook 使用指南与实现解析wp calypso 的 Storybook 统一配置包automattic/calypso storybook 使用指南与实现解析 导读 本篇文章围绕 w前端CMS上一篇如何在3分钟内免费安装Chrome视频下载扩展VideoDownloadHelper完整指南下一篇如何在3分钟内免费安装Chrome视频下载扩展VideoDownloadHelper终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考