본문 바로가기
카테고리 없음

react - Next.js 마이그레이션 svgr 문제

by 커쟁이훈 2024. 11. 7.

진행 중인 프로젝트에 서버에서 처리해줘야 하는 부분이 생김에 따라 react에서 Next.js의 pages router로 마이그레이션 해야 하는 상황이 왔다. 원래의 코드를 그대로 옮기는 작업을 하는데도 문제가 몇 가지 있었는데 마이그레이션 하면서 겪은 문제들을 하나씩 기록해 보자

svgr

React 프로젝트 일 당시 CRA(create react app)이 아닌 vite 번들러를 통해 프로젝트를 생성했었다.

그래서 svgr 관련 설정이 vite.config.ts에 되어있었다.

import react from "@vitejs/plugin-react";
import { resolve } from "path";
import { defineConfig } from "vite";
import svgr from "vite-plugin-svgr";

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react(), svgr()],
  resolve: {
    alias: {
      "@src": resolve(__dirname, "src"), // 절대 경로 설정
    },
  },
});

위와 같이 간단한 설정으로 돼있었고 큰 문제없이 svgr을 통해 조건부에 따른 이미지 색상 변경 등을 편리하게 사용했다.

그런데 Next.js로 마이그레이션 하면서 갑자기 프로젝트 전체의 이미지 크기가 작아지는 현상이 발생했다.

 

개발자 도구로 살펴보니 react일 때는 네비게이션 바의 각 icon의 width와 height 값이 본인의 기본 width, height 값으로 잘 렌더링 되고 있었고, next에서는 본인의 기본값과 다른 크기로 렌더링 되고 있었다.

좌 Next.js 우 React

무엇이 문제인지 알아보니

next.config.js

/**
 * @type {import('next').NextConfig}
 */
const nextConfig = {
  reactStrictMode: true,
  webpack(config) {
    config.module.rules.push({
      test: /\.svg$/,
      use: [
        {
          loader: "@svgr/webpack",
          options: {
            icon: true,
          },
        },
      ],
    });

    return config;
  },
};

module.exports = nextConfig;

options안에 icon:true로 설정돼 있던 게 문제였고, 각 icon의 width, height을 지정해주지 않았을 때, 기본 width와 height을 따라가게 하는 설정을 해줬어야 했다.

 

icon: true

  • width/height를 제거하고 1em 크기로 강제 설정됨
  • SVG를 아이콘처럼 취급하여 원본 크기 정보를 무시함

dimensions: true

  • 원본 width/height 값을 유지함
  • icon: true가 기본값으로 적용되어 있다면 icon 설정이 우선적으로 적용되어 dimensions 설정을 덮어쓰게 됨

이런 이유 때문에 두 개의 속성을 같이 적용해줘야 한다.

options: {
  dimensions: true,
  icon: false,
},

그리하여 options 안에 이 속성을 추가하고 각 icon 파일들이 지정해주지 않아도 본인의 기본 width, height를 따라가도록 하니 문제가 해결됐다!