vue.config.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. const path = require('path')
  2. const webpack = require('webpack')
  3. const ThemeColorReplacer = require('webpack-theme-color-replacer')
  4. const generate = require('@ant-design/colors/lib/generate').default
  5. function resolve (dir) {
  6. return path.join(__dirname, dir)
  7. }
  8. // vue.config.js
  9. module.exports = {
  10. /*
  11. Vue-cli3:
  12. Crashed when using Webpack `import()` #2463
  13. https://github.com/vuejs/vue-cli/issues/2463
  14. */
  15. /*
  16. pages: {
  17. index: {
  18. entry: 'src/main.js',
  19. chunks: ['chunk-vendors', 'chunk-common', 'index']
  20. }
  21. },
  22. */
  23. configureWebpack: {
  24. plugins: [
  25. // Ignore all locale files of moment.js
  26. new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
  27. // 生成仅包含颜色的替换样式(主题色等)
  28. new ThemeColorReplacer({
  29. fileName: 'css/theme-colors[hash].css',
  30. matchColors: getAntdSerials('#1890ff'), // 主色系列
  31. // 改变样式选择器,解决样式覆盖问题
  32. changeSelector (selector) {
  33. switch (selector) {
  34. case '.ant-calendar-today .ant-calendar-date':
  35. return ':not(.ant-calendar-selected-date)' + selector
  36. case '.ant-btn:focus,.ant-btn:hover':
  37. return '.ant-btn:focus:not(.ant-btn-primary),.ant-btn:hover:not(.ant-btn-primary)'
  38. case '.ant-btn.active,.ant-btn:active':
  39. return '.ant-btn.active:not(.ant-btn-primary),.ant-btn:active:not(.ant-btn-primary)'
  40. case '.ant-menu-horizontal>.ant-menu-item-active,.ant-menu-horizontal>.ant-menu-item-open,.ant-menu-horizontal>.ant-menu-item-selected,.ant-menu-horizontal>.ant-menu-item:hover,.ant-menu-horizontal>.ant-menu-submenu-active,.ant-menu-horizontal>.ant-menu-submenu-open,.ant-menu-horizontal>.ant-menu-submenu-selected,.ant-menu-horizontal>.ant-menu-submenu:hover':
  41. case '.ant-menu-horizontal > .ant-menu-item-active,.ant-menu-horizontal > .ant-menu-item-open,.ant-menu-horizontal > .ant-menu-item-selected,.ant-menu-horizontal > .ant-menu-item:hover,.ant-menu-horizontal > .ant-menu-submenu-active,.ant-menu-horizontal > .ant-menu-submenu-open,.ant-menu-horizontal > .ant-menu-submenu-selected,.ant-menu-horizontal > .ant-menu-submenu:hover':
  42. return '.ant-menu-horizontal > .ant-menu-item-active,.ant-menu-horizontal > .ant-menu-item-open,.ant-menu-horizontal > .ant-menu-item-selected,.ant-menu-horizontal > .ant-menu-item:hover,.ant-menu-horizontal > .ant-menu-submenu-active,.ant-menu-horizontal > .ant-menu-submenu-open,.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu-selected,.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu:hover'
  43. default :
  44. return selector
  45. }
  46. }
  47. })
  48. ]
  49. },
  50. chainWebpack: (config) => {
  51. config.resolve.alias
  52. .set('@$', resolve('src'))
  53. const svgRule = config.module.rule('svg')
  54. svgRule.uses.clear()
  55. svgRule
  56. .oneOf('inline')
  57. .resourceQuery(/inline/)
  58. .use('vue-svg-icon-loader')
  59. .loader('vue-svg-icon-loader')
  60. .end()
  61. .end()
  62. .oneOf('external')
  63. .use('file-loader')
  64. .loader('file-loader')
  65. .options({
  66. name: 'assets/[name].[hash:8].[ext]'
  67. })
  68. /* svgRule.oneOf('inline')
  69. .resourceQuery(/inline/)
  70. .use('vue-svg-loader')
  71. .loader('vue-svg-loader')
  72. .end()
  73. .end()
  74. .oneOf('external')
  75. .use('file-loader')
  76. .loader('file-loader')
  77. .options({
  78. name: 'assets/[name].[hash:8].[ext]'
  79. })
  80. */
  81. },
  82. css: {
  83. loaderOptions: {
  84. less: {
  85. modifyVars: {
  86. /* less 变量覆盖,用于自定义 ant design 主题 */
  87. /*
  88. 'primary-color': '#F5222D',
  89. 'link-color': '#F5222D',
  90. 'border-radius-base': '4px',
  91. */
  92. },
  93. javascriptEnabled: true
  94. }
  95. }
  96. },
  97. devServer: {
  98. // development server port 8000
  99. port: 8000
  100. // proxy: {
  101. // '/api': {
  102. // // target: 'https://mock.ihx.me/mock/5baf3052f7da7e07e04a5116/antd-pro',
  103. // target: 'https://mock.ihx.me/mock/5baf3052f7da7e07e04a5116/antd-pro',
  104. // ws: false,
  105. // changeOrigin: true
  106. // }
  107. // }
  108. },
  109. // disable source map in production
  110. productionSourceMap: false,
  111. lintOnSave: undefined,
  112. // babel-loader no-ignore node_modules/*
  113. transpileDependencies: []
  114. }
  115. function getAntdSerials (color) {
  116. // 淡化(即less的tint)
  117. const lightens = new Array(9).fill().map((t, i) => {
  118. return ThemeColorReplacer.varyColor.lighten(color, i / 10)
  119. })
  120. const colorPalettes = generate(color)
  121. return lightens.concat(colorPalettes)
  122. }