[react]create-creact-app项目优化配置

517 阅读2分钟

1介绍

create-creact-app项目,如果需要手动修改配置,需先npm run eject弹出配置,这个过程是不可逆的,因此推荐使用第三方工具进行修改。现在使用比较多的是react-app-rewired,它的作用是在不eject的情况下修改webpack配置,官方网站为www.npmjs.com/package/rea…

react-app-rewired@2.x版本需要搭配customize-cra使用,customize-cra的作用是帮助你自定义react脚手架配置。

2基本使用

  • 安装:npm i react-app-rewired --save-dev
npm install react-app-rewired --save-dev
npm install customize-cra --save-dev

  • 在根目录下新建文件config-overrides.js文件,该文件与src目录同级
module.exports = function override(config, env) {
  // do stuff with the webpack config...
  return config
}

目录结构关系如下

+-- your-project
|   +-- config-overrides.js
|   +-- node_modules
|   +-- package.json
|   +-- public
|   +-- README.md
|   +-- src


  • 修改package.json文件
{
  // ...
  "scripts": {
    "start": "react-app-rewired start",
    "build": "react-app-rewired build",
    "test": "react-app-rewired test",
    "eject": "react-scripts eject"
  },
  // ...
}

3使用ES7的装饰器

  • 修改config-overrides.js文件
const {
  override,
  addDecoratorsLegacy
} = require('customize-cra')

module.exports = override(
  // enable legacy decorators babel plugin
  addDecoratorsLegacy(),
)

4添加Less支持

  • 安装lessless-loadernpm i less less-loader --save-dev

  • 修改config-overrides.js文件

const {
  override,
  // ...
  addLessLoader,
  // ...
} = require('customize-cra')

module.exports = override(
  // ...
  // less
  // addLessLoader(),
  addLessLoader({
    lessOptions: {
      javascriptEnabledtrue,
      // Optionally adjust URLs to be relative. When false, URLs are already relative to the entry less file.
      relativeUrlsfalse,
      modifyVars: { '@primary-color''#A80000' },
      // cssModules: {
      //   // if you use CSS Modules, and custom `localIdentName`, default is '[local]--[hash:base64:5]'.
      //   localIdentName"[path][name]__[local]--[hash:base64:5]",
      // }
    } 
  })
  // ...
)

5设置路径别名

  • 修改config-overrides.js文件
const {
  override,
  // ...
  addWebpackAlias
} = require('customize-cra')
const path = require('path')

module.exports = override(
  // ...
  // 路径别名
  addWebpackAlias({
    '@': path.resolve(__dirname, 'src')
  })
)

6配置多环境

查看 create-react-app 的官方文档可以发现,create-react-app 默认是支持多个环境配置文件的:

  • .env:默认。

  • .env.local:本地覆盖。除 test 之外的所有环境都加载此文件

  • .env.development, .env.test, .env.production:设置特定环境。

  • .env.development.local, .env.test.local, .env.production.local:设置特定环境的本地覆盖。

但更建议使用dotenv-cli来管理环境配置。

  • 安装dotenv-clinpm i dotenv-cli --save-dev

  • 在根目录下添加.env.dev文件

REACT_APP_URL_API=http://dev.com
REACT_APP_URL_UPLOAD=http://upload.dev.com

  • 在根目录下添加.env.sit文件
REACT_APP_URL_API=http://sit.com
REACT_APP_URL_UPLOAD=http://upload.sit.com

  • 在根目录下添加.env.prod文件
REACT_APP_URL_API=http://prod.com
REACT_APP_URL_UPLOAD=http://upload.prod.com

  • 修改package.json文件
{
  // ...
  "scripts": {
    "start": "dotenv -e .env.dev react-app-rewired start",
    "build:sit": "dotenv -e .env.sit react-app-rewired build",
    "build:prod": "dotenv -e .env.prod react-app-rewired build",
    "test": "react-app-rewired test",
    "eject": "react-scripts eject"
  },
  // ...
}

  • index.html中使用%REACT_APP_URL_API%

  • js/jsx中:process.env.REACT_APP_URL_API

7proxy

开发环境下跨域问题,前端一般是给本地的devServer设置代理

  • 安装http-proxy-middlewarenpm i http-proxy-middleware --save-dev

  • src/目录下新建文件setupProxy.js注意:文件名不能修改!!cra会按照src/setupProxy.js这个路径解析

const {createProxyMiddleware} = require('http-proxy-middleware')


module.exports = function (app{
    app.use(createProxyMiddleware('/api', {
        target'http://127.0.0.1:3009',
        securefalse,
        changeOrigintrue,
        pathRewrite: {
            "^/api""/api"
        }
    }))
}


  • 重新启动即可

8antd按需引入

  • 安装babel-plugin-importnpm i babel-plugin-import --save-dev

  • 修改config-overrides.js文件

  • 随版本更新可能有所变动,建议查看官方文档。

const {
  override,
  // ...
  fixBabelImports
} = require('customize-cra')

module.exports = override(
  // ...

  // antd按需加载 - babel-plugin-import
  fixBabelImports('import', {
    libraryName'antd',
    style'css'
  })
)

  • 修改config-overrides.js文件,覆盖默认样式
const {
  override,
  // ...
  addLessLoader,
  fixBabelImports,
  // ...
} = require('customize-cra')

module.exports = override(
  // ...
  // less
  addLessLoader({
    // 现在的写法
    lessOptions: {
      javascriptEnabled: true,
      modifyVars: { '@brand-primary''#1DA57A' },
    },
  }),

  // antd按需加载 - babel-plugin-import
  fixBabelImports('import', {
    libraryName'antd',
    libraryDirectory'es',
    style: true
  }),
  // ...
)

本文使用 文章同步助手 同步