先看 webpack.config.dev.js 里的相关代码:

  1. // style files regexes
  2. const cssRegex = /\.css$/;
  3. const cssModuleRegex = /\.module\.css$/;
  4. const sassRegex = /\.(scss|sass)$/;
  5. const sassModuleRegex = /\.module\.(scss|sass)$/;
  6.  
  7. // common function to get style loaders
  8. const getStyleLoaders = (cssOptions, preProcessor) => {
  9. const loaders = [
  10. require.resolve('style-loader'),
  11. {
  12. loader: require.resolve('css-loader'),
  13. options: cssOptions,
  14. },
  15. {
  16. // Options for PostCSS as we reference these options twice
  17. // Adds vendor prefixing based on your specified browser support in
  18. // package.json
  19. loader: require.resolve('postcss-loader'),
  20. options: {
  21. // Necessary for external CSS imports to work
  22. // https://github.com/facebook/create-react-app/issues/2677
  23. ident: 'postcss',
  24. plugins: () => [
  25. require('postcss-flexbugs-fixes'),
  26. require('postcss-preset-env')({
  27. autoprefixer: {
  28. flexbox: 'no-2009',
  29. },
  30. stage: 3,
  31. }),
  32. ],
  33. },
  34. },
  35. ];
  36. if (preProcessor) {
  37. loaders.push(require.resolve(preProcessor));
  38. }
  39. return loaders;
  40. };
  41.  
  42. module.exports = {
  43. mode: 'development',
  44. // ...
  45. module: {
  46. // ...
  47. {
  48. oneOf: [
  49. // ...
  50. {
  51. test: cssRegex,
  52. exclude: cssModuleRegex,
  53. use: getStyleLoaders({
  54. importLoaders: 1,
  55. }),
  56. },
  57. // Adds support for CSS Modules (https://github.com/css-modules/css-modules)
  58. // using the extension .module.css
  59. {
  60. test: cssModuleRegex,
  61. use: getStyleLoaders({
  62. importLoaders: 1,
  63. modules: true,
  64. getLocalIdent: getCSSModuleLocalIdent,
  65. }),
  66. },
  67. // Opt-in support for SASS (using .scss or .sass extensions).
  68. // Chains the sass-loader with the css-loader and the style-loader
  69. // to immediately apply all styles to the DOM.
  70. // By default we support SASS Modules with the
  71. // extensions .module.scss or .module.sass
  72. {
  73. test: sassRegex,
  74. exclude: sassModuleRegex,
  75. use: getStyleLoaders({ importLoaders: 2 }, 'sass-loader'),
  76. },
  77. // Adds support for CSS Modules, but using SASS
  78. // using the extension .module.scss or .module.sass
  79. {
  80. test: sassModuleRegex,
  81. use: getStyleLoaders(
  82. {
  83. importLoaders: 2,
  84. modules: true,
  85. getLocalIdent: getCSSModuleLocalIdent,
  86. },
  87. 'sass-loader'
  88. ),
  89. }
  90. // ...
  91. };

4 个 样式文件后缀的正则表示,这份配置里是将普通 (s)css 文件和 (s)css module 文件是按文件名后缀不同而区分对待的,前者视为普通 css 文件,而处理后者时开启 css-loader 的 module 模式。这样做的一个好处是区分明确,全局的 class 样式加写到 .(s)css 文件里,需要加 hash 的局部样式就写到 .module.(s)css 文件里,这样也可以不用在想要写一个全局样式时把 class 包到 :global() 里了。

getStyleLoaders 是一个返回 loader 配置的函数,内部默认有 ['style-loader', 'css-loader', 'postcss-loader'] 三个 loader。函数接受两个参数,其中第一个是 css-loader 的 option 配置。第二个是视需要添加 sass-loader 或者 less-loader。需要添加 postcss 插件,可以在 getStyleLoaders 里对应的 plugin 配置里加。以上就是 development 下关于样式的配置,下面看看 production 里不一样的地方:

  1. // style-loader 换成了下面的内容
  2. {
  3. loader: MiniCssExtractPlugin.loader,
  4. options: Object.assign(
  5. {},
  6. shouldUseRelativeAssetPaths ? { publicPath: '../../' } : undefined
  7. ),
  8. },

此外配置里还多了 mini-css-extract-plugin、optimize-css-assets-webpack-plugin、postcss-safe-parser 这三个东西,第一个的作用是将构建后的 css 样式,生成 .css 文件,然后以 link 标签的形式插入到模板 html 中;第二个和第三个的作用是压缩 css 文件。

react中关于create-react-app2里css相关配置的更多相关文章

  1. 在 .NET Core 5 中集成 Create React app

    翻译自 Camilo Reyes 2021年2月22日的文章 <Integrate Create React app with .NET Core 5> [1] Camilo Reyes ...

  2. 如何优雅地在React中处理事件响应&&React绑定onClick为什么要用箭头函数?

    React绑定onClick为什么要用箭头函数? https://segmentfault.com/q/1010000010918131 如何优雅地在React中处理事件响应 https://segm ...

  3. asp.net在类库中使用EF 6.0时的相关配置

    前提:之前使用EF的配置都是直接使用NuGet安装在项目中,然后直接修改web.config中的connectionString,然后创建相关dbcontext直接使用就可以了.此次为直接将EF安装在 ...

  4. React中diff算法的理解

    React中diff算法的理解 diff算法用来计算出Virtual DOM中改变的部分,然后针对该部分进行DOM操作,而不用重新渲染整个页面,渲染整个DOM结构的过程中开销是很大的,需要浏览器对DO ...

  5. 利用 Create React Native App 快速创建 React Native 应用

    本文介绍的 Create-React-Native-App 是非常 Awesome 的工具,而其背后的 Expo 整个平台也让笔者感觉非常的不错.笔者目前公司是采用 APICloud 进行移动应用开发 ...

  6. 在React中使用Redux

    这是Webpack+React系列配置过程记录的第六篇.其他内容请参考: 第一篇:使用webpack.babel.react.antdesign配置单页面应用开发环境 第二篇:使用react-rout ...

  7. DIFF算法浅析(三)在react中的实现

    在虚拟dom中diff的实现. 分别从4个方面: DIFF抽象概念(概述.时间复杂性分析) 在Vue2中的实现(版本2.6.11.必要性.执行方式) 在React中的实现(版本16.13.1,必要性. ...

  8. CSS Modules入门及React中实践(内附webpack4配置)

    本篇文章以整理为主,自己进行了部分修改,如有侵权,请告知 CSS Modules介绍 CSS Modules是什么东西呢?首先,让我们从官方文档入手:GitHub – css-modules/css- ...

  9. 聊一聊 React 中的 CSS 样式方案

    和 Angular,Vue 不同,React 并没有如何在 React 中书写样式的官方方案,依靠的是社区众多的方案.社区中提供的方案有很多,例如 CSS Modules,styled-compone ...

随机推荐

  1. 关于使用Topshelf创建服务

    目录 0. 背景说明 1. 使用Topshelf组件创建Windows服务 1.1 依赖Quartz.net实现定时任务 1.2 依赖于Topshelf创建服务类 1.3 log4net的配置文件lo ...

  2. SQLserver 2014使用Convert()函数获取时间

    select convert(char(100),GetDate(),120) as Date 第3个参数就是用来设置日期类型数据的显示样式的,下面介绍几种样式的参数 SELECT CONVERT(v ...

  3. Windows下安装xampp的PHP扩展(redis为例)

    (1)PHP的windowns扩展下载网址:https://windows.php.net/downloads/pecl/releases/ (2)Ctrl+f查询你要下载的扩展名 注意:扩展的版本要 ...

  4. 极简!一个注解就能创建Jaeger的Span

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  5. LuoguP3932 浮游大陆的68号岛 题解

    Content 在一个无限长的数轴上有 \(n\) 个点.第 \(i\) 个点上面有 \(a_i\) 件物品,且第 \(i\) 个点到第 \(i+1\) 个点的距离为 \(b_i\). 定义从第 \( ...

  6. CF1428A Box is Pull 题解

    Content 有一个兔子拖着一个盒子在走,每秒钟可以带着盒子走一个单位,也可以不带着盒子走一个单位.当且仅当兔子和盒子的距离不超过 \(1\) 时可以带着盒子走一个单位.现给出 \(t\) 次询问, ...

  7. CF1492A Three swimmers 题解

    Update \(\texttt{2021.3.9}\) 修改了题解中的错别字. \(\texttt{2021.12.16}\) 修改了一个没括回的区间. Content 有 \(3\) 个游泳者,同 ...

  8. div中出现滚动条,自动保持在最底端---显示聊天窗口最新的信息

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. [C# Expression] 之基础概念

    00 | 什么是表达式树 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如方法调用和 x < y 这样的二元运算等.可以对表达式树中的代码进行编辑和运算. 这样能够动态修改可执 ...

  10. velocity使用foreach进行遍历时$velocityCount不起作用

    把$velocityCount替换成$foreach.count 例如 #if($foreach.count != $columns.size()),#end