vue.config.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. let path = require('path')
  2. const webpack = require('webpack')
  3. const ThemeColorReplacer = require('webpack-theme-color-replacer')
  4. const {getThemeColors, modifyVars} = require('./src/utils/themeUtil')
  5. const {resolveCss} = require('./src/utils/theme-color-replacer-extend')
  6. const CompressionWebpackPlugin = require('compression-webpack-plugin')
  7. const productionGzipExtensions = ['js', 'css']
  8. const isProd = process.env.NODE_ENV === 'production'
  9. const assetsCDN = {
  10. // webpack build externals
  11. externals: {
  12. vue: 'Vue',
  13. 'vue-router': 'VueRouter',
  14. vuex: 'Vuex',
  15. axios: 'axios',
  16. nprogress: 'NProgress',
  17. clipboard: 'ClipboardJS',
  18. '@antv/data-set': 'DataSet',
  19. 'js-cookie': 'Cookies'
  20. },
  21. css: [
  22. ],
  23. js: [
  24. '//cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.min.js',
  25. '//cdn.jsdelivr.net/npm/vue-router@3.3.4/dist/vue-router.min.js',
  26. '//cdn.jsdelivr.net/npm/vuex@3.4.0/dist/vuex.min.js',
  27. '//cdn.jsdelivr.net/npm/axios@0.19.2/dist/axios.min.js',
  28. '//cdn.jsdelivr.net/npm/nprogress@0.2.0/nprogress.min.js',
  29. '//cdn.jsdelivr.net/npm/clipboard@2.0.6/dist/clipboard.min.js',
  30. '//cdn.jsdelivr.net/npm/@antv/data-set@0.11.4/build/data-set.min.js',
  31. '//cdn.jsdelivr.net/npm/js-cookie@2.2.1/src/js.cookie.min.js'
  32. ]
  33. }
  34. module.exports = {
  35. devServer: {
  36. // proxy: {
  37. // '/api': { //此处要与 /services/api.js 中的 API_PROXY_PREFIX 值保持一致
  38. // target: process.env.VUE_APP_API_BASE_URL,
  39. // changeOrigin: true,
  40. // pathRewrite: {
  41. // '^/api': ''
  42. // }
  43. // }
  44. // }
  45. },
  46. pluginOptions: {
  47. 'style-resources-loader': {
  48. preProcessor: 'less',
  49. patterns: [path.resolve(__dirname, "./src/theme/theme.less")],
  50. }
  51. },
  52. configureWebpack: config => {
  53. config.entry.app = ["babel-polyfill", "whatwg-fetch", "./src/main.js"];
  54. config.performance = {
  55. hints: false
  56. }
  57. config.plugins.push(
  58. new ThemeColorReplacer({
  59. fileName: 'css/theme-colors-[contenthash:8].css',
  60. matchColors: getThemeColors(),
  61. injectCss: true,
  62. resolveCss
  63. })
  64. )
  65. // Ignore all locale files of moment.js
  66. config.plugins.push(new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/))
  67. // 生产环境下将资源压缩成gzip格式
  68. if (isProd) {
  69. // add `CompressionWebpack` plugin to webpack plugins
  70. config.plugins.push(new CompressionWebpackPlugin({
  71. algorithm: 'gzip',
  72. test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'),
  73. threshold: 10240,
  74. minRatio: 0.8
  75. }))
  76. }
  77. // if prod, add externals
  78. if (isProd) {
  79. config.externals = assetsCDN.externals
  80. }
  81. },
  82. chainWebpack: config => {
  83. // 生产环境下关闭css压缩的 colormin 项,因为此项优化与主题色替换功能冲突
  84. if (isProd) {
  85. config.plugin('optimize-css')
  86. .tap(args => {
  87. args[0].cssnanoOptions.preset[1].colormin = false
  88. return args
  89. })
  90. }
  91. // 生产环境下使用CDN
  92. if (isProd) {
  93. config.plugin('html')
  94. .tap(args => {
  95. args[0].cdn = assetsCDN
  96. return args
  97. })
  98. }
  99. },
  100. css: {
  101. loaderOptions: {
  102. less: {
  103. lessOptions: {
  104. modifyVars: modifyVars(),
  105. javascriptEnabled: true
  106. }
  107. }
  108. }
  109. },
  110. publicPath: process.env.VUE_APP_PUBLIC_PATH,
  111. outputDir: 'dist',
  112. assetsDir: 'static',
  113. productionSourceMap: false
  114. }