css-loader和style-loader关系原理及作用
2023-06-14
771 字约 3 分钟
...用webpack打包就需要用到css-loader和style-loader,接下来让我们逐步解析两个loader的作用以及它们都做了怎样的工作
创建空项目
- 创建一个名为demo的空文件夹,这就是我们实验的项目目录
- 进入到目录下执行
npm init -y
按照上述两步,我们就搭建好了最简单的项目环境了,接下来需要安装依赖包和创建源码目录
- 在项目目录创建
src子目录 - 基于webpack4讲解,运行npm安装所需依赖
npm i webpack@webpack-4 webpack-dev-server@version-3 webpack-cli@4 css-loader@5 style-loader@2 html-webpack-plugin@webpack-4 -D
创建webpack.cofnig.js
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
module: {
rules: [
{
test: /.css$/,
use: [
'css-loader'
]
}
]
},
plugins: [
new HtmlWebpackPlugin()
]
}
创建一个src/public.css样式文件
.rect{
background-color: red;
width: 100px;
height: 100px;
}
创建src/index.js程序入口文件
import './public.css';
let div = document.createElement("div");
div.className = "rect";
div.innerText = "hello div";
document.getElementsByTagName("body")[0].appendChild(div);
运行
webpack server
打开浏览器http://localhost:8080,显示内容如下:

运行结果1
我们点击浏览器查看源码,发现样式内容并没有应用到div上面,原因是css-loader只是帮我们解析了css文件里面的代码,默认webpack是只解析js代码的,所以想要应用样式我们要把解析完的css代码拿出来加入到style标签中。
更改src/index.js
// 打印到浏览器控制台,看一下导入的css文件究竟是什么
import css from './public.css';
console.log(css);
重新运行
我们发现原来获取的css竟然是一个js对象,这就是css-loader帮助我们编译时进行的转换工作

运行结果2
继续更改src/index.js代码
// 这次我们将css-loader解析的js对象中的css样式挂载到head的style标签中
import css from './public.css';
let div = document.createElement("div");
div.className = "rect";
div.innerText = "hello div";
let body = document.getElementsByTagName("body")[0];
let style = document.createElement("style");
style.innerText = css[0][1];
body.appendChild(style);
body.appendChild(div);
运行查看

运行结果3
我们发现style的样式被成功应用到div上面了,这是我们手动挂载css-loader解析的内容到style标签下,并且将style标签加入到html文档中,但是这样手动做很麻烦,所以就有了style-loader
引入style-loader
如果你看懂我上面说的,那么你应该已经猜测到了style-loader作用了,style-loader就是帮我们直接将css-loader解析后的内容挂载到html页面当中,我们来看一下
修改webpack.cofnig.js配置
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
module: {
rules: [
{
test: /.css$/,
use: [
'style-loader',
'css-loader'
]
}
]
},
plugins: [
new HtmlWebpackPlugin()
]
}
继续更改src/index.js代码
去掉手动挂载样式
import './public.css';
let div = document.createElement("div");
div.className = "rect";
div.innerText = "hello div";
document.getElementsByTagName("body")[0].appendChild(div);
运行结果
我们发现和之前的手动挂载一样

运行结果4
总结
- css-loader帮助我们解析css成为js对象
- sytle-loader可以从css-loader解析的对象中提取css样式挂载到页面当中
如果您觉得这篇文章有帮助,请点个赞吧~
相关文章
更多文章 →webpack2025-03-05
webpack构建流程、基础配置、打包性能优化、热更新、和Vite区别
一、webpack构建流程 四个阶段: 初始化阶段 :读取配置文件、创建complier实例 编译阶段 :解析入口点、模块加载(loader) 打包阶段 :模块合并与优化、代码分割 输出阶段 :生成输出文件 1.配置文件解析: Webpack读取并解析webpack.config.js文件,获取构建所需的配置信息。 2.入口处理: Webpack从入口文件开始,构建模块依赖图。 3.模块加载与转换: 使用加载器处理不同类型的模块,如CS...
学习面试
webpack2025-03-04
深入解析 Webpack 的构建流程
1\. 初始化阶段:准备启动引擎 当你启动 时,它就像一个超级工厂的启动按钮,开始准备好一切——加载配置文件、初始化插件,并准备好开始生产。 实例:准备你的工厂配置 解释: 入口文件(Entry) :Webpack 从这里开始它的构建任务,像一个工厂的生产线入口。 输出路径(Output) :Webpack 会把构建好的产品放在这里。 就是每个产品的唯一标识,确保浏览器不会缓存过时的文件。 模块加载(Loaders) :当 Webpac...
学习面试
webpack2024-04-07
Webpack 和 Rollup:您应该知道的一些事情
本文只做 Webpack 和 Rollup 的对比总结,不参入 esbuild、Vite 或其他工具的讨论 Webpack 和 Rollup 都是现在前端领域比较流行的打包工具,它们的相似之处在于可以帮助我们 把多个 JavaScript 文件打包成一个可以在浏览器中加载并在生产中使用的文件。 打包成单个文件的好处是可以减少网络请求、提高网站性能等目的。 这篇文章主要想通过对比的方式讲讲这两种打包工具的差异...
学习面试
webpack2023-06-18
简述Webpack和Vite的区别
前言 和 是现代前端开发中非常重要的工具,有助于改善开发者的工作流程和提高生产力。这篇博客将对比 和 的区别,并探讨在什么样的项目中选择哪一个工具。 Webpack 是一个模块打包工具,使得工程中的各种资源能够被打包成一个整体的bundle.js文件。 具有很高的可配置性和灵活性,使得开发者可以使用各种插件和配置文件来优化它们的工作流程。 Webpack适用于大型、复杂的项目,它可以处理多种不同类型的文件(如js、css、图片等),并根...
面试
八股文2026-08-27
定时器按顺序播放多个音频,切后台音频会乱
本身不会补触发,但 它会被系统级冻结 ——iOS Safari 后台完全停止计时,切回前台后 只补执行一次 (不是不补,而是"缺失的中间状态补不上")。间隔短的不会出大问题, 间隔长的会出现"音频流被压缩" ——切回来后本该播 5 分钟的间隙,实际只过了 3 分钟,结果整段对不上。 核心原则 :定时器只能用来"提醒一次", 真正决定"该不该播"的是绝对时间戳 。 setTimeout 在后台会发生什么(按平台) | 平台 | 后台行为...
面试
八股文2026-08-27
线上项目白屏的原因
白屏的本质是 渲染管线某一环断了 ——可能是资源、JS、接口、路由、样式、兼容性任一环节出问题。排查按"控制台 → 网络 → DOM → 环境"四步定位。 本质(前端类比) 把网页想成一栋楼: 白屏 ≠ 一定是同一种原因——这是面试想听的层次。 六大类原因(按出现频率) | 类别 | 典型表现 | 真实案例 | | : | : | : | | ① 资源加载失败 | DOM 是空的 | 入口 JS 404、CDN 挂了、CSS 阻塞 |...
面试
评论
请登录后发表评论
去登录