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日

相关推荐

  • JAVA学习路线之夯实基础

    第一章 开发环境 JDK(Java SE Development Kit),Java标准版开发包,提供编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行环…

    2020年1月14日
    1.8K
  • Webpack入门,项目工程配置说明

    使用npm scripts 在《Webpack入门,打包第一个工程》文章讲到,webpack打包工程命令为 npx webpack –entry=./index.js –mod…

    2022年11月9日
    630
  • CSS布局之圣杯与双飞翼布局

    所谓圣杯布局和双飞翼布局其实解决的问题是相同的,都是解决左右两栏固定宽度,中间部分自适应,其中某部分内容比其他内容高的时候,保证三者元素等高。他俩的区别就是:圣杯用padding。…

    2019年6月18日
    2.0K
  • Angular4.x ngModel 指令详解

    用过angular的前端工程师都知道,angular数据是可以双向绑定的。但是它为什么可以使数据双向绑定?原理又是什么?阅读这篇文章,来了解一下吧。

    2019年7月3日
    2.1K
  • MySQL数据库入门知识点整理

    数据库基本操作 1、创建数据库语句 数据库名称有以下几点要求 不能与已存在的数据库名称相同; 由字母、数字、下划线、@、$和#符号组成; 不能以数字及$符号开头; 标识符不能使用M…

    2020年7月7日
    1.7K
  • 深入理解JS内存机制

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

    2019年7月14日
    1.9K
  • Java自学之String类

    在实际项目开发中,String是一个必须使用的程序类,可以说是项目的核心组成类。在Java程序里所有的字符串都要求使用【’‘】进行定义,同时也可以利用【+】实现字符串的连接处理。 …

    2020年11月30日
    1.6K
  • MySQL数据库基础之索引相关知识点整理

    数据库对象索引的出现,除了可以提高数据库管理系统的查找速度,而且还可以保证字段的唯一性,从而实现数据库表的完整性。 MySQL支持6种索引:普通索引、唯一索引、全文索引、单列索引、…

    2020年7月9日
    1.8K
  • Spring Tools学习之JAVA开发环境搭建【windows 10】

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

    2018年12月6日
    3.2K
  • Java自学之I/O编程

    I/O(Input/Output,输入/输出)可以实现数据的读取与写入操作,Java针对I/O操作的实现提供了java.io工具包,此包的核心组成由File类、InputStrea…

    2020年12月21日
    1.4K