NUXT SSR 초급 입문 노트(소결)

9638 단어 NUXTSSR입문 하 다
nuxt 는 vue 를 바탕 으로 개발 한 응용 프레임 워 크 로 가장 많이 사용 되 는 것 은 ssr 를 만 드 는 것 이다.그렇다면 ssr 는 무엇 일 까?이것 은 상대 적 인 개념 인 csr 를 언급 해 야 한다.
CSR & SSR
웹 페이지 개발 은 이전의 jsp,php 에서 현재 의 3 대 프레임 워 크 인 angular react vue 로 바 뀌 었 습 니 다.사실은 csr 에서 ssr 로 바 뀌 었 습 니 다.즉,서버 렌 더 링 에서 클 라 이언 트 렌 더 링 으로 바 뀌 었 습 니 다.
사용 경험 이 있 는 것 은 대충 알 고 있 습 니 다.예 를 들 어 이전의 phop 개발 은 웹 페이지 내용 과 서버 코드 논 리 를 함께 쓴 것 입 니 다.클 라 이언 트 가 요청 할 때 서버 는 phop 엔진 의 렌 더 링 을 통 해 완전한 html 페이지 를 생 성하 여 클 라 이언 트 에 게 되 돌려 줍 니 다.이런 렌 더 링 된 페이지 는 브 라 우 저 에서 오른쪽 단 추 를 누 르 면 원본 코드 를 볼 수 있 습 니 다.페이지 의 모든 html 코드 를 볼 수 있 습 니 다.한편,클 라 이언 트 렌 더 링 은 vue 와 같 습 니 다.돌아 오 는 것 은 app 노드 에 걸 려 있 는 html 파일 과 js 파일 만 있 고 페이지 의 내용 은 모두 클 라 이언 트 의 js 렌 더 링 에서 생 성 되 었 습 니 다.그래서 html 텍스트 가 있 는 위 치 는 CSR(클 라 이언 트 렌 더 링)과 SSR(서버 렌 더 링)의 가장 본질 적 인 구분 입 니 다.
웹 개발 이 ssr 에서 csr 로 넘 어간 이상 우 리 는 왜 다시 ssr 를 하 는 것 입 니까?이것 은 쌍방의 장단 점 과 관련된다.
SSR:
장점:
SEO 에 편리 하고 완전한 html 를 렌 더 링 하 는 것 이 검색엔진 의 캡 처 에 더욱 유리 합 니 다.
페이지 에 불 러 오 는 흰색 화면 시간 이 짧 습 니 다(거의 없습니다).
단점:
페이지 를 불 러 올 때마다 서버 에 요청 을 해 야 합 니 다.서버 의 렌 더 링 부하 가 무 겁 고 요청 이 느 립 니 다.
불 러 올 때마다 페이지 를 새로 고 칩 니 다.페이지 의 작은 영역 만 바 꿔 야 하 더 라 도.
CSR:
장점:
페이지 는 우수한 성능 을 가지 고 페이지 의 상호작용 에 더욱 유리 하 다.
단점:
SEO 에 불리 하 다
첫 페이지 에서 흰색 화면 을 초기 화 하 는 데 시간 이 오래 걸 립 니 다.
우리 가 보편적으로 3 대 프레임 워 크 를 사용 하 는 오늘날,만약 우리 의 페이지 가 SEO 에 대한 좋 은 지원 이 필요 하 다 면,이것 은 우리 가 ssr 를 해 야 한다.NUXT 프로젝트 초기 화
다음 명령 을 사용 하여 비계 생 성 항목 을 호출 합 니 다.비계 옵션 은 필요 에 따라 선택 하면 됩 니 다.

npx create-nuxt-app <   >
생 성 된 디 렉 터 리 구 조 는 다음 과 같 습 니 다.
 
.nuxt
캐 시 디 렉 터 리 실행
assets
자원 디 렉 터 리,css 파일,js 파일,그림 저장 에 사용
components
vue 구성 요 소 를 저장 하 는 데 사용 되 는 구성 요소 디 렉 터 리
layouts
레이아웃 디 렉 터 리 는 레이아웃 을 설정 하 는 데 사 용 됩 니 다.파일 이름 은 레이아웃 이름 입 니 다.
페이지 디 렉 터 리 에 있 는 구성 요 소 는 layot 속성 을 통 해 레이아웃 구성 요 소 를 지정 할 수 있 으 며 기본 값 을 default 로 지정 하지 않 습 니 다.
레이아웃 구성 요소 에서<nuxt />탭 을 사용 하여 레이아웃 을 지정 할 때 page 구성 요소 가 있 는 위 치 를 지정 합 니 다.
middleware
미들웨어 디 렉 터 리 는 미들웨어 함 수 를 설정 하 는 데 사 용 됩 니 다.파일 이름 은 미들웨어 이름 입 니 다.
pages 디 렉 터 리 에 있 는 구성 요 소 는 middleware 속성 을 통 해 미들웨어 함 수 를 지정 할 수 있 습 니 다.미들웨어 는 구성 요소 가 렌 더 링 되 기 전에 실 행 됩 니 다.
pages
페이지 디 렉 터 리 는 경로 페이지 를 설정 하 는 데 사 용 됩 니 다.디 렉 터 리 에 있 는 vue 파일 은 해당 경로 설정 을 자동 으로 생 성 합 니 다.
다음 디 렉 터 리 구조 에 대응 하 는 설정:

pages/
--| _slug/
-----| comments.vue
-----| index.vue
--| users/
-----| _id.vue
--| index.vue

router: {
 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'
  }
 ]
}
nuxt 에서 사용<nuxt-link>대체<router-link>nuxt 는 page 구성 요소 에 추가 설정 항목 을 제공 합 니 다.다음 과 같이 자주 사용 합 니 다.
  • layot 는 현재 페이지 에 사용 할 레이아웃(layouts 루트 디 렉 터 리 의 레이아웃 파일)을 지정 합 니 다.
  • vaidate 검사 방법 은 동적 경로 의 인 자 를 검사 하 는 데 사 용 됩 니 다.
  • middleware 가 지정 한 페이지 의 미들웨어 함수 입 니 다.미들웨어 함 수 는 페이지 가 렌 더 링 되 기 전에 호출 되 고 middleware 폴 더 의 미들웨어 이름 으로 지정 할 수 있 습 니 다.
  • asyncData 는 비동기 데이터 처 리 를 지원 합 니 다.page 구성 요소 에 비동기 데 이 터 를 요청 하고 대상 의 data 를 구성 요소 의 data 에 덮어 씁 니 다.
  • fetch 는 페이지 를 렌 더 링 하기 전에 데이터 충전 응용 상태 트 리(store)를 가 져 오 는 데 사 용 됩 니 다.다른 것 은 fetch 방법 으로 구성 요소 의 데 이 터 를 설정 하지 않 습 니 다.
  • plugins
    플러그 인 디 렉 터 리,제3자 모듈 도입 에 사용,
    element-ui.js:
    
    import Vue from 'vue'
    import Element from 'element-ui'
    import locale from 'element-ui/lib/locale/lang/en'
    
    Vue.use(Element, { locale })
    그리고 nuxt.config.js 의 plugins 에 도입 할 수 있 습 니 다.
    
    plugins: [
      '@/plugins/element-ui'
     ],
    server
    서버 디 렉 터 리
    static
    정적 파일 디 렉 터 리
    store
    vuex 디 렉 터 리,index.js 주 파일,다른 파일 은 기본적으로 module 모듈 로 설정 되 며,기본적으로 namespace 를 사용 합 니 다.
    파일 형식:
    
    export const state = () => ({
      // state
    })
    
    export const actions = {
      // actions
    }
    
    export const mutations = {
      // mutations
    }
    index.js 의 actions 에서 nuxtServerInit 를 설정 할 수 있 습 니 다.서버 에서 클 라 이언 트 로 데 이 터 를 전송 할 수 있 습 니 다.
    구체 적 으로 사용 하 다
    만 든 항목 은 다음 과 같 습 니 다:

    초기 항목 을 실행 합 니 다.효 과 는 다음 과 같 습 니 다.
     
    레이아웃 사용
    layouts 에서 새 파일 my Layout.vue
    
    <template>
     <div>
      <header>
       <h2>I am header</h2>
      </header>
      <main>
       <nuxt />
      </main>
      <footer>
       <h2>I am footer</h2>
      </footer>
     </div>
    </template>
    그리고 페이지 아래 에 새 파일 layoutDemo.vue 를 만 듭 니 다.
    
    <template>
     <div>
      <h1>I am layout demo</h1>
     </div>
    </template>
    
    <script>
    export default {
     layout: 'myLayout'
    }
    </script>
    localhost:3000/layoutDemo 를 방문 하면 레이아웃 효 과 는 다음 과 같 습 니 다.
     
    미들웨어 사용
    예 를 들 어 우 리 는 로그 인하 지 않 고 점프 를 차단 하 는 미들웨어 를 실현 합 니 다.
    middleware 에 auth.js 를 새로 만 듭 니 다.
    
    export default function (ctx) {
     // eslint-disable-next-line no-constant-condition
     if (true) { // ctx        
      ctx.redirect({ path: '/' })
     }
    }
    layoutDemo.vue 에middleware: 'auth'를 더 하면 이 페이지 를 방문 하면 홈 페이지 로 이동 하 는 것 을 차단 합 니 다.
    asyncData 로 ssr 구현
    페이지 에 ssr1.vue 를 새로 만 듭 니 다.
    
    <template>
     <div>
      <ul>
       <li v-for="item of list1" :key="item">
        {{ item }}
       </li>
      </ul>
      <ul style="margin-top: 50px">
       <li v-for="item of list2" :key="item">
        {{ item }}
       </li>
      </ul>
     </div>
    </template>
    
    <script>
    export default {
     layout: 'myLayout',
     data () {
      return {
       list1: []
      }
     },
     async created () {
      const { status, data: { list } } = await this.$axios.get('/list')
      if (status === 200) {
       this.list = list
      }
     },
     async asyncDate () {
      const { status, data: { list } } = await this.$axios.get('/list')
      if (status === 200) {
       return {
        list2: list
       }
      }
     }
    }
    </script>
    여기 서 우리 list 1 은 전통 적 인 vue 방식 으로 비동기 데 이 터 를 얻 고 list 2 는 asyncData 로 비동기 데 이 터 를 얻 습 니 다.
    그리고 서버 에 인 터 페 이 스 를 쓰 려 면 node 를 사용 해 야 합 니까?require 를 사용 해 야 합 니까?import 방식 을 사용 하려 면 babel-cli 와 babel-preset-env 를 설치 하고 새 프로필 을 만 들 수 있 습 니 다.babelrc:
    
    {
     "presets": ["env"]
    }
    그리고 package.json 에 dev 명령 에 접미사--exec babel-node를 붙 이 고 server 에 node 를 쓰 면 import 를 사용 할 수 있 습 니 다.
    그리고 koa-router 를 설치 하고 index.js 에 다음 코드 를 추가 합 니 다.
    
    import Router from 'koa-router'
    
    //        start          app.use   
    const router = new Router()
    router.get('/list', (ctx) => {
    ctx.body = {
     list: ['a', 'b', 'c']
    }
    })
    app.use(router.routes()).use(router.allowedMethods())
    그리고 페이지 에 접근 하면 두 목록 이 정상적으로 렌 더 링 됩 니 다.

    우 리 는 오른쪽 단 추 를 눌 러 원본 코드 를 봅 니 다.

    list 2 는 asyncData 의 방식 으로 ssr 를 실현 했다.
    nuxtServerInit 를 사용 하여 ssr 구현
    새 페이지 ssr2.vue
    
    <template>
     <div>
      <ul>
       <li v-for="item of $store.state.list" :key="item">
        {{ item }}
       </li>
      </ul>
     </div>
    </template>
    
    <script>
    export default {
     layout: 'myLayout'
    }
    </script>
    그리고 store 에 index.js 를 새로 만 듭 니 다.
    
    export const state = () => ({
     list: []
    })
    
    export const mutations = {
     setList (state, value) {
      state.list = value
     }
    }
    
    export const actions = {
     async nuxtServerInit ({ commit }, { app }) {
      const { status, data: { list } } = await this.$axios.get('/list')
      if (status === 200) {
       commit('setList', list)
      }
     }
    }
    다시 npm run dev,localhost:3000/ssr 2 방문

    원본 코드 를 보고 정확하게 렌 더 링 합 니 다.

    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기