[Next.js] Custom App

2022. 7. 1. 16:41·Next.js/이론
반응형

Styles JSX는 현재 컴포넌트만 scope로 가진다. 

그렇게 되면 전역으로 css 속성을 주고 싶은 경우 모든 컴포넌트에 하나하나 입력해야하는데, 그렇게 되면 

너무 귀찮아지고 실수가 발생할 수 있어 현실적으로 불가능하다. 

 

그럴때 사용할 수 있는 방법이 global 속성과 _app.js이다. 

 

global 

import NavBar from "../components/NavBar";

const Home = () => {
  return (
    <div>
      <NavBar />
      <h1>Home</h1>

      <style jsx global>
        {`
          a {
            color: white;
          }
        `}
      </style>
    </div>
  );
};

export default Home;

jsx 옆에 global 옵션을 준다면 해당 컴포넌트와 자식 컴포넌트, 부모 컴포넌트에게도 영향을 주는 css 속성이 된다. 

하지만, 이것 역시 " 사용된 " 컴포넌트를 기준으로 속성이 적용된다. 

 

만약 

Home 컴포넌트와 About 컴포넌트가 있으며, 둘다 NavBar 라는 컴포넌트를 자식으로 가지고 있다고 생각해보자. 

Home 컴포넌트에서 global 옵션을 준다면 Home 컴포넌트와 NavBar 컴포넌트만 영향을 받고 

About 컴포넌트는 변화가 없이 그대로다. 반대의 경우인 About 컴포넌트에 주면 Home 컴포넌트는 변화가 없다.

 

이런 문제를 해결하기 위해서 _app.js를 사용한다. 

 

_app.js

Next.js의 모든 컴포넌트는 컴포넌트가 렌더링되기 전에 _app.js를 거쳐서 렌더링이 된다.  

 

export default function App({ Component, pageProps }) {
  return <Component {...pageProps} />;
}

가장 기본적인 _app.js의 형태이다. 

 

export default function App({ Component, pageProps }) {
  return (
    <div>
      <Component {...pageProps} />
      <span>Holla!</span>
    </div>
  );
}

여기에 추가로 태그를 넣는 등 작업을 한다면 모든 컴포넌트에서 동일하게 적용된다. 

Holla! 라는 span 태그가 모든 컴포넌트에 나오게 되는 것이다. 

 

import NavBar from "../components/NavBar";

export default function App({ Component, pageProps }) {
  return (
    <>
      <NavBar />
      <Component {...pageProps} />

      <style jsx global>
        {`
          a {
            color: white;
          }
        `}
      </style>
    </>
  );
}

이런 특성을 활용하면 각 컴포넌트에 있던 NavBar 태그와 공통으로 적용하고 싶었던 style을 한번에 적용할 수 있다. 

또한 _app.js에서만 css를 임포트할 수 있고, 다른 컴포넌트에서는 css 파일을 임포트할 수 없다. 

 

그러므로 css 파일을 적용하고 싶을 때도 _app.js에서 적용해줄 수 있다. 

import NavBar from "../components/NavBar";
import "../styles/globals.css";

export default function App({ Component, pageProps }) {
  return (
    <>
      <NavBar />
      <Component {...pageProps} />

      <style jsx global>
        {`
          a {
            color: white;
          }
        `}
      </style>
    </>
  );
}

만약 다른 컴포넌트에서 css 파일을 호출할 경우 

error - ./styles/globals.css
Global CSS cannot be imported from files other than your Custom <App>. Due to the Global nature of stylesheets, and to avoid conflicts, Please move all first-party global CSS imports to pages/_app.js. Or convert the import to Component-Level CSS (CSS Modules).
Read more: https://nextjs.org/docs/messages/css-global
Location: pages\about.js

위와 같은 에러를 발생시키며, .app.js에 적용을 시켜달라는 안내 에러가 나온다. 

반응형
저작자표시 비영리 변경금지 (새창열림)

'Next.js > 이론' 카테고리의 다른 글

[Next.js] Redirect & Rewrite  (1) 2022.07.03
[Next.js] Pattern & Head  (1) 2022.07.02
[Next.js] Styles JSX  (2) 2022.06.30
[Next.js] CSS 모듈  (1) 2022.06.29
[Next.js] Routing  (0) 2022.06.28
'Next.js/이론' 카테고리의 다른 글
  • [Next.js] Redirect & Rewrite
  • [Next.js] Pattern & Head
  • [Next.js] Styles JSX
  • [Next.js] CSS 모듈
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (789)
      • 개발정보 (36)
      • 개발환경 (7)
      • 개발생활 (19)
      • React (141)
        • 이론 (23)
        • 기능 (12)
        • 실험실 (88)
        • 버그 (6)
        • 패스트캠퍼스 (9)
        • Npm (3)
      • React Native (28)
        • 공통 (6)
        • TypeScript (3)
        • JavaScript (18)
        • 버그 (1)
      • Next.js (30)
        • 이론 (13)
        • 실험실 (13)
        • 버그 (3)
      • Web (35)
      • 알고리즘 (202)
        • 풀이 힌트 (39)
      • JavaScript (47)
      • TypeScript (29)
        • 기초 (27)
        • 실험실 (2)
      • Node.js (13)
        • 이론 (0)
        • 기능 (3)
        • 실험실 (9)
        • 버그 (1)
      • 도커 (4)
      • CCNA (22)
        • 이론 (4)
        • 문제 (18)
      • 취미생활 (167)
        • 잉여로운 칵테일 (2)
        • 잉여의 식물키우기 (130)
        • 잉여로운 여행기 (11)
        • 잉여의 제2외국어 (21)
        • 잉여로운 책장 (2)
      • Java (1)
        • Java의 정석 (1)
      • 꿀팁 공유 (3)
  • 태그

    알고리즘
    덤프
    영어독학
    타입스크립트
    식물
    다이소
    webpack
    Node.js
    프로그래머스
    redux
    리얼학습일기
    ReactNative
    react
    바질
    CSS
    javascript
    리액트
    Docker
    타일러영어
    자바스크립트
    리얼클래스
    Babel
    next.js
    네이버 부스트캠프
    바질 키우기
    네트워크
    typescript
    영어회화
    ChatGPT
    CCNA
  • hELLO· Designed By정상우.v4.10.1
잉여개발자
[Next.js] Custom App
상단으로

티스토리툴바