当前位置: 首页 > news >正文

WHAT - script type=“module“

文章目录

  • 一、基本用法
  • 二、核心特性详解
    • 1. 支持 import / export
    • 2. 模块是默认严格模式(strict mode)
    • 3. 模块代码是作用域隔离的
    • 4. 模块只加载一次(即使被多次引用)
    • 5. 模块通过 CORS 加载
    • 6. 模块加载是异步的
  • 三、与默认 script 不同点对比
  • 四、模块加载方式
    • 1. 本地模块
    • 2. CDN 方式
  • 五、注意事项
  • 六、浏览器支持

在 WHAT - script 加载(含 async、defer、preload 和 prefetch 区别) 中我们详细介绍过有关 script 加载的内容,其中提到 es module 加载。

<script type="module"> 是 HTML 中用来加载 JavaScript ES Module(ESM) 的一种方式。它与传统的 <script> 标签不同,具有模块化、作用域隔离、支持 import/export 等特性。

一、基本用法

<script type="module">import { sayHi } from './greetings.js';sayHi('world');
</script>

或者:

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

二、核心特性详解

1. 支持 import / export

ES Module 语法天生支持模块化,使用 import 引入模块,export 导出内容。

// greetings.js
export function sayHi(name) {console.log(`Hi, ${name}!`);
}
// main.js
import { sayHi } from './greetings.js';
sayHi('ChatGPT');

2. 模块是默认严格模式(strict mode)

所有模块文件自动以 use strict 模式执行,不需要显式声明。

3. 模块代码是作用域隔离的

不像普通 <script>,模块不会污染全局变量:

<script>var foo = 123; // 全局变量
</script><script type="module">var foo = 456; // 局部模块作用域,互不影响
</script>

4. 模块只加载一次(即使被多次引用)

浏览器会缓存模块,不会重复执行。

// a.js
console.log('Module A loaded');
export const a = 1;

即使多次 import './a.js',只执行一次。

5. 模块通过 CORS 加载

模块默认使用 CORS(跨源资源共享) 策略。跨域模块必须正确设置 Access-Control-Allow-Origin,否则加载失败。

6. 模块加载是异步的

模块在解析依赖后会异步加载,因此不会阻塞页面解析。

三、与默认 script 不同点对比

特性普通 <script><script type="module">
是否支持模块系统❌ 不支持✅ 支持
是否默认严格模式❌ 否✅ 是
是否作用域隔离❌ 共享全局作用域✅ 独立作用域
是否可使用 import/export❌ 否✅ 是
是否异步加载❌ 阻塞(可加 defer/async)✅ 天生异步加载
是否重复执行✅ 每次 <script> 执行✅ 只执行一次,后续复用

四、模块加载方式

1. 本地模块

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

注意路径需要以 .// 开头,不能省略(不能直接写 main.js)。

2. CDN 方式

<script type="module">import _ from 'https://cdn.jsdelivr.net/npm/lodash-es@4.17.21/lodash.js';console.log(_.shuffle([1, 2, 3, 4]));
</script>

五、注意事项

  1. 模块必须部署在支持 ESM 的环境(现代浏览器)。
  2. 文件必须是 .js.mjs,不能用 CommonJS 风格(如 require())。
  3. 若项目设置为 "type": "module",Node.js 中也可以使用 ESM,但语法和兼容性需注意。

六、浏览器支持

所有现代浏览器均已支持 ES Modules:

  • ✅ Chrome 61+
  • ✅ Firefox 60+
  • ✅ Safari 10.1+
  • ✅ Edge 16+
  • ✅ Node.js 12+(需设置 "type": "module" 或使用 .mjs
http://www.xdnf.cn/news/908623.html

相关文章:

  • 通过Spring AI框架搭建mcp服务端说明
  • 【Block总结】DBlock,结合膨胀空间注意模块(Di-SpAM)和频域模块Gated-FFN|即插即用|CVPR2025
  • FineReport模板认证找不到模板
  • pyarmor加密python程序
  • 【DAY41】简单CNN
  • 深入浅出Java ParallelStream:高效并行利器还是隐藏的陷阱?
  • 【使用conda】安装pytorch
  • python:基于pyside6的桌宠源码分享
  • java面试场景提题:
  • 全球知名具身智能/AI机器人实验室介绍之AI FACTORY基于慕尼黑工业大学
  • 数字孪生:如同为现实世界打造的“克隆体”,解锁无限可能
  • RabbitMQ 队列模式
  • CRM管理软件的审批流程设计与优化:提升企业运营效率的关键策略
  • DLL动态库实现文件遍历功能(Windows编程)
  • 浅谈不同二分算法的查找情况
  • hot100 -- 8.二叉树系列
  • 3D Web轻量化引擎HOOPS Communicator的定制化能力全面解析
  • LlamaIndex 工作流简介以及基础工作流
  • Linux驱动:class_create、device_create
  • java面试场景题:电商平台中订单未⽀付过期如何实现⾃动关单
  • 本地部署企业邮箱,让企业办公更安全高效
  • 【51单片机】0. 基础软件安装
  • Blazor-表单提交的艺术:如何优雅地实现 (下)
  • WorldExplorer:基于文本生成的可探索3D虚拟世界
  • 深克隆java对象的方式
  • 基于 openEuler 22.03 LTS SP1 构建 DPDK 22.11.8 开发环境指南
  • Xshell 详细安装与配置教程:从下载到高效使用
  • error: subprocess-exited-with-error【已解决】
  • docker 部署redis集群 配置
  • 【学习笔记】单例类模板