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属性,脚本就会异步加载。

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

ES6模块加载

也使用<script>标签,但是要加入type="module"属性。

<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 模块也允许内嵌在网页中,语法行为与加载外部脚本完全一致。

<script type="module">
  import utils from "./utils.js";

  // other code
</script>

ES6 模块与 CommonJS 模块的差异

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

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

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

由于 ES6 输入的模块变量,只是一个“符号连接”,所以这个变量是只读的,对它进行重新赋值会报错。

Node 加载(略)

猜你喜欢

转载自www.cnblogs.com/adhehe/p/9688029.html
今日推荐