Nuxt 開發記錄

Nuxt.js是一個基于Vue.js的通用應用架構, 它預設了服務端渲染(SSR, Server Side Render)應用所需要的相關配置, 同時也支持生成靜態站點.

1_EWDEUt0fqsmRgpYGFOOMew.png

1. 背景 & Nuxt簡介

Nuxt 其一目的是為了解決單頁面應用的SEO問題, 相比于我們平常的SPA頁面. 在搜索引擎中由于無法從網頁中被抓取內容信息(SPA頁面的信息都是被打包到JS文件中,動態加載到頁面中), 從而無法被用戶所搜索到.
其二是服務端渲染相比于SPA頁面渲染,在網絡環境較差或者客戶端運行在沒有JavaScript的引擎上, 這時基于SSR渲染的頁面能更好的展現原有的頁面的內容,而單頁面應用可能就會有很長的空白時間, 從而影響到用戶的體驗.

2. Nuxt應用架構

ujs-architecture.jpg
  • 客戶端向服務器請求數據
  • 服務器端獲取數據從API服務器
  • 服務端返回完整HTML頁面給客戶端
  • 客戶端頁面渲染使用SPA
  • 客戶端直接請求API服務器

3. 項目創建

為了更加方便快速的創建項目, Nuxt.js 團隊提供了一個腳手架工具 create-nuxt-app.確保你已經安裝 npx (npx 已經被內置自 NPM 5.2.0)

$ npx create-nuxt-app <project-name>

它會讓你進行一些選擇:
- 在集成的服務器端框架之間進行選擇:
- None(默認服務器)
- Express
- Koa
- Hapi
- Feathers
- Micro
- Adonis
- 選擇您喜歡的UI框架:
- None
- Bootstrap
- Vuetify
- Bulma
- Tailwind
- Element UI
- Ant Design Vue
- Buefy
- 選擇你想要的Nuxt模式(universal or SPA)
- 選擇axios module
- 選擇 Eslint
- 選擇 Prettier
當運行完成時,它將安裝所有依賴項,完成后啟動項目:

$ npm run dev

應用現在會運行在 http://localhost:3000

4. 項目開發

4.1 目錄結構

WX20181218-115512.png
  • api: api接口
  • assets:靜態資源
  • components:組件
  • layouts: 布局目錄
  • logs: 日志
  • middleware:中間件
  • pages: 頁面目錄
  • plugins:插件
  • nuxt.config.js: nuxt 配置文件

4.2 配置

Nuxt.js默認的配置涵蓋了大部分的使用情形, 也可以通過修改 nuxt.config.js 來進行自定義配置.

WX20181218-121625@2x.png

  • plugins: 全局引入的插件
  • css: 全局引入的css, scss 等
  • head: 可以設置pages的頭部信息, 如titile, meta信息等
  • loading:頁面切換的時候加載組件顯示的進度條
  • build: 自定義webpack的構建配置
  • env: 配置客戶端和服務端共享的環境變量
  • cache:是否允許緩存
  • router:自定義配置vue-router的信息

4.3 路由

WX20181218-151044@2x.png

Nuxt.js 會根據pages的目錄結構, 自動生成vue-router模塊的路由配置. 如上圖, 會生成 /dashboard/h5/:h5 , /dashboard/mws/:mws, ...
可以看出路徑根據目錄結構自動生成了, 動態路徑需要在名字前添加下劃線( _ )

4.4 布局

nuxt-views-schema.png

上圖是Nuxt.js的布局架構. 最外層依舊是Document, 往里一層是一個layout層,在 Nuxt里面對應目錄中的layouts文件夾,默認的pages下的頁面都會套用 layouts/default.vue 的布局樣式. 其中 <nuxt/> 相當于Vue中的 slot插槽的概念,
pages/**.vue的內容都會被填入<nuxt/>,其他的內容嵌套和平時的Vue單頁面應用開發是一樣的.

4.5 Vuex

在根目錄創建 store 目錄,就會默認引用 vuex 模塊,除此之外,還進行了以下的操作:1)將 vuex 模塊 加到 vendors 構建配置中去;2)設置 Vue 根實例的 store 配置項.
Nuxt.js 支持兩種使用 store 的方式:

  • 普通方式:store/index.js 返回一個 Vuex.Store 實例
  • 模塊方式:store 目錄下的每個 .js 文件會被轉換成為狀態樹指定命名的子模塊 (當然,index 是根模塊,相當于設置了namespaced: true)

Nuxt.js提供了模塊方式的簡單寫法:使用狀態樹模塊化的方式,store/index.js 不需要返回 Vuex.Store 實例,直接將 state、mutationsactions 暴露出來即可。示例如下:

export const state = () => ({
  accesstoken: ''
})

export const mutations = {
  setAccesstoken (state, accesstoken) {
    state.accesstoken = accesstoken
  }
}

4.6 異步數據 asyncData

Nuxt.js 增加了一個 asyncData 方法,用于 在設置組件數據 之前 能夠異步獲取 或 處理數據。
由于asyncData 是在組件 初始化 之前被調用的,所以不能通過 this 引用組件的實例對象,可以使用上下文對象來實現某些功能,具體的上下文context

4.7 fetch 方法

asyncData 方法類似,不同的是它不會設置組件的數據,作用是設置store 數據。

5. Nuxt 渲染流程

nuxt-schema.png

上圖是nuxt整個的渲染流程,在render之前的幾個階段, 都可以拿到context去做一些相應操作.

  • nuxtServerInit 是Nuxt.js在服務端初始化的時候定義在store中.這個對我們想要直接傳遞值給服務端非常有用,比如session, user.
  • middleware是一個自定義的方法,在每次渲染頁面之前被調用.它可以注冊到全局下(nuxt.config.js)也可以注冊在單個頁面或框架上.
  • validate 允許在動態路由組件中定義一個過濾器方法.
  • asyncDate,fetch asyncData可以讓我們在頁面繪制前調用方法獲取需要的數據源;第一次時在服務端會被調用,之后客戶端也會在頁面之前被調用.fetchasyncData非常相似,區別只在于fetch只會用來改變store的狀態,不能填充數據. *需要的一點.如果在方法中調用this會報錯.因為asyncData & fetch在服務端會被調用所以this的當前組件并沒有實例化
  • Render 被渲染

6. 一些遇到的坑

  • Window 或 Document 對象未定義?

    這是因為一些只兼容客戶端的腳本被打包進了服務端的執行腳本中去。 對于只適合在客戶端運行的腳本,需要通過使用 process.browser 變量來判斷導入.

  • 服務端渲染v-for 列表

    當頁面有列表內容在客戶端渲染,刷新頁面服務端會重復渲染列表結構,生成兩份. 需要用<no-ssr/>組件進行設置,從而不在無武器渲染中呈現

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容

  • 目錄 UI組件 開發框架 實用庫 服務端 輔助工具 應用實例 Demo示例 UI組件 element ★31142...
    吳佳浩閱讀 10,954評論 1 61
  • 內容 UI組件 開發框架 實用庫 服務端 輔助工具 應用實例 Demo示例 UI組件 element ★13489...
    秋玄語道閱讀 13,746評論 3 116
  • 前天老公都下班回來了,大寶去別人家玩還不知道回來,我要下去收衣服,順便去逮他回來。我剛進那朋友家的們,臭小子便馬上...
    紅豬豬閱讀 837評論 0 2
  • 40歲后的你,經歷了很多的事,看清了很多的人,品嘗了很多的苦,已經進入了不惑之年,沒有了青春期的氣盛,沒有...
    武傳華閱讀 397評論 0 0
  • 聞江湖-其一 孤樓紅葉畫知秋, 揮劍鳳弦一點愁。 滄山紛紜沉江月, 誰飲紅塵英雄仇? --------------...
    景黎閱讀 245評論 0 2