Browse Source

Optimize asset chunking (#3650)

* Optimize asset chunking

* fix issues

* don't apply chunking on on non async assets
Zhongjie Wu 6 years atrás
parent
commit
cb5a083410
2 changed files with 47 additions and 4 deletions
  1. 0 4
      config/config.js
  2. 47 0
      config/plugin.config.js

+ 0 - 4
config/config.js

@@ -75,10 +75,6 @@ export default {
   theme: {
     'primary-color': primaryColor,
   },
-  externals: {
-    '@antv/data-set': 'DataSet',
-    bizcharts: 'BizCharts',
-  },
   // proxy: {
   //   '/server/api/': {
   //     target: 'https://preview.pro.ant.design/',

+ 47 - 0
config/plugin.config.js

@@ -4,6 +4,25 @@ import MergeLessPlugin from 'antd-pro-merge-less';
 import AntDesignThemePlugin from 'antd-theme-webpack-plugin';
 import path from 'path';
 
+function getModulePackageName(module) {
+  if (!module.context) return null;
+
+  const nodeModulesPath = path.join(__dirname, '../node_modules/');
+  if (module.context.substring(0, nodeModulesPath.length) !== nodeModulesPath) {
+    return null;
+  }
+
+  const moduleRelativePath = module.context.substring(nodeModulesPath.length);
+  const [moduleDirName] = moduleRelativePath.split(path.sep);
+  let packageName = moduleDirName;
+  // handle tree shaking
+  if (packageName.match('^_')) {
+    // eslint-disable-next-line prefer-destructuring
+    packageName = packageName.match(/^_(@?[^@]+)/)[1];
+  }
+  return packageName;
+}
+
 export default config => {
   // pro 和 开发环境再添加这个插件
   if (process.env.APP_TYPE === 'site' || process.env.NODE_ENV !== 'production') {
@@ -30,4 +49,32 @@ export default config => {
       },
     ]);
   }
+  // optimize chunks
+  config.optimization
+    .runtimeChunk(false) // share the same chunks across different modules
+    .splitChunks({
+      chunks: 'async',
+      name: 'vendors',
+      maxInitialRequests: Infinity,
+      minSize: 0,
+      cacheGroups: {
+        vendors: {
+          test: module => {
+            const packageName = getModulePackageName(module);
+            if (packageName) {
+              return ['bizcharts', '@antv_data-set'].indexOf(packageName) >= 0;
+            }
+            return false;
+          },
+          name(module) {
+            const packageName = getModulePackageName(module);
+
+            if (['bizcharts', '@antv_data-set'].indexOf(packageName) >= 0) {
+              return 'viz'; // visualization package
+            }
+            return 'misc';
+          },
+        },
+      },
+    });
 };