vue.config.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. const path = require("path");
  2. const resolve = (dir) => path.join(__dirname, dir);
  3. // const SVGSpriteLoaderPlugin = require("svg-sprite-loader/plugin");
  4. function extendDefaultPlugins(arr) {
  5. let plug = [
  6. 'removeDoctype',
  7. 'removeXMLProcInst',
  8. 'removeComments',
  9. 'removeMetadata',
  10. 'removeEditorsNSData',
  11. 'cleanupAttrs',
  12. 'mergeStyles',
  13. 'inlineStyles',
  14. 'minifyStyles',
  15. 'cleanupIDs',
  16. 'removeUselessDefs',
  17. 'cleanupNumericValues',
  18. 'convertColors',
  19. 'removeUnknownsAndDefaults',
  20. 'removeNonInheritableGroupAttrs',
  21. 'removeUselessStrokeAndFill',
  22. 'removeViewBox',
  23. 'cleanupEnableBackground',
  24. 'removeHiddenElems',
  25. 'removeEmptyText',
  26. 'convertShapeToPath',
  27. 'convertEllipseToCircle',
  28. 'moveElemsAttrsToGroup',
  29. 'moveGroupAttrsToElems',
  30. 'collapseGroups',
  31. 'convertPathData',
  32. 'convertTransform',
  33. 'removeEmptyAttrs',
  34. 'removeEmptyContainers',
  35. 'mergePaths',
  36. 'removeUnusedNS',
  37. 'sortDefsChildren',
  38. 'removeTitle',
  39. 'removeDesc'
  40. ];
  41. return plug.concat(arr);
  42. }
  43. // 添加less继承
  44. function addStyleResource(rule) {
  45. rule.use('style-resource')
  46. .loader('style-resources-loader')
  47. .options({
  48. patterns: [
  49. resolve('src/assets/styles/common/common.less')
  50. ]
  51. })
  52. }
  53. module.exports = {
  54. chainWebpack: (config) => {
  55. // 路径别名
  56. config.resolve.alias
  57. .set("@", resolve("src"))
  58. .set("@node", resolve("node_modules"))
  59. .set("@com", resolve("src/components"))
  60. .set("@assets", resolve("src/assets"));
  61. // less 继承
  62. const types = ['vue-modules', 'vue', 'normal-modules', 'normal'];
  63. types.forEach(type => addStyleResource(config.module.rule('less').oneOf(type)));
  64. // svg 雪碧图
  65. config.module // 排除其他svg-loader
  66. .rule('svg')
  67. .exclude.add(resolve('src/assets/icon/svg'))
  68. .end()
  69. .exclude.add(resolve('src/assets/icon/svg_fill'))
  70. .end();
  71. // svg雪碧图
  72. const svgRule = config.module.rule('icons');
  73. svgRule.test(/\.svg$/)
  74. .include.add(resolve('src/assets/icon/svg'))
  75. .end()
  76. .use('svg-sprite-loader')
  77. .loader('svg-sprite-loader')
  78. .options({
  79. symbolId: 'svg-[name]',
  80. // extract: true,
  81. // publicPath: "img/",
  82. // spriteFilename: "svg-sprite-[hash:8].svg",
  83. });
  84. // config
  85. // .plugin("svgsprite")
  86. // .use(SVGSpriteLoaderPlugin, [{
  87. // plainSprite: true
  88. // }]);
  89. // svgo 去除svg中无用元素
  90. svgRule.use('svgo-loader').loader('svgo-loader').options({
  91. plugins: extendDefaultPlugins([{
  92. name: "removeAttrs",
  93. params: {
  94. attrs: 'fill',
  95. }
  96. }])
  97. });
  98. // svg雪碧图 不去除fill属性
  99. // const svgRuleFill = config.module.rule('icons_fill');
  100. // svgRuleFill.test(/\.svg$/)
  101. // .include.add(resolve('src/assets/icon/svg_fill'))
  102. // .end()
  103. // .use('svg-sprite-loader')
  104. // .loader('svg-sprite-loader')
  105. // .options({
  106. // symbolId: 'fill-[name]',
  107. // // extract: true,
  108. // // publicPath: "img/",
  109. // // spriteFilename: "svg-sprite-[hash:8].svg",
  110. // });
  111. // // config
  112. // // .plugin("svgsprite")
  113. // // .use(SVGSpriteLoaderPlugin, [{
  114. // // plainSprite: true
  115. // // }]);
  116. // // svgo 去除svg中无用元素
  117. // svgRuleFill.use('svgo-loader').loader('svgo-loader').options({
  118. // plugins: extendDefaultPlugins([])
  119. // });
  120. },
  121. }