属性defer & async
defer属性可以让JavaScript文件在异步加载的同时保证顺序
defer属性会推迟对DOMContentLoaded事件的执行,直到所有设置了defer属性的JavaScript文件都加载完毕。
属性type
内联的<script>元素有一个特性,就是如果定义的type类型不标准,那么此时<script>元素里面的文本内容就会按照普通的文本字符串进行渲染,而不再是JavaScript代码。
属性值module
设置了type="module"的<script>元素是异步加载与执行的,异步但保证顺序,和defer属性的表现类似
属性值importmap
type="importmap"可以被看成JavaScript模块化加载的进阶用法。
Import Maps的设置必须在所有模块JavaScript的前面进行。
当导入 JavaScript 模块时,import 语句和 import() 运算符都有一个“模块标识符”,其指示要导入的模块。浏览器必须能够将此标识符解析为绝对路径,才能导入模块。
使用 scopes 键提供映射,仅当导入模块的脚本包含特定的 URL 路径时才使用。 仅当导入模块的脚本包含一个指定的 URL 路径时,你才可以使用 scopes 键去提供映射。这允许根据正在导入的代码使用不同版本的模块。
<script type="importmap">
// 定义导入的 JSON 对象
</script>
范例
使用的文件说明:
- a.js
- lib/b.js
<!DOCTYPE html>
<html lang="en">
<body>
<script type="importmap">
{
"imports": {
"vue": "https://unpkg.com/vue@3/dist/vue.esm-browser.js",
"math": "./a.js"
},
"scopes": {
"/lib/": {
"vue": "https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.esm.browser.js"
}
}
}
</script>
<script type="module">
import { add } from 'math';
import { version } from './lib/b.js';
console.log('add result: ', add(3, 3)); // add result: 6
console.log('version 2: ', version); // version 2: 2.7.16
</script>
<script type="module">
import { version } from 'vue';
console.log('version 3: ', version); // version 3: 3.5.13
</script>
</body>
</html>
参考
- 书籍:HTML并不简单
- MDN: developer.mozilla.org/zh-CN/docs/…