一个简单的 Storybook 插件,用于在 VS Code 中打开组件源代码

在 Github 上查看

Storybook 插件 VSCode 源代码

一个简单的 Storybook 插件,可以打开组件的源文件。在本地/开发环境中,它会打开 `vs code`,而在生产环境中,它会打开 `github` 仓库中的文件。

An animated gif of the addon

入门。

先决条件:一个可用的 Storybook 设置

1. 安装开发依赖

yarn add -D storybook-vscode-component babel-plugin-macros paths.macro

注意:我们使用 `babel-plugin-macros` 和 `paths.macro` 来轻松获取文件路径。如果您选择硬编码文件路径,则可以选择不使用它们。

如果您使用的是 `paths.macro`,请确保在 `babelrc` 中启用宏,如下所示

// .babelrc
{
    "plugins": [
        "macros"
    ]
}

2. 将插件添加到 Storybook 配置(`.storybook/addon.js` 或 `.storybook/main.js`)

//.storybook/addon.js [deprecated]
import 'storybook-vscode-component/register';

//       or

// .storybook/main.js
module.exports = {
  stories: [
    // ....
  ],
  addons: [
    '@storybook/addon-links',
    //...
    'storybook-vscode-component/register',
  ],
};

3. 在参数 `storySource` 下设置全局参数。

您可以设置三个全局参数

参数 描述
workingDir 当前工作/根目录的路径 必需
repository Github 仓库的 URL - 用于在 Github 中打开文件 可选
branch Github 仓库的默认分支 可选,默认指向 `master`
// .storybook/preview.js
import { wd } from 'paths.macro';

export const parameters = {
  storySource: {
    repository: 'https://github.com/example/repo-name',
    workingDir: wd || '/Usr/vilva/Desktop/project-name',
    branch: 'branch1',
  },
};

4. 开始编写您的故事

现在您可以开始编写您的故事,并传递故事级别或组件级别的参数。

有两个可能的参数

参数 描述
componentPath 故事中使用的组件的路径 组件文件的绝对路径或相对于根目录的路径
storyPath 故事文件的路径,假设故事和组件位于同一个文件夹中,并且命名约定为 - 组件:`Button.js` 和故事:`Button.stories.js` 故事文件的绝对路径或相对于根目录的路径

以上两个参数之一是必须的,如果没有这些参数,插件将消失。

示例故事

组件级参数
// Component level parameters
import { Button } from './Button';

export default {
  title: 'Example/Button',
  component: Button,
  parameters: {
    storySource: {
      componentPath:
        '/src/Button/Button.js' ||
        '/Usr/vilva/Desktop/storybook/src/Button/Button.js',
    },
  },
};

const Template = (args) => <Button {...args} />;

export const Primary = Template.bind({});

//  or

storiesOf('Button', module)
  .addParameters({
    storySource: {
      componentPath:
        '/src/Button/Button.js' ||
        '/Usr/vilva/Desktop/storybook/src/Button/Button.js',
    },
  })
  .add('Primary', () => <Button />);
故事级参数
import { Button } from './Button';

export default {
  title: 'Example/Button',
  component: Button,
  parameters: {
    storySource: {
      componentPath:
        '/src/Button/Button.js' ||
        '/Usr/vilva/Desktop/storybook/src/Button/Button.js',
    },
  },
};

const Template = (args) => <Button {...args} />;

export const Primary = Template.bind({});

Primary.parameters = {
  storySource: {
    componentPath: '/src/Button/Button.js',
  },
};
故事的路径 - `storyPath`

注意:此参数仅在故事和相应的组件位于同一个文件夹中,并且具有相同名称时使用。假设组件位于 `src/Button/Button.js` 文件中,并且故事位于 `src/Button/Button.stories.js` 文件中,则此参数将起作用。但是它适用于所有类型的文件,`.js`、`.ts`、`.tsx`。

import { Button } from './Button';
import { fileAbsolute } from 'paths.macro';

export default {
  title: 'Example/Button',
  component: Button,
  parameters: {
    storySource: {
      componentPath:
        '/src/Button/Button.js' ||
        '/Usr/vilva/Desktop/storybook/src/Button/Button.js',
    },
  },
};

const Template = (args) => <Button {...args} />;

export const Primary = Template.bind({});

Primary.parameters = {
  storySource: {
    storyPath:
      fileAbsolute ||
      '/Usr/vilva/Desktop/storybook/src/Button/Button.stories.js' ||
      '/src/Button/Button.stories.js',
  },
};