【性能优化】如何使用webpack配置图片预加载

2025 年 5 月 10 日 星期六(已编辑)
7
这篇文章上次修改于 2025 年 5 月 10 日 星期六,可能部分内容已经不适用,如有疑问可询问作者。

【性能优化】如何使用webpack配置图片预加载

项目基础背景

creat-react-app 创建的初始化react项目,我们需要使用craco.config.js覆盖cra对webpack的配置,如果不使用craco的话,cra中我们是没有权限去对webpack做自定义plugin配置的

图片的预加载

1.手动写link preload或者是prefetch,但硬编码不具备普适性

image-20250509215001509

image-20250509215001509
<link *rel*="preload" *as*="image" *href*="%PUBLIC_URL%/static/media/aa.61df1d71589f9aa63ad7.jpg" />

preload成功会在chorme的network控制台中显示

image-20250509215406007

image-20250509215406007

2.使用第三方插件preload-webpack-plugin

具体的配置

new PreloadWebpackPlugin({
         rel: "preload",
         as: "image",
         include: "allAssets",
         fileBlacklist: [/\.map$/, /hot-update\.js$/],
         fileWhitelist: [/\.(jpg|jpeg)$/i], // Include both jpg and jpeg
         // Add this handlerFunction to see what assets are being processed
         handlerFunction: (assets) => {
           console.log("Assets detected by PreloadWebpackPlugin:", assets);
           // Only return image assets
           return assets.filter((file) => /\.(jpg|jpeg)$/i.test(file));
         },
       }),

完整的carco.config.js配置

const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const CustomPreloadPlugin = require("./src/plugin/preload.js");
const PreloadWebpackPlugin = require("@vue/preload-webpack-plugin");
module.exports = {
  webpack: {
    // 配置别名(可选,如果你需要)
    alias: {
      // 示例:可以添加路径别名
      // '@': path.resolve(__dirname, 'src'),
    },
    // 覆盖 Webpack 配置
    configure: (webpackConfig, { env, paths }) => {
      // 修改入口(CRA 默认入口是 src/index.js 或 src/index.tsx)
      webpackConfig.entry = "./src/index.tsx";

      // 扩展 resolve.extensions(CRA 默认已包含 .tsx, .ts, .js, .jsx,可以省略)
      webpackConfig.resolve.extensions = [
        ".tsx",
        ".ts",
        ".js",
        ".jsx",
        ...webpackConfig.resolve.extensions,
      ];

      // 修改模块规则
      webpackConfig.module.rules = [
        // 保留 CRA 的默认规则(避免覆盖)
        ...webpackConfig.module.rules,
        // 图片文件规则(CRA 默认已支持 file-loader,但可以自定义)
        {
          test: /\.(jpg|jpeg|png|gif)$/i,
          type: "asset/resource", // 使用 Webpack 内置的 asset/resource
          generator: {
            filename: "static/media/[name].[contenthash].[ext]", // 输出文件名
            publicPath: "", // 公共路径
          },
        },
      ];

      // 修改插件
      webpackConfig.plugins = [
        // 保留 CRA 默认的插件
        ...webpackConfig.plugins.filter(
          // 移除 CRA 默认的 HtmlWebpackPlugin(如果需要自定义)
          (plugin) => !(plugin instanceof HtmlWebpackPlugin)
        ),
        // 添加自定义 HtmlWebpackPlugin
        new HtmlWebpackPlugin({
          template: "public/index.html",
          inject: true,
        }),
        // 添加自定义 Preload 插件
        // new CustomPreloadPlugin(),
        new PreloadWebpackPlugin({
          rel: "preload",
          as: "image",
          include: "allAssets",
          fileBlacklist: [/\.map$/, /hot-update\.js$/],
          fileWhitelist: [/\.(jpg|jpeg)$/i], // Include both jpg and jpeg
          // Add this handlerFunction to see what assets are being processed
          handlerFunction: (assets) => {
            console.log("Assets detected by PreloadWebpackPlugin:", assets);
            // Only return image assets
            return assets.filter((file) => /\.(jpg|jpeg)$/i.test(file));
          },
        }),
      ];

      // 修改输出配置
      webpackConfig.output = {
        ...webpackConfig.output,
        path: path.resolve(__dirname, "dist"),
        filename: "bundle.[contenthash].js",
        publicPath: "/",
      };

      // 返回修改后的配置
      return webpackConfig;
    },
  },
};

3.手写一个plugin

4.file-loader url-loader 作用机理是什么 babel-loader做了什么事情

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...