そもそも私のエラーは、説明したエラーとまったく同じです here@ svgr/webpack パッケージを使用して、.svg
ファイルをReactコンポーネントとしてインポートします。
import Shop from './icons/shop.svg'
return <Shop />
私のアプリでは問題なく動作しますが、 Storybook で同じことを実行しようとすると、次のエラーが発生します。
'Document'で 'createElement'を実行できませんでした:指定されたタグ名( 'static/media/shop.61b51e05.svg')は有効な名前ではありません。
ローダーを.storybook/main.js
ファイルに追加して、デフォルトのStorybook Webpack構成を拡張します。
// ...
webpackFinal: async config => {
config.module.rules.Push({
test: /\.svg$/,
enforce: 'pre',
loader: require.resolve('@svgr/webpack'),
});
エラーは引き続き発生したため、 前の質問の回答 で提案されているように、.svg
ファイルのデフォルトのストーリーブックテストを上書きしようとしました。
const fileLoaderRule = config.module.rules.find(rule => { rule.test !== undefined ? rule.test.test('.svg') : '' });
fileLoaderRule.exclude = /\.svg$/;
しかし、それから私はこのエラーを受け取ります:
TypeError:未定義のプロパティ 'exclude'を設定できません
そのため、console.log
のrule.test
を作成することにしました。奇妙なことに、Storybookの構成から取得されるデフォルトのテストは以下のものだけです。
{
test: /\.md$/,
...
}
{
test: /\.(js|mjs|jsx|ts|tsx)$/,
...
}
{
test: /\.js$/,
...
}
{
test: /\.(stories|story).mdx$/,
...
}
{
test: /\.mdx$/,
...
}
{
test: /\.(stories|story)\.[tj]sx?$/,
...
}
{
test: /\.(ts|tsx)$/,
...
}
ご覧のとおり、.svg
ファイルに影響するテストはありません。だから誰かが私の設定がなぜ使っていないのか考えていますか:
{
test: /\.svg$/,
enforce: 'pre',
loader: require.resolve('@svgr/webpack'),
}
find
コールバックは常にundefined
を返します。正しいブール値を返すように変更します。
_const fileLoaderRule = config.module.rules.find(rule => rule.test && rule.test.test('.svg'));
_
とにかく、ストーリーブックのデフォルトの設定には、このテストでの画像のルールが必要です:/\.(svg|ico|jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|cur|ani|pdf)(\?.*)?$/
。したがって、あなたのコード(ただし、正しいfindコールバックを使用)は私にとってはうまく機能します。
最終_main.js
_:
_module.exports = {
stories: ['../src/**/*.stories.[tj]s'],
webpackFinal: config => {
// Default rule for images /\.(svg|ico|jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|cur|ani|pdf)(\?.*)?$/
const fileLoaderRule = config.module.rules.find(rule => rule.test && rule.test.test('.svg'));
fileLoaderRule.exclude = /\.svg$/;
config.module.rules.Push({
test: /\.svg$/,
enforce: 'pre',
loader: require.resolve('@svgr/webpack'),
});
return config;
}
};
_