[Bug]: @storybook/addon-controls 破坏了一些故事

q35jwt9p  于 6个月前  发布在  其他
关注(0)|答案(5)|浏览(59)

描述问题

在为一家大型企业开发Storybook应用时,我们试图从Storybook v6升级到v7。我已经在迁移之前去掉了旧的addon-knobs库,转而使用@storybook/addon-controls。我遇到的问题是在一个特定的故事文件中,我无法弄清楚发生了什么。当我不在main.js中的addons数组里添加@storybook/addon-controls时,故事工作得很好。但是一旦添加了它,我就看到了关于Modal is undefined和Modal组件的一些错误,因为它们甚至没有在我的故事中导入。我注意到,对于一些损坏的故事,我可以通过将某些barrel导入(使用index.js文件重新导出模块)转换为从每个单独的模块中导入来修复它们。
我现在完全搞不清楚问题出在哪里。我已经尝试降级到Storybook的早期次要版本,切换到@storybook/addon-essentials - 但我就是弄不明白问题到底出在哪里。
这是storybook/main.js:

const path = require('path');

const { VanillaExtractPlugin } = require('@vanilla-extract/webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const webpack = require('webpack');

const pkg = require('../../package.json');

// actions, backgrounds, docs, viewport, toolbars, measure, outline, and highlight
module.exports = {
  stories: ['../../src/**/*.stories.@(ts|js|tsx)'],

  addons: [
    '@storybook/addon-a11y',
    '@storybook/addon-links',
    '@storybook/addon-essentials',
    // {
    //   name: '@storybook/addon-essentials',
    //   options: {
    //     // controls: false,
    //     // docs: true,
    //     toolbars: false,
    //     measure: false,
    //     outline: false,
    //     highlight: false,
    //   },
    // },
  ],

  docs: {
    autodocs: false, // TODO: Do we need this for now?
  },

  framework: {
    name: '@storybook/nextjs',
    options: {},
  },

  webpackFinal: async (config) => {
    config.plugins.push(
      new VanillaExtractPlugin({
        identifiers: 'short',
      })
    );
    config.plugins.push(new MiniCssExtractPlugin({}));
    config.module.rules.push({
      test: /\.vanilla\.css$/i, // Targets only CSS files generated by vanilla-extract\
      use: [
        MiniCssExtractPlugin.loader,
        {
          loader: require.resolve('css-loader'),
          options: {
            url: false, // Required as image imports should be handled via JS/TS import statements
          },
        },
      ],
    });

    const nonVanillaExtractCSSRuleIdx = config.module.rules.findIndex(
      (r) => r?.test?.toString?.() === '/\\.css$/'
    );

    // eslint-disable-next-line no-param-reassign
    config.module.rules[nonVanillaExtractCSSRuleIdx].exclude = [
      config.module.rules[nonVanillaExtractCSSRuleIdx].exclude,
      /\.vanilla\.css$/i,
    ];

    config.plugins.push(
      new webpack.DefinePlugin({
        __APP_NAME__: JSON.stringify(pkg.name),
        __APP_VERSION__: JSON.stringify(pkg.version),
        'global.window.COMMITHASH': JSON.stringify(
          process.env.GIT_SHA || 'no-build-number'
        ),
      })
    );

    return config;
  },

  core: {},
};

重现问题

由于这个仓库是为我的工作而创建的,所以我不能分享它 - 但希望这只是一个与@storybook/addon-controls相关的问题

系统信息

System:
    OS: macOS 14.1.1
    CPU: (10) arm64 Apple M1 Pro
  Binaries:
    Node: 16.14.0 - ~/.nvm/versions/node/v16.14.0/bin/node
    Yarn: 1.22.21 - ~/.nvm/versions/node/v18.15.0/bin/yarn
    npm: 8.3.1 - ~/.nvm/versions/node/v16.14.0/bin/npm
  Browsers:
    Chrome: 124.0.6367.119
    Safari: 17.1
  npmPackages:
    @storybook/addon-a11y: ~7.6.19 => 7.6.19 
    @storybook/addon-essentials: ~7.6.19 => 7.6.19 
    @storybook/addon-links: ~7.6.19 => 7.6.19 
    @storybook/nextjs: ~7.6.19 => 7.6.19 
    @storybook/preview-api: ~7.6.19 => 7.6.19 
    @storybook/theming: ~7.6.19 => 7.6.19

附加信息

  • 无响应*
pu82cl6c

pu82cl6c1#

这些错误信息也不是很有帮助。抱怨Modal未定义,我甚至在它声称出错的文件中都看不到对Modal的引用:

von4xj4u

von4xj4u2#

更新:我已经调查了桶装进口(使用index.js重新导出模块),似乎在启用@storybook/addon-controls时会导致问题。尽管故事只使用那些在这些index.js文件中重新导出的特定模块,但我想知道react-docgen是否扫描所有其他导入的模块,然后在某个地方出错。我尝试跟踪导入路径,但甚至无法到达上面截图声称具有未定义模态的文件。
这真的很奇怪,因为当@storybook/addon-controls@storybook/addon-essentials未启用时,一切都正常工作。

vql8enpb

vql8enpb3#

Also - using TypeScript, Webpack 5 and Babel here + the storybook nextjs framework

hkmswyz6

hkmswyz64#

我已经将问题缩小到以下场景:

  1. @storybook/addon-essentials 被添加到 main.ts 文件中,controlsdocs 未被设置为 false(它们是启用的)。禁用这两个将解决此问题
  2. 一个简单的 Story 从 index.tsx 文件中导入一个组件/函数,同时还导入了其他未使用的 import,例如:
import React from 'react';

import TestComponent from '@/src/components/TestComponent'; // imports from barrel file (index.tsx)

export default {
  component: TestComponent,
};

export const CoolStory = (args) => <TestComponent {...args} />;
CoolStory.args = {
  text: 'Hello',
};

以及来自 index.tsx 文件的 @/src/components/TestComponent 导入:

import AnotherModule from "../AnotherModule"; // this is not utilized or explicitly imported, but I think react-docgen analyzes it which causes the undefined module error???
import TestComponent from './TestComponent';

export { AnotherModule };

export default TestComponent;
rqmkfv5c

rqmkfv5c5#

我以前没有听说过这个问题。你可以尝试在.storybook/main.js:

// .storybook/main.js
export default {
  typescript: { reactDocgen: false }
}

中关闭docgen,这意味着你将不会得到自动生成的控件,但如果你仍然想要docs/控件,这可能是一个解决方法。

如果你能在https://storybook.new创建一个复现示例,或者看到repro docs,那么团队中的某人可能有可能调试正在发生的事情。

相关问题