当前位置: 首页 > article >正文

【Webpack--012】提取单独的CSS文件压缩CSS文件

🤓😍Sam9029的CSDN博客主页:Sam9029的博客_CSDN博客-前端领域博主
🐱‍🐉若此文你认为写的不错,不要吝啬你的赞扬,求收藏,求评论,求一个大大的赞!👍*
🐞🐞文章若有错误或某个内容有更优的解决方案,还望指正!👍*
更多webpack入门知识,详细解读webpack的基本使用、进阶优化等;请阅读专栏:sam9029–CSDN博客—Webpack入门笔记
或者访问 作者个人博客网站:sam9029.asia—Webpack入门笔记

提取单独的CSS文件以优化性能

由于 webpack 默认只会处理JS文件和生成JS文件

所有 css 文件默认被打包到 js 文件中,当 js 文件加载时,会创建一个 style 标签来生成样式

这样对于网站来说,会出现闪屏现象,用户体验不好

我们应该是单独的 Css 文件,通过 link 标签加载性能才好

同时也涉及到了三个操作

  • 提取 CSS 文件 (mini-css-extract-plugin
  • 对 CSS 文件 进行兼容处理(postcss-loader postcss postcss-preset-env
  • 压缩 CSS 文件 (css-minimizer-webpack-plugin

提取 CSS 文件 (mini-css-extract-plugin

安装

npm i mini-css-extract-plugin -D

mini-css-extract-plugin ,它是一个webpack插件,用于将CSS文件从JavaScript文件中提取出来,生成独立的CSS文件。

配置webpack.config.js

// webpack.config.js

//... 其他配置
const MiniCssExtractPlugin = require("mini-css-extract-plugin"); // 引入单独提取

module.exports = {
  entry: "./src/main.js",
  output: {
    //... 其他配置
  },
  module: {
    rules: [
      {
        // 用来匹配 .css 结尾的文件
        test: /\.css$/,
        // use 数组里面 Loader 执行顺序是从右到左
        use: [MiniCssExtractPlugin.loader, "css-loader"], // css文件单独提取loader配置
      },
      {
        test: /\.less$/,
        use: [MiniCssExtractPlugin.loader, "css-loader", "less-loader"], // css文件单独提取loader配置
      },
      {
        test: /\.s[ac]ss$/,
        use: [MiniCssExtractPlugin.loader, "css-loader", "sass-loader"], // css文件单独提取loader配置
      },
      //... 其他配置
    ],
  },
  
  plugins: [
    //... 其他配置
    
    // 提取css成单独文件
    new MiniCssExtractPlugin({
      // 定义输出文件名和目录
      filename: "static/css/main.css",
    }),
    
  ],
  
  mode: "production",
};

对 CSS 文件 进行兼容处理(postcss-loader postcss postcss-preset-env

安装

npm i postcss-loader postcss postcss-preset-env -D

postcss-loader:这是一个webpack loader,用于在webpack构建过程中处理CSS文件,特别是使用PostCSS进行处理。

postcss:PostCSS是一个用JavaScript工具和插件生态系统来转换CSS代码的工具。它允许你使用最新的CSS语法,并且可以通过插件来扩展其功能。

postcss-preset-env:这是一个PostCSS的插件,提供了未来CSS规范中的特性,使得你可以在现代浏览器中使用它们,同时保持向后兼容性。

配置CSS兼容的层级

我们可以在!!! package.json !!!文件中添加 browserslist 来控制样式的兼容性做到什么程度。

{
  // 其他省略
  "browserslist": ["ie >= 8"]
}

想要知道更多的 browserslist 配置,查看browserslist 文档open in new window

以上为了测试兼容性所以设置兼容浏览器 ie8 以上。

实际开发中我们一般不考虑旧版本浏览器了,所以我们可以这样设置:

{
  // 其他省略
  "browserslist": ["last 2 version", "> 1%", "not dead"]
}

配置webpack.config.js

合并配置样式的Loaders
/**
 * @description 获取处理css样式的loaders工具配置函数, 配置了基础的loader,同时接收传参自定义loader
 * @param {Array} preProcessorList []
 * @returns
 */
const setStyleLoaders = (preProcessorList = []) => {
  return [
    // 单独提取css文件loader
    MiniCssExtractPlugin.loader,
    // 基础css-loader
    "css-loader",
    // css代码兼容处理loader配置
    {
      loader: "postcss-loader",
      options: {
        postcssOptions: {
          plugins: [
            "postcss-preset-env", // 能解决大多数样式兼容性问题
          ],
        },
      },
    },
    // 外部传入自定义 loader
    ...preProcessorList,
  ].filter(Boolean); // 筛选所有存在的loader
};
webpack.config.js

module.exports = {
  entry: "./src/main.js",
  output: {
    //... 其他配置
  },
  module: {
    rules: [
      {
        // 用来匹配 .css 结尾的文件
        test: /\.css$/,
        // use 数组里面 Loader 执行顺序是从右到左
        use: getStyleLoaders(),
      },
      {
        test: /\.less$/,
        use: getStyleLoaders("less-loader"),
      },
      {
        test: /\.s[ac]ss$/,
        use: getStyleLoaders("sass-loader"),
      },
      //... 其他配置
    ],
  },
  plugins: [
      //... 其他配置
  ],
  mode: "production",
};

压缩 CSS 文件 (css-minimizer-webpack-plugin

安装

npm i css-minimizer-webpack-plugin -D

“css-minimizer-webpack-plugin” 是一个用于 Webpack 的插件,它的作用是在 Webpack 构建过程中对 CSS 进行压缩和优化

配置 webpack.config.js

//... 其他配置
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");

module.exports = {
  entry: "./src/main.js",
  output: {
    //... 其他配置
  },
  module: {
    rules: [
      //... 其他配置
    ],
  },
  plugins: [
    //... 其他配置
    // css压缩
    new CssMinimizerPlugin(),
  ],
  mode: "production",
};


http://www.kler.cn/a/317156.html

相关文章:

  • 在JPA和EJB中用乐观锁解决并发问题
  • 论文翻译 | The Capacity for Moral Self-Correction in Large Language Models
  • Linux源码阅读笔记-V4L2框架基础介绍
  • Ruby编程语言全景解析:从基础到进阶
  • Llama架构及代码详解
  • 量化交易系统开发-实时行情自动化交易-3.4.1.2.A股交易数据
  • leetcode:验证回文串
  • 综合时如何计算net delay?
  • 【最基础最直观的排序 —— 冒泡排序算法】
  • 公安局党建平台建设方案和必要性-———未来之窗行业应用跨平台架构
  • 电动车车牌识别系统源码分享
  • 【LIO-SAM】LIO-SAM论文翻译(2020年)
  • 【揭秘Java】线程安全中的有序性之谜
  • 【Hive 运维】JDBC使用Hive UDF:Hive UDF打通hiveserver2
  • idea多模块启动
  • uniapp 动态修改input样式
  • Linux bash特性:
  • 机器人上的DPDK使用思考
  • Android Retrofit源码分析(一):Retrofit是什么?和OkHttp的区别是什么?为什么需要他?
  • 计算机网络34——Windows内存管理
  • 速盾:网站使用 CDN 加速
  • Redis的分布式部署
  • AI大模型日报#0923:李飞飞创业之后首个专访、华为云+腾讯音乐发布昇腾适配方案
  • 基于MaxScale搭建MariaDB读写分离集群的方法【2024年最新版】
  • 深度学习(一)——CMC特刊推荐
  • 统一网关--gateway(仅供自己参考)