NextJS项目中Storybook引入第三方NPM模块报错问题咨询
问题成因
- Swiper v8及以上版本为纯ESM规范包,仅提供ESM格式导出,不再兼容CommonJS规范。Storybook默认模块解析规则优先适配CommonJS包,未针对纯ESM第三方包的路径导出规则做适配,因此无法识别
swiper/react、swiper/css这类导出路径。 - Storybook默认的构建配置(Webpack/Vite)未将
swiper纳入需要转译的依赖范围,导致模块路径无法被正确解析。 - Next.js 13+ 默认
moduleResolution配置为bundler,若Storybook的TypeScript解析规则与项目配置不匹配,会进一步加重路径解析错误。
解决方案
Webpack版Storybook适配(sb init默认生成的Next.js适配版为Webpack架构)
修改.storybook/main.js配置,添加webpackFinal规则:
module.exports = { // 保留原有stories、addons等配置不变 webpackFinal: async (config) => { // 将swiper纳入ESM转译范围 config.module.rules.push({ test: /\.m?js$/, include: /node_modules\/swiper/, type: "javascript/auto", }); // 扩展模块解析后缀 config.resolve.extensions = [ ...config.resolve.extensions, ".mjs", ".js", ".jsx", ".ts", ".tsx", ]; return config; }, };
Vite版Storybook适配
修改.storybook/main.js配置,添加viteFinal规则:
module.exports = { // 保留原有stories、addons等配置不变 async viteFinal(config) { config.optimizeDeps.include = [ ...(config.optimizeDeps?.include || []), "swiper/react", "swiper/css", ]; return config; }, };
最终校验操作
- 确认项目根目录
tsconfig.json中compilerOptions.moduleResolution配置为bundler(Next.js 13+默认值,无需额外修改) - 执行命令清除Storybook缓存并重启服务:
yarn storybook --no-cache
内容的提问来源于stack exchange,提问作者Scott Freeman
相关产品推荐
相关产品推荐

