// 引入一个包 const path = require("path"); // 引入HTML插件 const HTMLWebpackPlugin = require("html-webpack-plugin"); // 引入EsLint插件 const ESLintWebpackPlugin = require("eslint-webpack-plugin"); // 引入CSS单独打包插件 const MiniCssExtractPlugin = require("mini-css-extract-plugin"); // 引入CSS压缩打包插件 const CssMinimizerPlugin = require("css-minimizer-webpack-plugin"); // webpack中的所有配置信息 module.exports = { // 模式:development开发、production生产 mode: "production", // 指定入口文件 entry: "./src/main.ts", // 指定打包文件所在目录 output: { // 指定打包文件的目录 path: path.resolve(__dirname, "../dist"), // 打包后的入口脚本文件名(动态设置文件名,并增加文件内容hash值的后缀) filename: "static/js/[name].[contenthash:10].js", // 自动清空上一次打包的内容,webpack4需使用扩展包clean-webpack-plugin插件来进行自动清空操作 clean: true, // 不使用箭头函数的方式定义 environment: { arrowFunction: false, const: false } }, // 指定webpack打包时要使用的模块 module: { // 指定要加载的规则 rules: [ { // 使用oneOf去优化打包速度,当文件对应的处理loader被检测到,就不用再去遍历其他的loader,提升打包速度 oneOf: [ { // 指定规则生效的文件 test: /\.ts$/, // 要使用的loader use: [ // 配置babel { // 指定加载器 loader: "babel-loader", // 设置babel options: { // 开启babel缓存 cacheDirectory: true, // 关闭缓存文件压缩 cacheCompression: false, // 减少代码体积 plugins: ["@babel/plugin-transform-runtime"], } }, "ts-loader" ], // 要排除的文件 exclude: /node_modules/ }, // 设置less文件的处理 { test: /\.less$/, use: [ MiniCssExtractPlugin.loader, "css-loader", // 引入postcss { loader: "postcss-loader", options: { postcssOptions: { plugins: [ "postcss-preset-env" ] } } }, "less-loader" ] } ] } ] }, // 配置webpack插件 plugins: [ new HTMLWebpackPlugin({ template: "./public/index.html" }), new ESLintWebpackPlugin({ // 指定检查文件的根目录 context: path.resolve(__dirname, "../src"), // 排除检查目录 exclude: "node_modules", // 开启缓存 cache: true, // 缓存输出文件路径 cacheLocation: path.resolve(__dirname, "../node_modules/.cache/eslintcache") }), // 提取css成单独文件 new MiniCssExtractPlugin({ // 定义输出文件名和目录(动态设置文件名,并增加文件内容hash值的后缀) filename: "static/css/[name].[contenthash:10].css" }) ], // 配置压缩插件,webpack5官方建议使用这种方式 optimization: { minimizer: [ // css压缩 new CssMinimizerPlugin() ], // 代码分割配置(单入口时默认配置会将代码中引用node_modules包中的功能时单独打包,及import动态引入的功能进行单独打包) // 本项目中因使用了any-touch,则会将这部分功能单独打包成js进行引入 splitChunks: { chunks: "all" }, // 将代码依赖单独记录到runtime文件中,保证依赖文件变更时,只改变它本身的hash和runtime的hash而不改变依赖者的hash runtimeChunk: { name: (entrypoint) => `runtime~${entrypoint.name}.js` } }, // 设置引用模块 resolve: { extensions: [".ts", ".js"] } };