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学习笔记之九 数据模型(上)
Jan 11 Javascript
jquery中实现简单的tabs插件功能的代码
Mar 02 Javascript
jQuery实现拖动调整表格单元格大小的代码实例
Jan 13 Javascript
最全面的百度地图JavaScript离线版开发
Sep 10 Javascript
JQueryEasyUI框架下的combobox的取值和绑定的方法
Jan 22 Javascript
jQuery实现html双向绑定功能示例
Oct 09 jQuery
JavaScript实现的3D旋转魔方动画效果实例代码
Jul 31 Javascript
jquery 插件重新绑定的处理方法分析
Nov 23 jQuery
微信小程序清空输入框信息与实现屏幕往上滚动的示例代码
Jun 23 Javascript
原生js+canvas实现验证码
Nov 29 Javascript
如何利用JavaScript编写一个格斗小游戏
Jan 06 Javascript
js 数组 fill() 填充方法
Nov 02 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
《斗罗大陆》六翼天使武魂最强,为什么老千家不是上三宗?
2020/03/02 国漫
php设计模式 Template (模板模式)
2011/06/26 PHP
PHP中如何定义和使用常量
2013/02/28 PHP
PHP程序员常见的40个陋习,你中了几个?
2014/11/20 PHP
laravel 5 实现模板主题功能(续)
2015/03/02 PHP
Laravel基础_关于view共享数据的示例讲解
2019/10/14 PHP
JavaScript设置FieldSet展开与收缩
2009/05/15 Javascript
基于jquery的滚动鼠标放大缩小图片效果
2011/10/27 Javascript
Javascript之this关键字深入解析
2013/11/12 Javascript
深入浅出ES6新特性之函数默认参数和箭头函数
2016/08/01 Javascript
jQuery仿IOS弹出框插件
2017/02/18 Javascript
jquery实现表单获取短信验证码代码
2017/03/13 Javascript
jQuery插件FusionCharts绘制的2D双面积图效果示例【附demo源码】
2017/04/11 jQuery
Vue中的混入的使用(vue mixins)
2018/06/01 Javascript
webpack 开发和生产并行设置的方法
2018/11/08 Javascript
微信小程序实现通过双向滑动缩放图片大小的方法
2018/12/30 Javascript
javascript利用canvas实现鼠标拖拽功能
2020/07/23 Javascript
Vue-Ant Design Vue-普通及自定义校验实例
2020/10/24 Javascript
在Python中使用poplib模块收取邮件的教程
2015/04/29 Python
详解python开发环境搭建
2016/12/16 Python
python中pika模块问题的深入探究
2018/10/13 Python
python在OpenCV里实现投影变换效果
2019/08/30 Python
python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析
2019/10/14 Python
selenium中get_cookies()和add_cookie()的用法详解
2020/01/06 Python
Python使用py2neo操作图数据库neo4j的方法详解
2020/01/13 Python
Python+OpenCV图像处理——图像二值化的实现
2020/10/24 Python
解决PyCharm无法使用lxml库的问题(图解)
2020/12/22 Python
餐厅楼面主管岗位职责范本
2014/02/16 职场文书
环保公益广告语
2014/03/13 职场文书
有创意的广告词
2014/03/18 职场文书
学校四群教育实施方案
2014/06/12 职场文书
技术入股合作协议书
2014/10/07 职场文书
2014年大学团支部工作总结
2014/12/02 职场文书
思想道德自我评价2015
2015/03/09 职场文书
MySQL令人咋舌的隐式转换
2021/04/05 MySQL
python使用glob检索文件的操作
2021/05/20 Python