如何判断给定对象是否为动态导入所得的ES6模块?
检测ES6动态导入返回的模块对象的可靠方法
存在可跨运行环境的可靠检测方案,核心依赖ECMAScript规范对模块命名空间对象的标准化定义。
核心检测逻辑
ECMAScript规范明确要求,所有ES模块的命名空间对象(即动态导入返回的Promise resolve后得到的对象)的内置Symbol.toStringTag属性值为固定字符串Module,且该属性不可写、不可枚举、不可配置,常规代码无法伪造该标记。
我们可以通过调用Object.prototype.toString读取该标记,实现可靠检测:
function isESModule(obj) { return Object.prototype.toString.call(obj) === '[object Module]' }
兼容性说明
所有支持ES6动态导入特性的运行环境(Chrome 63+、Firefox 67+、Safari 11.1+、Node.js 13.2+及以上版本)都完全兼容该检测逻辑,不存在误判问题。
该方法也可以直接区分ES模块对象、普通对象、CommonJS导出对象。
避坑提示
不要通过以下方式做检测,可靠性极低:
- 判断对象是否存在
default属性:普通对象可手动添加default属性,极易误判 - 判断对象原型是否为
null:可通过Object.create(null)手动创建原型为null的普通对象,无法准确区分
内容的提问来源于stack exchange,提问作者philipp
相关产品推荐
相关产品推荐

