File tree 1 file changed +6
-0
lines changed
2-ui/5-loading/02-script-async-defer
1 file changed +6
-0
lines changed Original file line number Diff line number Diff line change
1
+
1
2
# Script 标签属性:async, defer
2
3
3
4
现代脚本中,脚本往往比 HTML 更 “重”:它们的大小通常更大,处理时间也更长。
@@ -88,6 +89,7 @@ Defer 脚本保持他们的相对顺序,就像常规脚本一样。
88
89
` defer ` 属性会忽略没有 ` src ` 属性的 ` <script> ` 脚本。
89
90
```
90
91
92
+
91
93
## async
92
94
93
95
`async` 属性意味着脚本是完全独立的:
@@ -98,6 +100,7 @@ Defer 脚本保持他们的相对顺序,就像常规脚本一样。
98
100
- `DOMContentLoaded` 也可能发生在异步脚本之后(此时异步脚本可能很短或者是从 HTTP 缓存中加载的)
99
101
- 其他脚本不会等待 `async` 脚本加载完成,同样 `async` 脚本也不会等待其他脚本。
100
102
103
+
101
104
因此,如果我们有几个 `async` 脚本,它们可能按任意次序执行,总之是先加载完成的就先运行:
102
105
103
106
```html run height=100
@@ -124,6 +127,7 @@ Defer 脚本保持他们的相对顺序,就像常规脚本一样。
124
127
<script async src =" https://google-analytics.com/analytics.js" ></script >
125
128
```
126
129
130
+
127
131
## 动态脚本(Dynamic scripts)
128
132
129
133
我们也可以使用 JavaScript 动态地添加脚本:
@@ -157,6 +161,7 @@ document.body.append(script);
157
161
158
162
例如,这里我们添加了两个脚本。在没有设置 ` script.async=false ` 时,它们执行顺序为加载优先顺序(即 ` small.js ` 可能先运行)。但是当设置了 ` script.async=false ` 后,脚本执行顺序就是它在文档中的顺序:
159
163
164
+
160
165
``` js run
161
166
function loadScript (src ) {
162
167
let script = document .createElement (' script' );
@@ -170,6 +175,7 @@ loadScript("/article/script-async-defer/long.js");
170
175
loadScript (" /article/script-async-defer/small.js" );
171
176
```
172
177
178
+
173
179
## 总结
174
180
175
181
` async ` 和 ` defer ` 属性有一个共同点:它们都不会阻塞页面的渲染。因此,用户可以立即阅读并了解页面内容。
You can’t perform that action at this time.
0 commit comments