首页/文章/webpack

css-loader和style-loader关系原理及作用

2023-06-14
7713 分钟
...

用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

运行结果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

运行结果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

运行结果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

运行结果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 阻塞 |...
面试

评论

请登录后发表评论

去登录
加载评论中...

目录