[@svgr/webpack] Next.SVG를 js/Storybook에서 어셈블리로 처리
하고 싶은 일
문장 요약
@svgr/webpack를 이용하여 웹 패키지의 설정을 작성하고 해결
사전 요구 사항 정보
Next.js에 표시
먼저 추가@svgr/webpack.
yarn add -D @svgr/webpack
다음에 next.config.js에 웹 패키지 설정을 추가합니다.// next.config.js
module.exports = {
~~~ 省略 ~~~
webpack: (config) => {
config.module.rules.push({
test: /\.svg$/,
use: ['@svgr/webpack'],
})
return config
},
}
SVG 파일을 저장하고 적절한 구성 요소로 import을 하고 JSX를 추가합니다.import ExternalLinkIcon from '~/src/assets/svg/external-link.svg'
const App = () => (
<div>
<ExternalLinkIcon />
</div>
)
이것만 Next입니다.SVG는 js를 통해 표시할 수 있습니다.Storybook에 표시
./storybook/main.js에도 웹 패키지 설정이 추가되었습니다.// ./storybook/main.js
webpackFinal: async (config) => {
~~ 省略 ~~
config.module.rules.push({
test: /\.svg$/,
use: ['@svgr/webpack'],
})
return config
},
이 상태에서 Storybook 구축을 수행할 때TypeError: this.getOptions is not a function 발생합니다.ERR! => Failed to build the preview
ERR! ./src/assets/svg/external-link.svg
ERR! Module build failed (from ./node_modules/@svgr/webpack/dist/index.js):
ERR! TypeError: this.getOptions is not a function
ERR! at Object.svgrLoader (/home/runner/work/log.mh4gf.dev/log.mh4gf.dev/node_modules/@svgr/webpack/dist/index.js:83:24)
ERR! @ ./src/components/ArticleListItem/index.tsx 2:0-66 24:33-49
ERR! @ ./src/components/ArticleListItem/index.stories.tsx
ERR! @ ./src sync ^\.(?:(?:^|\/|(?:(?:(?!(?:^|\/)\.).)*?)\/)(?!\.)(?=.)[^/]*?\.stories\.(js|jsx|ts|tsx))$
ERR! @ ./generated-stories-entry.js
TypeError: this.getOptions is not a function
이 문제는 Webpack5로 수정하면 해결됩니다.ref:
Storybook에서 Webpack5를 사용하는 문서에 따라 업그레이드합니다.
yarn add --dev @storybook/builder-webpack5 @storybook/manager-webpack5
// ./storybook/main.js
module.exports = {
core: {
builder: 'webpack5',
},
~~~ 省略 ~~~
이렇게 하면 this.getOptions 오류가 발생하지 않지만 다음과 같은 오류가 발생한다.$ yarn storybook
yarn run v1.22.11
$ start-storybook -p 6006
info @storybook/react v6.4.22
info
info => Loading presets
info => Serving static files from ././public at /
info => Using PostCSS preset with [email protected]
info => Using default Webpack5 setup
<i> [webpack-dev-middleware] wait until bundle finished
9% setup compilation DocGenPlugininternal/modules/cjs/loader.js:905
throw err;
^
Error: Cannot find module 'webpack/lib/util/makeSerializable.js'
Cannot find module 'webpack/lib/util/makeSerializable.js'
이것은 아래 issue의 업무 복습을 통해 해결되었다.ref:
./storybook/main.다음과 같이 js를 수정합니다.
// ./storybook/main.js
module.exports = {
~~~ 省略 ~~~
typescript: { reactDocgen: false },
}
Storybook의 Webpack5는 아직 experimental에 대응하기 때문에 어쩔 수 없다고 생각합니다.이렇게 구축하면 통과할 수 있지만 SVG에서 import 구성 요소의 story를 표시하는 중 오류가 발생했습니다.
Failed to execute 'createElement' on 'Document': The tag name provided ('static/media/external-link.981294d1.svg') is not a valid name.
Failed to execute 'createElement' on 'Document': The tag name provided ('static/media/external-link.981294d1.svg') is not a valid name.
이 오류는 Storybook에서 기본적으로 준비한 웹 패키지의 설정으로svg의 확장자가 file-loader에 불러오기 때문입니다.
그거 취소로 설정하면 해결될 거야.
webpackFinal: async (config) => {
~~ 省略 ~~
const fileLoaderRule = config.module.rules.find((rule) => rule.test && rule.test.test('.svg'))
fileLoaderRule.exclude = /\.svg$/
return config
},
Storybook은 위의 몇 가지 대응에 따라 SVG를 표시할 수도 있습니다.끝맺다
이미 주기적인 방법으로 해결했기 때문에 향후 관련 프로그램 라이브러리의 업데이트를 추적하고 싶습니다.이 보도에 대한 선전도 매우 환영한다.
이번에 사용한 것은
@svgr/webpack,넥스트다.나는 js와 Storybook에서 Webpack의 설정이 다르다는 것에 매우 신경을 쓴다.웹팩으로 복잡한 일을 하면 바이트 환승 등도 어려워지기 때문에 가능하면 최소한으로 컨트롤하고 싶다.더 좋은 선택이 있다면 다른 방법을 바꾸고 싶습니다.
Reference
이 문제에 관하여([@svgr/webpack] Next.SVG를 js/Storybook에서 어셈블리로 처리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/mh4gf/articles/64456281f65fbe텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)