详解使用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 相关文章推荐
document.all还是document.getElementsByName?
Jul 21 Javascript
理解Javascript_10_对象模型
Oct 16 Javascript
jQuery Tools Dateinput使用介绍
Jul 14 Javascript
jQuery实用基础超详细介绍
Apr 11 Javascript
js中array的sort()方法使用介绍
Feb 20 Javascript
jQuery背景插件backstretch使用指南
Apr 21 Javascript
JS+CSS实现大气的黑色首页导航菜单效果代码
Sep 10 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
Jan 28 Javascript
基于JS代码实现图片在页面中旋转效果
Jun 16 Javascript
javascript 网页进度条简单实例
Feb 22 Javascript
vue-cli扩展多模块打包的示例代码
Apr 09 Javascript
微信小程序实现展示评分结果功能
Feb 15 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数组对百万数据进行排除重复数据的实现代码
2010/06/08 PHP
PHP定时执行计划任务的多种方法小结
2011/12/19 PHP
基于jQuery的倒计时实现代码
2012/05/30 Javascript
jQuery阻止同类型事件小结
2013/04/19 Javascript
javascript实现动态导入js与css等静态资源文件的方法
2015/07/25 Javascript
JS采用绝对定位实现回到顶部效果完整实例
2016/06/20 Javascript
基于CSS3和jQuery实现跟随鼠标方位的Hover特效
2016/07/25 Javascript
微信小程序 实例应用(记账)详解
2016/09/28 Javascript
angular2倒计时组件使用详解
2017/01/12 Javascript
js简易版购物车功能
2017/06/17 Javascript
vue 实现根据data中的属性值来设置不同的样式
2020/08/04 Javascript
用Python实现换行符转换的脚本的教程
2015/04/16 Python
Python json 错误xx is not JSON serializable解决办法
2017/03/15 Python
Python Numpy 数组的初始化和基本操作
2018/03/13 Python
对Python 网络设备巡检脚本的实例讲解
2018/04/22 Python
python实现烟花小程序
2019/01/30 Python
在Python 中同一个类两个函数间变量的调用方法
2019/01/31 Python
python中pathlib模块的基本用法与总结
2020/08/17 Python
python实现xml转json文件的示例代码
2020/12/30 Python
如何在网站上添加谷歌定位信息
2016/04/16 HTML / CSS
Koral官方网站:女性时尚运动服
2019/04/10 全球购物
EJB的几种类型
2012/08/15 面试题
幼儿园保育员辞职信
2014/01/12 职场文书
生物制药专业自我鉴定
2014/02/19 职场文书
实习报告评语
2014/04/26 职场文书
暑期培训班招生方案
2014/08/26 职场文书
2014幼儿园教师师德师风演讲稿
2014/09/10 职场文书
2014中学教师节广播稿
2014/09/10 职场文书
工作业绩不及格检讨书
2014/10/28 职场文书
运动会表扬稿
2015/01/16 职场文书
暂住证明怎么写
2015/06/19 职场文书
2015年环境监察工作总结
2015/07/23 职场文书
装修安全责任协议书
2016/03/22 职场文书
2017年大学生寒假社会实践活动总结
2016/04/06 职场文书
python字典的元素访问实例详解
2021/07/21 Python
Python实现制作销售数据可视化看板详解
2021/11/27 Python