webpack

在Vue项目中,webpack的配置项非常丰富,这些配置项用于优化项目的构建、打包和部署等过程。以下是一些在Vue中最常用的webpack配置项,以及它们各自的功能和示例:

  1. entry

    • 功能:定义webpack打包的入口文件。
    • 示例entry: './src/main.js',表示webpack从main.js文件开始打包。
  2. output

    • 功能:定义webpack打包后的输出文件路径和文件名。
    • 示例
      output: {
        path: path.resolve(__dirname, './dist'),
        filename: 'build.js'
      }
      
      这会将打包后的文件输出到dist目录下的build.js文件中。
  3. module

    • 功能:定义webpack如何处理项目中的不同类型的模块。
    • 示例
      module: {
        rules: [
          {
            test: /\.vue$/,
            loader: 'vue-loader'
          },
          {
            test: /\.js$/,
            loader: 'babel-loader'
          }
        ]
      }
      
      这里配置了webpack如何处理.vue.js文件,使用vue-loader处理.vue文件,使用babel-loader处理.js文件。
  4. devServer

    • 功能:提供开发服务器,具有自动刷新、热重载等功能。
    • 示例
      devServer: {
        contentBase: './dist',
        hot: true
      }
      
      这会在本地启动一个开发服务器,并设置其根目录为dist,同时启用热重载功能。
  5. plugins

    • 功能:用于扩展webpack的功能,如压缩代码、优化输出等。
    • 示例:使用HtmlWebpackPlugin插件来自动生成HTML文件,并自动引入打包后的JS文件。
  6. resolve

    • 功能:配置模块如何被解析。
    • 示例
      resolve: {
        alias: {
          '@': path.resolve(__dirname, 'src')
        }
      }
      
      这里配置了模块别名,使得在代码中可以通过@来快速引用src目录下的文件。
  7. optimization

    • 功能:用于优化webpack的输出。
    • 示例:使用splitChunks来分割代码,实现代码的按需加载。
  8. mode

    • 功能:设置webpack的运行模式,如developmentproduction等。
    • 示例mode: 'production',设置webpack为生产模式,会启用生产环境下的优化选项。

以上只是webpack在Vue项目中常用的一些配置项,实际上webpack的配置非常灵活且强大,可以根据项目的具体需求进行定制和优化。在实际开发中,通常还会结合其他工具如vue-loader、babel-loader等来实现更复杂的构建需求。

在Vue项目中,webpack的配置通常会在vue.config.js文件中进行,这个文件允许你修改内部的webpack配置。以下是一个包含了多个常用配置的示例,这些配置可以一同使用,以优化你的Vue项目的构建过程:

const path = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');

module.exports = {
  // 调整webpack配置
  configureWebpack: {
    // 入口文件
    entry: {
      app: './src/main.js'
    },
    // 输出配置
    output: {
      path: path.resolve(__dirname, 'dist'),
      filename: 'js/[name].[contenthash].js',
      chunkFilename: 'js/[name].[contenthash].chunk.js',
      publicPath: '/'
    },
    // 插件
    plugins: [
      new MiniCssExtractPlugin({
        filename: '[name].[contenthash].css'
      }),
      new HtmlWebpackPlugin({
        template: './src/index.html',
        inject: true
      }),
      new CleanWebpackPlugin(),
      // ...其他插件
    ],
    // 优化
    optimization: {
      splitChunks: {
        chunks: 'all',
        minSize: 20000,
        minRemainingSize: 0,
        maxSize: 0,
        minChunks: 1,
        maxAsyncRequests: 30,
        maxInitialRequests: 30,
        automaticNameDelimiter: '~',
        cacheGroups: {
          defaultVendors: {
            test: /[\\/]node_modules[\\/]/,
            priority: -10,
            reuseExistingChunk: true
          },
          default: {
            minChunks: 2,
            priority: -20,
            reuseExistingChunk: true
          }
        }
      },
      minimizer: [new TerserPlugin({
        terserOptions: {
          compress: {
            drop_console: true,
          },
        },
      })],
    },
    // 模块解析配置
    resolve: {
      alias: {
        '@': path.resolve(__dirname, 'src'),
      },
      extensions: ['.js', '.vue', '.json'],
    },
    // 模块规则
    module: {
      rules: [
        {
          test: /\.vue$/,
          loader: 'vue-loader'
        },
        {
          test: /\.js$/,
          loader: 'babel-loader',
          exclude: /node_modules/
        },
        {
          test: /\.css$/,
          use: [MiniCssExtractPlugin.loader, 'css-loader'],
        },
        {
          test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
          loader: 'url-loader',
          options: {
            limit: 10000,
            name: 'img/[name].[hash:7].[ext]'
          }
        },
        // ...其他规则
      ]
    },
    // 开发服务器配置
    devServer: {
      contentBase: path.join(__dirname, 'dist'),
      compress: true,
      port: 9000,
      hot: true
    },
    // 其他webpack配置...
  },
  // 链式操作webpack配置
  chainWebpack: config => {
    // 在这里进行链式操作
    // 例如:修改loader选项
    config.module
      .rule('vue')
      .use('vue-loader')
        .loader('vue-loader')
        .options({
          // vue-loader配置
        });
  },
};

请注意,这个配置是一个示例,并不是针对特定项目的完整配置。实际项目中,你可能需要根据项目的具体需求和依赖来调整这些配置。此外,你还需要确保在项目中安装了所有必要的webpack插件和loader,例如mini-css-extract-pluginhtml-webpack-pluginclean-webpack-pluginterser-webpack-plugin等。

vue.config.js文件通常位于Vue项目的根目录下,如果你没有这个文件,可以手动创建它,并根据项目需求添加相应的配置。

这是更复杂的vue.config.js配置示例。请注意,以下配置可能包含了一些高级特性和插件,因此请确保您已经安装了所有必要的依赖项,并且了解每个配置项的作用。

const path = require('path');
const TerserPlugin = require('terser-webpack-plugin');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const { defineConfig } = require('@vue/cli-service');

module.exports = defineConfig({
  // 基本路径
  publicPath: './',

  // 输出目录
  outputDir: 'dist',

  // 用于放置生成的静态资源 (js、css、img、fonts) 的目录
  assetsDir: 'assets',

  // 是否在构建生产包时生成 sourceMap 文件
  productionSourceMap: false,

  // 配置 webpack
  configureWebpack: {
    optimization: {
      minimize: true,
      minimizer: [
        new TerserPlugin({
          terserOptions: {
            compress: {
              drop_console: true,
              collapse_vars: true,
              reduce_vars: true,
            },
          },
        }),
        new CssMinimizerPlugin(),
      ],
    },
    plugins: [
      new MiniCssExtractPlugin({
        filename: '[name].[contenthash].css',
        chunkFilename: '[id].[contenthash].css',
      }),
      new HtmlWebpackPlugin({
        template: './public/index.html',
        inject: true,
        minify: {
          removeComments: true,
          collapseWhitespace: true,
          removeAttributeQuotes: true,
        },
      }),
    ],
  },

  // 链式操作 webpack 配置
  chainWebpack: config => {
    // 添加别名
    config.resolve.alias
      .set('@', path.resolve(__dirname, 'src'))
      .set('~', path.resolve(__dirname, 'node_modules'));

    // 配置 loader
    config.module
      .rule('vue')
      .use('vue-loader')
        .loader('vue-loader')
        .options({
          // 自定义 vue-loader 选项
        });

    config.module
      .rule('images')
      .test(/\.(png|jpe?g|gif|webp)(\?.*)?$/)
      .use('url-loader')
        .loader('url-loader')
        .options({
          limit: 8192,
          name: 'img/[name].[hash:7].[ext]',
        });

    // 其他链式配置...
  },

  // CSS 相关配置
  css: {
    extract: true, // 是否使用 css-loader 提取 CSS 到单独文件中
    sourceMap: false, // 是否为 CSS 开启 source map
    loaderOptions: {
      sass: {
        prependData: `@import "@/styles/variables.scss";`, // 注入全局 SASS 变量
      },
    },
  },

  // 开发服务器配置
  devServer: {
    port: 8080, // 端口号
    open: true, // 自动打开浏览器
    hot: true, // 启用热重载
    proxy: {
      '/api': {
        target: 'http://localhost:3000', // 代理目标地址
        changeOrigin: true, // 开启代理,在本地创建一个虚拟服务器
        pathRewrite: {
          '^/api': '' // 重写请求路径
        }
      }
    }
  },

  // 插件配置
  pluginOptions: {
    // 这里可以配置一些第三方插件的选项
    // 例如 vue-cli-plugin-i18n 的配置
    i18n: {
      locale: 'en', // 默认语言
      fallbackLocale: 'en', // 备用语言
      messages: {
        // 语言文件配置
      },
    },
  },

  // 其他配置...
});

这个配置包含了多个特性,例如:

  • 基本路径 (publicPath): 在生产环境下,您可以设置不同的子路径。
  • 输出目录 (outputDir): 指定构建后的文件输出目录。
  • 静态资源目录 (assetsDir): 指定静态资源(如 CSS、JavaScript、图片等)的目录。
  • 生产环境的 source map (productionSourceMap): 是否生成 source map。
  • Webpack 配置 (configureWebpack): 允许您直接修改内部的 webpack 配置。
  • 链式操作 Webpack (chainWebpack): 提供了一种更高级的方式来修改内部的 webpack 配置。
  • CSS 配置 (css): 允许您配置 CSS 相关的 loader 选项。
  • 开发服务器 (devServer): 配置
  • 使用TerserPluginCssMinimizerPlugin来压缩和优化JS和CSS代码。
  • 使用HtmlWebpackPlugin来生成HTML文件,并对其进行压缩。
  • 使用MiniCssExtractPlugin来提取CSS到单独的文件中。
posted @   嘿!那个姑娘  阅读(10)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2021-04-01 vue接口中的传参
点击右上角即可分享
微信分享提示