ES6知识点整理之----Module----加载实现

浏览器加载

传统方法

<!-- 页面内嵌的脚本 -->
<script type="application/javascript">
  // module code
</script>

<!-- 外部脚本 -->
<script type="application/javascript" src="path/to/myModule.js">
</script>

//浏览器脚本的默认语言是 JavaScript,type="application/javascript"能够省略。

<script>标签打开deferasync属性,脚本就会异步加载。javascript

  • defer:渲染完再执行,有多个defer脚本时,按页面出现的顺序加载
  • async:下载完就执行,哪一个加载完成了就执行哪一个模块
<script src="path/to/myModule.js" defer></script>
<script src="path/to/myModule.js" async></script>

ES6模块加载

也使用<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>

ES6 模块与 CommonJS 模块的差别

  • CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用。
  • CommonJS 模块是运行时加载,ES6 模块是编译时输出接口。

CommonJS 模块输出的是值的拷贝,也就是说,一旦输出一个值,模块内部的变化就影响不到这个值。除非写成一个函数,才能获得内部变更后的值。异步

ES6 模块遇到模块加载命令import,就会生成一个只读引用。等到脚本真正执行时,再根据这个只读引用,到被加载的那个模块里面去取值。async

因为 ES6 输入的模块变量,只是一个“符号链接”,因此这个变量是只读的,对它进行从新赋值会报错。函数

Node 加载(略)

相关文章
相关标签/搜索