6. Styling

Nuxt는 스타일링에 있어서 매우 유연하다. 자신만의 스타일을 작성하거나 로컬 및 외부 스타일시트를 참조하기 위해서 CSS 전처리기, CSS 프레임워크, UI 라이브러리 및 Nuxt 모듈을 사용하여 애플리케이션 스타일을 지정할 수 있다.

 

로컬 스타일시트

로컬 스타일시트를 작성하는 경우 이를 배치하는 자연스러운 장소는 assets/ 디렉토리다.

페이지, 레이아웃 및 구성 요소의 스타일시트를 직접 가져올 수 있다. javascript  또는 CSS 문을 임포트 하기위해 @import 문을 사용할 수 있다.

<!-- 
pages/index.vue
-->

<script>
// Use a static import for server-side compatibility
import '~/assets/css/first.css'

// Caution: Dynamic imports are not server-side compatible
import('~/assets/css/first.css')
</script>

<style>
@import url("~/assets/css/second.css");
</style>

힌트) 위의 경우 스타일시트는 Nuxt가 렌더링한 HTML에 인라인된다.

 

CSS 속성

Nuxt 구성에서 css 속성을 사용할 수도 있다. 스타일시트의 자연스러운 위치는 assets/ 디렉토리다. 이 경우 해당 경로를 참조할 수 있으며 Nuxt는 해당 경로를 애플리케이션의 모든 페이지에 포함한다.

// nuxt.config.ts

export default defineNuxtConfig({
  css: ['~/assets/css/main.css']
})

힌트) 위의 경우 스타일시트는 Nuxt가 렌더링한 HTML에 인라인되고 전역적으로 주입되어 모든 페이지에 표시된다.

 

폰트

로컬 글꼴 파일의 위치가 디렉터리 ~/public/, 예를 들어 ~/public/fonts 라고 가정했을 때 url() 를 사용하여 스타일시트에서 참조할 수 있다.

/* assets/css/main.css */

@font-face {
  font-family: 'FarAwayGalaxy';
  src: url('/fonts/FarAwayGalaxy.woff') format('woff');
  font-weight: normal;
  font-style: normal;
  font-display: swap;
}

그런 다음 스타일시트, 페이지 또는 구성 요소에서 이름으로 글꼴을 참조하면 된다.

<style>
h1 {
  font-family: 'FarAwayGalaxy', sans-serif;
}
</style>

 

NPM을 통해 배포되는 스타일시트

npm을 통해 배포되는 스타일시트를 참조할 수도 있다. 인기 있는 라이브러리 animate.css 를 예로 들어 보겠다.

먼저 animate.css 를 설치하자.

npm install animate.css

그런 다음 페이지, 레이아웃 및 구성 요소에서 직접 참조할 수 있다.

<!--
app.vue
-->

<script>
import 'animate.css'
</script>

<style>
@import url("animate.css");
</style>

패키지는 Nuxt 구성의 CSS 속성에서 문자열로 참조될 수도 있다.

// nuxt.config.ts

export default defineNuxtConfig({
  css: ['animate.css']
})

 

외부 스타일시트

nuxt.config 파일의 head 섹션에 링크 요소를 추가하여 애플리케이션에 외부 스타일시트를 포함할 수 있다. 다양한 방법을 사용하여 이 결과를 얻을 수 있으며, 로컬 스타일시트도 이와 같이 포함될 수 있다.


Nuxt 구성의 app.head 속성을 사용하여 헤드를 조작할 수 있다.

// nuxt.config.ts

export default defineNuxtConfig({
  app: {
    head: {
      link: [{ rel: 'stylesheet', href: 'https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css' }]
    }
}})

 

스타일시트를 동적으로 추가하기

useHead 컴포저블을 사용하여 코드의 헤드에 값을 동적으로 설정할 수 있다.

useHead({
  link: [{ rel: 'stylesheet', href: 'https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css' }]
})

힌트) Nuxt는 내부적으로 unhead 를 사용하며 여기에서 전체 문서를 참조할 수 있다.

 

Nitro 플러그인을 사용하여 렌더링된 헤드 수정

더 고급스런 제어가 필요한 경우 후크를 사용하여 렌더링된 HTML을 가로채고 프로그래밍 방식으로 헤드를 수정할 수 있다.

다음과 같이 플러그인을 만듭니다 ~/server/plugins/my-plugin.ts.

// server/plugins/my-plugin.ts

export default defineNitroPlugin((nitro) => {
    nitro.hooks.hook('render:html', (html) => {
    html.head.push('<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css">')
  })
})

외부 스타일시트는 렌더링을 차단하는 리소스다. 즉, 브라우저가 페이지를 렌더링하기 전에 로드 및 처리되어야한다. 불필요하게 큰 스타일이 포함된 웹 페이지는 렌더링하는 데 시간이 더 오래 걸린다. 이에 대한 자세한 내용은 web.dev 에서 읽어볼 수 있다.

 

전처리기 사용

SCSS, Sass, Less 또는 Stylus와 같은 전처리기를 사용하려면 먼저 설치가 필요하다.

# Sass & SCSS
npm install sass

# Less
npm install less

# Stylus
npm install stylus

스타일시트를 작성하는 가장 자연스러운 장소는 assets디렉토리다. 그런 다음 전처리기의 구문을 사용하여 소스 파일을 사용자(또는 레이아웃 파일) app.vue 로 가져올 수 있다.

<!--
pages/app.vue
-->

<style lang="scss">
@use "~/assets/scss/main.scss";
</style>

또는Nuxt 구성의  css 속성을 사용할 수 있다.

// nuxt.config.ts

export default defineNuxtConfig({
  css: ['~/assets/scss/main.scss']
})

힌트) 두 경우 모두, 컴파일된 스타일시트는 Nuxt가 렌더링한 HTML에 인라인된다.

 

색상 변수가 있는 sass 부분 과 같이 사전 처리된 파일에 코드를 삽입해야 하는 경우 vite preprocessors 옵션을 사용하면 된다.

 

assets 디렉터리에 일부분을 만든다.

/* assets/_colors.acss */

$primary: #49240F;
$secondary: #E4A79D;

그런 다음 nuxt.config 파일에

// nuxt.config.ts

export default defineNuxtConfig({
  vite: {
    css: {
      preprocessorOptions: {
        scss: {
          additionalData: '@use "~/assets/_colors.scss" as *;'
        }
      }
    }
  }
})

Nuxt는 기본적으로 Vite를 사용한다. 대신 webpack을 사용하려면 각 전처리기 로더문서를 참고하자.

 

단일 파일 구성 요소(SFC) 스타일 지정

Vue와 SFC의 가장 장점중 하나는 스타일링을 자연스럽게 처리하는 데 매우 뛰어나다는 것이다. 컴포넌트 파일의 스타일 블록에 CSS 또는 전처리기 코드를 직접 작성할 수 있으므로 CSS-in-JS와 같은 것을 사용하지 않고도 환상적인 개발자 경험을 누릴 수 있다. 그러나 CSS-in-JS를 사용하려는 경우 이를 지원하는 제3자 라이브러리 및 모듈(예: pinceau ) 을 찾을 수 있다.


SFC의 구성 요소 스타일링에 대한 포괄적인 참조는 Vue 문서를 참조할 수 있다 .

클래스 및 스타일 바인딩

Vue SFC 기능을 활용하여 클래스 및 스타일 속성으로 구성 요소의 스타일을 지정할 수 있다.

<!-- 
Ref and Reactive
-->

<script setup lang="ts">
const isActive = ref(true)
const hasError = ref(false)
const classObject = reactive({
  active: true,
  'text-danger': false
})
</script>

<template>
  <div class="static" :class="{ active: isActive, 'text-danger': hasError }"></div>
  <div :class="classObject"></div>
</template>
<!--
Computed
-->

<script setup lang="ts">
const isActive = ref(true)
const error = ref(null)

const classObject = computed(() => ({
  active: isActive.value && !error.value,
  'text-danger': error.value && error.value.type === 'fatal'
}))
</script>

<template>
  <div :class="classObject"></div>
</template>
<!--
Array
-->

<script setup lang="ts"> 
const isActive = ref(true)
const errorClass = ref('text-danger')
</script>

<template>
  <div :class="[{ active: isActive }, errorClass]"></div>
</template>
<!--
Style
-->

<script setup lang="ts">
const activeColor = ref('red')
const fontSize = ref(30)
const styleObject = reactive({ color: 'red', fontSize: '13px' })
</script>

<template>
  <div :style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
  <div :style="[baseStyles, overridingStyles]"></div>
  <div :style="styleObject"></div>
</template>

 

동적 스타일 v-bind

v-bind 함수를 사용하여 스타일 블록 내에서 JavaScript 변수 및 표현식을 참조할 수 있다. 이 경우 바인딩은 동적이다. 즉, 변수 값이 변경되면 스타일이 업데이트된다.

<script setup lang="ts">
const color = ref("red")
</script>

<template>
  <div class="text">hello</div>
</template>

<style>
.text {
  color: v-bind(color);
}
</style>

 

범위가 지정된 스타일

범위가 지정된 속성을 사용하면 구성요소의 스타일을 개별적으로 지정할 수 있다. 이 속성으로 선언된 스타일은 이 구성요소에만 적용된다.

<template>
  <div class="example">hi</div>
</template>

<style scoped>
.example {
  color: red;
}
</style>


CSS Modue

module 속성과 함께 CSS Module 을 사용할 수 있습니다 . 주입된  $style 변수를 사용하여 액세스한다.

<template>
  <p :class="$style.red">This should be red</p>
</template>

<style module>
.red {
  color: red;
}
</style>

 

전처리기 지원

SFC 스타일 블록은 전처리기 구문을 지원한다. Vite에는 구성 없이 .scss, .sass, .less, .styl 및 .stylus 파일에 대한 지원이 내장되어 있다. 사전에 설치하기만 하면 SFC에서 lang 속성을 통해 직접 사용할 수 있다.

<!--
SCSS
-->
<style lang="scss">
  /* Write scss here */
</style>


<!--
SASS
-->
<style lang="sass">
  /* Write sass here */
</style>


<!--
LESS
-->
<style lang="less">
  /* Write less here */
</style>


<!--
Stylus
-->
<style lang="stylus">
  /* Write stylus here */
</style>
Vite CSS 문서 및 @vitejs/plugin-vue 문서를 참조할 수 있습니다 . webpack 사용자는 vue loader docs 를 참고하자.

 

PostCSS 사용

Nuxt에는 postcss가 내장되어 있다. nuxt.config 파일 에서 구성할 수 있다.

// nuxt.config.ts

export default defineNuxtConfig({
  postcss: {
    plugins: {
      'postcss-nested': {}
      "postcss-custom-media": {}
    }
  }
})

SFC에서 적절한 구문 강조를 위해 postcss lang 속성을 사용할 수 있다.

<style lang="postcss">
  /* Write stylus here */
</style>

기본적으로 Nuxt에는 다음 플러그인이 이미 사전 구성되어 있다:

  • postcss-import : @import 규칙 개선.
  • postcss-url : url() 명령문을 변환.
  • autoprefixer : 공급업체 접두사를 자동으로 추가.
  • cssnano : 축소 및 제거.

다양한 스타일에 대한 레이아웃 활용

애플리케이션의 여러 부분을 완전히 다른 스타일로 지정해야 하는 경우 레이아웃을 사용할 수 있다. 다양한 레이아웃에 다양한 스타일을 사용해보자.

<template>
  <div class="default-layout">
    <h1>Default Layout</h1>
    <slot />
  </div>
</template>

<style>
.default-layout {
  color: red;
}
</style>

참고) 레이아웃

 

타사 라이브러리 및 모듈

Nuxt는 스타일링에 있어서 독단적이지 않으며 다양한 옵션을 제공한다. UnoCSS 또는 Tailwind CSS 와 같은 널리 사용되는 라이브러리 등 원하는 스타일 도구를 사용할 수 있다.


커뮤니티와 Nuxt 팀은 통합을 더 쉽게 만들기 위해 많은 Nuxt 모듈을 개발했다. 웹사이트의 모듈 섹션 에서 찾을 수 있다 . 다음은 시작하는 데 도움이 되는 몇 가지 모듈이다.

  • UnoCSS : 즉각적인 온디멘드 원자 CSS 엔진.
  • Tailwind CSS : 유틸리티 우선 CSS 프레임워크.
  • Fontaine : 글꼴 메트릭 폴백
  • Pinceau : 적응형 스타일링 프레임워크.
  • Nuxt UI : 최신 웹 앱을 위한 UI 라이브러리.

Nuxt 모듈은 즉시 사용 가능한 훌륭한 개발자 경험을 제공하지만, 즐겨 사용하는 도구에 모듈이 없다고 해서 Nuxt와 함께 사용할 수 없다는 의미는 아니다. 자신의 프로젝트에 맞게 직접 구성할 수 있다. 도구에 따라 Nuxt 플러그인을 사용 하거나 자신만의 모듈을 만들어야 할 수도 있다. 그럴경우 커뮤니티 와 공유하자!


쉽게 웹폰트 로드

Nuxt Google Fonts 모듈을 사용하여 Google Fonts를 로드 할 수 있다 .


UnoCSS를 사용하는 경우 Google 글꼴 등을 포함된 일반 공급자의 글꼴을 편리하게 로드할 수 있는 웹 글꼴 사전 설정이 함께 제공된다.

 

Transition

Nuxt는 Vue와 동일한 <Transition> 요소를 제공하며 실험적인 View Transitions API 도 지원합니다.

 

 

글꼴 고급 최적화

CLS를 줄이려면 Fontaine을 사용하는 것이 좋다 . 더 고급 기능이 필요한 경우 Nuxt 모듈을 생성하여 빌드 프로세스 또는 Nuxt 런타임을 확장하는 것을 고려해봐야한다.


응용 프로그램의 스타일을 보다 쉽고 효율적으로 만들려면 웹 생태계에서 사용할 수 있는 다양한 도구와 기술을 활용하는 것을 항상 기억하자. 네이티브 CSS, 전처리기, postcss, UI 라이브러리 또는 모듈을 사용하든 Nuxt가 도와준다.


LCP 고급 최적화

전역 CSS 파일의 다운로드 속도를 높이려면 다음을 수행할 수 있다.

  • 파일이 사용자에게 물리적으로 더 가깝도록 CDN을 사용.
  • Brotli를 사용하여 애셋을 압축.
  • 전송에 HTTP2/HTTP3 사용
  • 동일한 도메인에 애셋을 호스팅(다른 하위 도메인을 사용하지 말것).

Cloudflare, Netlify 또는 Vercel과 같은 최신 플랫폼을 사용하는 경우 이러한 작업의 대부분은 자동으로 수행되어야 한다. web.dev 에서 LCP 최적화 가이드를 찾을 수 있다 .


모든 CSS가 Nuxt에 의해 인라인되면 렌더링된 HTML에서 외부 CSS 파일이 참조되는 것을 (실험적으로) 완전히 중지할 수 있다. 모듈이나 Nuxt 구성 파일에 배치할 수 있는 후크를 사용하면된다.

// nuxt.config.ts

export default defineNuxtConfig({
  hooks: {
    'build:manifest': (manifest) => {
      // find the app entry, css list
      const css = manifest['node_modules/nuxt/dist/app/entry.js']?.css
      if (css) {
        // start from the end of the array and go to the beginning
        for (let i = css.length - 1; i >= 0; i--) {
          // if it starts with 'entry', remove it from the list
          if (css[i].startsWith('entry')) css.splice(i, 1)
        }
      }
    },
  },
})

'Nuxt 공식문서 번역 > 개요' 카테고리의 다른 글

8. SEO 와 Meta  (0) 2023.12.10
7. 라우팅  (0) 2023.12.10
5. Assets  (1) 2023.12.10
4. Views  (1) 2023.12.10
3. 설치 및 구성  (1) 2023.12.10
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유