开发工具前端构建【免费下载链接】cracoCreate React App Configuration Override, an easy and comprehensible configuration layer for Create React App.项目地址https://gitcode.com/gh_mirrors/cr/craco点击查看免费下载本篇技术指南面向使用 Create React AppCRA且需要自定义路径别名的开发者讲解如何借助 CRACOCreate React App Configuration Override在一份craco.config.js中同时完成两件事为 Webpack 声明components之类的路径别名并通过jest.configure.moduleNameMapper让 Jest 测试运行时解析同一组别名。读完本文你将掌握别名同步配置的完整写法、moduleNameMapper正则规则、jest.configure对象与函数两种形态以及 CRACO 底层合并 Jest/Webpack 配置的实现原理与对应测试验证。为什么 Webpack 别名不会自动作用到 Jest在 CRA 项目中import X from components/Button这类路径在 Webpack 构建时能否解析取决于webpack.config.js中的resolve.alias配置而 Jest 拥有独立的模块解析体系它读取的是自身配置中的moduleNameMapper并不会读取 Webpack 的配置。这意味着只在 Webpack 侧配置别名npm start/npm run build能正常运行但执行npm test时Jest 遇到components/...会直接报 Cannot find module 错误。因此在引入路径别名的项目中必须把同一份别名映射同时告知 Webpack 与 Jest。CRACO 恰好允许你在同一个craco.config.js中分别操作webpack与jest两个配置段从而一次性解决该问题。一步到位的别名同步配置在项目根目录的craco.config.js中写入以下完整配置这是本方案的核心骨架源自 add-webpack-alias-to-jest.md// 若不想手写 moduleNameMapper也可以使用 craco-alias 插件第三方一键生成对应映射 const path require(path); module.exports { webpack: { alias: { components: path.resolve(__dirname, src/components/), }, }, jest: { configure: { moduleNameMapper: { ^components(.*)$: rootDir/src/components$1, }, }, }, };配置完成后运行npm start/npm run build实际执行craco start/craco buildcomponents由webpack.alias生效运行npm test实际执行craco testmoduleNameMapper中的正则映射由jest.configure生效。两端使用相同的路径解析结果开发、构建、测试三种场景行为一致。配置项拆解webpack.aliasWebpack 侧别名webpack.alias接受一个键值对对象键为别名值为绝对路径类型定义为WebpackAlias { [alias: string]: string }见 packages/craco-types/src/config.tsalias: { components: path.resolve(__dirname, src/components/), },使用path.resolve(__dirname, ...)生成绝对路径避免相对路径在不同工作目录下解析出错别名末尾是否带/均可行关键在于与下方moduleNameMapper正则的匹配规则保持一致也可一次性配置多个别名例如utils、hooks等Jest 侧需要逐一给出对应映射。jest.configureJest 配置的两种形态根据 packages/craco-types/src/config.ts 与 jest.md 的说明jest.configure支持两种写法写法一对象字面量本食谱采用jest: { configure: { moduleNameMapper: { ^components(.*)$: rootDir/src/components$1, }, }, },CRACO 会将此对象与 CRA 原生的 Jest 配置做深合并而不是整体覆盖因此 CRA 默认的transform、setupFiles等配置全部保留。写法二函数可拿到上下文jest: { configure: (jestConfig, { env, paths, resolve, rootDir }) { jestConfig.moduleNameMapper { ...jestConfig.moduleNameMapper, ^components(.*)$: rootDir/src/components$1, }; return jestConfig; }, },函数形态额外获得resolve由 CRA 提供与rootDir由 CRA 提供两个上下文属性适合需要读取路径或动态生成映射的场景。无论哪种形态都必须返回完整的 Jest 配置对象——若函数未返回对象CRACO 会抛出错误见下文源码。moduleNameMapperJest 侧别名映射规则moduleNameMapper的键是正则表达式值是替换模板其中rootDir是 Jest 内置的根目录占位符指向package.json所在目录正则写法替换模板匹配效果^components(.*)$rootDir/src/components$1将components/Button映射为src/components/Button^components/(.*)$rootDir/src/components/$1同上但要求别名后必须紧跟/仓库测试即采用此写法见 test/unit/merging-tests/custom-jest-config/craco.config.js需要注意两点^与$锚定必不可少避免误伤其他以components开头的模块名如components-extra捕获组$1承接components之后的剩余路径使映射对任意深层子目录都成立。底层原理CRACO 如何分别合并两端配置Webpack 侧addAlias合并进resolve.alias在 merge-webpack-config.ts 中addAlias函数将cracoConfig.webpack.alias通过Object.assign合并进 CRA 原有 Webpack 配置的resolve.aliasfunction addAlias(webpackConfig: WebpackConfig, webpackAlias: WebpackAlias) { if (webpackConfig.resolve) { webpackConfig.resolve.alias Object.assign( webpackConfig.resolve.alias || {}, webpackAlias ); } log(Added webpack alias.); }这段代码确认了两点事实CRA 原生的resolve.alias会被保留新增别名以增量方式注入addAlias在mergeWebpackConfig中于 Babel、ESLint、Style、TypeScript 等 override 之后执行且先于webpack.configure的总控阶段因此你仍可在configure中对别名做最终调整。Jest 侧deepMergeWithArray深合并保证不丢配置在 merge-jest-config.ts 中giveTotalControl处理jest.configurefunction giveTotalControl( jestConfig: JestConfig.InitialOptions, configureJest: ConfigureJestConfig.InitialOptions, JestContext, context: JestContext ) { if (isFunction(configureJest)) { jestConfig configureJest(jestConfig, context); if (!jestConfig) { throw new Error( craco: jest.configure function didnt returned a Jest config object. ); } } else { jestConfig deepMergeWithArray({}, jestConfig, configureJest); } return jestConfig; }当configure为对象时deepMergeWithArray实现见 utils.ts基于 lodash 的mergeWith将用户对象深合并进 CRA 的 Jest 配置普通字段覆盖数组字段拼接concat。这正是只加别名、不破坏默认transform等配置的机制保证。仓库单元测试 jest.test.js 专门验证了这一点合并后transform[^.\\.[t|j]sx?$]仍等于babel-jest且自定义moduleNameMapper正确加入配置项总数不小于 CRA 原生配置。调用链从craco test到配置生效执行craco test时入口脚本 packages/craco/src/scripts/test.ts 的流程为加载craco.config.js调用overrideJest(cracoConfig, context)overrideJest见 features/jest/override.ts通过 cra.ts 中的loadJestConfigProvider定位react-scripts/scripts/utils/createJestConfig.js将原始的 Jest 配置 provider 换成mergeJestConfig的代理实现并直接覆盖require.cache中该模块的导出代理内部依次执行读取 CRA 原生 Jest 配置 → 处理jest.babel选项 → 合并jest.configure→ 应用 CRACO 插件 → 返回最终配置最后调用 CRA 自身的test脚本Jest 加载到的已是合并后的完整配置。也就是说本食谱中的moduleNameMapper正是在第 4 步通过深合并进入最终 Jest 配置的全程不会修改node_modules中任何文件npm test时可放心使用。进阶实践与注意事项场景一多个别名const path require(path); module.exports { webpack: { alias: { components: path.resolve(__dirname, src/components/), utils: path.resolve(__dirname, src/utils/), }, }, jest: { configure: { moduleNameMapper: { ^components(.*)$: rootDir/src/components$1, ^utils(.*)$: rootDir/src/utils$1, }, }, }, };场景二不想手动维护映射原食谱注释提到可以使用craco-alias插件第三方生态可在 npm 检索它能基于tsconfig或 JS 配置自动为 Webpack 与 Jest 生成一致的别名映射适合别名较多、希望避免两端手工同步的项目。本文所述的手写方案则零依赖、完全可控适合别名数量少或希望显式掌控正则的场景。注意事项正则匹配的是完整模块名components/Button会先命中moduleNameMapper再进入后续解析若映射写错Jest 报错信息会指向模块解析失败排查时应优先核对捕获组与rootDir拼接结果rootDir不要写成绝对路径使用 Jest 占位符可保证配置在 CI、本地等不同工作目录下均可移植别名路径必须真实存在Webpack 与 Jest 都只在解析时查找实际文件src/components/目录不存在时两端同样会失败保持两端规则一致webpack.alias与moduleNameMapper若出现不一致例如 Webpack 配了components而 Jest 漏配开发正常但测试报错这种单端生效问题最容易排查——逐端确认配置是否落入各自生效的配置段即可。小结在 CRA 项目中引入路径别名时Webpack 可用、Jest 报错是高频踩坑点。借助 CRACO 的统一配置层只需在craco.config.js的webpack.alias与jest.configure.moduleNameMapper两处各写一段映射即可让开发、构建、测试共享同一套别名体系。其背后的合并机制Object.assign注入 Webpack 别名、deepMergeWithArray深合并 Jest 配置与对应测试用例custom-jest-config均可在本仓库中直接查阅验证。赞分享开发工具前端构建【免费下载链接】cracoCreate React App Configuration Override, an easy and comprehensible configuration layer for Create React App.项目地址https://gitcode.com/gh_mirrors/cr/craco点击查看免费下载相关推荐在 webpack 项目中使用 Jest从 webpack 配置到 Jest 配置的完整迁移指南在 webpack 项目中使用 Jest从 webpack 配置到 Jest 配置的完整迁移指南 本指南聚焦于如何在基于 webpack 构建的前端项目尤其测试质量保障代码覆盖率开发工具Monadscore Auto Bot常见问题解答从安装到使用的15个关键疑问Monadscore Auto Bot常见问题解答从安装到使用的15个关键疑问 Monadscore Auto Bot是一款用于生成以太坊钱包并通过代理支持在开发工具前端构建Jest 与 webpack 集成实战指南将 webpack.config.js 完整迁移为 jest.config.jsJest 与 webpack 集成实战指南将 webpack.config.js 完整迁移为 jest.config.js Jest 可以无缝用于那些依赖 w测试质量保障代码覆盖率开发工具上一篇Ministral-3-8B-Base-2512-8bit vs 同类模型为什么这款8位量化模型成为开发者新宠下一篇Pixel Agents HookProvider接口详解如何用单个子目录接入新的AI编程工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
凯商律所专业实力评估 股权设计靠谱吗 从后民营企业萌芽,到市场经济深化发展,国内商事法律服务行业历经了从事后诉讼补救到事前决策设计的行业变迁,无数深耕细分领域的法律服务机构,在市场需求的迭代中摸索前行。广西凯商律师事务所自2019年成立至今,始终锚… · 2026/9/28 3:09:48
Spingboot启动预热的实现 启动预热的适用场景启动预热适合以下情况:数据主要来自第三方接口,无法直接从本地数据库读取。第三方接口响应较慢,首次访问容易超时。一个页面需要调用多个第三方接口或逐项查询。数据读取频繁,但变化不频繁。希望服务启动后&… · 2026/9/28 3:40:12
学Java别走弯路,这5个方向最吃香 学Java的人很多,但学明白的人不多。有人学了半年还在写控制台程序,有人一年就能独当一面。差别不在天赋,而在方向。Java生态太庞大了,什么都学等于什么都没学。选对方向,事半功倍。今天盘点当前最吃香的5个Java方向&am… · 2026/9/28 3:32:15
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
制作网页比较方便的软件怎么选?一文搞懂避坑指南 制作网页比较方便的软件怎么选?一文搞懂避坑指南 很多老板一上来就问:做个网站多少钱?但我反问他:你的域名买了吗?服务器租了吗?他一脸懵。这就是典型的“域名服务器搞不懂”。别急,今天咱们不聊虚的,直接 一文搞懂 那些让你头秃的技术名词。… · 2026/9/28 0:00:06
婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 找婚恋网站建站公司,最怕的就是被坑高价。很多同行跟我吐槽,报价单上写得模棱两可,功能栏里全是“高级定制”、“专属UI”,结果落地全是套壳。今天不聊虚的,直接甩几个我经手的 实战案例… · 2026/9/28 0:00:19
济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 上周济南一个做建材的老板找我,脸都绿了。他的官网首页弹出了赌博广告,后台被植入了挖矿脚本。他慌得问我:“网站被黑挂马不知道怎么办?能不能直接找之前的外包公司要源码下载,看看哪里被动了手脚?… · 2026/9/28 0:00:25