前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >预加载之——js 文件如何实现只加载不执行

预加载之——js 文件如何实现只加载不执行

作者头像
前端知知
发布2022-09-29 19:23:33
5.8K0
发布2022-09-29 19:23:33
举报
文章被收录于专栏:前端知知前端知知

性能优化很常见的一个方式是提前加载文件,本文讨论如何在其他依赖未加载情况下提前加载一个.js文件。

1.导出一个函数

如果使用<script> 加载一个js 文件,如果加载的js 是一个自执行文件,那么会出现错误。

代码语言:javascript
复制
// test.js
(function test() {
    bluer();
    console.log(1)
})();

// test.html
<body>
    <script src="/test.js"></script>
</body>

使用<script>标签会进行加载和执行,由于没有加载依赖函数bluer,控制台会出现以下问题:

代码语言:javascript
复制
test.js:2 Uncaught ReferenceError: bluer is not defined

如果要正确加载,可以在加载js 时是一个函数

代码语言:javascript
复制
//test2.js
function test() {
    bluer();
    console.log(1)
}

像这样改造之后确实是可以在提前在任何阶段加载js,但是改造成本比较大。

2.使用xhr 或者fetch 加载

可以使用xhr 或者 fetch 来获取js 文件,可以得到js 字符串,在需要获取的时候在使用eval方法进行调用,以下以fetch 为例,具体调用如下:

代码语言:javascript
复制
fetch('/test.js').then(response => {
 return response.text();
}).then(data => {
 console.log(data);
})

但是一般来说.js 是cdn, 可能出现域名不同的情况,会有跨域问题,而且eval执行也会存在某些问题。

3. 使用preload 加载资源

preload 会强制浏览器立即获取资源,并且该请求具有较高的优先级。并且是在不阻塞 document 的 onload 事件的情况下请求资源。具体是使用。rel属性常用如下:

  • stylesheet 引入样式表
  • preload 预先加载当前页面资源
  • prefetch利用浏览器的空闲时间加载页面将来可能用到的资源
  • dns-prefetch 提前对DNS预获取
代码语言:javascript
复制
<link rel="preload" as="script" href="test.js">
<script>
    function execScript(url){
        const script = document.createElement("script");
        script.src = url;
        document.body.appendChild(script);
    }
    //某个时机执行,已加载依赖bluer函数
    function bluer() {
        //do something;
    }
    setTimeout(function(){
        
        execScript("test.js")
    },1000)
</script>

4. 使用 Image

当preload 方式发现不兼容(caniuse 查询)时,可以使用Image来实现,Image对象的src 属性可以设置资源url,通过这个方式我们可以提前拉取资源。

代码语言:javascript
复制
 <script>
    let img = new Image();
    img.src = 'test.js'
    function execScript(url){
        const script = document.createElement("script");
        script.src = url;
        document.body.appendChild(script);
    }
    //某个时机执行,已加载依赖bluer函数
    function bluer() {
        //do something;
    }
    setTimeout(function(){
        
        execScript("test.js")
    },1000)
</script>

参考资料

[1]https://www.w3.org/TR/preload/#x2.link-type-preload

[2]https://blog.fundebug.com/2019/04/11/understand-preload-and-prefetch/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-08-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端知知 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.导出一个函数
  • 2.使用xhr 或者fetch 加载
  • 3. 使用preload 加载资源
  • 4. 使用 Image
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档