vue.config.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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-btn.active,.ant-btn:active':
  27. return '.ant-btn.active:not(.ant-btn-primary),.ant-btn:active:not(.ant-btn-primary)'
  28. 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':
  29. 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':
  30. 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'
  31. default :
  32. return selector
  33. }
  34. }
  35. })
  36. ]
  37. },
  38. chainWebpack: (config) => {
  39. config.resolve.alias
  40. .set('@$', resolve('src'))
  41. const svgRule = config.module.rule('svg')
  42. svgRule.uses.clear()
  43. svgRule
  44. .oneOf('inline')
  45. .resourceQuery(/inline/)
  46. .use('vue-svg-icon-loader')
  47. .loader('vue-svg-icon-loader')
  48. .end()
  49. .end()
  50. .oneOf('external')
  51. .use('file-loader')
  52. .loader('file-loader')
  53. .options({
  54. name: 'assets/[name].[hash:8].[ext]'
  55. })
  56. /* svgRule.oneOf('inline')
  57. .resourceQuery(/inline/)
  58. .use('vue-svg-loader')
  59. .loader('vue-svg-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. */
  69. },
  70. css: {
  71. loaderOptions: {
  72. less: {
  73. modifyVars: {
  74. /* less 变量覆盖,用于自定义 ant design 主题 */
  75. /*
  76. 'primary-color': '#F5222D',
  77. 'link-color': '#F5222D',
  78. 'border-radius-base': '4px',
  79. */
  80. },
  81. javascriptEnabled: true
  82. }
  83. }
  84. },
  85. devServer: {
  86. // development server port 8000
  87. port: 8000
  88. // proxy: {
  89. // '/api': {
  90. // // target: 'https://mock.ihx.me/mock/5baf3052f7da7e07e04a5116/antd-pro',
  91. // target: 'https://mock.ihx.me/mock/5baf3052f7da7e07e04a5116/antd-pro',
  92. // ws: false,
  93. // changeOrigin: true
  94. // }
  95. // }
  96. },
  97. // disable source map in production
  98. productionSourceMap: false,
  99. lintOnSave: undefined,
  100. // babel-loader no-ignore node_modules/*
  101. transpileDependencies: []
  102. }
  103. function getAntdSerials (color) {
  104. // 淡化(即less的tint)
  105. const lightens = new Array(9).fill().map((t, i) => {
  106. return ThemeColorReplacer.varyColor.lighten(color, i / 10)
  107. })
  108. const colorPalettes = generate(color)
  109. return lightens.concat(colorPalettes)
  110. }