[React] sass-loader 설정 커스터마이징하기

겨레·2024년 11월 20일

[React] 리액트 스터디

목록 보기
49/95

Sass를 사용할 때 반드시 해야 하는 작업은 아니지만 해 두면 유용하다.

예를 들어 방금 SassComponent에서 utils를 불러올 때 @import './styles/utils'; 형태로 불러왔는데, 만약 프로젝트에 디렉터리를 많이 만들어서 구조가 깊어졌다면?

src/components/somefeature/ThisComponent.scss 다음과 같이 상위 폴더로 한참 거슬러 올라가야 한다는 단점이 있는데, 웹팩에서 Sass를 처리하는 sass-loader의 설정을 커스터마이징하여 해결할 수 있다.

@import '../../../styles/utils';

create-react-app으로 만든 프로젝트는 프로젝트 구조의 복잡도를 낮추기 위해 세부 설정이 모두 숨겨져 있다. 이를 커스터마이징하려면 프로젝트 디렉터리에서 yarn eject 명령어를 통해 세부 설정을 밖으로 꺼내줘야 한다.

create-react-app에서는 기본적으로 Git 설정이 되어 있는데, yarn eject는 아직 Git에 커밋되지 않은 변화가 있다면 진행되지 않으므로 먼저 커밋해 준다.

$ git add .
$ git commit -m'Commit before yarn eject'
$ yarn eject
yarn run v1.12.0
warning ../package.json: No license field
$ react-scripts eject
? Are you sure you want to eject? This action is permanent. (y/N) y 

그러면 프로젝트 디렉터리에 config라는 디렉터리가 생성되는데, 그안에 들어 있는 webpack.config.js를 열어보자.

그 파일에서 "sassRegex"라는 키워드를 찾아보면, 다음과 같은 코드가 나타날 것이다.

// webpack.config.js - sassRegex 찾기
{
  test: sassRegex,
  exclude: sassModuleRegex,
  use: getStyleLoaders(
    {
      importLoaders: 2,
      sourceMap: isEnvProduction && shouldUseSourceMap,
    },
    'sass-loader'
  ),
  sideEffects: true,
},

여기서 use:에 있는 'sass-loader' 부분은 지우고, 뒷부분에 concat을 통해 커스터마이징된 sass-loader 설정을 넣어준다.

{
  test: sassRegex,
  exclude: sassModuleRegex,
  use: getStyleLoaders({
    importLoaders: 2,
    sourceMap: isEnvProduction && shouldUseSourceMap
}).concat({
    loader: require.resolve('sass-loader'),
    options: {
      includePaths: [paths.appSrc + '/styles'],
      sourceMap: isEnvProduction && shouldUseSourceMap,}
}),
sideEffects: true
},

설정 파일을 저장한 후, 서버를 껐다가 재시작한다. 이제 utils.scss 파일을 불러올 때 현재 수정하고 있는 scss 파일 경로가 어디에 위치하더라도 앞부분에 상대 경로를 입력할 필요 없이 styles 디렉터리 기준 절대 경로를 사용하여 불러올 수 있다.

SassComponent.scss 파일에서 import 구문을 다음과 같이 수정해보자! 그리고 똑같이 적용되는지 확인도 해보자.

@import 'utils.scss';

이제부터 utils.scss를 사용하는 컴포넌트가 있다면 임포트해주면 된다. 하지만 새 파일을 생성할 때마다 utils.scss를 매번 이렇게 포함시키는 게 귀찮을 땐, sass-loader의 data 옵션을 설정하면 된다. data 옵션을 설정하면 Sass 파일을 불러올 때마다 코드의 맨 윗부분에 특정 코드를 포함시켜 준다.

webpack.config.jsx를 열어서 조금 전 수정한 sass-loader의 옵션에 있는 data 필드를 다음과 같이 설정한다.

// webpack.config.js

{
{
  test: sassRegex,
  exclude: sassModuleRegex,
  use: getStyleLoaders({
    importLoaders: 2,
    sourceMap: isEnvProduction && shouldUseSourceMap
  }).concat({
    loader: require.resolve('sass-loader'),
    options: {
      includePaths: [paths.appSrc + '/styles'],
      sourceMap: isEnvProduction && shouldUseSourceMap,
      data: `@import 'utils';`
    }
  }),
  sideEffects: true
},

이렇게 작성하고 개발 서버를 재시작하면 모든 scss 파일에서 utils.scss를 자동으로 불러와서 Sass에서 맨 윗줄에 있는 import 구문을 지워도 정상적으로 작동하게 된다.

profile
호떡 신문지에서 개발자로 환생

0개의 댓글