JavaScript ES模块中实现CJS式函数重导出及解决同名报错
ESM中实现函数导入后立即重导出的正确方式
因技术原因需导入函数后立即重导出,但官方文档仅提供了CommonJS(CJS)的实现方式,现需在ES Modules(ESM)中实现相同逻辑。
当前尝试的ESM代码出现报错:
import { foo } from './foo'; import { bar } from './bar'; export const foo = foo; export const bar = bar;
错误信息:Parsing error: Identifier 'foo' has already been declared
参考可正常运行的CJS代码:
const foo = require('./foo'); const bar = require('./bar'); exports.foo = foo.foo; exports.bar = bar.bar;
解决方案
方案1:直接重导出(最简洁推荐)
ESM原生支持直接重导出指定成员,无需额外声明变量,从根源避免重名问题:
export { foo } from './foo'; export { bar } from './bar';
方案2:导入整个模块后导出成员
如果后续需要对模块内容做额外处理,可先导入整个模块并赋予别名,再导出目标成员:
import * as fooModule from './foo'; import * as barModule from './bar'; export const foo = fooModule.foo; export const bar = barModule.bar;
报错原因
你之前的代码报错是因为:通过import { foo }导入的foo已经是当前作用域的标识符,后续又用export const foo = foo;重复声明了同名变量,JavaScript不允许同一作用域内重复声明标识符,因此触发语法错误。
内容的提问来源于stack exchange,提问作者Laurent
相关产品推荐
相关产品推荐

