vue.config.js 4.5 KB

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