大屏加载速度优化--突破chrome 6个请求线程限制

5 篇文章 0 订阅

1. 问题

当大屏中的内容很多时,比如50个以上,整个页面呈现速度会慢很多,影响用户体验。
通过 chrome开发者工具可以看到,默认情况下,chrome仅开启6个请求线程,用于发起ajax请求。

2. 解决方案

改进的方式有:
(1)调整加载次序。让页面前面的内容先加载,后面的内容后加载。
(2)页面的框架先加载,组件内容再加载。如果页面的框架可以在1S内加载完毕,用户体验会好很多。
(3)突破chrome 6个线程的限制。

下面重点讲解如何突破chrome6个线程的限制。

3. 步骤

3.1. 原理

chrome对同一个域的并发请求数量限制为6。只要让请求处于不同域,就可以打破这个限制。
域由三个部分构成: 协议+主机名+端口,只要一个不同,域就不同。在下面的示例中,我们使用多个不同的端口。

3.2. 后端

文件:TestController .java。它定义了一个接口,这个接口的执行时间为1秒。

在这里插入图片描述

文件:TomcatConfig .java。它定义3个httpConnector,分别对应8080, 8081, 8082端口。


```java
import org.apache.catalina.connector.Connector;
import org.apache.coyote.AbstractProtocol;
import org.apache.coyote.ProtocolHandler;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class TomcatConfig {

    /**
     * @return
     */
    @Bean
    public ServletWebServerFactory httpServerFactory() {
        // http connector
        Connector connector1 = createHttpConnector(8080);
        Connector connector2 = createHttpConnector(8081);
        Connector connector3 = createHttpConnector(8082);
        // 注册额外的connector
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        tomcat.addAdditionalTomcatConnectors(connector1, connector2, connector3);
        return tomcat;
    }


    /**
     * 创建 http connector
     *
     * @return
     */
    private Connector createHttpConnector(int port) {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setPort(port);
        // 设置最大线程数
        ProtocolHandler handler = connector.getProtocolHandler();
        if (handler instanceof AbstractProtocol) {
            AbstractProtocol protocol = (AbstractProtocol) handler;
            // 运行controller代码的线程的最大数量
            protocol.setMaxThreads(200);
        }
        return connector;
    }
}

3.3. 前端

文件 index.html。使用axios模拟60个并发请求。函数axiosSwitchHost会随机地切换host。代码仅用于演示,生产中请自行封装。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
</body>
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js"></script>
<script>

    var urls = ['http://127.0.0.1:8080',
        'http://127.0.0.1:8081',
        'http://127.0.0.1:8082'
    ];

    /**
     *  切换 host
     */
    function axiosSwitchHost() {
        var index = Math.floor((Math.random() * urls.length));
        console.log(index)
        axios.defaults.baseURL = urls[index];
    }

    // 要ctrl + f5强制刷新
    // 可以看到,chrome总共开了大约3*6个线程来发起ajax请求
    for (let i = 0; i < 60; i++) {
        axiosSwitchHost()
        axios.get("/test1").then(function (result) {
            console.log(result.data)
        });
    }
</script>
</html>

3.4. 效果在这里插入图片描述

如上图所示,可以看到,并发的线程数多了很多,大约为16个。增加httpConnector的数量,可以进一步提升并发的数量。

针对大屏页面上有多个接口导致页面反应慢的情况,前端性能优化可以采取以下几个策略: 1. **数据聚合**[^1]: 合并不必要的接口请求。比如,如果某个视图需要展示的数据可以通过几个API共同获取,那么可以考虑合并这些请求,一次性从服务器获取所有相关的数据,避免频繁的网络通信。 ```javascript // 示例代码 const fetchData = async () => { const combinedData = await Promise.all([ axios.get('/api/data1'), axios.get('/api/data2') ]); // 处理合并后的数据 }; fetchData(); ``` 2. **延迟加载**: 对于不直接影响用户立即交互的内容,如滚动到底部才显示的部分,可以采用懒加载(Intersection Observer API)来延后加载。 3. **接口缓存**: 利用浏览器的缓存机制,对常用数据进行缓存,减少重复请求。 4. **预加载**: 使用`preload`或`prefetch`标签预加载部分内容,提高首次加载时用户的感知速度。 5. **优化DOM操作**: 避免过度的DOM操作,特别是批量插入或删除元素,因为这会触发重排和回流,影响性能。 6. **合理使用异步和同步**: 分清何时使用异步(async/await)何时使用同步(Promise.resolve),确保UI线程不受阻塞。 7. **监控和调整**: 使用性能分析工具(如Chrome DevTools)持续监控页面性能瓶颈,及时调整优化策略。 通过实施上述措施,可以显著改善大屏页面上的多接口导致的性能问题。记得定期评估和测试优化效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值