最近做的一个项目需要引入一个外部的第三方js脚本由于这是一个关于渲染3D建筑的脚本,所以体积比较大大概有2M,前端解决页面加载白屏完成也得要个好几秒网速慢嘚时候十几秒都有可能。
之前也遇到脚本前端解决页面加载白屏慢的问题但是没这么慢,所以这次就特别写个文章记录一下我的解决过程
首先上两张项目已完成的截图。
下图是通过第三方脚本渲染出来的3D建筑页面
下图是首页不需要用到第三方脚本
- 引入外部脚本太大,湔端解决页面加载白屏时间太长
- 首页用不到外部脚本需要先渲染出来
- 用到外部脚本的页面,要是脚本还没前端解决页面加载白屏好就点進去会报错
我一开始通过<script>标签直接引入到入口文件的头部如下
这样页面是可以正常前端解决页面加载白屏的,但是页面出来的很慢一開始会白屏一段时间等待这个js脚本前端解决页面加载白屏完成。虽然脚本体积大是事实但这用户体验肯定是可以优化的。
后来我又把这個脚本放到了页面底部也就是</body>标签下面。这样可以先让页面渲染出来再慢慢前端解决页面加载白屏这个庞大的脚本,于是首页是出来嘚很快但是从首页跳转到需要用到这个脚本的页面就会报错,如下
这个错误原因是这个页面需要用到window.DDEarth这个对象但是由于此时这个脚本還没有前端解决页面加载白屏完成,所以window下并没有这个对象所以就报错了。
于是我又想到等脚本前端解决页面加载白屏完成再执行相关方法这时就需要用到onload这个方法了,onload这个方法在脚本前端解决页面加载白屏完成的时候会执行我引入脚本的时候给它加了个id,方便以后通过dom找到代码如下:
// 脚本前端解决页面加载白屏完成执行前端解决页面加载白屏地图的操作
有了以上代码我跳转到PageTwo这个页面的时候,会等到DDEarth.js这个脚本前端解决页面加载白屏完成再执行前端解决页面加载白屏建筑地图的操作,这样就不会报错了
但是这又有一个问题,就昰如果我跳转到PageTwo的之前DDEarth.js已经前端解决页面加载白屏完成了,onload这个事件在PageTwo这个页面中就不生效了loadEarthMap这个方法自然也就不会执行了。
这个时候需要加一个判断完整代码如下:
总结一下我以上解决问题的步骤
在入口文件的底部引入第三方脚本,并给它加个id当然也可以放在<head>里,但是需要额外加上html5新增的 async 这个属性这样脚本才能异步前端解决页面加载白屏。
在需要用到这个脚本的页面先判断脚本有没有前端解決页面加载白屏完成(我这里是直接判断window.DDEarth对象是否为空)。如果已经前端解决页面加载白屏完成就直接执行相关操作;如果没有,先通過document.getElementById找到那个脚本然后监听脚本的onload事件,再做相关操作
什么情况可以用我以上思路?
- 引入的第三方脚本较大前端解决页面加载白屏所需时间较长
- 页面按需前端解决页面加载白屏,整个项目只有其中某几个页面需要用到引入的第三方脚本
- 第三方脚本没前端解决页面加载白屏完就渲染页面导致的页面报错
以上就是本文的全部内容希望对大家的学习有所帮助,也希望大家多多支持脚本之家