使用CRACO自定义 Webpack 配置

1、为什么要用 CRACO?

默认情况下,CRA 的 Webpack 配置是隐藏的,如果你需要修改 Webpack,比如:

✅ CDN配置

✅ 配置 alias(路径别名)

✅ 修改 Less/Sass 变量

✅ 添加 Babel 插件

✅ 优化 Webpack 构建(如 SplitChunks、CDN 加载)

✅ 支持 Tailwind CSS

✅ 移动端适配启用 PostCSS + px 转 rem

如果不用 CRACO,你必须运行 yarn eject / npm run eject,但这会暴露 CRA 内部所有配置,导致维护成本增加。因此,CRACO 允许在不 eject 的情况下修改 Webpack 配置。

2、craco.config.js 是什么?从哪里来的?

1️⃣ craco.config.js 是什么?

craco.config.js 是 CRACO(Create React App Configuration Override) 的配置文件。

它用于修改 Create React App(CRA)的 Webpack 配置,无需 eject(弹出)。

2️⃣ craco.config.js 从哪里来的?

它是 开发者手动创建 的,默认 CRA 项目没有,需要安装 CRACO 后才使用。

如果你看到 craco.config.js,说明这个 React 项目使用了 CRACO 来覆盖默认配置。

3、如何安装 & 创建 craco.config.js?

✅ 1. 安装 CRACO

bash 复制代码
npm install @craco/craco --save-dev

或者

bash 复制代码
yarn add @craco/craco --dev

✅ 2. 在 React 项目根目录创建 craco.config.js

bash 复制代码
touch craco.config.js

✅ 3. 修改 package.json,替换 react-scripts 为 craco

bash 复制代码
{
  "scripts": {
    "start": "craco start",
    "build": "craco build",
    "test": "craco test"
  }
}

4、项目事例

bash 复制代码
const path = require('path');
const CracoLessPlugin = require('craco-less');
const fs = require('fs');

const rewireBabelLoader = require('craco-babel-loader');
const appDirectory = fs.realpathSync(process.cwd());
const resolveApp = (relativePath) => path.resolve(appDirectory, relativePath);

module.exports = {
  webpack: {
    alias: {
      '@': path.resolve(__dirname, 'src'),
    },
    configure: (webpackConfig, { env }) => {
       if (env === 'production') {
         webpackConfig.output.publicPath = 'https://cdn.unionlao.com/la_unionlao_ios/';
       }
      if (env === 'development' || env === 'test') {
        webpackConfig.devtool = 'eval-source-map';
        webpackConfig.output.publicPath = 'https://cdn.unionlao.com/la_unionlao_ios/';
      }
      if (env !== 'development') {

        webpackConfig.optimization.splitChunks = {
          cacheGroups: {
            commons: {
              chunks: 'all',
              name: 'commons',
              minSize: 0, // 公用模塊的大小限制 bytes
              minChunks: 2, // 公用模塊最少復用次數
              maxInitialRequests: 2,
              priority: 10,
              reuseExistingChunk: true,
            },
          },
        };
      }
      return webpackConfig;
    },
  },
  plugins: [
    {
      plugin: CracoLessPlugin,
    },
    {
      plugin: rewireBabelLoader,
      options: {
        includes: [resolveApp('../../libs')], //put things you want to include in array here
        excludes: [/(node_modules|bower_components)/], //things you want to exclude here
     
      },
    },
  ],
  style: {
    postcss: {
      mode: 'extends',
      loaderOptions: {
        postcssOptions: {
          ident: 'postcss',
          plugins: [
            [
              'postcss-pxtorem',
              {
                rootValue: 37.5,
                unitPrecision: 2,
                // propList: ['*', '!font-size', '!*font-size*'],
                propList: ['*'],
                selectorBlackList: [],
                replace: true,
                mediaQuery: false,
                minPixelValue: 0,
                // exclude: /node_modules/i
              },
            ],
          ],
        },
      },
    },
  },
};
相关推荐
晓夜残歌16 分钟前
安全基线-rm命令防护
运维·服务器·前端·chrome·安全·ubuntu
inxunoffice1 小时前
批量删除 PPT 空白幻灯片页面
前端·powerpoint
Setsuna_F_Seiei3 小时前
前端切图仔的一次不务正业游戏开发之旅
前端·游戏·cocos creator
laimaxgg3 小时前
Qt窗口控件之颜色对话框QColorDialog
开发语言·前端·c++·qt·命令模式·qt6.3
爱编程的鱼3 小时前
Unity—从入门到精通(第一天)
前端·unity·ue5·游戏引擎
默默无闻 静静学习3 小时前
sass介绍
前端·sass
大怪v4 小时前
前端佬们,装起来!给设计模式【祛魅】
前端·javascript·设计模式
MetaverseMan4 小时前
Rust Tokio 和 Node.js 异步的相似之处
开发语言·rust·node.js
vvilkim4 小时前
Vue.js 插槽(Slot)详解:让组件更灵活、更强大
前端·javascript·vue.js
学无止境鸭4 小时前
uniapp报错 Right-hand side of ‘instanceof‘ is not an object
前端·javascript·uni-app