Webpack入门,样式处理

除了JavaScript以外,Webpack在打包方面另一个重要的工作就是样式处理。在具有一定规模的工程中,由于手工维护CSS的成本过于高昂,开发者可能会需要更智能的方案来解决浏览器兼容性问题,更优雅地处理组件间的样式隔离,甚至是借助一些更强大的语言特性来满足各种各样的需求。

《Webpack入门,预处理器》一篇中讲解过style-loader与css-loader,通过JS引用CSS文件的方式打包样式,可以更清晰地描述模块间的依赖关系。然而,当时打包之后并没有输出单独的CSS文件(虽然在源码中使用的单独的CSS文件),通过在浏览器开发者工具查看打包之后的页面中的元素,会发现样式是通过附加style标签的方式引入的。

一般来说,在生产环境下,开发者往往希望样式存在于CSS文件中而不是style标签中,因为文件更有利于客户端进行缓存。Webpack社区有专门的插件:extract-text-webpack-plugin(适用于Webpack 4之前版本)和mini-css-extract-plugin(适用于Webpack 4及以上版本),它们就是专门用于提取样式到CSS文件的。

温馨提示

由于示例工程使用的Webpack版本是5.74.0,所以本篇不在讲解extract-text-webpack-plugin插件的使用。

通过示例来认识一下mini-css-extract-plugin插件。

安装mini-css-extract-plugin插件

npm install mini-css-extract-plugin -D

接下来,修改配置文件

// webpack.config.js
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
module.exports = {
  entry: './app.js',
  output: {
    filename: 'bundle.js',
  },
  mode: 'development',
  module: {
    rules: [{
      test: /\.css$/,
      use: [
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              // 这里可以指定一个 publicPath
              // 默认使用 webpackOptions.output中的publicPath
              // publicPath的配置,和plugins中设置的filename和chunkFilename的名字有关
              // 如果打包后,background属性中的图片显示不出来,请检查publicPath的配置是否有误
              publicPath: './',  
            },
          },  
          'css-loader'
        ],
    }]
  },
  plugins: [
    new MiniCssExtractPlugin({
            filename:"index.css" //输出的css文件名,默认以入口文件名命名(例如main.css)
        })
  ]
}

样式的提取是从资源入口开始的,以chunk为单位进行检索。 在实际开发中,是多模块的,每个模块都有各自的样式表。对于多样式文件的场景,可以对插件提取的CSS文件使用类似模板的命名方式。

// webpack.config.js
const path = require("path");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
  entry: "./src/index.js",
  output: {
    filename: "[name].js",
  },
  mode: "development",
  devServer: {
    static: {
      directory: path.join(__dirname, "public"),
    },
    compress: true,
    hot: true,
    port: 3000,
    open: true,
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              publicPath: "./",
            },
          },
          "css-loader",
        ],
      },
    ],
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: "[name].css",
      chunkFilename: "[id].css",
    }),
  ],
};

示例工程

https://gitee.com/zero_79152105/webpack-vblog

原创文章,作者:ZERO,如若转载,请注明出处:https://www.edu24.cn/course/webpack-css-build.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
ZEROZERO
上一篇 2022年11月23日
下一篇 2022年11月25日

相关推荐

  • Webpack入门,常用loader

    babel-loader babel-loader用于处理ES6+并将其编译为ES5,它使开发者能够在工程中使用最新的语言特性,同时不必特别关注这些特性在不同平台的兼容问题。 在安…

    2022年11月23日
    617
  • 5分钟带你入门vuex(vue状态管理)

    如果你之前使用过vue.js,你一定知道在vue中各个组件之间传值的痛苦,在vue中我们可以使用vuex来保存我们需要管理的状态值,值一旦被修改,所有引用该值的地方就会自动更新,那…

    2019年11月5日
    2.0K
  • Webpack入门,模块打包原理分析

    面对工程中成百上千个模块,Webpack究竟是如何将它们有序地组织在一起,并按照开发者预想的顺序运行在浏览器上的呢?本篇文章将通过一个简单的示例。分析一下Webpack模块打包的原…

    2022年11月14日
    714
  • spring boot练习篇之用户登录系统【接口篇】

    写在前面 抛弃JSP,只做纯粹的前后端分离项目。 作为一个资深前端工作者,想要转JavaWeb开发,无论是书籍,还是网上视频、资料,竟然没有一篇能清楚明白地讲解怎样搭建一个前后端分…

    2021年5月25日
    1.6K
  • css如何利用transparent属性设置透明度?transparent属性绘制各种三角形

    想到用css设置元素透明度,大家的第一反应会是:用Opacity属性来设置透明度,其实在css中还有其他设置透明度的方法。本章给大家介绍用transparent属性设置透明度,以及…

    2021年2月25日
    1.3K
  • JavaScript基础知识八问

    JavaScript是前端开发中非常重要的一门语言,浏览器是他主要运行的地方。JavaScript是一个非常有意思的语言,但是他有很多一些概念,大家经常都会忽略。比如说,原型,闭包…

    2020年12月30日
    969
  • CSS卡片堆栈

    在浏览各种APP及网站,往往会发现很多酷炫的布局及样式。搜集一下,补充自己的技能库,借鉴学习一下。 HTML CSS

    2019年12月31日
    2.0K
  • Java自学之继承

    在面向对象的设计过程中,类是基本的逻辑单位。但是对于这些基本的逻辑单位需要考虑到重用的设计问题,所以在面向对象的设计里提供有继承,并利用这一特点实现类的可重用性定义。 类继承定义 …

    2020年12月3日
    1.3K
  • Spring Tools学习之JAVA开发环境搭建【windows 10】

    一直以来都想学习JAVA,但是苦于找不到门路,网上学习资料要不看不懂,要不需要金钱。 终于,迫于生活与年龄的压力,下定决心,学习JAVA。 写下此文档,记录一下自己学习JAVA之路…

    2018年12月6日
    2.8K
  • 深入理解JS内存机制

    JS的内存机制在很多前端开发者看来并不是那么重要,但是如果你想深入学习JS,并将它利用好,打造高质量高性能的前端应用,就必须要了解JS的内存机制。对于内存机制理解了以后,一些基本的…

    2019年7月14日
    1.7K