webpack教程,webpack如何处理css module模块化?
发布于 作者:苏南大叔 来源:程序如此灵动~css
模块化,生成的css
代码都是随机的。具体体现在类名和id名上,对应的名字和传统的css
选择器的命名是不一样的。其命名可以带上命名控件及随机数。当然,这个命名空间也实际上是假的,就是会安装特殊的命名规则生成选择器名称而已。
大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔高兴写的东西。本文描述如何利用webpack
配置css
模块化。当然,在实际应用中,本文中的这些还是不够的。所以,这里就是个入门阐述概念的目的。测试环境:win10
,node@16.14.2
,webpack@5.73.0
,webpack-cli@4.10.0
,webpack-dev-server@4.9.3
,mini-css-extract-plugin@2.6.1
,css-loader@6.7.1
,html-webpack-plugin@5.5.0
,style-loader@3.3.1
。
css
模块化的概念
其实用文字叙述来描述css
模块化的概念,挺难的。这里写个代码对比:
传统的css
调用代码如下:
<div class="btn color-red">按钮</div>
新的模块化的代码:
<div class="sunan-blog-btn-uOi0azdw">按钮</div>
sunan.blog.css
.btn{
color:red;
}
大家可以看出,使用css
模块化的概念后,编写html
和css
就变得很难了。本来很容易理解的代码关系就变得异常复杂起来。当然,这就是现在的发展趋势,没辙,所有的js
和css
和html
都纷纷作妖,继而引出这些问题的解决者:webpack
。
配置webpack
本文就是以展示css
模块化为目标,但是牵扯了一堆杂事。
npm init
npm i webpack webpack-cli webpack-dev-server html-webpack-plugin css-loader mini-css-extract-plugin style-loader -D
大家如果想要搞清这些webpack
插件都是干啥的,请参考如下文章:
- https://newsn.net/say/webpack.html
- https://newsn.net/say/webpack-plugin-html.html
- https://newsn.net/say/webpack-plugin-html-code.html
- https://newsn.net/say/webpack-dev-server-2.html
- https://newsn.net/say/webpack-css.html
这里先贴一下webpack.config.js
:
const path = require("path");
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
// mode: 'production', // 环境
mode: 'development', // 环境
entry: {
app: './src/index.js'
},
output: {
filename: '[name].js',
path: path.resolve(__dirname, 'dist')
},
// watch: true,
devServer: {
// contentBase: './dist',
static:'./static',
compress: true,
port: 3000,
open: true,
},
plugins: [
new MiniCssExtractPlugin({
filename: 'css/[name].[hash:8].css',
}),
new HtmlWebpackPlugin({
template:"./html/index.html", // 根据 目标文件生成 html
title: 'title参数',
showErrors: true,
inject: 'body',
}),
],
module: {
rules: [
{
test: /\.css$/,
use: [
// 'style-loader',
MiniCssExtractPlugin.loader,
{
loader: 'css-loader',
options: {
// modules: true,
modules: {
localIdentName: '[path][name]__[local]--[hash:base64:5]'
}
}
}
],
},
]
}
}
package.json
:
{
"name": "vvebpack",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "webpack",
"dev": "webpack-dev-server"
},
"author": "",
"license": "ISC",
"devDependencies": {
"css-loader": "^6.7.1",
"html-webpack-plugin": "^5.5.0",
"mini-css-extract-plugin": "^2.6.1",
"style-loader": "^3.3.1",
"url-loader": "^4.1.1",
"webpack": "^5.73.0",
"webpack-cli": "^4.10.0",
"webpack-dev-server": "^4.9.3"
}
}
其余文件代码
html/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>Document</title>
</head>
<body>
<div class="btn">原版btn</div>
<div id="root"></div>
</body>
</html>
src/aaa.bbb.css
:
:global(.btn){
color:red;
}
#btn{
color:blue;
}
.btn{
color:pink;
}
.btn-2{
color:brown;
}
.btn-3{
composes:btn-2;
font-weight:bold;
}
src/index.js
:
import styles from "./aaa.bbb.css";
console.log(styles);
var element = document.getElementById("root");
var next_html = '<div class="' + styles.btn + '">class btn</div>';
next_html += '<div id="' + styles.btn + '">id btn</div>';
next_html += '<div class="' + styles["btn-2"] + '">class命名带中划线</div>';
next_html += '<div class="' + styles["btn-3"] + '">杂合class name</div>';
element.innerHTML = next_html;
代码解说
代码解说起来还是挺麻烦的,所以就捡着重点说吧。要是谁不明白,请查看苏南大叔以前的webpack
文章:
css
模块化后,所有的css
条目名字都会被修改。
- 其中的名字的规则来自
localIdentName
。如果不设置的话,就会显示为随机数。 - 开启模块化,来自于:
css-loader
里面的options.module
。 css
的条目,如果不想被修改名字的话。需要使用:global()
来修饰一下。- 在
.js
中被import
引入后,需要和对应的模版的html
相结合。本文中的方式是比较弱智的,正常来说,需要使用各种模版引擎来处理。 - 对于
.btn
和#btn
来说,虽然同名,在import
里面是一个变量。但是,对于css
文件来说,还是两个不同的条目。 - 对于名字有中划线的命名,需要使用
[]
来引用,否则会报错。 composes
这个语法,可以处理两个class
的情况。
css
被处理后的表现形式:
- 处于
js
代码中的话,就是style-loader
和css-loader
的组合。 - 处于单独的
css
文件中的话,就是MiniCssExtractPlugin.loader
和css-loader
的组合。
相关文章
- https://newsn.net/say/webpack.html
- https://newsn.net/say/webpack-plugin-html.html
- https://newsn.net/say/webpack-plugin-html-code.html
- https://newsn.net/say/webpack-dev-server-2.html
- https://newsn.net/say/webpack-css.html
综述
这里的css
模块化,算是比较高级的内容了。它的存在对于反爬虫技术来说,是个好消息。对于喜欢采集别人文章的人来说,这些随时变化的css
就是个巨大的炸弹。更多webpack
的文章,请点击:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。