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 相关文章推荐
jscript之Read an Excel Spreadsheet
Jun 13 Javascript
jQuery EasyUI API 中文文档 - NumberSpinner数值微调器使用介绍
Oct 21 Javascript
JavaScript异步编程:异步数据收集的具体方法
Aug 19 Javascript
javascript函数作用域学习示例(js作用域)
Jan 13 Javascript
js实现进度条的方法
Feb 13 Javascript
javascript实现捕捉键盘上按下的键
May 05 Javascript
针对JavaScript中this指向的简单理解
Aug 26 Javascript
jQuery实现的多张图无缝滚动效果【测试可用】
Sep 12 Javascript
JavaScript折半查找(二分查找)算法原理与实现方法示例
Aug 06 Javascript
微信小程序中使用wxss加载图片并实现动画效果
Aug 13 Javascript
深入理解 Koa 框架中间件原理
Oct 18 Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
Oct 29 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+mysql实现无限级分类 | 树型显示分类关系
2006/11/19 PHP
使用PHP实现二分查找算法代码分享
2011/06/24 PHP
phpmailer发送gmail邮件实例详解
2013/06/24 PHP
php调用mysql存储过程实例分析
2014/12/29 PHP
php实现按天数、星期、月份查询的搜索框
2016/05/02 PHP
老生常谈PHP位运算的用途
2017/03/12 PHP
php取出数组单个值的方法
2018/03/12 PHP
网页javascript精华代码集
2007/01/24 Javascript
关于跨站脚本攻击问题
2011/12/22 Javascript
写自已的js类库需要的核心代码
2012/07/16 Javascript
关于jQuery UI 使用心得及技巧
2012/10/10 Javascript
javaScript对文字按照拼音排序实现代码
2013/12/27 Javascript
js操作输入框中选择内容兼容IE及其他主流浏览器
2014/04/22 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
jQuery实现的仿select功能代码
2015/08/19 Javascript
AngularJS框架中的双向数据绑定机制详解【减少需要重复的开发代码量】
2017/01/19 Javascript
nodejs爬虫初试superagent和cheerio
2018/03/05 NodeJs
JS 实现发送短信验证码的“59秒后重新发送验证短信”功能
2019/08/23 Javascript
JS实现transform实现扇子效果
2020/01/17 Javascript
微信小程序学习总结(二)样式、属性、模板操作分析
2020/06/04 Javascript
[02:15]你好,这就是DOTA!
2015/08/05 DOTA
Python程序员面试题 你必须提前准备!(答案及解析)
2018/01/23 Python
Python代码太长换行的实现
2019/07/05 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
2019/08/01 Python
Django分组聚合查询实例分享
2020/04/29 Python
Python接收手机短信的代码整理
2020/08/02 Python
Python爬虫后获取重定向url的两种方法
2021/01/19 Python
基于html和CSS3制作酷炫的导航栏
2015/09/23 HTML / CSS
音乐系毕业生自荐信
2013/10/27 职场文书
个人贷款承诺书
2014/03/28 职场文书
教师职业道德事迹材料
2014/08/18 职场文书
党支部先进事迹材料
2014/12/24 职场文书
大学考试作弊检讨书
2015/05/06 职场文书
Vue3 Composition API的使用简介
2021/03/29 Vue.js
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis
《模拟人生4》推出新补丁 “婚礼奇缘”DLC终于得到修复
2022/04/03 其他游戏