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 页面全选框实践代码
Apr 02 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之三
Jan 03 Javascript
一个简单的JS时间控件示例代码(JS时分秒时间控件)
Nov 22 Javascript
ECMAScript 6即将带给我们新的数组操作方法前瞻
Jan 06 Javascript
javascript获取文档坐标和视口坐标
May 26 Javascript
Perl Substr()函数及函数的应用
Dec 16 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
Dec 18 Javascript
深入理解node.js之path模块
May 03 Javascript
Angular如何引入第三方库的方法详解
Jul 13 Javascript
Node.js中读取TXT文件内容fs.readFile()用法
Oct 10 Javascript
vue缓存之keep-alive的理解和应用详解
Nov 02 Javascript
Vue项目中如何封装axios(统一管理http请求)
May 02 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
最省空间的计数器
2006/10/09 PHP
php实现获取文件mime类型的方法
2015/02/11 PHP
PHP Reflection API详解
2015/05/12 PHP
php抓取网站图片并保存的实现方法
2015/10/29 PHP
PHP写的简单数字验证码实例
2017/05/23 PHP
插件:检测javascript的内存泄漏
2007/03/04 Javascript
for 循环性能比较 提高for循环的效率
2009/03/19 Javascript
javascript中字符串替换函数replace()方法与c# 、vb 替换有一点不同
2010/06/25 Javascript
Ext修改GridPanel数据和字体颜色、css属性等
2014/06/13 Javascript
JS实现图片无间断滚动代码汇总
2014/07/30 Javascript
jQuery实现复选框成对选择及对应取消的方法
2015/03/03 Javascript
JavaScript中Number.MIN_VALUE属性的使用示例
2015/06/04 Javascript
node koa2实现上传图片并且同步上传到七牛云存储
2017/07/31 Javascript
JavaScript学习笔记之函数记忆
2017/09/06 Javascript
Element-UI Table组件上添加列拖拽效果实现方法
2018/04/14 Javascript
Vue.js的动态组件模板的实现
2018/11/26 Javascript
JavaScript实现简单的弹窗效果
2020/05/19 Javascript
python实现简单温度转换的方法
2015/03/13 Python
python从入门到精通(DAY 3)
2015/12/20 Python
Python基于列表list实现的CRUD操作功能示例
2018/01/05 Python
python中的数据结构比较
2019/05/13 Python
Python 写入训练日志文件并控制台输出解析
2019/08/13 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
2019/08/23 Python
Django框架HttpResponse对象用法实例分析
2019/11/01 Python
pycharm解决关闭flask后依旧可以访问服务的问题
2020/04/03 Python
Python smtp邮件发送模块用法教程
2020/06/15 Python
Python实现爬取并分析电商评论
2020/06/19 Python
CSS3属性background-size使用指南
2014/12/09 HTML / CSS
Omio意大利:全欧洲低价大巴、火车和航班搜索和比价
2017/12/02 全球购物
大四学生毕业自荐信
2013/11/07 职场文书
农村党员一句话承诺
2014/05/30 职场文书
经典毕业生求职信
2014/07/12 职场文书
交通事故案件代理词
2015/05/23 职场文书
大国崛起观后感
2015/06/02 职场文书
交通事故责任认定书
2015/08/06 职场文书
Nginx 502 Bad Gateway错误原因及解决方案
2021/03/31 Servers