vue.config.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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. configureWebpack: {
  11. plugins: [
  12. // Ignore all locale files of moment.js
  13. new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
  14. // 生成仅包含颜色的替换样式(主题色等)
  15. // TODO 需要增加根据环境不开启主题需求
  16. new ThemeColorReplacer({
  17. fileName: 'css/theme-colors-[contenthash:8].css',
  18. matchColors: getAntdSerials('#1890ff'), // 主色系列
  19. // 改变样式选择器,解决样式覆盖问题
  20. changeSelector (selector) {
  21. console.log('selector', selector)
  22. switch (selector) {
  23. case '.ant-calendar-today .ant-calendar-date':
  24. return ':not(.ant-calendar-selected-date):not(.ant-calendar-selected-day)' + selector
  25. case '.ant-btn:focus,.ant-btn:hover':
  26. return '.ant-btn:focus:not(.ant-btn-primary),.ant-btn:hover:not(.ant-btn-primary)'
  27. case '.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon':
  28. return ':not(.ant-steps-item-process)' + selector
  29. case '.ant-btn.active,.ant-btn:active':
  30. return '.ant-btn.active:not(.ant-btn-primary),.ant-btn:active:not(.ant-btn-primary)'
  31. 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':
  32. 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':
  33. 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'
  34. default :
  35. return selector
  36. }
  37. }
  38. })
  39. ]
  40. },
  41. chainWebpack: (config) => {
  42. config.resolve.alias
  43. .set('@$', resolve('src'))
  44. const svgRule = config.module.rule('svg')
  45. svgRule.uses.clear()
  46. svgRule
  47. .oneOf('inline')
  48. .resourceQuery(/inline/)
  49. .use('vue-svg-icon-loader')
  50. .loader('vue-svg-icon-loader')
  51. .end()
  52. .end()
  53. .oneOf('external')
  54. .use('file-loader')
  55. .loader('file-loader')
  56. .options({
  57. name: 'assets/[name].[hash:8].[ext]'
  58. })
  59. /* svgRule.oneOf('inline')
  60. .resourceQuery(/inline/)
  61. .use('vue-svg-loader')
  62. .loader('vue-svg-loader')
  63. .end()
  64. .end()
  65. .oneOf('external')
  66. .use('file-loader')
  67. .loader('file-loader')
  68. .options({
  69. name: 'assets/[name].[hash:8].[ext]'
  70. })
  71. */
  72. },
  73. css: {
  74. loaderOptions: {
  75. less: {
  76. modifyVars: {
  77. /* less 变量覆盖,用于自定义 ant design 主题 */
  78. /*
  79. 'primary-color': '#F5222D',
  80. 'link-color': '#F5222D',
  81. 'border-radius-base': '4px',
  82. */
  83. },
  84. javascriptEnabled: true
  85. }
  86. }
  87. },
  88. devServer: {
  89. // development server port 8000
  90. port: 8000
  91. // proxy: {
  92. // '/api': {
  93. // // target: 'https://mock.ihx.me/mock/5baf3052f7da7e07e04a5116/antd-pro',
  94. // target: 'https://mock.ihx.me/mock/5baf3052f7da7e07e04a5116/antd-pro',
  95. // ws: false,
  96. // changeOrigin: true
  97. // }
  98. // }
  99. },
  100. // disable source map in production
  101. productionSourceMap: false,
  102. lintOnSave: undefined,
  103. // babel-loader no-ignore node_modules/*
  104. transpileDependencies: []
  105. }
  106. function getAntdSerials (color) {
  107. // 淡化(即less的tint)
  108. const lightens = new Array(9).fill().map((t, i) => {
  109. return ThemeColorReplacer.varyColor.lighten(color, i / 10)
  110. })
  111. const colorPalettes = generate(color)
  112. return lightens.concat(colorPalettes)
  113. }