123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- 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'
- }
- }
- }
- }
- }
|