prod.config.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. // * 避免打包项
  2. const externals = {
  3. vue: "Vue",
  4. vuex: "Vuex",
  5. "vue-router": "VueRouter",
  6. axios: "axios",
  7. };
  8. // * 公共代码抽离
  9. const optimization = {
  10. splitChunks: {
  11. cacheGroups: {
  12. vendors: {
  13. name: "chunk-vendors",
  14. test: /[\\/]node_modules[\\/]/,
  15. priority: 100,
  16. chunks: "all",
  17. minChunks: 1,
  18. maxInitialRequests: 5,
  19. minSize: 0,
  20. },
  21. common: {
  22. name: "chunk-common",
  23. test: /[\\/]src[\\/]ts[\\/]/,
  24. minChunks: 2,
  25. maxInitialRequests: 5,
  26. minSize: 0,
  27. priority: 60,
  28. chunks: "all",
  29. reuseExistingChunk: true,
  30. },
  31. styles: {
  32. name: "styles",
  33. test: /\.(sa|sc|c)ss$/,
  34. chunks: "all",
  35. enforce: true,
  36. },
  37. runtimeChunk: {
  38. name: "manifest",
  39. },
  40. },
  41. },
  42. };
  43. // * 资源配置
  44. const cdns = {
  45. dev: {},
  46. build: {
  47. css: [],
  48. js: [
  49. "https://cdn-novel.iycdm.com/static/vue.min.js",
  50. "https://cdn-novel.iycdm.com/static/vuex.min.js",
  51. "https://cdn-novel.iycdm.com/static/vue-router.min.js",
  52. "https://cdn-novel.iycdm.com/static/vue-lazyload.js",
  53. "https://cdn-novel.iycdm.com/static/axios.min.js",
  54. ],
  55. },
  56. };
  57. // * oss config
  58. const ossConfig = {
  59. buildPath: "/",
  60. region: "oss-cn-hangzhou",
  61. ak: "LTAIowrHAk6HHxb8",
  62. sk: "vhrLQEn1WW8WQphOPBfcDE8zwx7nel",
  63. bucket: "zhuishuyun",
  64. };
  65. const ossCDN = "https://cdn-novel.iycdm.com/";
  66. // * 打包后资源上传oss
  67. const uploadAssetsToOSS = (config) => {
  68. config
  69. .plugin("webpack-aliyun-oss-plugin")
  70. .use(require("webpack-aliyun-oss-plugin"), [
  71. {
  72. buildPath: ossConfig.buildPath,
  73. region: ossConfig.region,
  74. ak: ossConfig.ak,
  75. sk: ossConfig.sk,
  76. bucket: ossConfig.bucket,
  77. filter: function(assets) {
  78. return !/\.html$/.test(assets);
  79. },
  80. },
  81. ]);
  82. };
  83. // * 打包gzip
  84. const assetsGzip = (config) => {
  85. config
  86. .plugin("compression-webpack-plugin")
  87. .use(require("compression-webpack-plugin"), [
  88. {
  89. filename: "[path].gz[query]",
  90. algorithm: "gzip",
  91. test: /\.js$|\.html$|\.json$|\.css/,
  92. threshold: 10240, // 只有大小大于该值的资源会被处理 10240
  93. minRatio: 0.8, // 只有压缩率小于这个值的资源才会被处理
  94. deleteOriginalAssets: true, // 删除原文件
  95. },
  96. ]);
  97. };
  98. // * 代码压缩
  99. const codeUglify = (config) => {
  100. config
  101. .plugin("uglifyjs-webpack-plugin")
  102. .use(require("uglifyjs-webpack-plugin"), [
  103. {
  104. uglifyOptions: {
  105. //生产环境自动删除console
  106. compress: {
  107. drop_debugger: true,
  108. drop_console: false,
  109. pure_funcs: ["console.log"],
  110. },
  111. },
  112. sourceMap: false,
  113. parallel: true,
  114. },
  115. ]);
  116. };
  117. module.exports = {
  118. uploadAssetsToOSS,
  119. assetsGzip,
  120. codeUglify,
  121. externals,
  122. optimization,
  123. cdns,
  124. ossCDN,
  125. };