index.js目录重导出场景下export default不生效问题排查
问题表现
导入采用「目录+index.js入口」模式组织的React组件时抛出如下报错:export 'Window' (reexported as 'default') was not found in './Window' (possible exports: default)
相关文件结构与代码如下:
- 目录结构:
shared/components/Window目录下包含Window.js、index.js、Window.css三个文件 - Window.js源码:
import './Window.css'; export default function Window () { return ( <div className='Window'> window </div> ) }
- index.js源码:
export { Window as default } from './Window';
- 失效导入语句(指向目录):
import Window from 'shared/components/Window';
- 正常生效的导入语句(直接指向组件源文件):
import Window from 'shared/components/Window/Window';
相同结构在项目其他位置可正常运行,仅shared目录下的组件出现该问题,项目已配置src为baseUrl实现路径别名。
根因分析
报错信息已经给出明确提示:./Window模块仅存在default默认导出,不存在名为Window的命名导出。
你当前index.js里的重导出语法export { Window as default } from './Window',逻辑是从./Window模块中导入名为Window的命名导出,再将其作为当前index.js模块的默认导出,但Window.js里只写了默认导出,没有声明同名的Window命名导出,自然会抛出找不到导出项的错误。
其他目录相同结构能正常运行,通常是因为对应目录被Babel等编译工具的规则覆盖,插件自动为默认导出生成了同名命名导出;而shared目录大概率没被包含在编译规则的include范围内,自动转换逻辑不生效,就暴露了写法问题。
修复方案
二选一即可:
- 修改index.js的重导出语法,直接重导出目标模块的默认导出,不需要依赖同名命名导出:
// shared/components/Window/index.js export { default } from './Window'; - 给Window.js补充同名命名导出,适配原有重导出写法:
// shared/components/Window/Window.js import './Window.css'; function Window () { return ( <div className='Window'> window </div> ) } // 补充同名命名导出 export { Window } export default Window
如果改完后仍有路径解析问题,检查打包工具的extensions配置是否包含.js后缀,确认目录入口解析规则中index.js处于生效优先级即可。
内容的提问来源于stack exchange,提问作者William Convertino
相关产品推荐
相关产品推荐

