<!-- 页面内嵌的脚本 --> <script type="application/javascript"> // module code </script> <!-- 外部脚本 --> <script type="application/javascript" src="path/to/myModule.js"> </script> //浏览器脚本的默认语言是 JavaScript,type="application/javascript"能够省略。
<script>
标签打开defer
或async
属性,脚本就会异步加载。javascript
defer:渲染完再执行,有多个defer脚本时,按页面出现的顺序加载
async:下载完就执行,哪一个加载完成了就执行哪一个模块
<script src="path/to/myModule.js" defer></script> <script src="path/to/myModule.js" async></script>
也使用<script>
标签,可是要加入type="module"
属性。java
<script type="module" src="./foo.js"></script>
浏览器对于带有type="module"
的<script>
,都是异步加载。等到整个页面渲染完,再执行模块脚本,等同于打开了<script>
标签的defer
属性。浏览器
<script type="module" src="./foo.js"></script> <!-- 等同于 --> <script type="module" src="./foo.js" defer></script>
ES6 模块也容许内嵌在网页中,语法行为与加载外部脚本彻底一致。app
<script type="module"> import utils from "./utils.js"; // other code </script>
CommonJS 模块输出的是值的拷贝,也就是说,一旦输出一个值,模块内部的变化就影响不到这个值。除非写成一个函数,才能获得内部变更后的值。异步
ES6 模块遇到模块加载命令import
,就会生成一个只读引用。等到脚本真正执行时,再根据这个只读引用,到被加载的那个模块里面去取值。async
因为 ES6 输入的模块变量,只是一个“符号链接”,因此这个变量是只读的,对它进行从新赋值会报错。函数