12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- import path from 'path';
- import * as IWebpackChainConfig from 'webpack-chain';
- function getModulePackageName(module: { context: string }) {
- 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: string | null = moduleDirName;
- // handle tree shaking
- if (packageName && packageName.match('^_')) {
- // eslint-disable-next-line prefer-destructuring
- packageName = packageName.match(/^_(@?[^@]+)/)![1];
- }
- return packageName;
- }
- const webpackPlugin = (config: IWebpackChainConfig) => {
- // optimize chunks
- config.optimization
- // share the same chunks across different modules
- .runtimeChunk(false)
- .splitChunks({
- chunks: 'async',
- name: 'vendors',
- maxInitialRequests: Infinity,
- minSize: 30000,
- minChunks: 3,
- automaticNameDelimiter: '.',
- cacheGroups: {
- vendors: {
- test: (module: { context: string }) => {
- const packageName = getModulePackageName(module) || '';
- if (packageName) {
- return [
- 'bizcharts',
- 'gg-editor',
- 'g6',
- '@antv',
- 'l7',
- 'gg-editor-core',
- 'bizcharts-plugin-slider',
- ].includes(packageName);
- }
- return false;
- },
- name(module: { context: string }) {
- const packageName = getModulePackageName(module);
- if (packageName) {
- if (['bizcharts', '@antv_data-set'].indexOf(packageName) >= 0) {
- return 'viz'; // visualization package
- }
- }
- return 'misc';
- },
- },
- },
- });
- };
- export default webpackPlugin;
|