JavaScript中的通配符import导入,其底层实现是否使用了with语句?
关于通配符import的实现说明
首先先纠正一个语法小误区:标准ES模块规范里不存在import * from 'x'的写法,通配符导入的正确语法是import * as 别名 from 'x',用于把模块所有导出内容挂载到一个命名空间对象上使用。
你担心的with语句完全不会出现在正规的转换实现里,通配符import转CommonJS的require逻辑非常直接:
- 标准的
import * as mod from 'x'等价于const mod = require('x'),所有导出的属性都在mod对象上,你需要用的时候直接取mod.导出名即可,完全不需要操作作用域。
如果是部分非标准语法支持的「无别名通配符导入」(把模块所有导出直接注入到当前作用域),实现逻辑也不会用到with:转译工具会在编译阶段静态分析目标模块的所有导出项,直接生成解构赋值的代码即可,比如目标模块导出了a、b、c三个属性,就会转成const {a, b, c} = require('x'),全程都是静态可分析的,不存在运行时作用域解析不确定的问题。
目前主流的所有转译工具(包括Babel、TypeScript、esbuild、swc等)的ES模块转CommonJS逻辑,都没有用到with语句的实现,完全规避了with带来的性能和可维护性问题。
内容的提问来源于stack exchange,提问作者caeus
相关产品推荐
相关产品推荐

