使用过create-react-app(以下简称cra)的朋友都知道,这是react官方的一款脚手架工具,内部集成了babel,webpack,webpack-dev-server等等。

以前我们要在cra中做webpack的配置,有三种方式:

1、运行npm run eject得到原始的webpack配置文件config,然后可以看到里面有prod和dev两个环境的相关配置;但是新版本cra你run eject之后,只有一个webpack.config.js文件了。

可以在这里面进行配置。但是本文中这不是我们推荐的方式。

2、不run eject。而是改写script文件中的js。这个本人没有操作过,这个就不详谈了。

3、使用react-app-rewired,安装这个工具后,在项目根目录中新建文件config-overrides.js文件。此时我们便可以在其中进行各种webpack的骚操作了~

但是!react-app-rewired2.x以后,不再支持injectBabelPlugin的方式,需要安装customize-cra

具体的,ant design官方文档已经给出了最新的解决方案。请前往详览。https://ant.design/docs/react/use-with-create-react-app-cn

这种方式就是我们推荐的方式。因为无需生成更多额外的文件,同时配置又趋于更简单可控的方式。

接下来我们就来具体说一下操作步骤。

首先,我们安装react-app-rewired。

$ yarn add react-app-rewired

然后修改package.json文件如下,

/* package.json */
"scripts": {
- "start": "react-scripts start",
+ "start": "react-app-rewired start",
- "build": "react-scripts build",
+ "build": "react-app-rewired build",
- "test": "react-scripts test",
+ "test": "react-app-rewired test",
}

接着,安装customize-cra

$ yarn add customize-cra

然后在根目录下添加config-overrides.js文件。

module.exports = function override(config, env) {
// 关于webpack的相关配置
return config;
};

好了,基本的操作就是这样。下面我们再来说具体到我们的项目中,需要做的一些配置。

1、react项目中我们最常用的组件库antd,我们需要配置按需加载。

使用babel-plugin-import,它是一个用于按需加载组件代码和样式的 babel 插件。

安装

$ yarn add babel-plugin-import

接着配置webpack

/* config-overrides.js */
+ const { override, fixBabelImports } = require('customize-cra'); - module.exports = function override(config, env) {
- return config;
- };
+ module.exports = override(
+ fixBabelImports('import', {
+ libraryName: 'antd',
+ libraryDirectory: 'es',
+ style: 'css',
+ }),
+ );

这样我们在组件中就可以按需引入组件库中所需要的组件了。

2、自定义主题

按照配置主题的要求,自定义主题需要用到 less 变量覆盖功能。

安装less和less-loader

$ yarn add less less-loader

配置webpack

/* config-overrides.js */
- const { override, fixBabelImports } = require('customize-cra');
+ const { override, fixBabelImports, addLessLoader } = require('customize-cra'); module.exports = override(
fixBabelImports('import', {
libraryName: 'antd',
libraryDirectory: 'es',
- style: 'css',
+ style: true,
}),
+ addLessLoader({
+ javascriptEnabled: true,
+ modifyVars: { '@primary-color': '#1DA57A' },
+ }),
);

这里利用了less-loader的modifyVars来进行主题配置。当然这里的modifyVars的值也可以是一个theme文件。

3、打包后我们会发现静态文件夹中会有很多的css和js的map文件,那么我们该怎么关闭sourcemap呢?

/* config-overrides.js */
const { override, fixBabelImports, addLessLoader } = require("customize-cra");

+ process.env.GENERATE_SOURCEMAP = "false";

module.exports = override(
fixBabelImports("import", {
libraryName: 'antd',
libraryDirectory: "es",
style: true,
}),
addLessLoader({
javascriptEnabled: true,
modifyVars: { '@primary-color': '#1DA57A' },
})
);

ok,再次执行npm run build便不会产生map文件了。

还看到一种解决的方式如下,

const rewiredMap = () => config => {
config.devtool = config.mode === 'development' ? 'cheap-module-source-map' : false;
return config;
}; module.exports = override(
// 关闭mapSource
rewiredMap()
);

参考地址:https://segmentfault.com/q/1010000018123194

4、支持装饰器

const { override, addDecoratorsLegacy } = require("customize-cra");
module.exports = override(
addDecoratorsLegacy()
);

5、最后我们来说说前端本地proxy的配置

开发中常见的问题就是跨域。那么我们前端惯用的方式就是给本地webpack启动的node服务设置代理。

那么具体到使用了新版的cra后,我们该怎么办呢?

很简单,在src目录下新建文件setupProxy.js(注意文件名一定要是这个名字,不要问什么,cra现在废弃了proxy对象配置的方式,将其作为单独模块。解析就是按 src/setupProxy.js这个路径)

安装http代理相关包http-proxy-middleware

$ yarn add http-proxy-middleware -D

配置如下,

const proxy = require('http-proxy-middleware')

module.exports = function(app) {
app.use(
proxy('/api', {
target: 'http://xx.xx.xx.xx:8000/',
changeOrigin: true,
pathRewrite: {
'^/api': ''
}
})
)
}

好了,现在你就可以愉快的访问接口了~

关于更多的customize-cra配置,大家可以自行查看文档。https://github.com/arackaf/customize-cra

关于最新create-react-app使用react-app-rewired2.x添加webpack配置的更多相关文章

  1. 如何扩展 Create React App 的 Webpack 配置

    如何扩展 Create React App 的 Webpack 配置  原文地址https://zhaozhiming.github.io/blog/2018/01/08/create-react-a ...

  2. react native 第一次下载app的欢迎页+每次启动app的启动页设计

    欢迎各位同学加入: React-Native群:397885169 大前端群:544587175 大神超多,热情无私帮助解决各种问题. 我想我写的这篇博文可以帮助到很多人,接下来要分享的东西,对app ...

  3. 用React Native编写跨平台APP

    用React Native编写跨平台APP React Native 是一个编写iOS与Android平台实时.原生组件渲染的应用程序的框架.它基于React,Facebook的JavaScript的 ...

  4. 【招聘App】—— React/Nodejs/MongoDB全栈项目:登录注册

    前言:最近在学习Redux+react+Router+Nodejs全栈开发高级课程,这里对实践过程作个记录,方便自己和大家翻阅.最终成果github地址:https://github.com/66We ...

  5. Hybrid App 和 React Native 开发那点事

    简介:Hybrid App(混合模式移动应用)开发是指介于Web-app.Native-App这两者之间的一种开发模式,兼具「Native App 良好用户交互体验的优势」和「Web App 跨平台开 ...

  6. Hybrid APP基础篇(二)->Native、Hybrid、React Native、Web App方案的分析比较

    说明 Native.Hybrid.React.Web App方案的分析比较 目录 前言 参考来源 前置技术要求 楔子 几种APP开发模式 概述 Native App Web App Hybrid Ap ...

  7. 基于webview的Hybrid app和React Native及html5

    基于webview的Hybrid app和React Native及html5 React Native 结合了 Web 应用和 Native 应用的优势,可以使用 JavaScript 来开发 iO ...

  8. 移动端学习之理解WEB APP、Native APP、Hybrid APP以及React Native/uniapp包括H5、小程序等的区别与共通之处

    因为工作需要,需要进一步了解移动端的开发,遂返回复习移动端的知识点,在开始学习之前,产生了疑惑WEB APP .Native APP .Hybrid APP.React Native.Uniapp.H ...

  9. React Native创建一个APP

    React Native 结合了 Web 应用和 Native 应用的优势,可以使用 JavaScript 来开发 iOS 和 Android 原生应用.在 JavaScript 中用 React 抽 ...

随机推荐

  1. 前端学习历程--vue

    ---恢复内容开始--- 一.对比其他框架 1.react: 共同点: 使用 Virtual DOM 提供了响应式(Reactive)和组件化(Composable)的视图组件. 将注意力集中保持在核 ...

  2. springboot自动生成mysql的DAO层代码

    springboot提供了强大丰富的整合内容,但是每次要写一堆dao层的xml或者数据库相关的配置代码的时候,还是挺繁琐又容易出错的. 可以用mybatis-generator自动生成代码: 只需要加 ...

  3. HDFS的Java客户端编写

    总结: 之前在教材上看hdfs的Java客户端编写,只有关键代码,呵呵…….闲话不说,上正文. 1. Hadoop 的Java客户端编写建议在linux系统上开发 2. 可以使用eclipse,ide ...

  4. centos7安装pip

    转自:https://www.cnblogs.com/mangoVic/p/6428369.html 默认情况下,centos7是没有pip的,可以通过如下命令安装 首先安装epel扩展源: yum ...

  5. JAVA中for与while关于内存的细节问题

    文/朱季谦 JAVA的程序结构有顺序结构,循环结构,分支结构,以及跳转结构,而循环结构里经常用到的无外乎有以下几种:for循环,while循环,以及do-while循环.本文主要讨论for循环与whi ...

  6. ogg 12.3 for sqlserver 2016/2014 CDC模式配置

    本文主要讲述ogg 12.3 通过CDC抽取mssqlserver 2016 enterprise的过程,以sqlserver为目标端投递配置相对简单,所以在此不在赘述. 针对以前的mssqlserv ...

  7. 自定义域名访问本地WEB应用

    自定义域名访问本地WEB应用 本地安装了WEB服务端,怎样通过自定义域名方式实现从公网访问本地WEB应用? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动WEB服务端 默认安装的WEB ...

  8. 在linux和windows用c++编写c接口的动态库

    linux 动态的头文件api.h #ifndef _API_H #define _API_H #ifdef DLL_IMPLEMENT #define DLL_EXPORT extern " ...

  9. 2019.04.16打卡(java 数组)

    1.  要求输出数组中数据的平均值,并输出所有大于平均值的数据 代码 package block; import java.util.*; public class Average { public ...

  10. day14

    迭代器什么是迭代器(iterator) 器指的是某种工具 迭代指的是更新换代的过程,例如应用程序的版本更新从1.0 变成 1.2 迭代的目的是要根据上一个结果,产生下一个结果,这是一个重复的过程,但不 ...