Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

antd 引入一个Spin组件,打包一些没有用到的文件,导致文件体积过大 #352

Closed
BernardZhang opened this issue Sep 13, 2019 · 9 comments

Comments

@BernardZhang
Copy link

BernardZhang commented Sep 13, 2019

  1. 使用babel-plugin-import 配置打包,组件中只引入了Spin组件,引入代码如下:
    import {Spin} from 'antd';

  2. .babelrc、 webpack配置如下:

{
    "presets": ["env"],
    "plugins": [
        "transform-object-rest-spread",
        "transform-react-jsx",
        [
            "import", 
            { "libraryName": "antd", "style": true }
        ]
    ]
}
![image](https://user-images.githubusercontent.com/3273449/64872443-ce2db680-d679-11e9-8cc0-36f656afbae3.png)

  1. 打包的buddle有300多K, 观察sourcemap发现moment以及一些不必要的库文件被打包进来了

image
image

  1. webpack打包分析图
    image

期望结果是:只打包Spin组件相关的文件,而不要打包无关的文件。

@BernardZhang BernardZhang changed the title antd 打包时打了一些没有用到的lib,导致文件体积过大问题 antd 引入一个Spin组件,打包一些没有用到的文件,导致文件体积过大 Sep 13, 2019
@afc163
Copy link
Contributor

afc163 commented Sep 13, 2019

可能需要把相关代码从 ConfigProvider 里独立出来:

https://github.com/ant-design/ant-design/blob/56abebfb3c7adac31bd27ae0be8f831a6ae0a319/components/spin/index.tsx#L6

@zombieJ

@afc163
Copy link
Contributor

afc163 commented Sep 13, 2019

楼主可以试试 "libraryDirectory": "es"

@BernardZhang
Copy link
Author

楼主可以试试 "libraryDirectory": "es"

@afc163
试过了依然会把moment等模块打包进去,同时试了直接手动引入指定模块也同样存在该问题:
import Spin from 'antd/lib/Spin';

@afc163
Copy link
Contributor

afc163 commented Sep 13, 2019

链路现在是这样的 spin => ConfigProvider => moment,确实有问题。

看起来 tree-shaking 也没有生效。

@BernardZhang
Copy link
Author

链路现在是这样的 spin => ConfigProvider => moment,确实有问题。

看起来 tree-shaking 也没有生效。

嗯 试了简单的Button组件也是会把moment打包进去,貌似是moment都必然被打包进去了,而且moment这个库体积很大,目前有没有方案来避免这种情况呢?

@zombieJ
Copy link
Contributor

zombieJ commented Sep 17, 2019

ConfigProvider 合并 LocaleProvider 后,是否有用到 locale 是运行时的,依赖还是算上 LocaleProvider。感觉如果不剥离 moment 没什么好办法。

@afc163
Copy link
Contributor

afc163 commented Sep 17, 2019

分开试试?

import { ConfigConsumer } from '../config-provider';
import { ConfigConsumerWithLocale } from '../config-provider/withLocale';
import { ConfigConsumerWithLocaleAndMoment } from '../config-provider/withLocaleAndMoment';

@afc163
Copy link
Contributor

afc163 commented Oct 8, 2019

@afc163 afc163 closed this as completed Oct 8, 2019
@janlukasschroeder
Copy link

janlukasschroeder commented Nov 5, 2019

I reduced my bundle size by 500KB by editing config-override.js like so:

config-override.js

const { override, fixBabelImports } = require('customize-cra');
const path = require('path');

module.exports = override(
  fixBabelImports('import', {
    libraryName: 'antd',
    libraryDirectory: 'es',
    style: 'css'
  }),
  // used to minimise bundle size by 500KB
  function(config, env) {
    const alias = config.resolve.alias || {};
    alias['@ant-design/icons/lib/dist$'] = path.resolve(__dirname, './src/icons.js');
    config.resolve.alias = alias;
    return config;
  }
);

./src/icons.js

/**
 * List all antd icons you want to use in your source code
 */
export {
  default as SearchOutline
} from '@ant-design/icons/lib/outline/SearchOutline';

export {
  default as CloseOutline
} from '@ant-design/icons/lib/outline/CloseOutline';

export {
  default as QuestionCircleOutline
} from '@ant-design/icons/lib/outline/QuestionCircleOutline';

export {
  default as PlayCircleOutline
} from '@ant-design/icons/lib/outline/PlayCircleOutline';

export {
  default as PauseCircleOutline
} from '@ant-design/icons/lib/outline/PauseCircleOutline';

export {
  default as LoadingOutline
} from '@ant-design/icons/lib/outline/LoadingOutline';

Before

Screen Shot 2019-11-05 at 2 56 54 pm

After

Screen Shot 2019-11-05 at 2 56 48 pm

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants