Nuxt 레이어 작성하기

Nuxt는 기본 파일, 설정 등을 확장할 수 있는 강력한 시스템을 제공합니다.

Nuxt 레이어는 모노레포 내에서, 또는 git 저장소나 npm 패키지에서 부분적인 Nuxt 애플리케이션을 공유하고 재사용할 수 있는 강력한 기능입니다. 레이어의 구조는 표준 Nuxt 애플리케이션과 거의 동일하여 작성 및 유지 관리가 쉽습니다.

Read more in Docs > Getting Started > Layers.

최소한의 Nuxt 레이어 디렉터리에는 레이어임을 나타내는 nuxt.config.ts 파일이 포함되어야 합니다.

base/nuxt.config.ts
export default defineNuxtConfig({})

또한, 레이어 디렉터리 내의 특정 파일들은 Nuxt에 의해 자동으로 스캔되어 이 레이어를 확장하는 프로젝트에서 사용됩니다.

기본 예시

export default defineNuxtConfig({
  extends: [
    './base'
  ]
})

스타터 템플릿

시작하려면 nuxt/starter/layer template로 레이어를 초기화할 수 있습니다. 이 템플릿은 확장할 수 있는 기본 구조를 생성합니다. 터미널에서 다음 명령어를 실행하여 시작하세요:

Terminal
npm create nuxt -- --template layer nuxt-layer

다음 단계는 README 지침을 따라 진행하세요.

레이어 배포하기

원격 소스나 npm 패키지를 사용하여 레이어를 배포하고 공유할 수 있습니다.

Git 저장소

Nuxt 레이어를 공유하기 위해 git 저장소를 사용할 수 있습니다. 몇 가지 예시는 다음과 같습니다:

nuxt.config.ts
export default defineNuxtConfig({
  extends: [
    'github:username/repoName',        // GitHub 원격 소스
    'github:username/repoName/base',   // /base 디렉터리 내 GitHub 원격 소스
    'github:username/repoName#dev',    // dev 브랜치의 GitHub 원격 소스
    'github:username/repoName#v1.0.0', // v1.0.0 태그의 GitHub 원격 소스
    'gitlab:username/repoName',        // GitLab 원격 소스 예시
    'bitbucket:username/repoName',     // Bitbucket 원격 소스 예시
  ]
})
비공개 원격 소스를 확장하려면, 토큰을 제공하기 위해 환경 변수 GIGET_AUTH=<token>을 추가해야 합니다.
자체 호스팅된 GitHub 또는 GitLab 인스턴스의 원격 소스를 확장하려면, 해당 URL을 GIGET_GITHUB_URL=<url> 또는 GIGET_GITLAB_URL=<url> 환경 변수로 제공하거나, 설정의 auth 옵션에서 직접 구성해야 합니다.
원격 소스를 레이어로 확장하는 경우, Nuxt 외부에서 해당 의존성에 접근할 수 없다는 점을 유의하세요. 예를 들어, 원격 레이어가 eslint 플러그인에 의존한다면, 해당 플러그인은 eslint 설정에서 사용할 수 없습니다. 이는 이러한 의존성이 패키지 매니저에서 접근할 수 없는 특별한 위치(node_modules/.c12/layer_name/node_modules/)에 위치하기 때문입니다.
git 원격 소스를 사용할 때, 레이어에 npm 의존성이 있고 이를 설치하고 싶다면, 레이어 옵션에 install: true를 지정하여 설치할 수 있습니다.
nuxt.config.ts
export default defineNuxtConfig({
  extends: [
    ['github:username/repoName', { install: true }]
  ]
})

npm 패키지

Nuxt 레이어를 확장하고자 하는 파일과 의존성을 포함하는 npm 패키지로 배포할 수 있습니다. 이를 통해 설정을 다른 사람과 공유하거나, 여러 프로젝트에서 사용하거나, 비공개로 사용할 수 있습니다.

npm 패키지에서 확장하려면, 해당 모듈이 npm에 배포되어 있고 사용자의 프로젝트에 devDependency로 설치되어 있어야 합니다. 그런 다음 모듈 이름을 사용하여 현재 nuxt 설정을 확장할 수 있습니다:

nuxt.config.ts
export default defineNuxtConfig({
  extends: [
    // scope가 있는 노드 모듈
    '@scope/moduleName',
    // 또는 모듈 이름만
    'moduleName'
  ]
})

레이어 디렉터리를 npm 패키지로 배포하려면, package.json에 올바른 속성이 채워져 있는지 확인해야 합니다. 이렇게 하면 패키지 배포 시 파일이 포함됩니다.

package.json
{
  "name": "my-theme",
  "version": "1.0.0",
  "type": "module",
  "main": "./nuxt.config.ts",
  "dependencies": {},
  "devDependencies": {
    "nuxt": "^3.0.0"
  }
}
레이어에서 import하는 모든 의존성은 명시적으로dependencies에 추가되어야 합니다. nuxt 의존성 및 배포 전 레이어 테스트에만 사용되는 항목은 devDependencies 필드에 남겨두세요.

이제 모듈을 공개 또는 비공개로 npm에 배포할 수 있습니다.

레이어를 비공개 npm 패키지로 배포할 때는, 노드 모듈을 다운로드하기 위해 npm에 로그인하여 인증해야 합니다.

이름이 지정된 레이어 별칭

자동으로 스캔되는 레이어(~~/layers 디렉터리에서)는 자동으로 별칭을 생성합니다. 예를 들어, ~~/layers/test 레이어는 #layers/test로 접근할 수 있습니다.

다른 레이어에 대해 이름이 지정된 레이어 별칭을 만들고 싶다면, 레이어의 설정에서 이름을 지정할 수 있습니다.

nuxt.config.ts
export default defineNuxtConfig({
  $meta: {
    name: 'example',
  },
})

이렇게 하면 #layers/example 별칭이 생성되어 해당 레이어를 가리킵니다.

상대 경로와 별칭

레이어의 컴포넌트와 컴포저블에서 글로벌 별칭(~/, @/ 등)을 사용하여 import할 때, 이 별칭들은 사용자의 프로젝트 경로를 기준으로 해석된다는 점에 유의하세요. 이를 우회하려면 상대 경로를 사용하거나, 이름이 지정된 레이어 별칭을 사용할 수 있습니다.

또한 레이어의 nuxt.config 파일에서 상대 경로를 사용할 때(중첩된 extends는 예외), 이 경로들은 레이어가 아닌 사용자의 프로젝트를 기준으로 해석됩니다. 이를 우회하려면, nuxt.config에서 전체 해석된 경로를 사용하세요:

nuxt.config.ts
import { fileURLToPath } from 'url'
import { dirname, join } from 'path'

const currentDir = dirname(fileURLToPath(import.meta.url))

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

Nuxt 모듈을 위한 멀티 레이어 지원

내부 배열 nuxt.options._layers를 사용하여 모듈에 대한 커스텀 멀티 레이어 처리를 지원할 수 있습니다.

modules/my-module.ts
export default defineNuxtModule({
  setup(_options, nuxt) {
    for (const layer of nuxt.options._layers) {
      // 각 레이어에 대해 커스텀 디렉터리 존재 여부를 확인하여 확장할 수 있습니다
      console.log('Custom extension for', layer.cwd, layer.config)
    }
  }
})

참고:

  • _layers 배열에서 앞쪽 항목일수록 우선순위가 높으며, 뒤쪽 항목을 덮어씁니다
  • 사용자의 프로젝트가 _layers 배열의 첫 번째 항목입니다

더 깊이 알아보기

설정 로딩 및 extends 지원은 unjs/c12에서 처리하며, unjs/defu로 병합되고, 원격 git 소스는 unjs/giget로 지원됩니다. 더 자세한 내용은 문서와 소스 코드를 참고하세요.

GitHub에서 레이어 지원을 위한 지속적인 개발 현황을 확인하세요.