使用ES模块的两种方式

无论是内部方式还是外部方式,带有 type="module" 属性的 <script> 标签会告诉浏览器相关代码应该作为模块执行,而不是作为普通的脚本执行。

无论是内部方式还是外部方式,一个 HTML 页面有多少个 type="module" 属性的 <script> 标签没有限制。

无论是内部方式还是外部方式,同一个模块无论在同一个 HTML 页面中被加载(导入)多少次,实际上只会被加载(导入)一次。

<!-- 假设这是index.html页面,模块moduleA在index.html页面只会被加载(导入)一次。 -->
<script type="module">
  import './moduleA.js';
</script>

<script type="module">
  import './moduleA.js';
</script>

<script type="module" src="./moduleA.js"></script>
<script type="module" src="./moduleA.js"></script>

1.内部(Internal)方式

往往用于单个网页。

<script type="module">
  //export语句
  //无法导出,因为<script>标签无为此模块命名的语法。
  export ...;
  export ... from '模块标识符';
  //import语句(静态导入)
  import ... from '模块标识符';
  import '模块标识符';
</script>
<script>
  //import运算符(动态导入)
  //注意:动态导入外围的<script>无需type="module"属性。
  import('模块标识符');
</script>

2.外部(External)方式

往往用于所有网页。

<script type="module" src="./module.js"></script>

3.importmap

<script type="importmap">
  //JSON对象
</script>

type="importmap" 属性的 <script> 元素(只支持内部方式)用于映射其它 <script> 元素(支持内部方式和外部方式)中 import 语句 和 import() 运算符中的模块标识符到对应的值。

注意:deferasync 属性不可以与 type="importmap" 属性同时声明。

注意:映射的时候跟属性名的顺序没有关系,如果有多个属性名可以映射,则使用最具体的属性名。

注意:有 type="importmap" 属性的 <script> 元素必须在有 import 语句 和 import() 运算符的 <script> 元素之前被处理,否则映射不到对应的值。

注意:同一个 HTML 页面中只有第一个有 type="importmap" 属性的 <script> 元素会被处理,任何后续的有 type="importmap" 属性的 <script> 元素都会被忽略。

//index.html(省略部分代码)
<!doctype html>
<html lang="en">
  <head>

    <script type="importmap">
      <!-- JSON对象 -->
      {
        "imports": {
          <!-- 属性值为解析以后实际的模块标识符 -->
          <!-- 情形1:属性名的末尾无正斜杠 -->
          "lodash": "/node_modules/lodash-es/lodash.js",
          "https://example.com/lodash.js": "/node_modules/lodash-es/lodash.js",
          <!-- 情形2:属性名和属性值的末尾都有正斜杠 -->
          "lodash/": "/node_modules/lodash-es/",
          "https://example.com/": "/node_modules/lodash-es/"
        }
      }
    </script>

    <script type="module" src="./main.js"></script>
  </head>
  <body>
  </body>
</html>
//main.js
//以下都映射到/node_modules/lodash-es/lodash.js

//情形1
import ... from "lodash";
import ... from "https://example.com/lodash.js";

//情形2
import ... from "lodash/lodash.js";
import ... from "https://example.com/lodash.js";

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/experience/javascriptexp/33926.html

(0)
huoxiaoqiang的头像huoxiaoqiang
上一篇 2024年1月4日 02:17
下一篇 2024年1月25日 02:27

相关推荐

  • Node.js代码的三种运行方式

    1.node -e或-p命令方式 2.node script.js文件方式 helloworld.js文件代码清单: 启动终端,使用 cd 命令,切换到存放 helloworld.js 文件的目录。执行以下命令: 3.node -i交互方式 node -i 可简写为 node。

    JavaScript经验 2023年2月23日
    08870
  • 开启JavaScript语言的严格模式

    要对一个脚本文件内的所有内容开启严格模式,只需要在脚本文件内的顶部添加 “use strict” 或 ‘use strict’ 即可。 要单独对一个函数体内的所有内容开启严格模式,只需要在函数体内的顶部添加 “use strict” 或 ‘use strict’ 即可。 注意:JavaScript 模块内的所有内容自动…

    JavaScript经验 2023年12月12日
    06570
  • JavaScript对象简谱(JavaScript Object Notation,JSON)详解

    1.结构(structure) 1.1对象(object) 对象(object)是“键/值”对的无序集合。 一个对象以左花括号 { 开始,然后以右花括号 } 结束。键必须使用双引号字符串,每个键后跟一个冒号 :  ,“键/值”对之间使用逗号 , 分隔。 1.2数组(array) 数组(array)是值的有序集合。 一个…

    JavaScript经验 2023年3月2日
    06020

发表回复

登录后才能评论