详解使用create-react-app添加css modules、sasss和antd


Posted in Javascript onJuly 31, 2018

create-react-app 是facebook的官方脚手架,对于个人开发者和中小型公司快速创建项目非常推荐。react的CSS解决方案有很多,这里我技术选型时用 css modules 和 sass ,然后配合antd使用通用组件库。但是create-react-app原生并不支持 css modules 和 sass ,所以需要额外配置。

配置

增加css modules和sass

使用eject暴露配置

create-react-app 默认是没有暴露 webpack 配置的,所以需要eject一下。注意如果项目在git仓库环境下,先提交代码到git仓库,否则会报错

npm run eject

npm添加css modules和sass

npm install react-css-modules 
npm install sass-loader node-sass

这里安装sass可能会遇到墙的问题报错,所以要么使用cnpm或者使用本地代理设置,因为我有ss所以使用本地代理

// 开启代理
npm config set proxy http://127.0.0.1:1080
// 安装完sass后关闭代理
npm config delete proxy

webpack配置

重点来了,我们需要给 webpack 配置上 css-modules 和 sass-loader 。但是使用 css-modules 会使 node_modules 库里的css样式找不到,比如后面要使用到的antd,这个时候我们需要inclube来排除影响 node_modules ,使得 css-modules 不会影响到 node_modules

修改项目中 config 目录下的 webpack.config.dev.js 和 webpack.config.prod.js ,说明下这两个文件,前一个是开发环境 npm start 使用,后一个是 npm run build 打包后使用

修改 webpack.config.dev.js :

大约在160行左右,找到 test: /\.css$/ ,中文注释的地方就是修改和增加的地方

{
      test: [/\.css$/, /\.scss$/],// 这里增加SCSS的支持
      exclude: [/node_modules/],// 这里去排除node_modules,防止css modules影响到node_modules
      use: [
       require.resolve('style-loader'),
       {
        loader: require.resolve('css-loader'),
        options: {
         importLoaders: 1,
         modules: true, // 这里增加对css modules的支持
         localIdentName: '[name]__[local]__[hash:base64:5]' //这里增加对css modules的支持
        },
       },
       {
        loader: require.resolve('sass-loader'), // 这里增加sass的支持
       },
       {
        loader: require.resolve('postcss-loader'),
        options: {
         // Necessary for external CSS imports to work
         // https://github.com/facebookincubator/create-react-app/issues/2677
         ident: 'postcss',
         plugins: () => [
          require('postcss-flexbugs-fixes'),
          autoprefixer({
           browsers: [
            '>1%',
            'last 4 versions',
            'Firefox ESR',
            'not ie < 9', // React doesn't support IE8 anyway
           ],
           flexbox: 'no-2009',
          }),
         ],
        },
       },
      ],
     },
     // 因为上面排除了css_modules所以这里一定要再添加个排除src来识别css_modules
     // 其实就是复制之前没修改前的所有,再增加一个exclude: [/src/]
     {
      test: /\.css$/, 
      exclude: [/src/], // 这里添加排除src,
      use: [
       require.resolve('style-loader'),
       {
        loader: require.resolve('css-loader'),
        options: {
         importLoaders: 1,
        },
       },
       {
        loader: require.resolve('postcss-loader'),
        options: {
         // Necessary for external CSS imports to work
         // https://github.com/facebookincubator/create-react-app/issues/2677
         ident: 'postcss',
         plugins: () => [
          require('postcss-flexbugs-fixes'),
          autoprefixer({
           browsers: [
            '>1%',
            'last 4 versions',
            'Firefox ESR',
            'not ie < 9', // React doesn't support IE8 anyway
           ],
           flexbox: 'no-2009',
          }),
         ],
        },
       },
      ],
     }

修改 webpack.config.prod.js :

和上面修改 webpack.config.dev.js 类似

{
      test: [/\.css$/, /\.scss$/], // 这里增加SCSS的支持
      exclude: [/node_modules/], // 这里去排除node_modules
      loader: ExtractTextPlugin.extract(
       Object.assign(
        {
         fallback: {
          loader: require.resolve('style-loader'),
          options: {
           hmr: false,
          },
         },
         use: [
          {
           loader: require.resolve('css-loader'),
           options: {
            importLoaders: 1,
            minimize: true,
            sourceMap: true,
            modules: true, // 这里添加css modules支持
           },
          },
          {
           loader: require.resolve('postcss-loader'),
           options: {
            // Necessary for external CSS imports to work
            // https://github.com/facebookincubator/create-react-app/issues/2677
            ident: 'postcss',
            plugins: () => [
             require('postcss-flexbugs-fixes'),
             autoprefixer({
              browsers: [
               '>1%',
               'last 4 versions',
               'Firefox ESR',
               'not ie < 9', // React doesn't support IE8 anyway
              ],
              flexbox: 'no-2009',
             }),
            ],
           },
          },
          {
           loader: require.resolve('sass-loader'), // 这里添加sass支持
          }
         ],
        },

        extractTextPluginOptions
       )
      ),
      // Note: this won't work without `new ExtractTextPlugin()` in `plugins`.
     },
     {
      test: /\.css$/,
      exclude: [/src/], // 排除src
      loader: ExtractTextPlugin.extract(
       Object.assign(
        {
         fallback: {
          loader: require.resolve('style-loader'),
          options: {
           hmr: false,
          },
         },
         use: [
          {
           loader: require.resolve('css-loader'),
           options: {
            importLoaders: 1,
            minimize: true,
            sourceMap: true,
           },
          },
          {
           loader: require.resolve('postcss-loader'),
           options: {
            // Necessary for external CSS imports to work
            // https://github.com/facebookincubator/create-react-app/issues/2677
            ident: 'postcss',
            plugins: () => [
             require('postcss-flexbugs-fixes'),
             autoprefixer({
              browsers: [
               '>1%',
               'last 4 versions',
               'Firefox ESR',
               'not ie < 9', // React doesn't support IE8 anyway
              ],
              flexbox: 'no-2009',
             }),
            ],
           },
          }
         ],
        },

        extractTextPluginOptions
       )
      ),
      // Note: this won't work without `new ExtractTextPlugin()` in `plugins`.
     }

安装antd和配置

主要是安装配置 antd 和 babel-plugin-import ,这样可以使得 antd 按需加载样式

npm添加antd和babel-plugin-import

npm install antd
npm install babel-plugin-import

配置babel

在项目根目录下增加 .babelrc 文件,然后配置如下

{
 "presets": [
  "react-app"
 ],
 "plugins": [
  "transform-runtime",
  [
   "import",
   {
    "libraryName": "antd",
    "style": "css"
   }
  ]
 ]
}

大功告成

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js nextSibling属性和previousSibling属性概述及使用注意
Feb 16 Javascript
12种不宜使用的Javascript语法整理
Nov 04 Javascript
javascript为下拉列表动态添加数据项
May 23 Javascript
JavaScript模拟重力状态下抛物运动的方法
Mar 03 Javascript
每天一篇javascript学习小结(RegExp对象)
Nov 17 Javascript
JS中的数组方法笔记整理
Jul 26 Javascript
js实现html table 行,列锁定的简单实例
Oct 13 Javascript
JavaScript简单生成 N~M 之间随机数的方法
Jan 13 Javascript
js实现城市级联菜单的2种方法
Jun 23 Javascript
详解ES6之用let声明变量以及let loop机制
Jul 15 Javascript
使用layer弹窗和layui表单实现新增功能
Aug 09 Javascript
vue中使用v-model完成组件间的通信
Aug 22 Javascript
jQuery实现点击自身以外区域关闭弹出层功能完整示例【改进版】
Jul 31 #jQuery
Vue导出页面为PDF格式的实现思路
Jul 31 #Javascript
详解微信小程序实现WebSocket心跳重连
Jul 31 #Javascript
前端axios下载excel文件(二进制)的处理方法
Jul 31 #Javascript
JS构造一个html文本内容成文件流形式发送到后台
Jul 31 #Javascript
vue导出html、word和pdf的实现代码
Jul 31 #Javascript
JavaScript函数节流和函数去抖知识点学习
Jul 31 #Javascript
You might like
php基础设计模式大全(注册树模式、工厂模式、单列模式)
2015/08/31 PHP
PHP实现 APP端微信支付功能
2018/06/22 PHP
深入理解JavaScript定时机制
2010/10/29 Javascript
jquery中ajax学习笔记一
2011/10/16 Javascript
web基于浏览器的本地存储方法应用
2012/11/27 Javascript
删除节点的jquery代码
2014/01/13 Javascript
初识Node.js
2014/09/03 Javascript
JavaScript中获取Radio被选中的值
2015/11/11 Javascript
JavaScript的字符串方法汇总
2016/07/31 Javascript
JS实现下拉菜单列表与登录注册弹窗效果
2017/08/10 Javascript
vue.js分页中单击页码更换页面内容的方法(配合spring springmvc)
2018/02/10 Javascript
详解Vue.js使用Swiper.js在iOS
2018/09/10 Javascript
[01:04:48]VGJ.S vs TNC Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
Windows系统下安装Python的SSH模块教程
2015/02/05 Python
Python 中 Virtualenv 和 pip 的简单用法详解
2017/08/18 Python
Python将多个excel文件合并为一个文件
2018/01/03 Python
python OpenCV学习笔记直方图反向投影的实现
2018/02/07 Python
python+pyqt5实现24点小游戏
2019/01/24 Python
Tensorflow获取张量Tensor的具体维数实例
2020/01/19 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
2020/02/25 Python
Python random模块的使用示例
2020/10/10 Python
Vs Code中8个好用的python 扩展插件
2020/10/12 Python
Python基于execjs运行js过程解析
2020/11/27 Python
Python关于拓扑排序知识点讲解
2021/01/04 Python
介绍一下如何优化MySql
2016/12/20 面试题
入党积极分子自我鉴定
2014/02/18 职场文书
《小池塘》教学反思
2014/02/28 职场文书
公司股权转让协议书
2014/04/12 职场文书
《梅花魂》教学反思
2014/04/30 职场文书
大班亲子运动会方案
2014/06/10 职场文书
机电专业毕业生自我鉴定2014
2014/10/04 职场文书
镇党委书记群众路线整改措施思想汇报
2014/10/13 职场文书
教师年度个人总结
2015/02/11 职场文书
见习期个人总结
2015/03/05 职场文书
2016年大学迎新工作总结
2015/10/14 职场文书
元素水平垂直居中的方式
2021/03/31 HTML / CSS