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 相关文章推荐
Hutia 的 JS 代码集
Oct 24 Javascript
将光标定位于输入框最右侧实现代码
Dec 04 Javascript
使用JavaScript 实现各种跨域的方法
May 08 Javascript
js substring从右边获取指定长度字符串(示例代码)
Dec 23 Javascript
JS小游戏之象棋暗棋源码详解
Sep 25 Javascript
javascript实现倒计时并弹窗提示特效
Jun 05 Javascript
js replace(a,b)之替换字符串中所有指定字符的方法
Aug 17 Javascript
原生JS实现网络彩票投注效果
Sep 25 Javascript
js+html制作简单日历的方法
Jun 27 Javascript
自定义事件解决重复请求BUG的问题
Jul 11 Javascript
Angular 4.x+Ionic3踩坑之Ionic 3.x界面传值详解
Mar 13 Javascript
简单实现节流函数和防抖函数过程解析
Oct 08 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+xml编程之SimpleXML的应用实例
2015/01/24 PHP
php微信公众号开发之二级菜单
2018/10/20 PHP
javascript 的Document属性和方法集合
2010/01/25 Javascript
javascript 自动填写表单的实现方法
2010/04/09 Javascript
在javascript中执行任意html代码的方法示例解读
2013/12/25 Javascript
JS实现slide文字框缩放伸展效果代码
2015/11/05 Javascript
js实现微信分享代码
2020/10/11 Javascript
EasyUI中在表单提交之前进行验证
2016/07/19 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
2016/09/06 Javascript
利用原生JS与jQuery实现数字线性变化的动画
2017/02/24 Javascript
Vue实现active点击切换方法
2018/03/16 Javascript
webpack手动配置React开发环境的步骤
2018/07/02 Javascript
vue 父组件给子组件传值子组件给父组件传值的实例代码
2019/04/15 Javascript
你不知道的Vue技巧之--开发一个可以通过方法调用的组件(推荐)
2019/04/15 Javascript
nodejs实现日志读取、日志查找及日志刷新的方法分析
2019/05/20 NodeJs
vue路由守卫+登录态管理实例分析
2019/05/21 Javascript
vue插槽slot的简单理解与用法实例分析
2020/03/14 Javascript
为什么推荐使用JSX开发Vue3
2020/12/28 Vue.js
python实现ip查询示例
2014/03/26 Python
Python中shutil模块的学习笔记教程
2017/04/04 Python
Python的爬虫框架scrapy用21行代码写一个爬虫
2017/04/24 Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
2017/06/20 Python
Python编程之Re模块下的函数介绍
2017/10/28 Python
Windows环境下python环境安装使用图文教程
2018/03/13 Python
selenium python 实现基本自动化测试的示例代码
2019/02/25 Python
基于Tensorflow:CPU性能分析
2020/02/10 Python
Keras在训练期间可视化训练误差和测试误差实例
2020/06/16 Python
C++:memset ,memcpy和strcpy的根本区别
2013/04/27 面试题
大四本科生的自我评价
2013/12/30 职场文书
珠宝店促销方案
2014/03/21 职场文书
爱国演讲稿400字
2014/05/07 职场文书
住房抵押登记委托书
2014/09/27 职场文书
2015年乡镇流动人口工作总结
2015/05/12 职场文书
python单元测试之pytest的使用
2021/06/07 Python
Python基础之变量的相关知识总结
2021/06/23 Python
css3带你实现3D转换效果
2022/02/24 HTML / CSS