Bootstrap

vue3初体验(vue.config.js配置)

vue-cli4脚手架搭建完成后,项目目录中没有 vue.config.js 文件,需要手动创建
在这里插入图片描述

const path = require('path');
const webpack = require('webpack')
const CompressionWebpackPlugin = require("compression-webpack-plugin"); // 开启gzip压缩, 按需引用
 const productionGzipExtensions = /\.(js|css|json|txt|html|ico|svg)(\?.*)?$/i; // 开启gzip压缩, 按需写入
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin; // 打包分析
const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV);
// 是否使用cdn
const needCdn = false
// 是否压缩文件
const isZip = false
// 引入less公共文件
function addStyleResource(rule) {
  rule.use('style-resource')
    .loader('style-resources-loader')
    .options({
      patterns: [
        path.resolve(__dirname, './src/assets/css/reset.less'),
        path.resolve(__dirname, './src/assets/css/variable.less')
      ]
    })
  }
const cdn = {
  externals: {
    vue: 'Vue',
    vuex: 'Vuex',
    'VueRouter': 'VueRouter',
    iview: 'iView',
    axios: 'axios',
    BMapGL: 'BMapGL'
  },
  css: [],
  js: [
    'https://cdn.staticfile.org/vue/2.6.10/vue.min.js',
    'https://cdn.staticfile.org/vuex/3.0.1/vuex.min.js',
    'https://cdn.staticfile.org/vue-router/3.0.3/vue-router.min.js'
  ]
}

module.exports = {
//部署应用包时的基本 URL, 用法和 webpack 本身的 output.publicPath 一致。
  publicPath: './',
  //输出文件目录
  outputDir: 'dist',
  css: {
    // 是否使用css分离插件 ExtractTextPlugin
    extract: true,
    // 开启 CSS source maps?
    sourceMap: false,
    // css预设器配置项
    loaderOptions: {
      less: {
        // globalVars: {
        // }
      }
    }
  },
  //false 可以加速生产环境构建
  productionSourceMap: false,
  // webpack相关配置
  chainWebpack: config => {
  // less公共文件引入
    const types = ['vue-modules', 'vue', 'normal-modules', 'normal']
    types.forEach(type => addStyleResource(config.module.rule('less').oneOf(type)))
    //图片处理,注意用cnpm 淘宝镜像
    config.module
      .rule('images')
      .use('image-webpack-loader')
      .loader('image-webpack-loader')
      .options({
        bypassOnDebug: true
      })
      .end()
	// 别名配置
    config.resolve.alias
      .set('@', path.resolve(__dirname, './src'))
      .set('@V', path.resolve(__dirname, './src/views'))
      .set('@N', path.resolve(__dirname, './node_modules'))
      .set('@C', path.resolve(__dirname, './src/components'))
      .set('@I', path.resolve(__dirname, './src/assets/image'))
      // 打包分析
      // 打包之后自动生成一个名叫report.html文件(可忽视)
      if (IS_PROD) {
        config.plugin("webpack-report").use(BundleAnalyzerPlugin, [{
          analyzerMode: "static"
        }]);
      }
    // 生产环境或本地需要cdn时,才注入cdn
    config.plugin('html').tap(args => {
        args[0].title = process.env.VUE_APP_ITEMNAME
        if (needCdn) args[0].cdn = cdn
        return args
      }),
      // 删除预加载
      config.plugins.delete('preload')
      config.plugins.delete('prefetch')
  },
  // eslint-loader 是否在保存的时候检查
  lintOnSave: false, 
  devServer: {
    port: 8086,
    host: 'localhost',
    hotOnly: true, // 热更新
    overlay: { // 让浏览器 overlay 同时显示警告和错误
      warnings: true,
      errors: true
    },
    // 跨域
    proxy: {
      '/api': {
        target: 'http://www.baidu.com',
        changeOrigin: true,
        ws: true, // websocket支持
        pathRewrite: {
          '^/api': ''
        }
      }
    }
  },
  configureWebpack: config => {
    if (needCdn) config.externals = cdn.externals
    if (isZip) {
      config.plugins.push(
        new CompressionWebpackPlugin({
          filename: '[path].gz[query]',
          algorithm: 'gzip',
          test: productionGzipExtensions,
          threshold: 10240, // 只有大小大于该值的资源会被处理
          minRatio: 0.8, // 只有压缩率小于这个值的资源才会被处理
          deleteOriginalAssets: false // 删除原文件
        })
      )
    }
  },

}

;