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 相关文章推荐
nicejforms——美化表单不用愁
Feb 20 Javascript
jQuery CSS()方法改变现有的CSS样式表
Sep 09 Javascript
使用jquery获取url及url参数的简单实例
Jun 14 Javascript
文本框只能输入数字的实现方法(兼容IE火狐)
Jun 25 Javascript
Bootstrap BootstrapDialog使用详解
Feb 17 Javascript
使用Node.js实现简易MVC框架的方法
Aug 07 Javascript
JS使用正则表达式找出最长连续子串长度
Oct 26 Javascript
AngularJS标签页tab选项卡切换功能经典实例详解
May 16 Javascript
JavaScript作用域链实例详解
Jan 21 Javascript
jquery实现选项卡切换代码实例
May 14 jQuery
Vue.js组件使用props传递数据的方法
Oct 19 Javascript
Vue 基于 vuedraggable 实现选中、拖拽、排序效果
May 18 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 memcache扩展的三种安装方法
2009/04/26 PHP
UCenter 批量添加用户的php代码
2012/07/17 PHP
php实现图片添加描边字和马赛克的方法
2014/12/10 PHP
php微信公众号开发之微信企业付款给个人
2018/10/04 PHP
javascript之水平横向滚动歌词同步的应用
2007/05/07 Javascript
JavaScript.The.Good.Parts阅读笔记(二)作用域&闭包&减缓全局空间污染
2010/11/16 Javascript
jquery选择符快速提取web表单数据示例
2014/03/27 Javascript
javascript中关于&& 和 || 表达式的小技巧分享
2015/04/10 Javascript
深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)
2015/12/01 Javascript
jQuery+正则+文本框只能输入数字的实现方法
2016/10/07 Javascript
前端编码规范(3)JavaScript 开发规范
2017/01/21 Javascript
如何快速上手Vuex
2017/02/14 Javascript
详解webpack3如何正确引用并使用jQuery库
2017/08/26 jQuery
Vue隐藏显示、只读实例代码
2018/07/18 Javascript
vue 动态生成拓扑图的示例
2021/01/03 Vue.js
[16:04]DOTA2海涛带你玩炸弹 9月5日更新内容详解
2014/09/05 DOTA
pymongo实现控制mongodb中数字字段做加法的方法
2015/03/26 Python
使用Python的turtle模块画图的方法
2017/11/15 Python
Python中的上下文管理器和with语句的使用
2018/04/17 Python
Python生成rsa密钥对操作示例
2019/04/26 Python
Python中注释(多行注释和单行注释)的用法实例
2019/08/28 Python
python爬取Ajax动态加载网页过程解析
2019/09/05 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
2020/03/04 Python
荷兰在线钓鱼商店:Raven
2019/06/26 全球购物
C#面试常见问题
2013/02/25 面试题
AJAX检测用户名是否存在的方法
2021/03/24 Javascript
测绘工程个人的自我评价
2013/11/23 职场文书
创意活动策划书
2014/01/15 职场文书
初三政治教学反思
2014/01/30 职场文书
大学自我评价
2014/02/12 职场文书
办公室员工岗位工作职责
2014/03/10 职场文书
质量提升方案
2014/06/16 职场文书
超市员工辞职信范文
2015/05/12 职场文书
2015年社区工会工作总结
2015/05/26 职场文书
幼儿园教师管理制度
2015/08/05 职场文书
Python 绘制多因子柱状图
2022/05/11 Python