具有绝对路径的故事书

Storybook with absolute paths

在我们的应用程序中,我们使用绝对路径进行导入。例如,如果我们有一个相对于 src 文件夹的路径,我们可以只写 import module from "components/myComponent"

问题是这在故事书中不起作用。经过一番挖掘后发现,您可以采用默认的 webpack 配置并根据需要扩展它,如文档 here 中所示。我基于此的思考过程是简单地将我的 src 目录推送到模块数组上,

module.exports = (baseConfig, env, defaultConfig) => {
    // Extend defaultConfig as you need.
    defaultConfig.resolve.modules.push("src");

    return defaultConfig;
};

然而,在这样做之后,我在尝试 运行 故事书时最终收到以下错误。

ERROR in ./node_modules/@storybook/addon-knobs/src/react/index.js Module parse failed: Unexpected token (26:9) You may need an appropriate loader to handle this file type. | const initialContent = getStory(context); | const props = { context, storyFn: getStory, channel, knobStore, initialContent }; | return ; | }; |

真的不知道从这里去哪里。

这看起来与这个 GitHub 问题 https://github.com/storybooks/storybook/issues/2704 非常相似,其中建议的修复是在您的 webpack 配置中使 src 目录成为绝对目录。

module.exports = {
  //...
  resolve: {
    modules: [path.resolve(__dirname, 'src'), 'node_modules']
  }
};

我在使用 CLI 后遇到了这个问题,我能够通过将我的 .storybook/main.js 修改为:

来解决它
const path = require('path');

module.exports = {
  ...other settings....,

  webpackFinal: async (config) => {
    config.resolve.modules = [
      ...(config.resolve.modules || []),
      path.resolve(__dirname, "../src"),
    ];

    return config;
  },

}

请注意,我使用的是 Typescript 和 ReactJS,我的 Typescript 文件的基础 URL 设置为 src。那是我的 tsconfig 有这个:

{
...,
 "baseUrl": "./src/",
}

我试过其他解决方案,但没有用。所以我为我的案例使用了一个 webpack 插件来解决这个问题。

按照此处的说明进行操作后:https://storybook.js.org/docs/riot/configure/webpack#extending-storybooks-webpack-config

我使用的是 TypeScript 版本,并将 webpackFinal 字段更改如下:

// main.ts
import { TsconfigPathsPlugin } from 'tsconfig-paths-webpack-plugin';
import type { Configuration } from 'webpack';

export default {
  // ... other fields
  webpackFinal: async (config: Configuration) => {
    if (!config.resolve) {
      config.resolve = {};
    }

    config.resolve.plugins = [
      ...(config.resolve.plugins || []),
      new TsconfigPathsPlugin(),
    ];

    return config;
  },
};

与上面@Sahin D. 的回答类似,但似乎已更新。

// .storybook/main.js

const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin');

module.exports = {
  webpackFinal: async (config) => {
    config.resolve.plugins = [
      ...(config.resolve.plugins || []),
      new TsconfigPathsPlugin({
        extensions: config.resolve.extensions,
      }),
    ];
    return config;
  },
};

来源:https://storybook.js.org/docs/react/configure/webpack#typescript-module-resolution