Nuxt
Nuxt.js
What is Nuxt.js
- Vue.js 어플리테이션을 만드는 프레임워크
- 비동기 데이터, 미들웨어, 레이아웃 등과 같이 클라이언트 측, 서버 측 사이에 많은 기능 제공
Function
- Vue2
- Vue Router
- Vuex
- Vue Server Renderer
- Vue-meta
Feature
- Vue 파일 쓰기
- 코드 분할 자동화
- 서버 사이드 렌더링
- 라우팅 시스템
- 정적 파일 전송
- ES2015+ 지원
- JS & CSS 코드 번들링 및 압축
- 전처리기 지원: SASS, LESS, Stylus 등
Use Nuxt Template
- starter 템플릿 다운로드 및 설치(vue-cli)
vue-cli가 설치되지 않았다면,vue init nuxt-community/starter-template <project-name>npm install -g @vue/cli @vue/cli-init - 설치
cd <project-name> npm install - 프로젝트 실행(localhost:3000)
npm run dev
Starting from scratch
- 빈 디렉토리 생성
mkdir <project-name> cd <project-name> - package.json 수정
{ "name": "my-app", "scripts": { "dev": "nuxt" } }
nuxt를 어떻게 실행할 것인지 명시, scripts는 npm run dev 명령어를 통해 Nuxt.js를 실행할 것임-
Nuxt 설치
npm install --save nuxt -
pages 폴더
Nuxt.js는 pages 디렉토리 내의 모든 *.vue 파일을 애플리케이션의 라우트로 변환함
pages 디렉토리를 생성
mkdir pages -
pages/index.vue에 첫 번째 페이지 생성
<template> <h1>Hello world!</h1> </template> -
프로젝트 실행
npm run dev
Directory Structure
- Assets
- Less, SASS, Javascript 같은 컴파일되지 않은 asset들을 포함하는 디렉토리
- Components
- Vue.js 컴포넌트를 포함하는 디렉토리
- Layouts
- 애플리케이션의 레이아웃을 포함하는 디렉토리
- 이 디렉토리 이름은 변경할 수 없음
- Middleware
- 애플리케이션의 미들웨어를 포함하는 디렉토리
- 페이지나 레이아웃이 렌더링되기 전에 실행할 사용자 정의 함수를 정의할 수 있음
- Pages
- 애플리케이션의 뷰와 라우트를 포함하는 디렉토리
- Nuxt.js는 모든 .vue파일을 읽고 애플리케이션의 라우터를 생성
- 이 디렉토리 이름은 변경할 수 없음
- Plugins
- vue.js 애플리케이션이 생성되기 전 실행하고 싶은 자바스크립트 플러그인을 포함하는 디렉토리
- Static
- 정적 파일들을 포함하는 디렉토리
- 파일들은 /에 연결됨
- ex) /static/robots.txt 은 /robots.txt 로 연결
- 이 디렉토리 이름은 변경할 수 없음
- Store
- Vuex Store 파일을 포함하는 디렉토리
- Vuex Store 옵션은 Nuxt.js 프레임워크에 의해 실행되며, index.js 파일을 생성하면 프레임워크가 자동으로 옵션을 활성화함
- 이 디렉토리 이름은 변경할 수 없음
- nuxt.config.js
- 사용자 정의 설정 파일
- 이 디렉토리 이름은 변경할 수 없음
- package.json
- 애플리케이션의 의존성과 스크립트를 포함하는 파일
- 이 디렉토리 이름은 변경할 수 없음
Aliases
| 별칭 | 디렉토리 |
|---|---|
| ~ or @ | srcDir |
| ~~ or @@ | rootDir |
srcDir은 rootDir와 같음INFO: vue 템플릿 내에서 assets 이나 static 디렉토리에 링크할 필요가 있다면 ~assets/your_image.png, ~static/your_image.png 처럼 입력해야 함
Configuration
- build
- 생성된 vendor.bundle.js 파일에 모듈을 추가하여 앱 번들의 크기를 줄일 수 있음
- 외부 모듈 사용 시 정말 유용
- cache
- 캐시된 컴포넌트를 사용하여 렌더링 성능을 향상시킬 수 있음
- css
- 모든 페이지에서 전역으로 사용할 CSS파일 / 모듈 / 라이브러리 파일을 설정할 수 있음
- dev
- nuxt.js의 개발 또는 프로덕션 모드를 정의 할 수 있음
- env
- 클라이언트 및 서버에서 사용 가능한 환경 변수를 정의 할 수 있음
- generate
- 어플리케이션에서 Nuxt.js가 HTML 파일로 변환할 모든 동적인 경로에 대한 각각의 params 값을 정의 할 수 있음
- head
- 애플리케이션의 모든 기본 메타를 정의 할 수 있음
- loading
- Nuxt.js를 사용하여 기본적으로 불러올 loading 컴포넌트를 사용자 정의 할 수 있음
- plugins
- 루트 vue.js 어플리케이션을 인스턴스화 하기 전에 실행할 Javascript 플러그인을 정의 할 수 있음
- rootDir
- nuxt.js 어플리케이션의 위치를 정의 할 수 있음
- router
- vue-router의 기본적인 Nuxt.js 구성을 덮어 쓸 수 있음
- srcDir
- nuxt.js 어플리케이션의 src 디렉토리를 정의 할 수 있음
- transition
- 페이지 transition 기능의 기본 속성을 정의 할 수 있음
Routing
- 기본 라우트
pages/ --| user/ -----| index.vue -----| one.vue --| index.vue
router: { routes: [ { name: 'index', path: '/', component: 'pages/index.vue' }, { name: 'user', path: '/user', component: 'pages/user/index.vue' }, { name: 'user-one', path: '/user/one', component: 'pages/user/one.vue' } ] }-
동적 라우트
파라메터가 있는 동적 라우트를 정의하기 위해서는 앞에 밑줄이 붙은 .vue 파일이나 폴더를 정의해야 함
pages/ --| _slug/ -----| comments.vue -----| index.vue --| users/ -----| _id.vue --| index.vuerouter: { routes: [ { name: 'index', path: '/', component: 'pages/index.vue' }, { name: 'users-id', path: '/users/:id?', component: 'pages/users/_id.vue' }, { name: 'slug', path: '/:slug', component: 'pages/_slug/index.vue' }, { name: 'slug-comments', path: '/:slug/comments', component: 'pages/_slug/comments.vue' } ] }
3. 라우트 파라미터의 유효성 페트
ex) pages/users/_id.vue export default { validate ({ params }) { // Must be a number return /^\d+$/.test(params.id) } }만약 validate 메소드가 true를 반환하지 않는다면 Nuxt.js는 자동으로 404 error 페이지를 로딩할 것
4. 중첩 라우트
- 자식 뷰를 포함하고 있는 폴더와 같은 이름 으로 Vue 파일을 생성해야 함
- 부모 컴포넌트(.vue file)에
<nuxt-child/>태그 필수pages/ --| users/ -----| _id.vue -----| index.vue --| users.vuerouter: { routes: [ { path: '/users', component: 'pages/users.vue', children: [ { path: '', component: 'pages/users/index.vue', name: 'users' }, { path: ':id', component: 'pages/users/_id.vue', name: 'users-id' } ] } ] }
- 동적 중첩 라우트
pages/ --| _category/ -----| _subCategory/ --------| _id.vue --------| index.vue -----| _subCategory.vue -----| index.vue --| _category.vue --| index.vuerouter: { routes: [ { path: '/', component: 'pages/index.vue', name: 'index' }, { path: '/:category', component: 'pages/_category.vue', children: [ { path: '', component: 'pages/_category/index.vue', name: 'category' }, { path: ':subCategory', component: 'pages/_category/_subCategory.vue', children: [ { path: '', component: 'pages/_category/_subCategory/index.vue', name: 'category-subCategory' }, { path: ':id', component: 'pages/_category/_subCategory/_id.vue', name: 'category-subCategory-id' } ] } ] } ] }
Transition
Global Settings
Nuxt.js의 기본 트랜지션 이름은"page"Middleware
- 모든 미들웨어는 middleware/ 디렉토리에 있어야 함. 파일 이름은 곧 미들웨어의 이름(ex- middleware/auth.js는 auth 미들웨어가 됨
Views
-
Document
- HTML file
- 커스터마이징 가능
- html 템플릿을 확장하기 위해
app.html - 기본 템플릿
<!DOCTYPE html> <html {{ HTML_ATTRS }}> <head {{ HEAD_ATTRS }}> {{ HEAD }} </head> <body {{ BODY_ATTRS }}> {{ APP }} </body> </html> -
Lyaout
- Vue compoennt + Nuxt options: middleware and head
- 기본 레이아웃
<!-- layouts/default.vue --> <template> <nuxt/> <!-- 페이지 컴포넌트를 레이아웃에 렌더링하기 위하여 --> </template>- 에러 페이지
layouts/error.vue파일 추가- 태그 포함 X
- 사용자 정의 레이아웃
- 페이지 컴포넌트를 레이아웃에 렌더링하기 위하여 태그 작성
- layouts/blog.vue
<template> <div> <div>My blog navigation bar here</div> <nuxt/> </div> </template><script> export default { layout: 'blog' } </script>
-
Page
- Vuew component supercharged with Nuxt options (asyncData, fetch, head, layout, middleware, scrollToTop, transition, validate)
- asyncData: 비동기적으로 만들 수 있음
- fetch: 페이지가 렌더링되기 전에 스토어를 채우기 위해 사용됨
- head: 현재 페이지에 대한 특정 메타 태그 설정
- layout: layouts 폴더에 정의된 레이아웃을 지정할 수 있음
- transition: 페이지에 대한 특정 트랜지션 설정
- scrollToTop: 리본값은 false. 페이지를 렌더링하기 전에 페이지를 맨 위로 스크롤할 것인지, 중첩 라우트를 위해 사용됨
- validate: 동적 라우트에 대한 유효성 검사
- middleware: 페이지를 렌더링하기 전에 호출됨
-
HTML Head
Nuxt는headers와html attributes를 갱신하기 위해 vue-meta를 사용
// vue-meta 옵션
{
keyName: 'head', // the component option name that vue-meta looks for meta info on.
attribute: 'data-n-head', // the attribute name vue-meta adds to the tags it observes
ssrAttribute: 'data-n-head-ssr', // the attribute name that lets vue-meta know that meta info has already been server-rendered
tagIDKeyName: 'hid' // the property name that vue-meta uses to determine whether to overwrite or append a tag
}
- 기본 메타 태그
- Nuxt.js를 사용하면
nuxt.config.js에 head 속성을 사용함으로써 기본 메타를 정의할 수 있음( - ex) 사용자 정의 구글 폰트, 사용자 정의 뷰포트 설정
- Nuxt.js를 사용하면
댓글
댓글 쓰기