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 相关文章推荐
面向对象的javascript(笔记)
Oct 06 Javascript
分享几个超级震憾的图片特效
Jan 08 Javascript
Javascript this 的一些学习总结
Aug 31 Javascript
jquery插件lazyload.js延迟加载图片的使用方法
Feb 19 Javascript
百度判断手机终端并自动跳转js代码及使用实例
Jun 11 Javascript
Jquery网页内滑动缓冲导航的实现代码
Apr 05 Javascript
coffeescript使用的方式汇总
Aug 05 Javascript
ReactNative页面跳转实例代码
Sep 27 Javascript
AngularJS 2.0入门权威指南
Oct 08 Javascript
利用vue.js插入dom节点的方法
Mar 15 Javascript
Angular 2父子组件数据传递之局部变量获取子组件其他成员
Jul 04 Javascript
javascript实现文字无缝滚动效果
Aug 26 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设计模式编程中的简单工厂模式
2016/02/29 PHP
PHP从二维数组得到N层分类树的实现代码
2016/10/11 PHP
php安全配置记录和常见错误梳理(总结)
2017/03/28 PHP
Laravel框架实现定时Task Scheduling例子
2019/10/22 PHP
TopList标签和JavaScript结合两例
2007/08/12 Javascript
js加解密 脚本解密
2008/02/22 Javascript
关于js new Date() 出现NaN 的分析
2012/10/23 Javascript
采用call方式实现js继承
2014/05/20 Javascript
JavaScript兼容浏览器FF/IE技巧
2016/08/14 Javascript
Angular和Vue双向数据绑定的实现原理(重点是vue的双向绑定)
2016/11/22 Javascript
详解js树形控件—zTree使用总结
2016/12/28 Javascript
微信小程序 开发经验整理
2017/02/15 Javascript
zTree实现节点修改的实时刷新功能
2017/03/20 Javascript
使用Angular CLI生成路由的方法
2018/03/24 Javascript
vue elementUI 表单校验的实现代码(多层嵌套)
2019/11/06 Javascript
Vue 中 a标签上href无法跳转的解决方式
2019/11/12 Javascript
微信小程序自定义底部弹出框功能
2020/11/18 Javascript
Vue如何实现变量表达式选择器
2021/02/18 Vue.js
[59:48]LGD vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python中的ctime()方法使用教程
2015/05/22 Python
django框架防止XSS注入的方法分析
2019/06/21 Python
Django Rest framework三种分页方式详解
2019/07/26 Python
用Python将Excel数据导入到SQL Server的例子
2019/08/24 Python
Python定时器线程池原理详解
2020/02/26 Python
python时间time模块处理大全
2020/10/25 Python
python中os.remove()用法及注意事项
2021/01/31 Python
浅谈利用缓存来优化HTML5 Canvas程序的性能
2015/05/12 HTML / CSS
体育教育专业自荐信范文
2013/12/20 职场文书
物理教师自荐信范文
2013/12/28 职场文书
市场营销调查计划书
2014/05/02 职场文书
国际会计专业求职信
2014/08/04 职场文书
2014年镇党建工作汇报材料
2014/11/02 职场文书
婚庆答谢词大全
2015/09/29 职场文书
golang switch语句的灵活写法介绍
2021/05/06 Golang
python缺失值的解决方法总结
2021/06/09 Python
Python 快速验证代理IP是否有效的方法实现
2021/07/15 Python