storybook 当在两个不同的文件中定义默认和命名的story导出时,v6源加载器/附加故事来源无法工作,

dphi5xsq  于 4个月前  发布在  其他
关注(0)|答案(8)|浏览(82)

问题描述

当我们将故事的默认导出和命名导出的故事定义分成两个不同的文件时,源加载器/ addon-storysource 模块无法正常工作。在插件面板中的“故事”选项卡显示为空。这个场景在v5版本中可以正常工作,但在v6版本中失败了。

重现步骤

从下面的仓库下载可复现的示例代码并运行npm run storybook

现在访问:http://localhost:9010/?path=/story/greeting--title-only
http://localhost:9010/?path=/story/greeting--with-message
检查“故事”选项卡,它将为空。

预期行为

尽管故事定义位于不同的文件中,但它仍应显示(在v5版本中可以正常显示,但在v6版本中不行)。此外,应突出显示故事开始和结束的行(这在v5版本中不起作用)。

截图

代码片段

https://github.com/vinothvk/storybookjv6-story-source-issue

系统信息:

环境信息:
系统:macOS Mojave 10.14.6
CPU:(12) x64 Intel(R) Core(TM) i7-8850H CPU @ 2.60GHz
二进制文件:
Node: 12.18.3 - ~/.nvm/versions/node/v12.18.3/bin/node
Yarn: 1.22.4 - ~/.yarn/bin/yarn
npm: 6.14.7 - ~/.nvm/versions/node/v12.18.3/bin/npm
浏览器:
Chrome: 84.0.4147.135
Firefox: 78.0.2
Safari: 13.1.2
npm包:
@storybook/addon-a11y: ~6.0.16 => 6.0.16
@storybook/addon-actions: ~6.0.16 => 6.0.16
@storybook/addon-backgrounds: ~6.0.16 => 6.0.16
@storybook/addon-console: ~1.2.1 => 1.2.1
@storybook/addon-controls: ~6.0.16 => 6.0.16
@storybook/addon-docs: ~6.0.16 => 6.0.16
@storybook/addon-events: ~6.0.16 => 6.0.16
@storybook/addon-knobs: ~6.0.16 => 6.0.16
@storybook/addon-links: ~6.0.16 => 6.0.16
@storybook/addon-storysource: ~6.0.16 => 6.0.16
@storybook/addon-toolbars: ~6.0.16 => 6.0.16
@storybook/addon-viewport: ~6.0.16 => 6.0.16
@storybook/addons: ~6.0.16 => 6.0.16
@storybook/react: ~6.0.16 => 6.0.16
@storybook/theming: ~6.0.16 => 6

brjng4g3

brjng4g31#

@shilman ,我相信你和团队正忙于处理事情。只是想知道这个问题在解决bug列表中是否有优先级/时间表?

gdrx4gfi

gdrx4gfi2#

你正在从哪个版本升级?我们通常不会优先处理storysource的bug(并在寻找维护者),但source-loader目前用于addon-docs,因此这方面可以优先考虑。

zfciruhq

zfciruhq3#

@shilman 我们从v5升级到了v6。我附上了链接,指向源代码中重现问题的代码。
分析问题后发现,似乎是在source-loader和addon-storysource之间出现的问题。如果你能优先处理它,那就太好了。

jpfvwuh4

jpfvwuh44#

在这里也遇到了类似的问题。我们试图采用storysource,但是我们的一些组件需要嵌套许多子组件。例如:Table,它需要head、body、rows、cells和其他相关组件深度嵌套在其中。
这导致每个命名导出都成为一个长组件。在一个文件中有多个这样的组件正是我们试图避免的。所以我们将它们分解成story文件夹中的多个文件。

文件夹结构:

  • .storybook/
  • main.js
  • src/
  • simple.stories.tsx(这个可以工作-既有默认导出,也有命名导出)
  • complex.stories/
  • index.ts
  • example-a.tsx
// .storybook/main.js

module.exports = {
  // ...
  stories: [
    "../src/stories/**/*.stories.@(ts|tsx)",
    "../src/stories/**/*.stories/index.@(ts|tsx)",
  ],
  // ...
};
// complex.stories/index.ts

import { Meta } from "@storybook/react/types-6-0";
import { Table } from "component-library";

export default {
  title: "Table",
  component: Table,
} as Meta;

export * from "./example-a";
// export * from "./example-b";
// export * from "./example-c";
// complex.stories/example-a.tsx

import * as React from "react";
import { Story } from "@storybook/react/types-6-0";
import {
  Table,
  // ...
} from "component-library";

export const ExampleA: Story = () => (
  <Table>
    {/* Complex table example */}
  </Table>
);

对于simple.stories.tsx,我们在标签页中得到了预期的源代码。但对于complex.stories/example-a.tsx,标签页是空白的。

41zrol4v

41zrol4v5#

你是否有修复的计划时间表/路线图?
谢谢

oxosxuxt

oxosxuxt6#

不,我们正在处理基本插件的积压问题,这是我们现在的优先事项。我很高兴审查带有修复的PR。

x6h2sr28

x6h2sr287#

经过仔细研究src代码并进行多次尝试,我找到了一个临时的解决方案来解决^6.3.7的问题(尚未测试其他版本)。我的设置与上面定义的设置略有不同,但考虑到以下示例设置和步骤,我认为我们可以解决任何设置。

.storybook/
├── main.js
├── preview.js
└── stories
    ├── complex_story.tsx
    └── my_stories.stories.tsx

需要更改的内容

将所有复杂的故事重命名为 *.story.tsx

在这里使用的实际上是一个自定义的webpack加载器...
storybook/addons/docs/src/frameworks/common/preset.ts
第54行至第63行在 337fdcd
| | constsourceLoader=sourceLoaderOptions |
| | ? [ |
| | { |
| | test: /.(stories|story).[tj]sx?$/, |
| | loader: require.resolve('@storybook/source-loader'), |
| | options: { ...sourceLoaderOptions,inspectLocalDependencies: true}, |
| | enforce: 'pre', |
| | }, |
| | ] |
| | : []; |
由于上面的 test 路径只包含 *.story.**.stories.* 文件,我们的 complex_story.tsx 文件将被排除,因此故事源将永远找不到该文件。所以我们现在的设置是这样的...

.storybook/
├── main.js
├── preview.js
└── stories
-   ├── complex_story.tsx
+   ├── complex_story.story.tsx
    └── my_stories.stories.tsx

注意:你也可以另辟蹊径地覆盖默认的webpack规则,并将 test 正则表达式设置为包括你的复杂故事文件,但我觉得这样做更容易。

将你的 story 文件包含在 main.stories 数组中

除非文件包含在 stories 路径中,否则源将不会被发现。因此, complex_story.story.tsx 必须包含。

// main.js
module.exports = {
  stories: [
-   './stories/**/*.stories.ts?(x)",
+   './stories/**/*.(stories|story).ts?(x)",
  ],
  // ...
};

包含 @storybook/addon-docs

出于某种原因,你也必须包含 @storybook/addon-docs ,没有这个插件,source-loader/story-source仍然无法找到要使用的正确导出作为源。这必须包含一些逻辑来连接导出与其原始文件。

// main.js
module.exports = {
  addons: [
    '@storybook/addon-storysource'
+   '@storybook/addon-docs'
  ],
  // ...
};

如果你像我一样不使用文档选项卡,你可以像这样轻松地隐藏它...

// preview.js
export const parameters  = {
  previewTabs: {
    'storybook/docs/panel': {
      hidden: true,
    },
  },
};

注意事项

  • 你不能从这些 complex_story.story.tsx 文件中使用 export default 否则它们将被视为故事并需要正确的 title 等,并且很可能是重复的故事。
  • 这个解决方法只会显示导出值的源代码,而不是从中导出的文件。因此, import 和其他除特定导出之外的内容都将被排除。

结论

我不认为这是一个解决问题的方法,因为它需要非显而易见的实现来修复。此外,先前版本( ^5.x.x )的功能允许完整文件可见,而不仅仅是导出的内容包括。
查看 nickofthyme@d7429cf 以查看工作演示,只需运行 yarn bootstrap --core && yarn start 即可在本地运行。

g9icjywg

g9icjywg8#

跟进我注意到在一些故事中存在一个类似于#12208的问题。

相关问题