javascript - GTM 真的异步加载所有标签吗?
问题描述
谷歌标签管理器的一大好处和功能来自他们的网站:
异步触发代码,因此它们彼此独立加载,不会减慢您的网页速度。
考虑这种类型的同步标签用法:
<script type="text/javascript" src="www.example.com/third-party-tag.js"></script>
<script type="text/javascript">
//run some function from third-party-tag.js
</script>
外部js必须同步加载,否则第二个脚本通常会失败。如果您将其直接放入页面 HTML(无 GTM)中,则 js 会同步加载,并且第二个脚本可以工作。
如果您将两个脚本标签都添加到 GTM 中的一个自定义 HTML 标签中,它仍然可以工作。我可以看到没有添加任何“异步”属性。这怎么可能...
- 这是一个简单而明显的答案:谷歌标签管理器没有像它声称的那样异步加载外部 js 脚本?
- 我是否误解了 GTM 的说法是什么意思?例如,自定义 HTML 片段(标签)的检索和准备是异步的,但是一旦将 HTML 添加到 DOM,所有常规规则都适用于这些标签。
感谢您的任何建议!ps 将代码段重构为“更好”的方法不在问题的范围内。
解决方案
需要注意的是,仅仅因为脚本是异步加载的,它仍然会阻塞主线程。所有 async 所做的只是指示浏览器在下载脚本时不阻止下载其他请求。这里有一个很好的解释,
https://www.digitalocean.com/community/tutorials/html-defer-async
使用异步,文件被异步下载,然后在下载后立即执行。
使用 defer,文件被异步下载,但仅在文档解析完成时执行。
如果可能,我更喜欢“推迟”脚本。
推荐阅读
- node.js - 使用 Node.JS 加载 .ejs 文件失败
- mysql - 访问 Google Cloud SQL 中的 mysql 目录
- ubuntu-16.04 - 如何在 Ubuntu 中创建单独的 X11 屏幕
- ios - 如何将 sizeForItemAt 放在后台线程上?
- java - 是否可以从我的应用程序中阻止电话?手机是否有一些可以访问的 ID?
- node.js - 如何使用按钮触发 HTTP 请求?
- cron - Crontab:我做错了什么?
- protocol-buffers - C++ protobuf 使用的内存比保存消息所需的内存多得多
- ios - 改进两个数组 Swift 的比较
- javascript - 来自 zone.js 的 Angular 6 未捕获异常