最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解基于 Nuxt 的 Vue.js 服務端渲染實踐

 更新時間:2017年10月24日 11:06:39   作者:百姓網技術團隊  
這篇文章主要介紹了詳解基于 Nuxt 的 Vue.js 服務端渲染實踐,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

Vue.js 是目前最火熱的前端框架之一,而 Nuxt.js 是針對 Vue.js 推出的服務端渲染框架,通過高度定制化的配置以及簡潔的 API,開發(fā)者可以快速進行服務端渲染項目的開發(fā),本文將對 Nuxt.js 框架做一個簡要介紹。

服務端渲染

服務端渲染(Server Side Render)并不是一個新的概念,在單頁應用(SPA)還沒有流行起來的時候,頁面就是通過服務端渲染好,并傳遞給瀏覽器的。當用戶需要訪問新的頁面時,需要再次請求服務器,返回新的頁面。

為了優(yōu)化體驗,開發(fā)者們開始選擇采用 JavaScript 在前端完成渲染過程,用前后端分離的手段,使后端更專注于數(shù)據,而前端注重于處理展示,通過設計良好的 API 以及 Ajax 技術完成前后端的交互,jQuery、React.js、Vue.js、Angular.js 等框架應運而生。

這些框架給開發(fā)者帶來了巨大的便利,但是對于一些論壇、資訊網站、或是企業(yè)的官方網站來說,他們對 搜索引擎優(yōu)化(SEO) 有強烈的要求,而前端渲染技術是無法滿足他們的需求的。如果無法通過搜索引擎的搜索輸出自身的內容,那么網站的價值就會大大受影響,要解決這類問題,還是要靠服務端渲染。

本文會介紹 Vue.js 的服務端渲染解決方案 Nuxt.js。Vue.js 推出后,其數(shù)據驅動和組件化思想,以及簡潔易上手的特性給開發(fā)者帶來了巨大的便利,Vue.js 官方提供的 vue-server-renderer 可以用來進行服務端渲染的工作,但是需要增加額外的工作量,開發(fā)體驗仍有待提高,而 Nuxt.js 推出后,這個問題被很好的解決了。

Nuxt.js 簡介

Nuxt.js 是一個基于 Vue.js 的通用應用框架,Nuxt.js 預設了利用 Vue.js 開發(fā)服務端渲染的應用所需要的各種配置,并且可以一鍵生成靜態(tài)站點。同時,Nuxt.js 的熱加載機制可以使開發(fā)者非常便捷的進行網站的開發(fā)。

Nuxt.js 于 2016 年 10 月 25 號發(fā)布,上線還不足一年,但是已經受到了廣泛的好評,最新的穩(wěn)定版本是 0.10.7,目前仍在進行 1.0 版本的內測,Nuxt.js 社區(qū)也在逐步完善中,官網已經支持了中文文檔。

簡單上手

Vue.js 的 vue-cli 工具可以很方便的讓我們使用現(xiàn)成的模板初始化 Vue.js 項目,而 Nuxt.js 團隊已經為我們提供了初始化 Nuxt.js 項目的模板,安裝 vue-cli 后,只需在命令行中輸入

vue init nuxt/starter <projectName>

即可完成項目的創(chuàng)建工作,然后進入項目目錄中執(zhí)行以下命令:

npm installnpm run dev

Nuxt.js 會使用 3000 端口運行服務,在瀏覽器中輸入 http://localhost:3000 就可以看到一個帶有 Nuxt.js 的 logo 的原始的頁面了。

項目目錄

完成了一個簡單的 Hello World 項目后,我們來進一步研究 Nuxt.js。進入 Nuxt.js 項目后,項目目錄如下:

下面簡要介紹一下各個目錄的作用:

.nuxt/ :用于存放 Nuxt.js 的核心庫文件。例如,你可以在這個目錄下找到 server.js 文件,描述了 Nuxt.js 進行服務端渲染的邏輯(參見下一段 “Nuxt.js 的渲染流程”), router.js 文件包含一張自動生成的路由表。

assets/ :用于存放靜態(tài)資源,該目錄下的資源使用 Webpack 構建。

components/ :存放項目中的各種組件。注意,只有在這個目錄下的文件才能被稱為 組件

layouts/ :創(chuàng)建自定義的頁面布局,可以在這個目錄下創(chuàng)建全局頁面的統(tǒng)一布局,或是錯誤頁布局。如果需要在布局中渲染 pages 目錄中的路由頁面,需要在布局文件中加上 <nuxt /> 標簽。

middleware/ :放置自定義的中間件,會在加載組件之前調用。

pages/ :在這個目錄下,Nuxt.js 會根據目錄的結構生成 vue-router 路由,詳見下文。

plugins/ :可以在這個目錄中放置自定義插件,在根 Vue 對象實例化之前運行。例如,可以將項目中的埋點邏輯封裝成一個插件,放置在這個目錄中,并在 nuxt.config.js 中加載。

static/ :不使用 Webpack 構建的靜態(tài)資源,會映射到根路徑下,如 robots.txt

store/ :存放 Vuex 狀態(tài)樹。

nuxt.config.js :Nuxt.js 的配置文件,詳見下文。

Nuxt.js 的渲染流程

Nuxt.js 通過一系列構建于 Vue.js 之上的方法進行服務端渲染,具體流程如下:

調用 nuxtServerInit 方法

當請求打入時,最先調用的即是 nuxtServerInit 方法,可以通過這個方法預先將服務器的數(shù)據保存,如已登錄的用戶信息等。另外,這個方法中也可以執(zhí)行異步操作,并等待數(shù)據解析后返回。

Middleware

經過第一步后,請求會進入 Middleware 層,在該層中有三步操作:

讀取 nuxt.config.js 中全局 middleware 字段的配置,并調用相應的中間件方法 匹配并加載與請求相對應的 layout 調用 layoutpage 的中間件方法

調用 validate 方法

在這一步可以對請求參數(shù)進行校驗,或是對第一步中服務器下發(fā)的數(shù)據進行校驗,如果校驗失敗,將拋出 404 頁面。

調用 fetchasyncData 方法

這兩個方法都會在組件加載之前被調用,它們的職責各有不同, asyncData 用來異步的進行組件數(shù)據的初始化工作,而 fetch 方法偏重于異步獲取數(shù)據后修改 Vuex 中的狀態(tài)。

我們在 Nuxt.js 的源碼 util.js 中可以看到以下方法:

export function applyAsyncData (Component, asyncData = {}) {
 const ComponentData = Component.options.data || noopData
 Component.options.data = function () {
  const data = ComponentData.call(this)
  return { ...data, ...asyncData }
 }
 if (Component._Ctor && Component._Ctor.options) {
  Component._Ctor.options.data = Component.options.data
 }
}

這個方法會在 asyncData 方法調用完畢后進行調用,可以看到,組件從 asyncData 方法中獲取的數(shù)據會和組件原生的 data 方法獲取的數(shù)據做一次合并,最終仍然會在 data 方法中返回,所以得出, asyncData 方法其實是原生 data 方法的擴展。

經過以上四步后,接下來就是渲染組件的工作了,整個過程可以用下圖表示:

(圖片來源:Nuxt.js 官網)

如上文所述,在 .nuxt 目錄下,你可以找到 server.js 文件,這個文件封裝了 Nuxt.js 在服務端渲染的邏輯,包括一個完整的 Promise 對象的鏈式調用,從而完成上面描述的整個服務端渲染的步驟。

Nuxt.js 的一些使用技巧

nuxt.config.js 的配置

nuxt.config.js 是 Nuxt.js 的配置文件,可以通過針對一系列參數(shù)的設置來完成 Nuxt.js 項目的配置,可以在Nuxt.js 官網 找到針對這個文件的說明,下面舉例一些常用的配置:

head: 可以在這個配置項中配置全局的 head ,如定義網站的標題、 meta ,引入第三方的 CSS、JavaScript 文件等:

head: {
   title: '百姓店鋪',
   meta: [
      { charset: 'utf-8' },
      { name: 'viewport', content: 'width=device-width, initial-scale=1' },
      { name: 'applicable-device', content: 'pc,mobile' },
   ],
   link: [
      { rel: 'stylesheet', type: 'text/css', href: 'https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css'}
   ],
   script: [
      {src: 'https://code.jquery.com/jquery-3.1.1.min.js'},
      {src: 'https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js'}
   ]
 },

build: 這個配置項用來配置 Nuxt.js 項目的構建規(guī)則,即 Webpack 的構建配置,如通過 vendor 字段引入第三方模塊,通過 plugin 字段配置 Webpack 插件,通過 loaders 字段自定義 Webpack 加載器等。通常我們會在 build 的 vendor 字段中引入 axios 模塊,從而在項目中進行 HTTP 請求( axios 也是 Vue.js 官方推薦的 HTTP 請求框架)。

build: {
   vendor: ['core-js', 'axios'],
   loaders: [
     {
       test: /\.(scss|sass)$/,
       use: [{
         loader: "style-loader"
       }, {
         loader: "css-loader"
       }, {
         loader: "sass-loader"
       }]
     },
     {
       test: /\.(png|jpe?g|gif|svg)$/,
       loader: 'url-loader',
       query: {
         limit: 1000,
         name: 'img/[name].[hash:7].[ext]'
       }
     },
     {
       test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
       loader: 'url-loader',
       query: {
         limit: 1000,
         name: 'fonts/[name].[hash:7].[ext]'
       }
     }
   ]
 }

css: 在這個配置項中,引入全局的 CSS 文件,之后每個頁面都會被引入。

router: 可以在此配置路由的基本規(guī)則,以及進行中間件的配置。例如,你可以創(chuàng)建一個用來獲取 User-Agent 的中間件,并在此加載。

loading: Nuxt.js 提供了一套頁面內加載進度指示組件,可以在此配置顏色,禁用,或是配置自定義的加載組件。

env: 可以在此配置用來在服務端和客戶端共享的全局變量。

目錄即路由

Nuxt.js 在 vue-router 之上定義了一套自動化的生成規(guī)則,即依據 pages 的目錄結構生成。例如,我們有以下目錄結構:

這個目錄下含有一個基礎路由(無參數(shù))以及兩個動態(tài)路由(帶參數(shù)),Nuxt.js 會生成如下的路由配置表(可以在 .nuxt 目錄下的 router.js 文件中找到):

routes: [
  {
    path: "/",
    component: _abe13a78,
    name: "index"
  },
  {
    path: "/article/:id?",
    component: _48f202f2,
    name: "article-id"
  },
  {
    path: "/:page",
    component: _5ccbb43a,
    name: "page"
  }
]

對于 article-id 這個路由,路徑中帶有 :id? 參數(shù),表明這是一個可選的路由,如果要將其設為必選,則必須在 article 的目錄下添加 index.vue 文件。

再看下面一個例子:

由于有同名文件和文件夾的存在,Nuxt.js 會為我們生成嵌套路由,生成的路由結構如下,在使用時,需要增加 <nuxt-child /> 標簽來顯示子視圖的內容。

routes: [
  {
    path: "/article",
    component: _f930b330,
    children: [
      {
        path: "",
        component: _1430822a,
        name: "article"
      },
      {
        path: ":id",
        component: _339e8013,
        name: "article-id"
      }
    ]
  }
]

此外,Nuxt.js 還可以設置動態(tài)嵌套路由,具體可參見Nuxt.js 的官方文檔。

總結

Nuxt.js 盡管是一個非常年輕的框架,目前也有很多待改進的問題,但它的出現(xiàn)為 Vue.js 開發(fā)者搭建服務端渲染項目提供了巨大的便利,期待 Nuxt.js 1.0 版本發(fā)布后,能給我們帶來更多實用的新功能。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • vuejs事件中心管理組件間的通信詳解

    vuejs事件中心管理組件間的通信詳解

    這篇文章主要為大家詳細介紹了vuejs事件中心管理組件間的通信,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 使用Vue實現(xiàn)網頁截圖和截屏功能

    使用Vue實現(xiàn)網頁截圖和截屏功能

    網頁截圖與截屏功能在許多Web應用程序中都非常有用,Vue.js作為一個流行的JavaScript框架,提供了許多工具和庫來簡化網頁截圖和截屏的實現(xiàn),本文將介紹如何使用Vue來實現(xiàn)一個網頁截圖和截屏功能的示例,包括使用html2canvas庫和vue-cropper庫,需要的朋友可以參考下
    2023-10-10
  • 關于Vue?CLI3中啟動cli服務參數(shù)說明

    關于Vue?CLI3中啟動cli服務參數(shù)說明

    這篇文章主要介紹了關于Vue?CLI3中啟動cli服務參數(shù)說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue3+vite+ts父子組件之間的傳值

    vue3+vite+ts父子組件之間的傳值

    隨著vue2的落幕,vue3越來成熟,有必要更新一下vue3的父子組件之間的傳值方式,這里介紹下vue3+vite+ts父子組件之間的傳值方式實例詳解,感興趣的朋友一起看看吧
    2023-12-12
  • Vue.js如何利用v-for循環(huán)生成動態(tài)標簽

    Vue.js如何利用v-for循環(huán)生成動態(tài)標簽

    這篇文章主要給大家介紹了關于Vue.js如何利用v-for循環(huán)生成動態(tài)標簽的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-01-01
  • Vue中自定義標簽及其使用方式

    Vue中自定義標簽及其使用方式

    這篇文章主要介紹了Vue中自定義標簽及其使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • vue3 vue-draggable-next如何實現(xiàn)拖拽穿梭框效果

    vue3 vue-draggable-next如何實現(xiàn)拖拽穿梭框效果

    這篇文章主要介紹了vue3 vue-draggable-next如何實現(xiàn)拖拽穿梭框效果,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 圖文講解用vue-cli腳手架創(chuàng)建vue項目步驟

    圖文講解用vue-cli腳手架創(chuàng)建vue項目步驟

    本次小編給大家?guī)淼氖顷P于用vue-cli腳手架創(chuàng)建vue項目步驟講解內容,有需要的朋友們可以學習下。
    2019-02-02
  • Vue監(jiān)聽數(shù)據對象變化源碼

    Vue監(jiān)聽數(shù)據對象變化源碼

    這篇文章主要為大家詳細介紹了Vue監(jiān)聽數(shù)據對象變化的源碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • vue+elementui 實現(xiàn)上傳文件/導入文件的功能示例詳解

    vue+elementui 實現(xiàn)上傳文件/導入文件的功能示例詳解

    文章介紹了如何使用Vue和Element UI實現(xiàn)上傳文件和導入文件的功能,主要內容包括:上傳組件的使用、data中的數(shù)據存儲、methods中的方法(選擇文件、點擊確定上傳文件、刪除文件),文章還提供了相關鏈接供進一步學習,感興趣的朋友一起看看吧
    2025-03-03

最新評論

山丹县| 广州市| 普陀区| 巴中市| 渭南市| 黎川县| 中牟县| 武乡县| 库伦旗| 锡林郭勒盟| 云霄县| 平远县| 苗栗县| 开原市| 桃源县| 讷河市| 宁阳县| 新泰市| 任丘市| 兴海县| 普安县| 上高县| 环江| 宽甸| 甘泉县| 石楼县| 河源市| 镇坪县| 永城市| 二连浩特市| 姜堰市| 荔浦县| 扬中市| 宣恩县| 麻阳| 缙云县| 聂荣县| 淄博市| 西安市| 仁怀市| 鄯善县|