React craco 详细使用与介绍(类似 Vue 外抛的 vue.config.js)

一、简介

  • craco 官方文档craco Github

  • craco 是一个用于扩展 Create React App(CRA)的工具,CRA 是一个用于快速搭建 React 应用的脚手架工具。CRA 提供了一个简单的项目结构和配置,使得开发者可以快速开始一个 React 项目的开发。

    然而 CRA 的配置是被隐藏的,开发者无法对其进行自定义和扩展。这就是 craco 出现的原因。craco(Create React App Configuration Override) 允许开发者覆盖和扩展 CRA 的配置,以满足更复杂的项目需求。

    使用 craco,开发者可以在不弹出 CRA 的配置的情况下,修改 webpack 配置babel 配置ESLint 配置devServer配置 等。craco 提供了一种简单的方式来覆盖 CRA 的默认配置,同时保留了 CRA 的简洁性和易用性。

    通过 craco,开发者可以使用自定义的 webpack 插件babel 插件其他工具,以满足项目的特定需求。例如:可以添加自定义的 webpack loader,配置自定义的 babel presetplugin,或者修改 webpack 的输出路径等。

二、使用

  • 安装
$ npm i -D @craco/craco
  • 根目录创建 craco.config.js 配置文件,可以理解为 Vue 项目中外抛的 vue.config.js

        my-app  
        ├── node_modules  
      + ├── craco.config.js  
        └── package.json
    

    配置文件名其他写法支持,如果找到多个配置文件,craco 将使用上面列表中最高的一个:

    1、craco.config.ts
    2、craco.config.js
    3、craco.config.cjs
    4、.cracorc.ts
    5、.cracorc.js
    6、.cracorc
    
  • 如果多个配置文件,也可以通过 package.json 添加字段指定配置文件:

    ...
    {  
        "cracoConfig": "config/craco-config-with-custom-name.js"  
    }
    ...
    

    scripts 指令中指定配置文件进行编译:

    {  
        "scripts": {  
            "start": "craco start --config config/craco-config-with-custom-name.js"  
        }  
    }
    
  • 修改 package.json 文件中 scripts 配置的 react-scripts 替换为 craco,例如:

    "scripts": {
    -   // "start": "react-scripts start",
    -   // "build": "react-scripts build",
    -   // "test": "react-scripts test",
    +   "start": "craco start",
    +   "build": "craco build",
    +   "test": "craco test",
        "eject": "react-scripts eject"
    }
    
  • craco.config.js 文件中,可以根据需要修改和扩展 CRA 的配置。以下是一个示例配置文件的基本结构:

    基本可以覆盖正常业务的所有需求配置,更多配置可以查看下 官方文档

    const path = require('path')
    const lessPlugin = require('craco-less')
    
    module.exports = {
      // 插件配置
      plugins: [
        {
          plugin: lessPlugin,
          options: {
            lessLoaderOptions: {
              lessOptions: {
                // modifyVars: { '@primary-color': '#1DA57A' },
                javascriptEnabled: true
              }
            }
          }
        }
        // ...
      ],
      // 修改 babel 配置
      babel: {
        // plugins: [
        //   ['@babel/plugin-proposal-decorators', { legacy: true }],
        //   [   
        //     'import', 
        //     {
        //       'libraryName': 'antd',
        //       'libraryDirectory': 'es',
        //       'style': 'css' // 设置为 true 即是 less 这里用的是 css
        //     }
        //   ]
        // ]
        // ...
      },
      // 修改 eslint 配置
      eslint: {
        // ...
      },
      // 修改 module 配置
      module: {
        // rules:[// 规则,在写 style.module.scss 的时候发现引入后缀为 .scss 会报错,在这里配置一下即可
        //   {
        //     test: /.scss$/,
        //     loaders: ['style-loader', 'css-loader', 'sass-loader']
        //   }
        // ]
        // ...
      },
      // 跨域配置
      devServer: {
        proxy: {
          '/api': {
            target: 'https://xxx:8080',
            changeOrigin: true,
            pathRewrite: {
              '^/api': ''
            }
          }
        }
        // ...
      },
      // webpack 配置
      webpack: {
        // 配置别名
        alias: {
          // 约定:使用 @ 表示 src 文件所在路径
          '@': path.resolve(__dirname, 'src')
        },
        // webpack 插件
        plugins: {
          add: [ /* ... */],
          remove: [ /* ... */],
        },
        // plugins: [
        //   new ConfigWebpackPlugin(),
        //   ...whenDev(() => [new CircularDependencyPlugin()], []),
        // ],
        // 这里面是 webpack 原始配置,这里追加的配置,将与原始配置合并
        configure: {
          resolve: {
            fallback: {
              'path': false,
              'util': false,
              'url': false,
              'http': false,
              'https': false,
              'stream': false,
              'assert': false,
              'querystring': false,
              'zlib': false
            }
          }
        }
        // ...
      }
    }
    
### Vue 项目中 `@` 路径配置失效的解决方案 在 Vue 项目开发过程中,如果遇到 `@` 别名路径无法正常工作的情况,通常可以通过调整 Webpack 的别名配置来解决问题。以下是几种常见的解决方法: #### 方法一:通过 vue.config.js 配置 可以在项目的根目录下找到或创建 `vue.config.js` 文件,并在其内部定义 `chainWebpack` 或 `configureWebpack` 来设置路径别名。 ```javascript const path = require('path'); module.exports = { chainWebpack: (config) => { config.resolve.alias .set('@', path.resolve(__dirname, './src')) // 设置 @ 对应 src 目录 .set('components', path.resolve(__dirname, 'src/components')) .set('views', path.resolve(__dirname, 'src/views')); }, }; ``` 上述代码片段展示了如何利用 `chainWebpack` API 定义多个路径别名[^5]。此方式适用于基于 Vue CLI 创建的项目。 --- #### 方法二:直接修改 Webpack 配置文件 对于某些自定义构建工具链或者未使用 Vue CLI 构建的项目,可以直接编辑 Webpack 配置文件(如 `webpack.config.js`),并添加以下内容: ```javascript const path = require('path'); module.exports = { resolve: { alias: { '@': path.resolve(__dirname, 'src') // 将 @ 映射到 src 目录 } } }; ``` 这种方式适合手动管理 Webpack 配置的场景[^3]。需要注意的是,在 Vue CLI 项目中,默认情况下不建议直接修改原始的 Webpack 配置文件,而是推荐通过 `vue.config.js` 进行扩展。 --- #### 方法三:针对 PostCSS 导致的问题 当项目中集成了 `postcss-import` 插件时,可能会导致 CSS/SCSS/SASS 文件中的 `@import` 声明无法解析路径别名。此时可以尝试以下两种处理方式之一: 1. **显式指定路径前缀** 修改导入语句为带波浪号的形式,例如: ```scss @import '~@/styles/global.scss'; ``` 2. **更新 postcss-loader 配置** 如果希望继续沿用无波浪号形式,则需确保 `postcss-loader` 正确加载了路径别名支持。可在 `postcss.config.js` 中增加相关插件配置[^2]。 --- #### 方法四:Create React App 类型项目的兼容性参考 虽然问题是关于 Vue 项目,但如果对比 Create React App 的实现逻辑,也可以借鉴其思路。例如,借助第三方工具 CRACO 替代 CRA 默认配置,从而灵活定制 Webpack Alias[^4]。尽管这并非 Vue 场景下的首选方案,但它提供了一种额的技术视角。 --- ### 总结 综合来看,最常见且推荐的方法是在 `vue.config.js` 中通过 `chainWebpack` 添加路径别名配置。这是因为在 Vue CLI 工程体系内,该文件专门设计用来覆盖默认行为而无需破坏原有结构。而对于更复杂的环境(比如涉及 PostCSS 或其他预处理器),则可能需要进一步排查具体依赖版本及其交互影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡尔特斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值