• vue.config.js配置优化


    vue.config.js完整代码如下:

    'use strict';
    // Template version: 1.3.1
    // see http://vuejs-templates.github.io/webpack for documentation.
    
    const path = require('path');
    const resolve = (dir) => path.resolve(__dirname, dir);
    // 是否为生产环境
    const isProduction = process.env.NODE_ENV !== 'development';
    // gzip压缩
    const CompressionWebpackPlugin = require('compression-webpack-plugin');
    
    const cdn = {
      // 忽略打包的第三方库
      externals: {
        vue: 'Vue',
        vuex: 'Vuex',
        'vue-router': 'VueRouter',
        axios: 'axios',
      },
    
      // 通过cdn方式使用
      js: [
        'https://cdn.bootcss.com/vue/2.6.11/vue.runtime.min.js',
        'https://cdn.bootcss.com/vue-router/3.1.2/vue-router.min.js',
        'https://cdn.bootcss.com/vuex/3.1.2/vuex.min.js',
        'https://cdn.bootcss.com/axios/0.19.2/axios.min.js',
        'https://cdn.bootcss.com/moment.js/2.24.0/moment.min.js',
        'https://cdn.bootcss.com/echarts/4.6.0/echarts.min.js',
      ],
      css: [],
    };
    
    module.exports = {
      publicPath: '/', // 基本路径
      outputDir: 'dist', // 输出文件目录
      assetsDir: 'static',
      indexPath: 'index.html',
      productionSourceMap: false, // 关闭生产环境的 source map
      chainWebpack: (config) => {
        config.module
          .rule('swf')
          .test(/.swf$/)
          .use('url-loader')
          .loader('url-loader')
          .tap((options) => {
            return {
              limit: 10000,
            };
          });
        // 添加别名
        config.resolve.alias
          .set('@', resolve('src'))
          .set('assets', resolve('src/assets'))
          .set('components', resolve('src/components'))
          .set('router', resolve('src/router'))
          .set('store', resolve('src/store'))
          .set('views', resolve('src/views'));
        config.plugin('copy').tap((args) => {
          args[0][0].to = 'resource';
          return args;
        });
        // 移除 prefetch 插件
        config.plugins.delete('prefetch-index');
        // 移除 preload 插件,避免加载多余的资源
        config.plugins.delete('preload-index');
        // 配置cdn引入
        config.plugin('html').tap((args) => {
          args[0].cdn = cdn;
          return args;
        });
      },
      // 这个值是一个对象,则会通过 webpack-merge 合并到最终的配置中。
      configureWebpack: (config) => {
        // 忽略打包配置
        config.externals = cdn.externals;
        // 生产环境相关配置
        if (isProduction) {
          //gzip压缩
          const productionGzipExtensions = ['html', 'js', 'css'];
          config.plugins.push(
            new CompressionWebpackPlugin({
              filename: '[path].gz[query]',
              algorithm: 'gzip',
              test: new RegExp('\.(' + productionGzipExtensions.join('|') + ')$'),
              threshold: 10240, // 只有大小大于该值的资源会被处理 10240
              minRatio: 0.8, // 只有压缩率小于这个值的资源才会被处理
              deleteOriginalAssets: false, // 删除原文件
            })
          );
          // 公共代码抽离
          config.optimization = {
            // 分割代码块
            splitChunks: {
              cacheGroups: {
                //公用模块抽离
                common: {
                  chunks: 'initial',
                  minSize: 0, //大于0个字节
                  minChunks: 2, //抽离公共代码时,这个代码块最小被引用的次数
                },
                //第三方库抽离
                vendor: {
                  priority: 1, //权重
                  test: /node_modules/,
                  chunks: 'initial',
                  minSize: 0, //大于0个字节
                  minChunks: 2, //在分割之前,这个代码块最小应该被引用的次数
                },
              },
            },
          };
        }
      },
      devServer: {
        overlay: {
          warnings: false,
          errors: false,
        },
        open: true,
        // host: 'localhost',
        host: '0.0.0.0',
        port: 8081,
        https: false,
        hotOnly: true,
        proxy: {
          '/api': {
            // 代理地址
            target: process.env.VUE_APP_API,
            changeOrigin: true, // 是否跨域
            secure: false,
            pathRewrite: {
              '^/api': '/api/ctrl', //测试环境
              // '/api': '', //需要rewrite重写的, //本地联调
            },
          },
        },
      },
      css: {
        extract: true,
        sourceMap: false,
        loaderOptions: {
          sass: {
            prependData: `@import "~@/assets/scss/variables.scss";`,
          },
        },
      },
    };

    index.html页面引入cdn文件:

      <% for (var i in htmlWebpackPlugin.options.cdn &&
        htmlWebpackPlugin.options.cdn.js) { %>
        <script
          src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"
          crossorigin="anonymous"
        ></script>
        <% } %>
  • 相关阅读:
    POJ 3680_Intervals
    POJ 3680_Intervals
    POJ 3686_The Windy's
    POJ 3686_The Windy's
    Codeforces 629C Famil Door and Brackets
    Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)
    Codeforces 629D Babaei and Birthday Cake(线段树优化dp)
    Codeforces 628F Bear and Fair Set
    18.04.26 魔兽世界终极版
    18.4.20 STL专项练习8选6
  • 原文地址:https://www.cnblogs.com/jiekzou/p/12923393.html
Copyright © 2020-2023  润新知