常见webpack基础配置项的作用

131 阅读4分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路。

在B站学习了千峰webpack基础 记录一下,B站地址: www.bilibili.com/video/BV1YU…

webpack.config.js webpack配置入口文件

将针对开发环境和生成环境分开配置,

const { merge } = require('webpack-merge')

const commonConfig = require('./webpack.config.common')
const productionConfig = require('./webpack.config.prod')
const developmentConfig = require('./webpack.config.dev')

module.exports = (env) => {
  switch(true) {
    case env.development:
      return merge(commonConfig, developmentConfig)

    case env.production:
      return merge(commonConfig, productionConfig)

    defult:
      return new Error('No matching configuration was found')
  }
}

webpack.config.common.js 是开发环境和生产环境都需要用到的配置

const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
const TerserPlugin = require("terser-webpack-plugin");

const toml = require("toml");
const yaml = require("yaml");
const json5 = require("json5");

module.exports = {
  entry: {
    index: "./src/index.js", //打包入口文件
    another: "./src/another-module.js", //打包入口文件
  },

  output: {
    path: path.resolve(__dirname, "../dist"), //打包到所在的目录 //path.resolve(__dirname 找到当前配置文件webpack.config.js的位置
    clean: true, //每次重新打包后清除到之前的打包文件
    assetModuleFilename: "images/[contenthash][ext]", //方法1: 打包图片资源,输出文件在images下,contenthash为动态生成的图片名称,ext为动态图片格式后缀
  },

  plugins: [
    new HtmlWebpackPlugin({
      template: "./index.html", //以开发目录下index.html为基础
      filename: "app.html", //打包出来的文件取名为app.html
      inject: "body", //将打包出来的<script defer src="bundle.js"></script>放在body标签下
    }),

    new MiniCssExtractPlugin({
      filename: "styles/[contenthash].css", //将css打包在styles文件夹下  contenthash自动生成的文件名
    }),
  ],

  module: {
    //导入规则
    rules: [
      {
        test: /\.png$/,
        type: "asset/resource",
        generator: {
          filename: "images/[contenthash][ext]", //方法2 :优先级高于方法一 //用于导出一个资源的url地址 ?
        },
      },

      {
        test: /\.svg$/,
        type: "asset/inline", //inline 用于导出一个资源的data url base64 字符串的格式 打包没得本地文件
      },

      {
        test: /\.txt$/,
        type: "asset/source", //source 可以导出资源的源代码
      },

      {
        test: /\.jpg$/, //在导出一个data url 和一个单独的文件之间做一个选择 inline resource 默认图片资源大于8k 会选择生成一个本地资源 小于8k会按照inline方式去生成data url base64
        type: "asset",
        parser: {
          dataUrlCondition: {
            maxSize: 4 * 1024 * 1024, // 4M 可调整临界值8k变为其他大小
          },
        },
      },

      {
        test: /\.(css|less)$/, //从后向前加载 loader加载编译
        use: [MiniCssExtractPlugin.loader, "css-loader", "less-loader"], //css-loader 编译css样式文件 再通过style-loader将css放置在我们的页面上
      },

      {
        test: /\.(woff|woff2|eot|ttf|otf)$/,
        type: "asset/resource",
      },

      {
        test: /\.(csv|tsv)$/, //利用csv-loader 编译csv/tsv文件  csv文件会转换为一个数组
        use: "csv-loader",
      },

      {
        test: /\.xml$/,
        use: "xml-loader", //利用xml-loader 编译xml文件 xml文件会转换为一个js对象
      },

      {
        test: /\.toml$/,
        type: "json", //自定义json模块来加载yaml toml 以及json5 文件
        parser: {
          parse: toml.parse,
        },
      },

      {
        test: /\.yaml$/,
        type: "json",
        parser: {
          parse: yaml.parse,
        },
      },

      {
        test: /\.json5$/,
        type: "json",
        parser: {
          parse: json5.parse,
        },
      },

      {
        test: /\.js$/,
        exclude: /node_modules/, //node_modules里的js 不需要用babel-loader进行编译
        use: {
          loader: "babel-loader", //babel-loader将es6转化为es5
          options: {
            presets: ["@babel/preset-env"],
            plugins: [["@babel/plugin-transform-runtime"]],
          },
        },
      },
    ],
  },
  // 优化
  optimization: {
    splitChunks: {
      cacheGroups: {
        vendor: {
          //node_modules 利用浏览器长效缓存的机制 缓存弟三方库到浏览器 命中的缓存来消除请求 从而减少向serve获取资源的次数 不变得时候就不用重新打包
          test: /[\\/]node_modules[\\/]/,
          name: "vendors",
          chunks: "all",
        },
      },
    },
  },
};

webpack.config.dev.js 开发环境专属配置

module.exports = {
  output: {
    filename: "scripts/[name].js", //打包输出文件名
  },

  mode: "development", //将webpack编译的模式指定为开发模式

  devtool: "inline-source-map", //代码出错时 浏览器调试时 打包后的文件 能定位到源代码的位置 精准定位代码的行数
  // devtool: 'cheap-module-source-map',
  // source-map 会生成打包后和打包前的 调试代码的行数和列数的映射, cheap-source-map 会生成行数的映射
  // cheap-module-source-map 推荐使用这个
  resolve: {
    alias: {
      "@": path.resolve(__dirname, "./src"), //配置路径别名
    },

    extensions: [".json", ".js", ".vue"], //reqiure 同名文件 不同格式时 按配置顺序加载
  },
  devServer: {
    static: "./dist", //引入 webpack-dev-serve   当文件修改后 实时监听编译打包 自动刷新浏览器
    // webpack-dev-serve真正的没有输出任何的物理的文件,把输出的打包以后的bundle文件放在了内存里
     // static: path.resolve(__dirname, "./dist"),
    compress: false, //compress 设置是否在服务器中进行代码压缩,提高传输效率 network查看 content-ecoding :为gzip
    port: 3000,
    host: "0.0.0.0", //配置局域网内的其他人都可以访问本地

    headers: {
      "X-Access-Token": "abc123",
    },

    proxy: {
      "/api": "http://localhost:9000", //设置代理 解决跨域
    },

    // https: true //访问https请求
    http2: true, //访问http2请求

    historyApiFallback: true, //解决 h5 history路由模式 刷新404 的问题
    hot: true, //热更新
  },
};

webpack.config.prod.js 生产环境专属配置

const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
const TerserPlugin = require("terser-webpack-plugin");

module.exports = {
  output: {
    filename: "scripts/[name].[contenthash].js", //filename根据hash生产不同的字符串名字
    publicPath: "http://localhost:8080/", // 配置路由
  },

  mode: "production", //将webpack编译的模式指定为生产模式

  optimization: {
    minimizer: [
      new CssMinimizerPlugin(), //生产环境 压缩代码 //CssMinimizerPlugin压缩打包的css代码 去除空格等
      new TerserPlugin(),
    ],
  },
  optimization: {
    usedExports: true, //只打包用到的代码
  },
  performance: {
    hints: false, //去掉性能方面的提示 如 打包size过大
  },
};