
该问题源于 works.jsx 中错误地混合了默认导出语法与命名导出导入方式,导致 react/vite 无法解析 works 模块——需统一导出类型(命名导出或默认导出)并匹配对应 import 语法。
该问题源于 works.jsx 中错误地混合了默认导出语法与命名导出导入方式,导致 react/vite 无法解析 works 模块——需统一导出类型(命名导出或默认导出)并匹配对应 import 语法。
在 React + Vite 项目中,模块导入/导出必须严格匹配。你当前的 App.jsx 使用的是命名导入语法:
import { Works } from "../components/Works"
这意味着它期望 Works.jsx 提供一个名为 Works 的命名导出(named export)。然而,你的 Works.jsx 实际写法是:
export default Works = () => { ... } // ❌ 错误:这不是合法的 ES 模块语法
这段代码存在两个关键问题:
- export default Works = ... 是无效语法(类似函数声明与赋值混淆),JS 引擎无法解析;
- 即使语法修正为 export default Works = () => {...}(实际应写作 const Works = () => {}; export default Works;),它仍属于默认导出(default export),与 import { Works } 的命名导入不兼容。
✅ 正确解法有两种,任选其一,但需保持导入与导出形式一致:
✅ 方案一:改用命名导出(推荐,与现有 import 匹配)
// Works.jsx
import React from 'react';
import styled from 'styled-components';
const Section = styled.div`
height: 100vh;
scroll-snap-align: center;
display: flex;
justify-content: center;
position: relative;
color: black;
font-size: 14px;
font-weight: 300;
`;
// 正确的命名导出写法(两种等效形式)
export const Works = () => {
return <section></section>;
};
// 或等价写法:
// const Works = () => <section></section>;
// export { Works };
✅ 此时 import { Works } from "../components/Works" 完全匹配,无需修改 App.jsx。
✅ 方案二:改为默认导出(需同步修改 import)
// Works.jsx
export default function Works() {
return <section></section>;
}
// 或箭头函数形式:
// const Works = () => <section></section>;
// export default Works;
// App.jsx → 修改导入语句为默认导入 import Works from "../components/Works"; // 注意:无大括号
⚠️ 重要注意事项:
- 文件名大小写敏感:确保路径 ../components/Works 对应真实文件 Works.jsx(而非 works.jsx 或 works.js),Vite 在开发服务器中对大小写敏感;
- 清除缓存:修改后若仍报错,尝试重启 Vite 开发服务器(yarn dev),并清空浏览器缓存或使用无痕模式验证;
- ESLint/TSC 提示:现代编辑器(如 VS Code)会在悬停导入时显示“no exported member”警告——这是最直接的排查线索,优先检查该提示对应的组件导出定义。
总结:React 模块系统严格遵循 ES Modules 规范。命名导入 { X } 必须对应命名导出 export { X } 或 export const X = ...;默认导入 X 必须对应 export default X。二者不可混用。 推荐统一采用命名导出,尤其在组件较多、需按需导入的项目中,可读性与可维护性更优。











