• webpack简单配置(基于vue3配置)


    首先创建webpack.config.js他和src平级

    基础配置(具体根据项目而言)

    1. const path = require('path'); // 引入Node.js的path模块,用于处理文件路径
    2. const { VueLoaderPlugin } = require('vue-loader'); // 引入Vue Loader插件,用于处理.vue文件
    3. const MiniCssExtractPlugin = require('mini-css-extract-plugin'); // 引入MiniCssExtractPlugin插件,用于提取CSS到单独的文件
    4. const TerserPlugin = require('terser-webpack-plugin'); // 引入TerserPlugin插件,用于压缩JavaScript代码
    5. const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); // 引入OptimizeCSSAssetsPlugin插件,用于压缩CSS代码
    6. const HtmlWebpackPlugin = require('html-webpack-plugin'); // 引入HtmlWebpackPlugin插件,用于生成HTML文件
    7. const { CleanWebpackPlugin } = require('clean-webpack-plugin'); // 引入CleanWebpackPlugin插件,用于清理构建目录
    8. const webpack = require('webpack'); // 引入webpack模块,用于访问内置插件和工具
    9. module.exports = (env, argv) => {
    10. // 判断当前环境是否为生产环境
    11. const isProduction = argv.mode === 'production';
    12. return {
    13. // 入口文件
    14. entry: './src/main.js',
    15. // 输出文件
    16. output: {
    17. path: path.resolve(__dirname, 'dist'), // 输出路径
    18. filename: isProduction ? 'js/[name].[contenthash].js' : 'js/[name].js', // 输出文件名
    19. publicPath: '/' // 公共路径
    20. },
    21. // 模块加载器配置
    22. module: {
    23. rules: [
    24. {
    25. test: /\.vue$/, // 匹配.vue结尾的文件
    26. loader: 'vue-loader' // 使用vue-loader处理
    27. },
    28. {
    29. test: /\.js$/, // 匹配.js结尾的文件
    30. exclude: /node_modules/, // 排除node_modules目录下的文件
    31. use: {
    32. loader: 'babel-loader', // 使用babel-loader处理
    33. options: {
    34. presets: ['@babel/preset-env'] // 使用babel的env预设进行转换
    35. }
    36. }
    37. },
    38. {
    39. test: /\.css$/, // 匹配.css结尾的文件
    40. use: [
    41. isProduction ? MiniCssExtractPlugin.loader : 'vue-style-loader', // 生产环境提取CSS,开发环境使用style标签插入
    42. 'css-loader', // 解析CSS文件
    43. 'postcss-loader' // 使用PostCSS进行后处理
    44. ]
    45. },
    46. {
    47. test: /\.(scss|sass)$/, // 匹配.scss或者.sass结尾的文件
    48. use: [
    49. isProduction ? MiniCssExtractPlugin.loader : 'vue-style-loader',
    50. 'css-loader',
    51. 'postcss-loader',
    52. 'sass-loader' // 使用sass-loader将Sass/SCSS转换为CSS
    53. ]
    54. },
    55. {
    56. test: /\.(png|jpe?g|gif|svg)$/, // 匹配图片文件
    57. loader: 'url-loader', // 使用url-loader处理
    58. options: {
    59. limit: 8192, // 小于8KB的图片转换为base64格式
    60. name: 'images/[name].[hash:7].[ext]' // 输出文件名格式
    61. }
    62. },
    63. {
    64. test: /\.(woff2?|eot|ttf|otf)$/, // 匹配字体文件
    65. loader: 'file-loader', // 使用file-loader处理
    66. options: {
    67. name: 'fonts/[name].[hash:7].[ext]' // 输出文件名格式
    68. }
    69. }
    70. ]
    71. },
    72. // 解析模块请求的选项
    73. resolve: {
    74. extensions: ['.js', '.vue', '.json'], // 导入时可以省略的后缀名
    75. alias: {
    76. '@': path.resolve(__dirname, 'src/') // @符号表示src目录
    77. }
    78. },
    79. // 控制是否生成,以及如何生成 source map
    80. devtool: isProduction ? false : 'eval-cheap-source-map', // 生产环境不生成Source Map,开发环境生成eval-cheap-source-map类型的Source Map
    81. // 开发服务器配置
    82. devServer: {
    83. contentBase: path.join(__dirname, 'dist'), // 服务器根目录
    84. compress: true, // 是否启用gzip压缩
    85. port: 9000, // 服务器端口号
    86. hot: true, // 启用热模块替换(HMR)
    87. open: true // 是否在启动时自动打开浏览器
    88. },
    89. // 优化配置
    90. optimization: {
    91. minimizer: [
    92. new TerserPlugin(), // 压缩JavaScript
    93. new OptimizeCSSAssetsPlugin() // 压缩CSS
    94. ],
    95. splitChunks: {
    96. cacheGroups: {
    97. vendor: {
    98. test: /[\\/]node_modules[\\/]/,
    99. name: 'vendors',
    100. chunks: 'all'
    101. }
    102. }
    103. }
    104. },
    105. // 插件配置
    106. plugins: [
    107. new VueLoaderPlugin(), // Vue Loader插件
    108. new MiniCssExtractPlugin({ // 提取CSS到单独的文件
    109. filename: isProduction ? 'css/[name].[contenthash].css' : 'css/[name].css',
    110. chunkFilename: isProduction ? 'css/[id].[contenthash].css' : 'css/[id].css'
    111. }),
    112. new HtmlWebpackPlugin({ // 生成HTML文件
    113. template: './public/index.html',
    114. filename: 'index.html',
    115. inject: true, // 所有JavaScript资源将被注入到body元素的底部
    116. minify: {
    117. removeComments: true, // 去除注释
    118. collapseWhitespace: true, // 去除空格
    119. removeAttributeQuotes: true // 去除属性引号
    120. }
    121. }),
    122. new CleanWebpackPlugin(), // 清理构建目录
    123. new webpack.DefinePlugin({ // 定义环境变量
    124. 'process.env.NODE_ENV': JSON.stringify(argv.mode)
    125. })
    126. ]
    127. };
    128. };

    需要使用npm安装的指令

    Vue 相关依赖

    vue@next:Vue 3的最新版本,提供了Composition API、