webpack4 css modules

demo 代码点此,webpack4 中通过 css-loader 开启 css 模块化, 开始前先做点准备工作。

不了解 css 模块化的,可以前往查看github_css_modules.

## 准备工作

安装 webpack:

npm init -y
npm i -D webpack webpack-cli css-loader

创建 webpack.config.js 进行配置:

const path = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  entry: {
    main: './src/index.js'
  },
  module: {
    rules: [
      // 不在 node_modules 中的 css,开启 css modules
      {
        test: /\.css$/,
        exclude: /node_modules/,
        use: [
          MiniCssExtractPlugin.loader,
          {
            loader: 'css-loader',
            options: {
              /* 以前版本是通过 true 开启,相关配置接着写
                modules: true
                localIdentName: '[name]__[local]--[hash:base64:5]'
                */
              // 现在是给 modules 一个 options 对象开启
              modules: {
                // 重新生成的 css 类名
                localIdentName: '[name]__[local]--[hash:base64:5]'
              }
            }
          }
        ]
      },
       // 在 node_modules 中的 css,不开启
      {
        test: /\.css$/,
        include: /node_modules/,
        use: [
          MiniCssExtractPlugin.loader, 'css-loader']
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, './src/index.html'),
      filename: 'index.html'
    }),
    new MiniCssExtractPlugin({
      filename: '[name].[hash].css'
    })
  ],
  output: {
    filename: '[name].[hash].bundle.js',
    path: path.resolve(__dirname, './dist')
  }
}

更多 css-loader 的配置建议前往 github_css-loader 查看,因为版本更新后,配置可能会有变。

## 编写 css

配置完 webpack,写 css 时要使用相关语法,因为是通过 webpack 打包时进行编译,重新生成新的 css 类名来防止全局变量名污染的。

注意: css modules 只针对类、Id选择器生效,不会对标签选择器进行模块化。

/* 全局样式 */
:global(.header) {
  color: #696969;
  background-color: #fff;
}

:global .main {
  color: #363636;
  background-color: #fff;
}

/* less 等预处理语言可以这样写 */
/* :global {
  .footer {
    color: #303030;
    background-color: #fff;
  }
} */

/* 局部样式 */
:local(.header) {
  color: red;
  background-color: #c2b1b1;
}

:local(.main) {
  color: yellow;
  background-color: rgb(136, 96, 96);
}

:local(.footer) {
  color: blue;
  background-color: #929292;
}

编译后的 css 代码:

/* 全局样式 */
.header {
  color: #696969;
  background-color: #fff;
}

.main {
  color: #363636;
  background-color: #fff;
}

/* less 等预处理语言可以这样写 */
/* :global {
  .footer {
    color: #303030;
    background-color: #fff;
  }
} */

/* 局部样式 */
.index__header--1JD7j {
  color: red;
  background-color: #c2b1b1;
}

.index__main--1j9-Y {
  color: yellow;
  background-color: rgb(136, 96, 96);
}

.index__footer--gJKjp {
  color: blue;
  background-color: #929292;
}

## 使用

因为 css 类名是重新编译后的,所以使用时不能直接使用原 css 类名,要通过 import 语法使用。

import styles from './index.css';

export const Header = () => {
  return `
    <h1 class=${styles.header}>header</h1>
  `
}

在 html 里面是这样的:

<h1 class="index__header--1JD7j">header</h1>

原文地址:https://www.cnblogs.com/guolao/p/11830098.html

时间: 2024-08-29 00:34:53

webpack4 css modules的相关文章

CSS Modules如何使用?

本文和大家分享的主要是CSS Modules的相关内容,一起来看看吧,希望对大家学习css有所帮助. 什么是css模块化? 为了理解css模块化思想,我们首先了解下,什么是模块化,在百度百科上的解释是,在系统的结构中,模块是可组合.分解和更换的单元.模块化是一种处理复杂系统分解成为更好的可管理模块的方式.它可以通过在不同组件设定不同的功能,把一个问题分解成多个小的独立.互相作用的组件,来处理复杂.大型的软件.看完模块化,是不是有种拼图的即视感,可以把大图分成各个小图,然后把小图拼成大图,分与合的

CSS modules 与 React中实践

最近一直在学习React,看上去蛮简单的内容,其实学习曲线还是比较高的. 目前学到css绑定的问题,看到有一篇好的文章,就转过来了. CSS 模块化的解决方案有很多,但主要有两类.一类是彻底抛弃 CSS,使用 JS 或 JSON 来写样式.Radium, jsxstyle ,react-style 属于这一类.优点是能给 CSS 提供 JS 同样强大的模块化能力:缺点是不能利用成熟的 CSS 预处理器(或后处理器) Sass/Less/PostCSS, :hover 和 :active 伪类处理

在Angular1.X中使用CSS Modules

在Angular1.5中,增加了一个Component方法,并且定义了组件的若干生命周期hook,在代码规范中也是推崇组件化开发,但是很遗憾的是,CSS模块化组件化的问题并没有得到解决,大部分项目的打包方式还是将所有CSS打包成一个完整的CSS文件,然后插入到html中,这样做的坏处显而易见,如果团队没有良好的CSS代码规范,很容易引起CSS的冲突,本文使用CSS Modules来解决Angular1.X中存在的CSS 冲突问题. 为了便于读者查看并动手操作,我将所有的代码打包成了一个库,首先在

[Webpack + React] Import CSS Modules with TypeScript and webpack

If you try to use CSS Modules in TypeScript the same way you would use them in JavaScript, with webpack’s css-loader, you’ll see an error: ”TS2307: Cannot find module './styles.css'”. typings-for-css-modules-loader is a drop-in replacement for css-lo

在vue中使用css modules替代scroped

前面的话 css modules是一种流行的模块化和组合CSS的系统. vue-loader提供了与css modules的集成,作为scope CSS的替代方案.本文将详细介绍css modules 引入 最开始使用Vue的时候,提倡并大量使用的是scoped这种技术 <style scoped> @media (min-width: 250px) { .list-container:hover { background: orange; } } </style> 这个可选 sc

[Vue]Scoped Css与Css Modules的区别

均为解决CSS全局作用域问题(样式冲突(污染))的一个解决方案. 1.Scoped CSS 当 <style> 标签有 scoped 属性时,相当于在元素中添加了一个唯一属性用来区分. <style scoped> .example { color: red; } </style> <template> <div class="example">hi</div> </template> 它通过使用 Po

初探CSS Modules

CSS Modules 介绍 CSS Modules到底是个什么东西,不妨先看看其官方解释CSS Modules 通过其官方的解释我们可以了解到,CSS Modules既不是官方标准,也不是浏览器标准,而是在构建步骤中对css 类名选择器做作用域限定的一种方式(通过hash实现类似命名空间的方法) CSS模块化 JS都已经全面实现的模块化,只有CSS的模块化还处于探索阶段,那麽为什么需要做CSS的模块化呢,主要有一下几个因素 CSS全局作用域问题 CSS规则都是全局的,任何一个组件的样式规则,对

CSS Modules入门教程

为什么引入CSS Modules 或者可以这么说,CSS Modules为我们解决了什么痛点.针对以往我写网页样式的经验,具体来说可以归纳为以下几点: 全局样式冲突 过程是这样的:你现在有两个模块,分别为A.B,你可能会单独针对这两个模块编写自己的样式,例如a.css.b.css,看一下代码 // A.js import './a.css' const html = '<h1 class="text">module A</h1>' // B.js import

webpack4 css添加浏览器前缀 postcss-loader

自动添加浏览器前缀 ,我们这里使用postcss-loader 首先  cnpm install --save-dev postcss-loader autoprefixer 我这里用的cnpm ,npm也可以下载 接下来是配置 在网上查了相关文档发现需要新建一个 postcss.config.js 文件来对 postcss-loader 配置. 第一种配置: 新建与 webpack.config.js 同级的 postcss.config.js 文件 module.exports = { pl