webpack项目轻松混用css module的方法


Posted in Javascript onJune 12, 2018

前言

本文讲述css-loader开启css模块功能之后,如何与引用的npm包中样式文件不产生冲突。

比如antd-mobilenpm包的引入。在不做特殊处理的前提下,样式文件将会被转译成css module

一、产生问题的原因

{ 
  test: /\.css$/,
  use: [
    'style-loader',
    {
      loader: 'css-loader',
      options: {
        modules: true,
        localIdentName: '[hash:base64:6]'
      }
    },
    'postcss-loader'
  ] 
}

以上代码片段,摘自webpack配置的module.rule。

可以看出wepack在编译过程中,遇到.css结尾的文件,都会交由postcss-loader、css-loader和style-loader依次处理。

因为css-loader开启了css模块功能,所以,所有经过处理的css文件,类名都将被改变。

二、初步改进

使用exclude和include进行区分

1.node_module文件夹内的文件,避免被当前rule处理

{ 
  test: /\.css$/,
  use: [
    {
      loader: 'style-loader'
    },
    {
      loader: 'css-loader',
      options: {
        modules: true,
        localIdentName: '[hash:base64:6]'
      }
    },
    {
      loader: 'postcss-loader'
    }
  ],
  exclude:[path.resolve(__dirname, '..', 'node_modules')]
}

如上所示,将node_module文件夹内的文件,用exclude排除在外,不用当前rule进行处理。

2.单独处理node_module内的css文件

{ 
  test: /\.css$/,
  use: [
    {
      loader: 'style-loader'
    },
    {
      loader: 'css-loader'
    },
    {
      loader: 'postcss-loader'
    }
  ],
  include:[path.resolve(__dirname, '..', 'node_modules')]
}

三、升级版,支持css module模式和普通模式混用

1.用文件名区分两种模式

  1. *.global.css 普通模式
  2. *.css css module模式

这里统一用 global 关键词进行识别。

2.用正则表达式匹配文件

// css module
{ 
  test: new RegExp(`^(?!.*\\.global).*\\.css`),
  use: [
    {
      loader: 'style-loader'
    },
    {
      loader: 'css-loader',
      options: {
        modules: true,
        localIdentName: '[hash:base64:6]'
      }
    },
    {
      loader: 'postcss-loader'
    }
  ],
  exclude:[path.resolve(__dirname, '..', 'node_modules')]
}

// 普通模式
{ 
  test: new RegExp(`^(.*\\.global).*\\.css`),
  use: [
    {
      loader: 'style-loader'
    },
    {
      loader: 'css-loader',
    },
    {
      loader: 'postcss-loader'
    }
  ],
  exclude:[path.resolve(__dirname, '..', 'node_modules')]
}

四、其他问题

less在使用css module时,对url的解析存在冲突,可以用resolve-url-loader进行解决,直接上代码:

test: /\.less/,
use: [
  {
    loader: "style-loader"
  },
  {
    loader: "css-loader", 
    options: {
      sourceMap: true,
      importLoaders: 2
    }
  },
  {
    loader: "postcss-loader", 
    options: {
      sourceMap: true
    }
  },
  {
    loader: "resolve-url-loader", 
    options: {
      sourceMap: true
    }
  },
  {
    loader: "less-loader", 
    options: {
      sourceMap: true
    }
  }
]

参考

[1] [Updated README regarding relative filepaths issue #121]

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

Javascript 相关文章推荐
javascript 学习笔记(六)浏览器类型及版本信息检测代码
Apr 08 Javascript
使用纯javascript实现放大镜效果
Mar 18 Javascript
详解jQuery插件开发方式
Nov 22 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
May 03 Javascript
vue 如何添加全局函数或全局变量以及单页面的title设置总结
Jun 01 Javascript
JS动态添加的div点击跳转到另一页面实现代码
Sep 30 Javascript
JS实现导出Excel的五种方法详解【附源码下载】
Mar 15 Javascript
Vue中在新窗口打开页面及Vue-router的使用
Jun 13 Javascript
vue实现评论列表功能
Oct 25 Javascript
webpack+vue-cil 中proxyTable配置接口地址代理操作
Jul 18 Javascript
vue实现PC端分辨率适配操作
Aug 03 Javascript
nuxt.js添加环境变量,区分项目打包环境操作
Nov 06 Javascript
微信小程序js文件改变参数并在视图上及时更新【推荐】
Jun 11 #Javascript
用vue快速开发app的脚手架工具
Jun 11 #Javascript
详解React Native 屏幕适配(炒鸡简单的方法)
Jun 11 #Javascript
vue非父子组件通信问题及解决方法
Jun 11 #Javascript
Angular如何在应用初始化时运行代码详解
Jun 11 #Javascript
详解.vue文件解析的实现
Jun 11 #Javascript
vue filters的使用详解
Jun 11 #Javascript
You might like
用PHP 快速生成 Flash 动画的方法
2007/03/06 PHP
关于在php.ini中添加extension=php_mysqli.dll指令的说明
2007/06/14 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
使用PHP json_decode可能遇到的坑与解决方法
2017/08/03 PHP
PHP Laravel中的Trait使用方法
2019/01/20 PHP
一个刚完成的layout(拖动流畅,不受iframe影响)
2007/08/17 Javascript
JavaScript使用Replace进行字符串替换的方法
2015/04/14 Javascript
微信开发 js实现tabs选项卡效果
2016/10/28 Javascript
JS实现一次性弹窗的方法【刷新后不弹出】
2016/12/26 Javascript
Vuex和前端缓存的整合策略详解
2017/05/09 Javascript
基于daterangepicker日历插件使用参数注意的问题
2017/08/10 Javascript
基于JavaScript实现简单的音频播放功能
2018/01/07 Javascript
JS实现调用本地摄像头功能示例
2018/05/18 Javascript
ES6 Symbol数据类型的应用实例分析
2019/06/26 Javascript
python实现迭代法求方程组的根过程解析
2019/11/25 Javascript
Vue实现图书管理案例
2021/01/20 Vue.js
vue-cli中实现响应式布局的方法
2021/03/02 Vue.js
python抓取网页时字符集转换问题处理方案分享
2014/06/19 Python
python使用socket向客户端发送数据的方法
2015/04/29 Python
解决pyinstaller打包pyqt5的问题
2019/01/08 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
2019/06/03 Python
Django 用户认证组件使用详解
2019/07/23 Python
Python序列化与反序列化pickle用法实例
2019/11/11 Python
Python实现数值积分方式
2019/11/20 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
2019/12/10 Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
2020/12/31 Python
Forever 21美国官网:美国标志性快时尚品牌
2017/02/20 全球购物
如何进行Linux分区优化
2016/09/13 面试题
采购求职信
2014/03/17 职场文书
文明礼仪标语
2014/06/13 职场文书
《周恩来的四个昼夜》观后思想汇报范文两篇
2014/09/10 职场文书
2014高中生入党思想汇报范文
2014/09/13 职场文书
2015年超市员工工作总结
2015/05/04 职场文书
新郎父亲婚礼致辞
2015/07/27 职场文书
2016学校元旦晚会经典开场白台词
2015/12/03 职场文书
一年之计:2019年下半年的计划
2019/05/07 职场文书