vue.config.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. const webpack = require('webpack');
  2. const isDev = process.env.NODE_ENV === 'development';
  3. // cdn链接
  4. const cdn = {
  5. css: [
  6. // antd css 由于引入失败只好放弃了antd的按需引入
  7. ],
  8. js: [
  9. // vue
  10. 'https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.min.js',
  11. // vue-router
  12. 'https://cdn.bootcdn.net/ajax/libs/vue-router/3.1.3/vue-router.min.js',
  13. // vuex
  14. 'https://cdn.bootcdn.net/ajax/libs/vuex/3.1.2/vuex.min.js',
  15. // axios
  16. 'https://cdn.bootcdn.net/ajax/libs/axios/0.18.0/axios.min.js',
  17. // moment
  18. 'https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.27.0/moment.min.js',
  19. // lodash
  20. 'https://cdn.bootcdn.net/ajax/libs/lodash.js/4.17.20/lodash.min.js',
  21. ],
  22. };
  23. const CompressionWebpackPlugin = require('compression-webpack-plugin');
  24. module.exports = {
  25. chainWebpack: (config) => {
  26. // 需要打包分析时取消注释
  27. // eslint-disable-next-line global-require
  28. // config.plugin('webpack-bundle-analyzer').use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin);
  29. // 配置cdn引入
  30. if (process.env.NODE_ENV === 'production' && process.env.VUE_APP_CDN === 'true') {
  31. const externals = {
  32. vue: 'Vue',
  33. axios: 'axios',
  34. 'vue-router': 'VueRouter',
  35. vuex: 'Vuex',
  36. moment: 'moment',
  37. lodash: '_',
  38. };
  39. config.externals(externals);
  40. // 通过 html-webpack-plugin 将 cdn 注入到 index.html 之中
  41. config.plugin('html').tap((args) => {
  42. // eslint-disable-next-line no-param-reassign
  43. args[0].cdn = cdn;
  44. return args;
  45. });
  46. }
  47. },
  48. configureWebpack: (config) => {
  49. // 代码 gzip
  50. const productionGzipExtensions = ['html', 'js', 'css'];
  51. // 开发模式下不走gzip
  52. if (!isDev) {
  53. config.plugins.push(
  54. new CompressionWebpackPlugin({
  55. filename: '[path].gz[query]',
  56. algorithm: 'gzip',
  57. test: new RegExp(`\\.(${productionGzipExtensions.join('|')})$`),
  58. threshold: 10240, // 只有大小大于该值的资源会被处理 10240
  59. minRatio: 0.8, // 只有压缩率小于这个值的资源才会被处理
  60. deleteOriginalAssets: false, // 删除原文件
  61. })
  62. );
  63. }
  64. // 不打包moment的语言包
  65. config.plugins.push(new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/));
  66. // 去除console
  67. if (process.env.NODE_ENV === 'production') {
  68. // eslint-disable-next-line no-param-reassign
  69. config.optimization.minimizer[0].options.terserOptions.compress.drop_console = true;
  70. }
  71. },
  72. css: {
  73. loaderOptions: {
  74. less: {
  75. lessOptions: {
  76. modifyVars: {
  77. 'primary-color': '#09b955',
  78. // 'link-color': '#1DA57A',
  79. // 'border-radius-base': '2px',
  80. },
  81. javascriptEnabled: true,
  82. },
  83. },
  84. sass: {
  85. prependData: "@import '@/styles/index.scss';",
  86. },
  87. },
  88. },
  89. // webSocket本身不存在跨域问题,所以我们可以利用webSocket来进行非同源之间的通信。
  90. publicPath: './',
  91. devServer: {
  92. port: 1997,
  93. },
  94. productionSourceMap: false,
  95. };