webpack5相关

1 配置运行命令

// package.json
{
  // 其他省略
  "scripts": {
    "start": "npm run dev",
    "dev": "npx webpack serve --config ./config/webpack.dev.js",
    "build": "npx webpack --config ./config/webpack.prod.js"
  }
}

以后启动指令:

  • 开发模式:npm start 或 npm run dev
  • 生产模式:npm run build

2 开发环境配置

webpack.dev.js

const path = require("path");

module.exports = {
  entry: "./src/main.js",
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "static/js/main.js", // 将 js 文件输出到 static/js 目录中
    clean: true, // 自动将上次打包目录资源清空
  },
  module: {
    rules: [
      {//处理图片资源
        test: /\.(png|jpe?g|gif|webp)$/,
        type: "asset",//相当于url-loader,小于某个大小的资源会处理成base64
        parser: {//过去在 Webpack4 时,我们处理图片资源通过 file-loader 和 url-loader 进行处理;现在 Webpack5 已经将两个 Loader 功能内置到 Webpack 里了
          dataUrlCondition: {
            maxSize: 10 * 1024 // 小于10kb的图片会被base64处理
          }
        },
        generator: {
          // 将图片文件输出到 static/imgs 目录中
          // 将图片文件命名 [hash:8][ext][query]
          // [hash:8]: hash值取8位
          // [ext]: 使用之前的文件扩展名
          // [query]: 添加之前的query参数
          filename: "static/imgs/[hash:8][ext][query]",
        },
      },
      {//处理字体图标/音视频资源
        test: /\.(ttf|woff2?|map4|map3|avi)$/,
        type: "asset/resource",//相当于file-loader
        generator: {
          filename: "static/media/[hash:8][ext][query]",
        },
      },
    ],
  },
  plugins: [],
  mode: "development",
};

3 生产环境配置

webpack.prod.js

CSS兼容性:我们可以在 package.json 文件中添加 browserslist 来控制样式的兼容性做到什么程度。配置见:GitHub - browserslist/browserslist: 🦔 Share target browsers between different front-end tools, like Autoprefixer, Stylelint and babel-preset-env

压缩css:css-minimizer-webpack-plugin

html 压缩和 js 压缩:默认生产模式已经开启了,不需要额外进行配置

eslint:eslint-webpack-plugin 配置见eslint_史学娇的博客-CSDN博客

多进程: eslint 、babel、Terser 三个工具

减少babel体积:禁用了 Babel 自动对每个文件的 runtime 注入,使所有辅助代码作为一个独立模块,来避免重复引入。

图片压缩:本地项目静态图片

const path = require("path");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
const TerserPlugin = require("terser-webpack-plugin");
const os = require("os");
const threads = os.cpus().length;
const ImageMinimizerPlugin = require("image-minimizer-webpack-plugin");

// 获取处理样式的Loaders
const getStyleLoaders = (preProcessor) => {
  return [
    MiniCssExtractPlugin.loader,
    "css-loader",
    {
      loader: "postcss-loader",
      options: {
        postcssOptions: {
          plugins: [
            "postcss-preset-env", // 能解决大多数样式兼容性问题
          ],
        },
      },
    },
    preProcessor,
  ].filter(Boolean);
};
module.exports = {
  entry: "./src/main.js",
  output: {
    path: path.resolve(__dirname, "../dist"), 
    filename: "static/js/main.js",
    clean: true,
  },
  module: {
    rules: [
      {
        test: /\.css$/,                     
        use: getStyleLoaders(),
      },
      {
        test: /\.less$/,
        use: getStyleLoaders("less-loader"),
      },
      {//babel多进程
            test: /\.js$/,
            // exclude: /node_modules/, // 排除node_modules代码不编译
            include: path.resolve(__dirname, "../src"), // 也可以用包含
            use: [
              {
                loader: "thread-loader", // 开启多进程
                options: {
                  workers: threads, // 数量
                },
              },
              {
                loader: "babel-loader",
                options: {
                  cacheDirectory: true, // 开启babel编译缓存,
                  cacheCompression: false, // 关闭缓存文件压缩
                  plugins: ["@babel/plugin-transform-runtime"], // 减少代码体积:npm i @babel/plugin-transform-runtime -D
                },
              },
            ],
          },
    ],
  },
  plugins: [
    // css压缩
    // new CssMinimizerPlugin(),
    // 压缩图片(无损压缩)
    // 无损:npm install imagemin-gifsicle imagemin-jpegtran imagemin-optipng imagemin-svgo -D
    //有损:npm install imagemin-gifsicle imagemin-mozjpeg imagemin-pngquant imagemin-svgo -D
      new ImageMinimizerPlugin({
        minimizer: {
          implementation: ImageMinimizerPlugin.imageminGenerate,
          options: {
            plugins: [
              ["gifsicle", { interlaced: true }],
              ["jpegtran", { progressive: true }],
              ["optipng", { optimizationLevel: 5 }],
              [
                "svgo",
                {
                  plugins: [
                    "preset-default",
                    "prefixIds",
                    {
                      name: "sortAttrs",
                      params: {
                        xmlnsOrder: "alphabetical",
                      },
                    },
                  ],
                },
              ],
            ],
          },
        },
      }),
  ],
  optimization: {
    minimize: true,
    minimizer: [
      // css压缩也可以写到optimization.minimizer里面,效果一样的
      new CssMinimizerPlugin(),
      // 当生产模式会默认开启TerserPlugin,但是我们需要进行其他配置,就要重新写了
      new TerserPlugin({
        parallel: threads // 开启多进程
      })
    ],
  },
  mode: "production",
};

4 性能优化

4.1 preload


const path = require("path");
const PreloadWebpackPlugin = require("@vue/preload-webpack-plugin");

module.exports = {
  entry: "./src/main.js",
  output: {
    path: path.resolve(__dirname, "../dist"), 
  },
  plugins: [
    new PreloadWebpackPlugin({
      rel: "preload", // preload兼容性更好
      as: "script",
      // rel: 'prefetch' // prefetch兼容性更差
    }),
  ],
  mode: "production",
};

要将webpack更新到webpack5,你可以按照以下步骤进行操作: 1. 首先,确保你的项目已经安装了webpack4,并且项目中的webpack相关的依赖包已经经过优化。 2. 在开始升级之前,你需要了解webpack5的新特性和改动,以便确定是否会对你的项目产生影响。你可以查阅webpack5的官方文档,了解新版本的改进。 3. 接下来,你可以通过以下几个步骤来升级webpack: a. 首先,升级webpack的主要依赖包。你可以修改项目的package.json文件,将webpack相关的依赖包的版本号修改为webpack5对应的版本号。 b. 然后,运行npm install命令来安装新版本的依赖包。 c. 接下来,你需要根据你的项目需求和配置,逐步迁移你的webpack配置文件。由于webpack5引入了一些新的配置项和改动,你需要根据官方文档和你的项目需求,逐步修改和调整配置文件,以确保项目可以正常运行。 d. 最后,你可以运行项目,并进行测试和调试,以确保项目在升级到webpack5之后可以正常工作。 4. 在升级过程中,你可能会遇到一些兼容性问题或者其他异常情况。在这种情况下,你可以通过查阅webpack的官方文档、搜索相关的社区讨论或者咨询其他开发者的经验来解决问题。 总结起来,将webpack更新到webpack5的过程主要包括了解新版本的改进、升级依赖包、迁移配置文件和测试调试等步骤。希望这些步骤能帮助你成功地将webpack更新到webpack5,并实现项目的优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值