前端性能优化实践

使用create-react-app创建的项目,使用react-app-rewired customize-cra 来进行webpack配置重写

完整webpack配置

config-overrides.js

const path = require('path')
const CompressionWebpackPlugin = require('compression-webpack-plugin');
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
const { override, addDecoratorsLegacy } = require('customize-cra')

function resolve(dir) {
    return path.join(__dirname, dir)
}

const customize = () => (config) => {
    config.resolve.alias['@'] = resolve('src')
    config.resolve.alias['#'] = resolve('src/IMcomponents/')
    config.resolve.alias['%'] = resolve('src/assets/')
    const env = process.env.REACT_APP_ENV
    const isOPenAnalyzer = process.env.REACT_APP_OPEN_ANALYZER
    if (env === 'prod') {
        config.devtool = false;
        config.externals = {
            'react': 'React',
            // 'react-dom': 'ReactDOM',
            // 'react-router-dom': 'ReactRouterDOM'
        }
        // 添加js打包gzip配置
        config.plugins.push(
            new CompressionWebpackPlugin({
                test: /\.(js|css|html|svg)$/,
                threshold: 1024,
                minRatio: 0.8, 
                deleteOriginalAssets: true,
            }),
        )
        config.optimization.splitChunks = {
            chunks: "all",
            minSize: 30000, //小于这个限制的会打包进Main.js
            cacheGroups: {
                vendors: {
                    test: /[\\/]node_modules[\\/]/,
                    priority: -10, // 优先级权重,层级 相当于z-index。 谁值越大权会按照谁的规则打包
                    name: "vendors",
                },
            },
        }
    }else {
        config.devtool= "source-map"
        if(isOPenAnalyzer) {
            config.plugins.push( new BundleAnalyzerPlugin())
        }
       
    }
    return config
};
module.exports = override(addDecoratorsLegacy(), customize())

一、环境区分

文档

新建.env .env.development .env.production 里面的参数 直接可以使用process.env. 获取的到

二、开启gzip

  // 添加js打包gzip配置
        config.plugins.push(
            new CompressionWebpackPlugin({
                test: /\.(js|css|html|svg)$/,
                threshold: 1024,
                minRatio: 0.8, 
                deleteOriginalAssets: true,
            }),
        )

这里有坑需要配置nginx 开启gzip

添加 gzip_static on  开启静态文件压缩

        gzip on;
        gzip_static on; # 开启静态文件压缩
        gzip_min_length  1k;
        gzip_buffers     4 16k;
        gzip_http_version 1.1;
        gzip_comp_level 2;
        gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
        gzip_vary on;
        gzip_proxied   expired no-cache no-store private auth;
        gzip_disable   "MSIE [1-6]\.";

三、设置cdn

  config.externals = {
       'react': 'React',
       'react-dom': 'ReactDOM',
       'react-router-dom': 'ReactRouterDOM'
  }

index.html 引入配置全局cdn

不知道对应cdn的名字的 可以看浏览器window对象 里面有

cdnjs - The #1 free and open source CDN built to make life easier for developers

BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务

四:配置splitChunks

  config.optimization.splitChunks = {
            chunks: "all",
            minSize: 30000, //小于这个限制的会打包进Main.js
            cacheGroups: {
                vendors: {
                    test: /[\\/]node_modules[\\/]/,
                    priority: -10, // 优先级权重,层级 相当于z-index。 谁值越大权会按照谁的规则打包
                    name: "vendors",
                },
            },
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥肥呀呀呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值