You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Storybook以支持TypeScript/ESM模块的Mock导入?

Storybook TypeScript/ESM环境下模块Mock配置修复方案

问题根源

TypeScript静态检查阶段不会读取webpack的别名配置,单纯设置resolve.alias只会让webpack编译时生效,但TS编译器会因为找不到对应的类型映射抛出错误;同时ESM模块的解析逻辑与CJS不同,需要额外调整路径处理方式。

分步修复方案

1. 更新webpackFinal配置

修改.storybook/main.js(或main.ts)中的webpack配置,确保覆盖TS扩展名解析,同时明确指定Mock模块的路径:

module.exports = {
  webpackFinal: (config) => {
    // 映射目标模块到Mock文件,指定TS扩展名
    config.resolve.alias['moduleToMock'] = require.resolve('../src/mocks/mockModule.ts');
    // 添加TS扩展名到webpack解析列表
    config.resolve.extensions = [...config.resolve.extensions, '.ts', '.tsx'];
    return config;
  },
};

2. 配置TypeScript路径映射

在项目的tsconfig.json(如果Storybook有独立的.storybook/tsconfig.json则用这个)中添加paths,让TS编译器识别别名:

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "moduleToMock": ["./src/mocks/mockModule.ts"]
    }
  }
}

注意baseUrl必须设置,否则paths无法正常工作。

3. ESM专属适配(如果项目启用ESM)

如果你的package.json中设置了"type": "module",需要改用ESM风格的路径处理:

export default {
  webpackFinal: (config) => {
    config.resolve.alias['moduleToMock'] = new URL('../src/mocks/mockModule.ts', import.meta.url).pathname;
    config.resolve.extensions = [...config.resolve.extensions, '.ts', '.tsx'];
    // 关闭强制扩展名要求,适配ESM导入习惯
    config.resolve.enforceExtension = false;
    return config;
  },
};

验证

重启Storybook服务后,检查TS文件中的导入语句是否不再报错,同时确认Storybook预览中Mock模块正常加载。

内容的提问来源于stack exchange,提问作者Jordan Baron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 20:55:20