无法在 NextJs + Storybook 中提供静态文件

Dyl*_*yen 4 typescript webpack next.js storybook

nextjs 文档 ( https://nextjs.org/docs/basic-features/static-file-serving ) 声明在public目录下添加图像文件路径。

我有一个渲染图像组件的组件,该文件在我的 nextjs 项目上正确渲染,但不在故事书内渲染。图像文件当前位于public/images/

const renderImage = () => {
    const portraitClassName = cx({
        [styles.imageContainerPortrait]: true,
    });

    return (
        <img
            className={portraitClassName}
            data-testid="image"
            src="/images/portrait.png"
            alt={image.imgAlt}
        />
    );
};
Run Code Online (Sandbox Code Playgroud)

这是我当前的故事书配置文件

webpackFinal: async (config) => {
        config.module.rules.push({
            test: /\.(scss|sass|css)$/,
            use: [
                {
                    loader: "sass-loader",
                    options: {
                        implementation: require("sass"),
                    },
                },
                {
                    loader: "postcss-loader",
                    options: {
                        ident: "postcss",
                        plugins: [tailwindcss, autoprefixer],
                    },
                }
            ],
            include: path.resolve(__dirname, "../"),
        });
        return config;
    }
Run Code Online (Sandbox Code Playgroud)

是否缺少某些东西可以让我以与 Nextjs 的设置方式相同的方式渲染图像?

小智 6

对我有用的是我需要使用staticDirs告诉Storybook.js我的公共资源所在的位置。

即: root > .storybook目录 >main.ts

const config: StorybookConfig = {
 //other stuff .... 
  docs: {
    autodocs: 'tag',
  },

  staticDirs: ['../public/'], //<--- FIX    };

};
export default config;
Run Code Online (Sandbox Code Playgroud)


Gio*_*tta 5

您需要告诉故事书在哪里可以找到您的图像。在nextjs他们停留在public/,所以你可以只需添加-s ./public到您的脚本运行童话故事:

//package.json
{
"scripts": {
    "start-storybook": "start-storybook -s ./public"
  }
}
Run Code Online (Sandbox Code Playgroud)

这里的文档链接供参考:https : //storybook.js.org/docs/react/configure/images-and-assets#serving-static-files-via-storybook

  • `-s` 已弃用,在 main.js 内部使用 `staticDirs: ['../public', '../static'],` 代替。这仍然不适用于 css,但有一个解决方法,你可以做一个内联样式 css 变量,如 `style={{"--myVar": "url('/test.png')"} as React.CSSProperties }` 并在你的 css 中使用它 (2认同)