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 相关文章推荐
Extjs 3.3切换tab隐藏相应工具栏出现空白解决
Apr 02 Javascript
php和js对数据库图片进行等比缩放示例
Apr 28 Javascript
JQuery EasyUI的使用
Feb 24 Javascript
jQuery基础_入门必看知识点
Jul 04 Javascript
老生常谈JQuery data方法的使用
Sep 09 Javascript
vue中渐进过渡效果实现
Oct 27 Javascript
jQuery validata插件实现方法
Jun 25 jQuery
js实现图片轮播效果学习笔记
Jul 26 Javascript
jQuery实现输入框的放大和缩小功能示例
Jul 21 jQuery
《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析
Apr 07 Javascript
vue 实现把路由单独分离出来
Aug 13 Javascript
vue中实现点击空白区域关闭弹窗的两种方法
Dec 30 Vue.js
微信小程序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 之入门篇
2006/12/04 PHP
PHP伪静态页面函数附使用方法
2008/06/20 PHP
php 正则匹配函数体
2009/08/25 PHP
深入PHP购物车模块功能分析(函数讲解,附源码)
2013/06/25 PHP
php专用数组排序类ArraySortUtil用法实例
2015/04/03 PHP
PHP中4种常用的抓取网络数据方法
2015/06/04 PHP
初识PHP中的Swoole
2016/04/05 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
2017/09/29 PHP
javascript字典探测用户名工具
2006/10/05 Javascript
javascript 混合的构造函数和原型方式,动态原型方式
2009/12/07 Javascript
解决自定义$(id)的方法与jquery选择器$冲突的问题
2014/06/14 Javascript
javascript基本包装类型介绍
2015/04/10 Javascript
理解JS事件循环
2016/01/07 Javascript
jQuery插件AjaxFileUpload实现ajax文件上传
2016/05/05 Javascript
JS+WCF实现进度条实时监测数据加载量的方法详解
2017/12/19 Javascript
记一次webpack3升级webpack4的踩坑经历
2018/06/12 Javascript
Vue-Quill-Editor富文本编辑器的使用教程
2018/09/21 Javascript
JavaScript循环遍历你会用哪些之小结篇
2018/09/28 Javascript
JavaScript forEach中return失效问题解决方案
2020/06/01 Javascript
JavaScript 监听组合按键思路及代码实现
2020/07/28 Javascript
python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
2015/12/31 Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
2018/04/19 Python
python 通过logging写入日志到文件和控制台的实例
2018/04/28 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
2018/05/25 Python
python实现按长宽比缩放图片
2018/06/07 Python
10分钟教你用Python实现微信自动回复功能
2018/11/28 Python
Python+OpenCV图片局部区域像素值处理详解
2019/01/23 Python
django中间键重定向实例方法
2019/11/10 Python
Django查询优化及ajax编码格式原理解析
2020/03/25 Python
python入门:argparse浅析 nargs='+'作用
2020/07/12 Python
python模拟点击玩游戏的实例讲解
2020/11/26 Python
美国饼干礼物和美食甜点购买网站:Cheryl’s
2020/05/28 全球购物
管理工程专业求职信
2014/08/10 职场文书
员工表扬信怎么写
2015/05/05 职场文书
2015年管理人员工作总结
2015/05/13 职场文书
使用python生成大量数据写入es数据库并查询操作(2)
2022/09/23 Python