可通过检查 import.meta 是否存在且为对象来可靠判断当前代码是否运行在 es 模块环境中:typeof import.meta === 'object' 且 import.meta !== null;辅以顶层 this 为 undefined、module 和 require 未定义等条件可增强可靠性。

可以通过检查 import.meta 是否存在且为对象来可靠判断当前代码是否运行在 ES 模块(ESM)环境中。
最直接的判断依据:import.meta
import.meta 是 ESM 的专属特性,在 CommonJS、浏览器普通 script 标签、控制台或 Node.js REPL 中均未定义或报错。只要满足以下条件,即可确认是 ES 模块:
-
typeof import.meta === 'object'(不是'undefined'或'function') import.meta !== null
辅助验证项(增强判断可靠性)
单靠 import.meta 已足够,但结合以下特征可排除边界情况(如某些构建工具注入的伪环境):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 顶层
this为undefined(ESM 总是严格模式,顶层 this 不指向 globalThis) -
typeof module === 'undefined'(排除 CommonJS) -
typeof require === 'undefined'(排除 CommonJS 和 Node.js 非模块脚本) - 在浏览器中:
document.currentScript?.type === 'module'(说明当前 script 是以type="module"加载)
注意区分“模块环境”和“模块文件”
判断的是**当前执行上下文是否为 ESM**,不是单纯看文件后缀或路径:
-
.mjs文件或package.json中设"type": "module"→ Node.js 将其作为 ESM 加载 -
<script type="module" src="x.js"></script>→ 浏览器将其作为 ESM 执行 - 即使文件名是
.js,只要通过上述方式加载,import.meta就有效
不推荐的误判方式
以下方法不可靠,容易出错:
- 仅靠
typeof exports === 'undefined'—— 普通 script 标签里也无 exports - 仅靠是否有
export语句 —— 语法错误前无法检测,且非顶层代码可能不触发解析 - 依赖
window.location.protocol或服务器路径 —— 与模块机制无关
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










