• vuecli vue.config.js 通用配置


    'use strict'
    const path = require('path')
    const defaultSettings = require('./src/settings.js')

    function resolve(dir) {
      return path.join(__dirname, dir)
    }

    const name = defaultSettings.title

    // If your port is set to 80,
    // use administrator privileges to execute the command line.
    // For example, Mac: sudo npm run
    // You can change the port by the following methods:
    // port = 9999 npm run dev OR npm run dev --port = 9999
    const port = process.env.port || process.env.npm_config_port || 9999 // dev port
    // 代理的类型及目标地址
    const npmConfigTarget = process.env.npm_config_target
    const devEnv = process.env.npm_config_dev_env || 'mock'
    const proxyTarget = npmConfigTarget || process.env[`PROXY_TARGET_${devEnv.toUpperCase()}`]
    const host = devEnv === 'mock' ? 'localhost' : process.env.DEV_SERVER_HOST

    if (devEnv === 'local' && !proxyTarget) {
      throw new Error('请配置环境变量: PROXY_TARGET_LOCAL')
    }

    // All configuration item explanations can be find in https://cli.vuejs.org/config/
    module.exports = {
      /**
       * You will need to set publicPath if you plan to deploy your site under a sub path,
       * for example GitHub Pages. If you plan to deploy your site to https://foo.github.io/bar/,
       * then publicPath should be set to "/bar/".
       * In most cases please use '/' !!!
       * Detail: https://cli.vuejs.org/config/#publicpath
       */
      publicPath: '/',
      outputDir: 'dist',
      assetsDir: 'static',
      lintOnSave: process.env.NODE_ENV === 'development',
      productionSourceMap: false,
      devServer: {
        host,
        port,
        open: true,
        overlay: {
          warnings: false,
          errors: true
        },
        proxy: {
          '^/': {
            target: proxyTarget,
            secure: false,
            ws: false,
            changeOrigin: true
          }
        }
      },
      configureWebpack: {
        // provide the app's title in webpack's name field, so that
        // it can be accessed in index.html to inject the correct title.
        name: name,
        resolve: {
          alias: {
            '@': resolve('src'),
            'components': resolve('src/components'),
            'api': resolve('src/api'),
            'utils': resolve('src/utils'),
            'constants': resolve('src/constants')
          }
        }
      },
      chainWebpack(config) {
        // it can improve the speed of the first screen, it is recommended to turn on preload
        // config.plugins.delete('preload')  
        config.plugin('preload').tap(() => [
          {
            rel: 'preload',
            // to ignore runtime.js
            fileBlacklist: [ /runtime..*.js$/],
            include: 'initial',
          },
        ])

        // when there are many pages, it will cause too many meaningless requests
        config.plugins.delete('prefetch')

        // set svg-sprite-loader
        config.module
          .rule('svg')
          .exclude.add(resolve('src/icons'))
          .end()
        config.module
          .rule('icons')
          .test(/.svg$/)
          .include.add(resolve('src/icons'))
          .end()
          .use('svg-sprite-loader')
          .loader('svg-sprite-loader')
          .options({
            symbolId: 'icon-[name]'
          })
          .end()

        // set preserveWhitespace
        config.module
          .rule('vue')
          .use('vue-loader')
          .loader('vue-loader')
          .tap(options => {
            options.compilerOptions.preserveWhitespace = true
            return options
          })
          .end()

        config
          .when(process.env.NODE_ENV !== 'development',
            config => {
              //根据路由驱动页面的 runtime 代码默认情况是包含在 build 后的 app.hash.js 内的,
              //如果我们改动其他路由,就会导致 runtime 代码改变。从而不光我们改动的路由对应的页面 js 会变,
              //含 runtime 代码的 app.hash.js 也会变,对用户体验是非常不友好的。
              //为了解决这个问题要设定 runtime 代码单独抽取打包: 但是 runtime 代码由于只是驱动不同路由页面的关系,代码量比较少,请求 js 的时间都大于执行时间了,所以使用 script-ext-html-webpack-plugin 插件将其内链在 index.html 中比较友好。
              config
                .plugin('ScriptExtHtmlWebpackPlugin')
                .after('html')
                .use('script-ext-html-webpack-plugin', [
                  {
                    // `runtime` must same as runtimeChunk name. default is `runtime`
                    inline: /runtime..*.js$/,
                  },
                ])
                .end()
              config.optimization.splitChunks({
                chunks: 'all',
                cacheGroups: {
                  libs: {
                    name: 'chunk-libs',
                    test: /[\/]node_modules[\/]/,
                    priority: 10,
                    chunks: 'initial', // only package third parties that are initially dependent
                  },
                  elementUI: {
                    name: 'chunk-elementUI', // split elementUI into a single package
                    priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
                    test: /[\/]node_modules[\/]_?element-ui(.*)/, // in order to adapt to cnpm
                  },
                  commons: {
                    name: 'chunk-commons',
                    test: resolve('src/components'), // can customize your rules
                    minChunks: 3, //  minimum common number
                    priority: 5,
                    reuseExistingChunk: true,
                  },
                },
              })
              config.optimization.runtimeChunk('single')
            }
          )

        config
          .plugin('define')
          .tap(args => {
            args[0]['__DEV_ENV__'] = JSON.stringify(devEnv)
            return args
          })
      }
    }
  • 相关阅读:
    Java的HashMap
    为什么 char c = 'A';c += 32; 结果输出的是 'a'?
    java中整数的常量优化机制
    IDEA2019版中文汉化包
    asp.net项目协作开发时,常常要忽略版本控制的目录
    SQLServer同步数据到ElasticSearch
    为什么不建议在微信小程序的TarBar上检查统一登录后跳转页面
    nginx的热备方式
    HTTP 和FTP 状态信息总结(留着自己用)
    Web Api 简介
  • 原文地址:https://www.cnblogs.com/binglove/p/15073974.html
Copyright © 2020-2023  润新知