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

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

1.样式loader在webpack中的使用

module.exports = {
  module: {
    rules: [
      {
                test: /\.css|less$/,
                use: [
                    "style-loader",
                    "css-loader",
                    //引入postcss,这个放在less-loader之前,css-loader之后
                    {
                        loader: "postcss-loader",
                        options: {
                            postcssOptions: {
                                plugins: [
                                    [
                                        "postcss-preset-env",
                                        {
                                            //兼容每种浏览器的最新两个版本
                                            browsers: "last 2 versions",
                                        },
                                    ],
                                ],
                            },
                        },
                    },
                    "less-loader",
                ],
            },
    ],
  },
};
  • less-loader:
    类css代码转为真正的css代码
  • postcss-loader:
    将某些高版本语法的css代码转为低版本语法的css代码,来兼容不同浏览器
  • css-loader:
    处理CSS文件,支持模块化、压缩和文件导入等功能,通常与style-loader一起使用‌。
  • style-loader
    创建style标签,使用<style>将css-loader内部样式注入到我们的HTML页面

关于less-loader/sass-loader和postcss-loader应该很好理解。下面主要分析分析css-loader和style-loader。

2.css-loader

下面以一个例子来说明问题。

创建一个名字任意的空文件夹,进到目录下执行npm init -y,在项目目录创建src子目录,安装相关依赖:

npm i webpack webpack-cli webpack-dev-server  html-webpack-plugin css-loader style-loader -D

创建webpack.config.js文件:

const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    mode:"development",
    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 world!!!";
document.getElementsByTagName("body")[0].appendChild(div);

执行npx webpack serve运行项目:
在这里插入图片描述
我们点击浏览器查看源码,发现样式内容并没有应用到div上面。原因是css-loader只是帮我们解析了css文件里面的代码,默认webpack是只解析js代码的,所以想要应用样式我们要把解析完的css代码拿出来加入到style标签中。
在这里插入图片描述
更改src/index.js

// 打印到浏览器控制台,看一下导入的css文件究竟是什么
import css from './public.css';

console.log(css);

重新运行我们发现原来获取的css竟然是一个js对象,这就是css-loader帮助我们编译时进行的转换工作:
在这里插入图片描述
继续更改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 world!!!";

let body = document.getElementsByTagName("body")[0];

let style = document.createElement("style");
style.innerText = css[0][1];

body.appendChild(style);
body.appendChild(div);

运行查看:
在这里插入图片描述
我们发现style的样式被成功应用到div上面了,这是我们手动挂载css-loader解析的内容到style标签下,并且将style标签加入到html文档中,但是这样手动做很麻烦,所以就有了style-loader

3.style-loader

style-loader就是帮我们直接将css-loader解析后的内容挂载到html页面当中,我们来看一下。

修改webpack.config.js配置:

const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    mode:"development",
    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 world!!!";
document.getElementsByTagName("body")[0].appendChild(div);

重启项目(修改了配置文件之后需要重新运行项目),运行结果:
在这里插入图片描述
然后我们右键检查页面元素,会发现在主页面html的头部head里面多了一个style:
在这里插入图片描述

4.总结

  • css-loader帮助我们解析css成为js对象
  • style-loader可以从css-loader解析的对象中提取css样式挂载到页面当中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太阳与星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值