使用过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. linux关机(重启)命令

    Linux系统关机命令: #关机命令 1.halt 2.poweroff 3.shutdown -h now 立即关机(具有root权限用户使用)#重启命令 1.reboot 2.shutdown - ...

  2. Python 字符串操作 starswitch() find() re.IGNORECASE replace() join()

    检测开头&结尾开头:startswith()url = 'http://www.python.org' url.startswith('http') >>>True 结尾:e ...

  3. Linq基础+Lambda表达式对数据库的增删改及简单查询

    一.Linq to sql 类 高集成化的数据库访问技术 使用Linq可以代替之前的Ado.Net,省去了自己敲代码的实体类和数据访问类的大量工作 实体类: 添加一个Linq to sql 类 --- ...

  4. 《Whitelabel Error Page 404》 对于Springboot初学者可能出现问题的原因

    whitelabel error page异常一定是有原因的,比如,访问路径不对,解析不对,注解忘记引入等.对于初学者,一定要注意一点,程序只加载Application.java所在包及其子包下的内容 ...

  5. Holer下载

    Holer下载 经常使用开源的holer将本地的应用映射到公网上访问,本文介绍如何下载holer软件包和注意事项,以及相关的帮助文档. 1. Java版本的holer软件包 格式: holer-cli ...

  6. 如何用Github删除repository

    第一步,登陆github,一定要点开要删除的repository,再选择相应的setting: 第二步,下拉选择,delete this repository 第三步,输入删除的仓库名,删除repos ...

  7. 解决jmeter中文乱码的三种方法

    1.在Jmeter中的Http请求中,在内容编码后填入“utf-8”. 2.在本地文件存储Jmeter的bin目录下,修改jmeter.properties文件. (1)用记事本打开jmeter.pr ...

  8. Type Conversion

    文章著作权归作者所有.转载请联系作者,并在文中注明出处,给出原文链接. 本文原更新于作者的github博客,这里给出链接. 什么是转换 转换是接受一个类型的值并使用它作为另一个类型的等价值的过程.转换 ...

  9. Python中 sys.argv[]的用法简明解释

    sys.argv[]就是一个从程序外部获取参数的桥梁,这个“外部”很关键.因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可以看作是一个列表,所以才能 ...

  10. AHOI2019游记

    day0 早上八点钟出发,下午一点左右到了(高速好堵啊) 下午试机,打了一发线段树,堆和其他一些东西,测试完没有问题就走了 惊奇发现旁边竟然是合肥市队的WC银牌hzy,%%% 晚上%了一发金牌爷yg就 ...