Wang's blog Wang's blog
首页
  • 前端文章

    • HTML教程
    • CSS
    • JavaScript
  • 前端框架

    • Vue
    • React
    • VuePress
    • Electron
  • 后端技术

    • Npm
    • Node
    • TypeScript
  • 编程规范

    • 规范
  • 我的笔记
  • Git
  • GitHub
  • VSCode
  • Mac工具
  • 数据库
  • Google
  • 服务器
  • Python爬虫
  • 前端教程
更多
收藏
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Wang Mings

跟随大神,成为大神!
首页
  • 前端文章

    • HTML教程
    • CSS
    • JavaScript
  • 前端框架

    • Vue
    • React
    • VuePress
    • Electron
  • 后端技术

    • Npm
    • Node
    • TypeScript
  • 编程规范

    • 规范
  • 我的笔记
  • Git
  • GitHub
  • VSCode
  • Mac工具
  • 数据库
  • Google
  • 服务器
  • Python爬虫
  • 前端教程
更多
收藏
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • CSS

    • 常用css
    • sass用法
    • viewport详解
    • css各种布局
    • a标签小妙用
    • flex布局语法
    • CSS-function汇总
    • CSS变量的使用
    • css使用小技巧
    • css重置样式表
    • CSS之animation动画
    • 隐藏元素的方法
    • 项目上使用微标
    • CSS之transition过渡
    • flex布局案例-基础
    • flex布局案例-骰子
    • css模块化实现教程
      • 创建该有的文件
      • 安装依赖包
      • 新建个webpack.config.js文件
      • 执行一波命令
      • 全局作用域
    • Flex布局教程语法篇
    • 粘性定位sticky的用途
    • flex布局案例-圣杯布局
    • flex布局案例-网格布局
    • css实现滚动视觉差效果
    • flex布局案例-输入框布局
    • 伪元素表单控件默认样式重置
    • 水平垂直居中的几种方式-案例
    • 从box-sizing属性入手,了解盒子模型
    • 文字在一行或多行时超出显示省略号
    • 如何根据系统主题自动响应CSS深色模式
    • 「css技巧」使用hover和attr()定制悬浮提示-demo
    • 「布局技巧」图片未加载前自动撑开元素高度
  • Npm

  • Vue

  • HTML

  • Node

  • Yaml

  • React

  • 框架

  • 规范

  • Electron

  • JS演示

  • VuePress

  • JavaScript

  • TypeScript

  • 微信小程序

  • TypeScript-axios

  • 前端
  • CSS
wangmings
2022-07-19
目录

css模块化实现教程

# css模块化实现教程

大家都知道,CSS的规则都是全局的,任何一个组件的样式规则,都对整个页面有效。

我们想要做css Module(模块化)呢,原理就是使用一个唯一的class的名字,不会与其他选择器重名即可。

这里我们主要使用 css-loader (opens new window) 结合 webpack (opens new window) 来实现 css Module (其实就是 自动生成唯一的class类名)。

如果你对webpack还不了解呢,也没关系,那就先一步步跟着我敲代码,我将项目从零开始构建,和原生js的方式带大家实现。 如果你有webpack基础就更好理解了。

# 首先使用webpack构建我们的项目

  1. 新建个项目名,如我新建个 learn 文件夹
  1. 使用 npm init -y 命令 生成下 package.json文件
npm init -y
1

# 创建该有的文件

  1. 新建个 src 文件夹, src文件夹下面新建个 index.js、 style.css, index.html文件

目录如下:

index.js 文件的代码如下:

// index.js
import _ from 'lodash';
import style from './style.css';

 function component() {
   const element = document.createElement('div');

   element.innerHTML = _.join(['Hello', 'webpack'], ' ');
   style.hello.split(' ').forEach(item => element.classList.add(item))

   return element;
 }

 document.body.appendChild(component());
1
2
3
4
5
6
7
8
9
10
11
12
13
14

这里使用了lodash包,等下我们按照下

style.css 文件代码如下:

.className{
    background-color: #ccc;
}
.hello {
    composes: className;
    color: red;
}
1
2
3
4
5
6
7

index.html 文件代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
    index
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12

# 安装依赖包

这里我们需要安装

  • babel (解析es6代码为es6的)
  • css-loader style-loader (处理css的)
  • html-webpack-plugin (处理html模板的)
  • lodash (js一些常用函数包)
  • webpack webpack-cli

所以我们一起安装

npm i -D babel css-loader  style-loader html-webpack-plugin lodash webpack webpack-cli
1

安装完之后

# 新建个webpack.config.js文件

// webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  entry: './src/index.js',
  
  output: {
    filename: 'main.js',
    path: path.resolve(__dirname, 'dist'),
  },
  module: {
    rules: [
      {
        test: /\.css$/i,
        use: [
          'style-loader',
          {
            loader: "css-loader",
              options: {
                modules: true, // 关键代码,使css模块化
                // modules: { 
                //   localIdentName: "[path][name]__[local]--[hash:base64:5]" // 这里配置是自己定义css模块化生成的类名
                // },
              },
          }
        ],
      },
    ],
  },
  plugins: [
    new HtmlWebpackPlugin({
      title: 'cssModule',
      template: 'src/index.html',
      hash: true
    }),
  ],
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

一切文件都准备好了,来开始我们的命令,跑起来

在package.json文件添加个运行webpakc的命令

// package.json
"scripts": {
    "build": "webpack"
  },
1
2
3
4

# 执行一波命令

npm run build
1

打包成功,文件如下:

来,我们打开dist/index.html文件

看到没,类名全部给你hash值,唯一类名,这样就达到了cssModule的效果了

# 全局作用域

CSS Modules 允许使用:global(.className)的语法,声明一个全局规则。凡是这样声明的class,都不会被编译成哈希字符串。

style.css加入一个全局class。

/* 新加的css */
:global(.g-title) {
    font-size: 20px;
    font-weight: bold;
}
.className{
    background-color: #ccc;
}
.hello {
    composes: className;
    color: red;
}
1
2
3
4
5
6
7
8
9
10
11
12

index.js使用普通的class的写法,就会引用全局class。

import _ from 'lodash';
import style from './style.css';

 function component() {
   const element = document.createElement('div');

   element.innerHTML = _.join(['Hello', 'webpack'], ' ');
   style.hello.split(' ').forEach(item => element.classList.add(item))

   element.classList.add('g-title') // 新加的js

   return element;
 }

 document.body.appendChild(component());
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

再编译打包下

npm run build
1

这里解释下 style.css 文件出现的 composes: className;, 意思是 继承了 className这个类的样式意思,和sass语法的mixin效果一样,只是这个composes是cssModule插件识别的

完工!!! 以上是小弟的一些小研究, 各位大佬有什么建议,欢迎留言交流

参考文章: 阮一峰 CSS Modules 用法教程 (opens new window)

编辑 (opens new window)
flex布局案例-骰子
Flex布局教程语法篇

← flex布局案例-骰子 Flex布局教程语法篇→

最近更新
01
theme-vdoing-blog博客静态编译问题
09-16
02
搜索引擎
07-19
03
友情链接
07-19
更多文章>
Theme by Vdoing | Copyright © 2019-2022 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式