webpack

概述

create-react-app脚手架中的react-scripts能够(1)自动下载需要的webpack依赖;(2)自己写了一个nodejs服务端脚本代码;(3)使用express的Http服务器;(4)并隐藏了配置文件。
那么如果需要额外配置webpack该怎么办呢?比如添加md的loader。
总结了如下2种方法:

方法一:显示隐藏的配置文件进行更改

运行如下命令即可把配置文件显示出来:

  1. npm run eject
  2. yarn eject
  3. //然后输入Y

输入后项目目录会多出一个congfig文件夹,里面就有webpack的配置文件。
image.png :::tips 但是此过程不可逆,所以显现回来后就不能再隐藏回去了。 :::

引入less支持+antd按需加载+自定义主题

1、添加less 在项目根目录 使用 npm 或者 yarn 来安装antd less 和 less-loader

  1. yarn add babel-plugin-import
  2. yarn add antd
  3. yarn add less less-loader

2、修改package.json:添加antd库的样式

  1. "babel": {
  2. "presets": [
  3. "react-app"
  4. ],
  5. "plugins": [
  6. [
  7. "import",
  8. {
  9. "libraryName": "antd",
  10. "style": "css"
  11. }
  12. ]
  13. ]
  14. }

3、复制代码修改配置环境(webpack.config.js) 定义全局变量

  1. // style files regexes
  2. const cssRegex = /\.css$/;
  3. const cssModuleRegex = /\.module\.css$/;
  4. const lessRegex = /\.less$/;
  5. const lessModuleRegex = /\.module\.less$/;
  6. const sassRegex = /\.(scss|sass)$/;
  7. const sassModuleRegex = /\.module\.(scss|sass)$/;

4、复制代码配置less-loader

  1. //在大概466行会看到如下代码
  2. {
  3. test: sassModuleRegex,
  4. use: getStyleLoaders(
  5. {
  6. importLoaders: 2,
  7. sourceMap: isEnvProduction && shouldUseSourceMap,
  8. modules: true,
  9. getLocalIdent: getCSSModuleLocalIdent,
  10. },
  11. 'sass-loader'
  12. ),
  13. },
  14. //在此代码后添加如下代码
  15. {
  16. test: lessRegex,
  17. exclude: lessModuleRegex,
  18. use: getStyleLoaders(
  19. {
  20. importLoaders: 2
  21. },
  22. 'less-loader'
  23. ),
  24. },
  25. {
  26. test: lessModuleRegex,
  27. use: getStyleLoaders(
  28. {
  29. importLoaders: 2,
  30. modules: true,
  31. getLocalIdent: getCSSModuleLocalIdent,
  32. },
  33. 'less-loader'
  34. ),
  35. },

5、复制代码定义全局样式

  1. //注释掉大概114行
  2. // if (preProcessor) {
  3. // loaders.push({
  4. // loader: require.resolve(preProcessor),
  5. // options: {
  6. // sourceMap: isEnvProduction && shouldUseSourceMap,
  7. // },
  8. // });
  9. // }
  10. // return loaders;
  11. //替换为如下
  12. if (preProcessor) {
  13. let loader = require.resolve(preProcessor)
  14. if (preProcessor === "less-loader") {
  15. loader = {
  16. loader,
  17. options: {
  18. modifyVars: { //自定义主题
  19. 'primary-color': ' #1890ff ',
  20. },
  21. javascriptEnabled: true,
  22. }
  23. }
  24. }
  25. loaders.push(loader);
  26. }
  27. return loaders;

6、复制代码修改package.json

  1. "babel": {
  2. "presets": [
  3. "react-app"
  4. ],
  5. "plugins": [
  6. [
  7. "import",
  8. {
  9. "libraryName": "antd",
  10. "style": true //修改处
  11. }
  12. ]
  13. ]
  14. }

方法二:修改babel插件处理

以修改babel插件实现按需加载antd为例,修改其它配置可以仿照这个方法来做。
(1)使用 react-app-rewired (一个对 create-react-app 进行自定义配置的社区解决方案)和babel-plugin-import(一个babel的管理加载的插件)。

  1. $ yarn add react-app-rewired --dev
  2. $ yarn add babel-plugin-import --dev
  3. //或者使用npm
  4. npm install react-app-rewired --dev
  5. npm install babel-plugin-import --dev

(2)修改package.json 里的启动配置。

  1. /* package.json */
  2. "scripts": {
  3. "start": "react-app-rewired start",
  4. "build": "react-app-rewired build",
  5. "test": "react-app-rewired test --env=jsdom",
  6. }

(3)在项目根目录创建一个 config-overrides.js 用于修改默认配置。

  1. /* config-overrides.js */
  2. const { injectBabelPlugin } = require('react-app-rewired');
  3. module.exports = function override(config, env) {
  4. config = injectBabelPlugin(['import', { libraryName: 'antd', libraryDirectory: 'es', style: 'css' }], config);
  5. return config;
  6. };