vue.config.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. const path = require('path');
  2. const isProduction = process.env.NODE_ENV === 'production';
  3. function resolve(dir) {
  4. return path.join(__dirname, dir);
  5. }
  6. const cdn = {
  7. dev: {
  8. css: ['https://cdn.bootcss.com/element-ui/2.13.0/theme-chalk/index.css']
  9. },
  10. pro: {
  11. css: [
  12. 'https://cdn.bootcss.com/nprogress/0.2.0/nprogress.min.css',
  13. 'https://cdn.bootcss.com/quill/2.0.0-dev.3/quill.core.min.css',
  14. 'https://cdn.bootcss.com/viewerjs/1.3.7/viewer.min.css',
  15. 'https://cdn.bootcss.com/element-ui/2.13.0/theme-chalk/index.css'
  16. ],
  17. js: [
  18. 'https://cdn.bootcss.com/vue/2.6.10/vue.min.js',
  19. 'https://cdn.bootcss.com/vue-router/3.1.3/vue-router.min.js',
  20. 'https://cdn.bootcss.com/vuex/3.1.1/vuex.min.js',
  21. 'https://cdn.bootcss.com/clipboard.js/2.0.4/clipboard.min.js',
  22. 'https://cdn.bootcss.com/axios/0.19.0-beta.1/axios.min.js',
  23. 'https://cdn.bootcss.com/nprogress/0.2.0/nprogress.min.js',
  24. 'https://cdn.bootcss.com/Mock.js/1.0.1-beta3/mock-min.js',
  25. 'https://cdn.bootcss.com/quill/2.0.0-dev.3/quill.min.js',
  26. 'https://cdn.bootcss.com/element-ui/2.13.0/index.js',
  27. 'https://cdn.bootcss.com/viewerjs/1.3.7/viewer.min.js',
  28. 'https://cdn.bootcss.com/echarts/4.4.0-rc.1/echarts.min.js',
  29. 'https://cdn.jsdelivr.net/npm/vue-echarts@4.0.2'
  30. ]
  31. }
  32. };
  33. module.exports = {
  34. publicPath: '/',
  35. lintOnSave: true,
  36. productionSourceMap: false,
  37. parallel: require('os').cpus().length > 1,
  38. css: {
  39. extract: isProduction,
  40. sourceMap: false,
  41. loaderOptions: {
  42. stylus: {
  43. import: '~@/assets/css/common.styl'
  44. },
  45. sass: {
  46. prependData: `@import "~@/assets/css/base.scss";`
  47. }
  48. }
  49. },
  50. devServer: {
  51. port: 7777,
  52. open: false,
  53. compress: false,
  54. overlay: {
  55. warnings: false,
  56. errors: true
  57. },
  58. proxy: {
  59. '/dev': {
  60. target: 'http://api.b.huaml.com',
  61. changeOrigin: true,
  62. pathRewrite: { '^/dev': '' }
  63. },
  64. '/pro': {
  65. target: 'http://api.b.huaml.com',
  66. changeOrigin: true,
  67. pathRewrite: { '^/pro': '/api' }
  68. }
  69. }
  70. },
  71. chainWebpack: config => {
  72. // 移除 prefetch 插件
  73. config.plugins.delete('prefetch');
  74. // 移除 preload 插件
  75. // config.plugins.delete('preload');
  76. // svg
  77. config.module.rule('svg').uses.clear();
  78. config.module
  79. .rule('svg-sprite-loader')
  80. .test(/.svg$/)
  81. .exclude.add(/node_modules/)
  82. .end()
  83. .use('svg-sprite-loader')
  84. .loader('svg-sprite-loader')
  85. .options({
  86. symbolId: '[name]'
  87. });
  88. // 去掉元素之间空格
  89. config.module
  90. .rule('vue')
  91. .use('vue-loader')
  92. .loader('vue-loader')
  93. .tap(options => {
  94. options.compilerOptions.preserveWhitespace = true;
  95. return options;
  96. })
  97. .end();
  98. // 引入cdn
  99. config.plugin('html').tap(args => {
  100. args[0].cdn = cdn[isProduction ? 'pro' : 'dev'];
  101. return args;
  102. });
  103. if (isProduction) {
  104. config.performance.set('hints', false);
  105. config.optimization.splitChunks({
  106. chunks: 'all',
  107. cacheGroups: {
  108. libs: {
  109. name: 'chunk-libs',
  110. test: /[\\/]node_modules[\\/]/,
  111. priority: 10,
  112. chunks: 'initial'
  113. },
  114. commons: {
  115. name: 'chunk-cool',
  116. test: resolve('src/cool'),
  117. minChunks: 3,
  118. priority: 5,
  119. reuseExistingChunk: true
  120. }
  121. }
  122. });
  123. }
  124. },
  125. configureWebpack: config => {
  126. if (isProduction) {
  127. config.externals = {
  128. vue: 'Vue',
  129. 'vue-router': 'VueRouter',
  130. 'element-ui': 'ELEMENT',
  131. vuex: 'Vuex',
  132. axios: 'axios',
  133. mockjs: 'Mock',
  134. nprogress: 'NProgress',
  135. quill: 'Quill',
  136. viewer: 'Viewer',
  137. echarts: 'echarts',
  138. 'vue-echarts': 'VueECharts'
  139. };
  140. }
  141. }
  142. };