NextJS、Storybook、SVG 和绝对导入路径

p.b*_*iko 4 typescript next.js storybook

无法将 SVG 用作 NextJS 应用程序和 Storybook 的模块(使用绝对路径导入)。经过多次尝试设置,我能够在 Next 或 Storybook 中导入 SVG,但不能同时导入两者。我将此设置用于babel-plugin-inline-react-svg

// .babelrc
{
  ...
  "plugins": [
    ...
    "inline-react-svg"
  ]
}
Run Code Online (Sandbox Code Playgroud)

使用此插件 Storybook 不需要任何配置,并且此示例代码可以按预期工作:

import Wrapper from '../../../components/Wrapper';
import IconSVG from '../../../icons/sandwich.svg';

export const WrappedSVG = () => (
  <Wrapper>
    <IconSVG />
  </Wrapper>
);
Run Code Online (Sandbox Code Playgroud)

但以下情况则不然:

import Wrapper from 'components/Wrapper';
import IconSVG from 'icons/sandwich.svg';

export const WrappedSVG = () => (
  <Wrapper>
    <IconSVG />
  </Wrapper>
);
Run Code Online (Sandbox Code Playgroud)

正在处理包装器,但未处理图标:Cannot find module

这是svgr设置:

// next.config.js
module.exports = {
  webpack(config, options) {
    ...
    config.module.rules.push({
      test: /\.svg$/,
      use: ['@svgr/webpack'],
    });

    return config;
  },
};
Run Code Online (Sandbox Code Playgroud)
// .storybook/main.js
module.exports = {
  ...
  webpackFinal: async config => {
    ...
    config.module.rules.unshift({
      test: /\.svg$/,
      use: ['@svgr/webpack'],
    });

    return config;
  },
}
Run Code Online (Sandbox Code Playgroud)

此配置在应用程序端运行良好,但在 Storybook 中我得到DOMException: "String contains an invalid character"

我的npm run dev脚本是这样的:(ts-node --project tsconfig.server.json src/server.ts通过nodemon)。

我希望有人能给我一个提示,如何使 SVG 组件的绝对导入同时适用于 NextJS 和 Storybook。

Bre*_*dan 6

这里有一个对我有用的不同问题的答案。

这可能是因为与 Storybook 的默认 SVG 加载器发生冲突。这对我有用:

module.exports = {
  webpackFinal: async (config, { configType }) => {
    const rules = config.module.rules;
    const fileLoaderRule = rules.find(rule => rule.test.test('.svg'));
    fileLoaderRule.exclude = /\.svg$/;

    rules.push({
      test: /\.svg$/,
      use: ["@svgr/webpack"],
    });

    return config;
  }
};
Run Code Online (Sandbox Code Playgroud)