1. import { resolve } from 'path'
    2. const CompressionPlugin = require('compression-webpack-plugin');
    3. const productionGzipExtensions = /\.(js|css|json|txt|html|ico|svg)(\?.*)?$/i;
    4. const fs = require('fs')
    5. const path = require('path')
    6. const lessToJs = require('less-vars-to-js')
    7. const IS_PROD = process.env.NODE_ENV !== 'development' // 是否为生产环境
    8. export default {
    9. // 用户配置 sourcemap 类型。
    10. // 常见的可选类型有:
    11. // eval,最快的类型,但不支持低版本浏览器,如果编译慢,可以试试
    12. // source-map,最慢最全的类型
    13. devtool: IS_PROD ? false : 'eval',
    14. hash: true,
    15. ignoreMomentLocale: true, // 打包的时候忽略moment的语种,未忽略前600k+
    16. nodeModulesTransform: { // 编译不编译nodeModules
    17. type: 'none',
    18. exclude: [],
    19. },
    20. title: '中台系统', // 系统名称
    21. antd: {}, // 启用UMI自带的antd
    22. // 页面head中的属性设置,例如:不缓存
    23. metas: [
    24. {
    25. httpEquiv: 'Cache-Control',
    26. content: 'no-cache',
    27. },
    28. {
    29. httpEquiv: 'Pragma',
    30. content: 'no-cache',
    31. },
    32. {
    33. httpEquiv: 'google', // 禁止浏览器翻译,多语言系统,如果中文翻译为简体会有问题
    34. content: 'notranslate',
    35. }
    36. ],
    37. // 是否启用按需加载,即是否把构建产物进行拆分,在需要的时候下载额外的 JS 再执行。
    38. dynamicImport: {},
    39. // 系统主题色,/themes/default.less中可以自定义
    40. theme: lessToJs(
    41. fs.readFileSync(path.join(__dirname, './src/themes/default.less'), 'utf8')
    42. ),
    43. // 请求代理
    44. proxy: {
    45. '/api': {
    46. target: 'http://110..', // develop
    47. changeOrigin: true,
    48. pathRewrite: {
    49. '^/api': '',
    50. },
    51. },
    52. },
    53. // 配置别名,对引用路径进行映射。
    54. alias: {
    55. //使用方法 import { DpLoading } from 'components'
    56. components: resolve(__dirname, './src/components'),
    57. },
    58. // 配置额外的 babel 插件集。
    59. extraBabelPresets: ['@lingui/babel-preset-react'],
    60. // 配置额外的 babel 插件。
    61. extraBabelPlugins: [
    62. [
    63. 'import', // 引入lodash
    64. {
    65. libraryName: 'lodash',
    66. libraryDirectory: '',
    67. camel2DashComponentName: false,
    68. },
    69. 'lodash',
    70. ],
    71. IS_PROD ? 'transform-remove-console' : '' // 生产关闭打印
    72. ],
    73. // 设置模块可以不被打包,通过 <script> 或其他方式引入,通常需要和 scripts 或 headScripts 配置同时使用。
    74. externals: {
    75. 'react': 'window.React',
    76. 'react-dom': 'window.ReactDOM',
    77. },
    78. scripts: process.env.NODE_ENV === 'development' ? [
    79. 'https://gw.alipayobjects.com/os/lib/react/16.13.1/umd/react.development.js',
    80. 'https://gw.alipayobjects.com/os/lib/react-dom/16.13.1/umd/react-dom.development.js',
    81. ] : [
    82. 'https://gw.alipayobjects.com/os/lib/react/16.13.1/umd/react.production.min.js',
    83. 'https://gw.alipayobjects.com/os/lib/react-dom/16.13.1/umd/react-dom.production.min.js',
    84. ],
    85. // 默认是 ['umi'],umi.js 之前加载 vendors.js。
    86. chunks: ['vendors', 'umi'],
    87. //API 修改 webpack 配置
    88. chainWebpack: function(config, { webpack }) {
    89. config.merge({
    90. optimization: {
    91. splitChunks: {
    92. minSize: 30000,
    93. maxSize: 0,
    94. minChunks: 1,
    95. maxAsyncRequests: 5,
    96. maxInitialRequests: 3,
    97. automaticNameDelimiter: '~',
    98. cacheGroups: {
    99. react: {
    100. name: 'react',
    101. priority: 20,
    102. test: /[\\/]node_modules[\\/](react|react-dom|react-dom-router|react-dnd|react-adsense|react-countup|react-dnd-html5-backend|react-helmet|react-perfect-scrollbar|react-scripts|react-sortable-hoc|lodash|lodash-decorators|redux-saga|re-select|dva|moment)[\\/]/,
    103. },
    104. antd: {
    105. name: 'antd',
    106. priority: 20,
    107. test: /[\\/]node_modules[\\/](antd|@ant-design\/icons|@ant-design\/compatible)[\\/]/,
    108. },
    109. draftjs: {
    110. name: 'draftjs',
    111. priority: 20,
    112. test: /[\\/]node_modules[\\/](draftjs-to-html|draftjs-to-markdown)[\\/]/,
    113. },
    114. vendor: {
    115. name: 'vendors',
    116. test({ resource }) {
    117. return /[\\/]node_modules[\\/]/.test(resource);
    118. },
    119. priority: 10,
    120. },
    121. async: {
    122. chunks: 'async',
    123. minChunks: 2,
    124. name: 'async',
    125. maxInitialRequests: 1,
    126. minSize: 0,
    127. priority: 5,
    128. reuseExistingChunk: true,
    129. },
    130. default: {
    131. minChunks: 2,
    132. priority: -20,
    133. reuseExistingChunk: true
    134. }
    135. }
    136. }
    137. }
    138. })
    139. // 开启前端Gzip压缩,在本地不用压缩
    140. if (IS_PROD) {
    141. config.plugin('compression-webpack-plugin').use(CompressionPlugin, [{
    142. filename: '[path][base].gz',
    143. algorithm: 'gzip',
    144. minRatio: 0.8,
    145. test: productionGzipExtensions, //匹配文件名
    146. threshold: 10240, //对超过10k的数据压缩
    147. deleteOriginalAssets: false, //是否删除源文件
    148. }]);
    149. }
    150. },
    151. // 补丁很多的话会导致编译加载很慢 ---- 生产需要关闭,否则可能导致某些浏览器加载有问题
    152. targets: { // 减少补丁
    153. chrome: 79,
    154. firefox: false,
    155. safari: false,
    156. edge: false,
    157. ios: false,
    158. },
    159. // 开启esbuild压缩器,提高编译速度
    160. esbuild: {},
    161. // 开启analyze模式,用于分析,模块的打包大小等,命令行运行:yarn analyze
    162. analyze: {
    163. analyzerMode: 'server',
    164. analyzerPort: 8000,
    165. openAnalyzer: true,
    166. // generate stats file while ANALYZE_DUMP exist
    167. generateStatsFile: false,
    168. statsFilename: 'stats.json',
    169. logLevel: 'info',
    170. defaultSizes: 'gzip', // stat // gzip
    171. }
    172. }