Closed1
Next.js 14とStorybook 8でSVGをインラインコードで扱う
SVGRのWebpack loaderを依存関係に追加する。
Next.js
next.config.mjs
/** @type {import('next').NextConfig} */
const nextConfig = {
output: "standalone",
webpack: (config) => {
config.module.rules.push({
test: /\.svg$/,
use: [
{
loader: "@svgr/webpack",
},
],
});
return config;
},
};
TypeScript
Next.jsの内部で意図的にany
が指定されているので、型を用意する。
src/app/globals.d.ts
declare module "*.svg" {
const ReactComponent: React.FC<React.SVGProps<SVGSVGElement>>;
export default ReactComponent;
}
tsconfig.json
のinclude
でnext-env.d.ts
の前に型ファイルを追加する。
tsconfig.json
{
"include": [
"src/app/globals.d.ts",
"next-env.d.ts",
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts"
],
}
Storybook
.storybook/main.ts
const config: StorybookConfig = {
stories: ["../src/**/*.mdx", "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"],
addons: [
"@storybook/addon-onboarding",
"@storybook/addon-links",
"@storybook/addon-essentials",
"@chromatic-com/storybook",
"@storybook/addon-interactions",
],
framework: {
name: "@storybook/nextjs",
options: {},
},
staticDirs: ["../public"],
webpackFinal: async (config) => {
// NOTE: https://github.com/storybookjs/storybook/issues/18557
config.module = config.module || {};
config.module.rules = config.module.rules || [];
// This modifies the existing image rule to exclude .svg files
// since you want to handle those files with @svgr/webpack
const imageRule = config.module.rules.find((rule) =>
rule?.["test"]?.test(".svg"),
);
if (imageRule) {
imageRule["exclude"] = /\.svg$/;
}
// Configure .svg files to be loaded with @svgr/webpack
config.module.rules.push({
test: /\.svg$/,
use: ["@svgr/webpack"],
});
return config;
},
};
このスクラップは2ヶ月前にクローズされました