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 19 Javascript
jQuery.form插件的使用及跨域异步上传文件
Apr 27 Javascript
js将滚动条滚动到指定位置的简单实现方法
Jun 25 Javascript
js输出数据精确到小数点后n位代码
Jul 02 Javascript
Select2.js下拉框使用小结
Oct 24 Javascript
jQuery序列化表单成对象的简单实现
Nov 29 Javascript
Vue方法与事件处理器详解
Dec 01 Javascript
浅谈JsonObject中的key-value数据解析排序问题
Dec 06 Javascript
vue 页面加载进度条组件实例
Feb 05 Javascript
jQuery实现表单动态添加与删除数据操作示例
Jul 03 jQuery
angular2组件中定时刷新并清除定时器的实例讲解
Aug 31 Javascript
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
Jan 08 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
PHP mkdir()定义和用法
2009/01/14 PHP
php学习之简单计算器实现代码
2011/06/09 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
2019/03/22 PHP
在thinkphp5.0路径中实现去除index.php的方式
2019/10/16 PHP
改进:论坛UBB代码自动插入方式
2006/12/22 Javascript
JQuery 网站换肤功能实现代码
2009/11/02 Javascript
浅析javascript闭包 实例分析
2010/12/25 Javascript
用javascript替换URL中的参数值示例代码
2014/01/27 Javascript
jQuery中ajax和post处理json的不同示例对比
2014/11/02 Javascript
JS获取网页图片name属性的方法
2015/04/01 Javascript
jquery实现的判断倒计时是否结束代码
2016/02/05 Javascript
一个简单的JavaScript Map实例(分享)
2016/08/03 Javascript
Vue.js每天必学之Class与样式绑定
2016/09/05 Javascript
jQuery中的一些小技巧
2017/01/18 Javascript
jQuery Ajax前后端使用JSON进行交互示例
2017/03/17 Javascript
详解Vue 2.0封装axios笔记
2017/06/22 Javascript
对vue事件的延迟执行实例讲解
2018/08/28 Javascript
JavaScript实现图片放大镜效果
2019/06/27 Javascript
layui动态表头的实现代码
2019/08/22 Javascript
jQuery实现验证用户登录
2019/12/10 jQuery
利用node.js开发cli的完整步骤
2020/12/29 Javascript
[05:46]DOTA2英雄梦之声_第18期_陈
2014/06/20 DOTA
pytorch中tensor的合并与截取方法
2018/07/26 Python
python实现3D地图可视化
2020/03/25 Python
Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析
2020/03/30 Python
深入了解Python 方法之类方法 & 静态方法
2020/08/17 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
Bally澳大利亚官网:瑞士奢侈品牌
2018/11/01 全球购物
优秀的教师个人的中文求职信
2013/09/21 职场文书
总务岗位职责
2013/11/19 职场文书
怎样写好自荐信和推荐信
2013/12/26 职场文书
会员活动策划方案
2014/08/19 职场文书
篮球比赛通讯稿
2015/07/18 职场文书
信息简报范文
2015/07/21 职场文书
2019个人工作自我评价范文(3篇)
2019/09/19 职场文书
PyTorch中permute的使用方法
2022/04/26 Python