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 相关文章推荐
jquery 日期分离成年月日的代码
May 14 Javascript
新鲜出炉的js tips提示效果
Apr 03 Javascript
javascript学习笔记(一) 在html中使用javascript
Jun 18 Javascript
JavaScript跨平台的开源框架NativeScript
Mar 24 Javascript
JavaScript学习笔记(三):JavaScript也有入口Main函数
Sep 12 Javascript
Jquery表单验证失败后不提交的解决方法
Oct 18 Javascript
JavaScript常见的五种数组去重的方式
Dec 15 Javascript
解决iview打包时UglifyJs报错的问题
Mar 07 Javascript
vue 本地环境跨域请求proxyTable的方法
Sep 19 Javascript
vue中实现回车键登录功能
Feb 19 Javascript
微信小程序自定义弹出层效果
May 26 Javascript
three.js中多线程的使用及性能测试详解
Jan 07 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将向Java靠拢
2006/10/09 PHP
Laravel中使用阿里云OSS Composer包分享
2015/02/10 PHP
不常用但很实用的PHP预定义变量分析
2019/06/25 PHP
Javascript之文件操作
2007/03/07 Javascript
jsTree树控件(基于jQuery, 超强悍)[推荐]
2009/09/01 Javascript
基于jquery的图片的切换(以数字的形式)
2011/02/14 Javascript
自己实现string的substring方法 人民币小写转大写,数字反转,正则优化
2012/09/02 Javascript
Jquery 动态生成表格示例代码
2013/12/24 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
JS 弹出层 定位至屏幕居中示例
2014/05/21 Javascript
将数字转换成大写的人民币表达式的js函数
2014/09/21 Javascript
jQuery制作拼图小游戏
2015/01/12 Javascript
jQuery实现仿美橙互联两级导航菜单的方法
2015/03/09 Javascript
Angular2库初探
2017/03/01 Javascript
EasyUI实现下拉框多选功能
2017/11/07 Javascript
详解微信JS-SDK选择图片遇到的坑
2018/08/15 Javascript
详解在Javascript中进行面向切面编程
2019/04/28 Javascript
[50:27]Secret vs VG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
在Python中使用mongoengine操作MongoDB教程
2015/04/24 Python
编写Python脚本把sqlAlchemy对象转换成dict的教程
2015/05/29 Python
pip命令无法使用的解决方法
2018/06/12 Python
使用Python横向合并excel文件的实例
2018/12/11 Python
PyTorch 1.0 正式版已经发布了
2018/12/13 Python
详解Python requests 超时和重试的方法
2018/12/18 Python
python3中sorted函数里cmp参数改变详解
2020/03/12 Python
通过python 执行 nohup 不生效的解决
2020/04/16 Python
如何使用 Flask 做一个评论系统
2020/11/27 Python
python爬虫scrapy基于CrawlSpider类的全站数据爬取示例解析
2021/02/20 Python
微信浏览器左上角返回按钮拦截功能
2017/11/21 HTML / CSS
详解HTML5中ol标签的用法
2015/09/08 HTML / CSS
纽约海:Sea New York
2018/11/04 全球购物
Athleta官网:购买女士瑜伽服、技术运动服和休闲运动服
2020/11/12 全球购物
生产厂长岗位职责
2014/02/21 职场文书
小小的船教学反思
2014/02/21 职场文书
解析在浏览器地址栏输入一个URL后发生了什么
2021/06/21 Servers
你知道Java Spring的两种事务吗
2022/03/16 Java/Android