webpack.config.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. const path=require('path');
  2. const { CleanWebpackPlugin } = require('clean-webpack-plugin');
  3. //const { HtmlWebpackPlugin } = require("html-webpack-plugin");
  4. const HtmlWebpackPlugin = require('html-webpack-plugin');
  5. //const { VueLoaderPlugin } = require('vue-loader/dist/index');
  6. const { VueLoaderPlugin } = require('vue-loader');
  7. const MiniCssExtractPlugin = require('mini-css-extract-plugin');
  8. module.exports={
  9. entry:{
  10. index:"./index.js",
  11. },
  12. output:{
  13. filename:"[name].js",
  14. path:path.resolve(__dirname,"./dist"),
  15. publicPath: '/', // 默认路径(根据部署环境调整)
  16. },
  17. resolve: {
  18. alias: {
  19. vue: 'vue/dist/vue.esm-bundler.js' // 关键配置
  20. }
  21. },
  22. module:{
  23. rules:[
  24. {
  25. test: /\.html \)/,
  26. use: 'html-loader',
  27. options: {
  28. sources: {
  29. list: [
  30. { tag: 'img', attribute: 'src', type: 'src' }
  31. ]
  32. }
  33. }
  34. },
  35. {
  36. test:/\.css$/i,
  37. // use:["style-loader","css-loader"],
  38. use:[MiniCssExtractPlugin.loader, ,"css-loader"],
  39. },
  40. {
  41. test:/\.vue$/,
  42. use:[
  43. { loader:"vue-loader" }
  44. ]
  45. },
  46. // 处理 .js 文件
  47. {
  48. test: /\.js$/,
  49. exclude: /node_modules/,
  50. use: {
  51. loader: 'babel-loader',
  52. options: {
  53. presets: ['@babel/preset-env']
  54. }
  55. }
  56. },
  57. {
  58. test:/\.(png|jpe?g|gif|svg|webp)$/i,
  59. // use:[{
  60. // loader:"file-loader",
  61. // options:{
  62. // limit: 512 * 1024,
  63. // name: "[name].[ext]",
  64. // outputPath:"media",
  65. // },
  66. // }]
  67. type: 'asset/resource',
  68. generator:{
  69. // filename: "[name].[ext]",
  70. filename: 'assets/[hash][ext][query]' // 指定输出路径
  71. }
  72. },
  73. {
  74. test:/\.(woff2?|eof|ttf|otf)$/i,
  75. // use:[{
  76. // loader:"file-loader",
  77. // options:{
  78. // limit: 512 * 1024,
  79. // name: "[name].[ext]",
  80. // outputPath:"media",
  81. // },
  82. // }]
  83. type: 'asset/resource',
  84. generator:{
  85. // filename: "./font/[name].[ext]",
  86. filename: 'font/[hash][ext][query]'
  87. }
  88. },]
  89. },
  90. plugins:[
  91. new VueLoaderPlugin(),
  92. new CleanWebpackPlugin(),
  93. new HtmlWebpackPlugin({
  94. inject:'head',
  95. title:"index page ",
  96. template:"./index.html",
  97. filename:"index.html",
  98. chunks:['index'],
  99. }),
  100. new MiniCssExtractPlugin({
  101. filename: 'css/[name].[contenthash:8].css' // 指定 CSS 输出路径
  102. })
  103. ],
  104. // 优化配置(如代码拆分)
  105. optimization: {
  106. splitChunks: {
  107. chunks: 'all',
  108. minSize: 20000,
  109. cacheGroups: {
  110. vendors: {
  111. test: /[\\/]node_modules[\\/]/,
  112. priority: -10,
  113. reuseExistingChunk: true,
  114. name: 'vendors'
  115. }
  116. }
  117. }
  118. }
  119. }