const path=require('path'); const { CleanWebpackPlugin } = require('clean-webpack-plugin'); //const { HtmlWebpackPlugin } = require("html-webpack-plugin"); const HtmlWebpackPlugin = require('html-webpack-plugin'); //const { VueLoaderPlugin } = require('vue-loader/dist/index'); const { VueLoaderPlugin } = require('vue-loader'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); module.exports={ entry:{ index:"./index.js", }, output:{ filename:"[name].js", path:path.resolve(__dirname,"./dist"), publicPath: '/', // 默认路径(根据部署环境调整) }, resolve: { alias: { vue: 'vue/dist/vue.esm-bundler.js' // 关键配置 } }, module:{ rules:[ { test: /\.html \)/, use: 'html-loader', options: { sources: { list: [ { tag: 'img', attribute: 'src', type: 'src' } ] } } }, { test:/\.css$/i, // use:["style-loader","css-loader"], use:[MiniCssExtractPlugin.loader, ,"css-loader"], }, { test:/\.vue$/, use:[ { loader:"vue-loader" } ] }, // 处理 .js 文件 { test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: ['@babel/preset-env'] } } }, { test:/\.(png|jpe?g|gif|svg|webp)$/i, // use:[{ // loader:"file-loader", // options:{ // limit: 512 * 1024, // name: "[name].[ext]", // outputPath:"media", // }, // }] type: 'asset/resource', generator:{ // filename: "[name].[ext]", filename: 'assets/[hash][ext][query]' // 指定输出路径 } }, { test:/\.(woff2?|eof|ttf|otf)$/i, // use:[{ // loader:"file-loader", // options:{ // limit: 512 * 1024, // name: "[name].[ext]", // outputPath:"media", // }, // }] type: 'asset/resource', generator:{ // filename: "./font/[name].[ext]", filename: 'font/[hash][ext][query]' } },] }, plugins:[ new VueLoaderPlugin(), new CleanWebpackPlugin(), new HtmlWebpackPlugin({ inject:'head', title:"index page ", template:"./index.html", filename:"index.html", chunks:['index'], }), new MiniCssExtractPlugin({ filename: 'css/[name].[contenthash:8].css' // 指定 CSS 输出路径 }) ], // 优化配置(如代码拆分) optimization: { splitChunks: { chunks: 'all', minSize: 20000, cacheGroups: { vendors: { test: /[\\/]node_modules[\\/]/, priority: -10, reuseExistingChunk: true, name: 'vendors' } } } } }