prod.config.js 3.1 KB

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