Nuxt 開(kāi)發(fā)記錄

Nuxt.js是一個(gè)基于Vue.js的通用應(yīng)用架構(gòu), 它預(yù)設(shè)了服務(wù)端渲染(SSR, Server Side Render)應(yīng)用所需要的相關(guān)配置, 同時(shí)也支持生成靜態(tài)站點(diǎn).

1_EWDEUt0fqsmRgpYGFOOMew.png

1. 背景 & Nuxt簡(jiǎn)介

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

2. Nuxt應(yīng)用架構(gòu)

ujs-architecture.jpg
  • 客戶(hù)端向服務(wù)器請(qǐng)求數(shù)據(jù)
  • 服務(wù)器端獲取數(shù)據(jù)從API服務(wù)器
  • 服務(wù)端返回完整HTML頁(yè)面給客戶(hù)端
  • 客戶(hù)端頁(yè)面渲染使用SPA
  • 客戶(hù)端直接請(qǐng)求API服務(wù)器

3. 項(xiàng)目創(chuàng)建

為了更加方便快速的創(chuàng)建項(xiàng)目, Nuxt.js 團(tuán)隊(duì)提供了一個(gè)腳手架工具 create-nuxt-app.確保你已經(jīng)安裝 npx (npx 已經(jīng)被內(nèi)置自 NPM 5.2.0)

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

它會(huì)讓你進(jìn)行一些選擇:
- 在集成的服務(wù)器端框架之間進(jìn)行選擇:
- None(默認(rèn)服務(wù)器)
- 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
當(dāng)運(yùn)行完成時(shí),它將安裝所有依賴(lài)項(xiàng),完成后啟動(dòng)項(xiàng)目:

$ npm run dev

應(yīng)用現(xiàn)在會(huì)運(yùn)行在 http://localhost:3000

4. 項(xiàng)目開(kāi)發(fā)

4.1 目錄結(jié)構(gòu)

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

4.2 配置

Nuxt.js默認(rèn)的配置涵蓋了大部分的使用情形, 也可以通過(guò)修改 nuxt.config.js 來(lái)進(jìn)行自定義配置.

WX20181218-121625@2x.png

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

4.3 路由

WX20181218-151044@2x.png

Nuxt.js 會(huì)根據(jù)pages的目錄結(jié)構(gòu), 自動(dòng)生成vue-router模塊的路由配置. 如上圖, 會(huì)生成 /dashboard/h5/:h5 , /dashboard/mws/:mws, ...
可以看出路徑根據(jù)目錄結(jié)構(gòu)自動(dòng)生成了, 動(dòng)態(tài)路徑需要在名字前添加下劃線(xiàn)( _ )

4.4 布局

nuxt-views-schema.png

上圖是Nuxt.js的布局架構(gòu). 最外層依舊是Document, 往里一層是一個(gè)layout層,在 Nuxt里面對(duì)應(yīng)目錄中的layouts文件夾,默認(rèn)的pages下的頁(yè)面都會(huì)套用 layouts/default.vue 的布局樣式. 其中 <nuxt/> 相當(dāng)于Vue中的 slot插槽的概念,
pages/**.vue的內(nèi)容都會(huì)被填入<nuxt/>,其他的內(nèi)容嵌套和平時(shí)的Vue單頁(yè)面應(yīng)用開(kāi)發(fā)是一樣的.

4.5 Vuex

在根目錄創(chuàng)建 store 目錄,就會(huì)默認(rèn)引用 vuex 模塊踩萎,除此之外雅倒,還進(jìn)行了以下的操作:1)將 vuex 模塊 加到 vendors 構(gòu)建配置中去绅络;2)設(shè)置 Vue 根實(shí)例的 store 配置項(xiàng).
Nuxt.js 支持兩種使用 store 的方式:

  • 普通方式:store/index.js 返回一個(gè) Vuex.Store 實(shí)例
  • 模塊方式:store 目錄下的每個(gè) .js 文件會(huì)被轉(zhuǎn)換成為狀態(tài)樹(shù)指定命名的子模塊 (當(dāng)然别惦,index 是根模塊朗伶,相當(dāng)于設(shè)置了namespaced: true)

Nuxt.js提供了模塊方式的簡(jiǎn)單寫(xiě)法:使用狀態(tài)樹(shù)模塊化的方式,store/index.js 不需要返回 Vuex.Store 實(shí)例步咪,直接將 state论皆、mutationsactions 暴露出來(lái)即可。示例如下:

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

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

4.6 異步數(shù)據(jù) asyncData

Nuxt.js 增加了一個(gè) asyncData 方法猾漫,用于 在設(shè)置組件數(shù)據(jù) 之前 能夠異步獲取 或 處理數(shù)據(jù)点晴。
由于asyncData 是在組件 初始化 之前被調(diào)用的,所以不能通過(guò) this 引用組件的實(shí)例對(duì)象悯周,可以使用上下文對(duì)象來(lái)實(shí)現(xiàn)某些功能,具體的上下文context

4.7 fetch 方法

asyncData 方法類(lèi)似粒督,不同的是它不會(huì)設(shè)置組件的數(shù)據(jù),作用是設(shè)置store 數(shù)據(jù)禽翼。

5. Nuxt 渲染流程

nuxt-schema.png

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

  • nuxtServerInit 是Nuxt.js在服務(wù)端初始化的時(shí)候定義在store中.這個(gè)對(duì)我們想要直接傳遞值給服務(wù)端非常有用,比如session, user.
  • middleware是一個(gè)自定義的方法,在每次渲染頁(yè)面之前被調(diào)用.它可以注冊(cè)到全局下(nuxt.config.js)也可以注冊(cè)在單個(gè)頁(yè)面或框架上.
  • validate 允許在動(dòng)態(tài)路由組件中定義一個(gè)過(guò)濾器方法.
  • asyncDate,fetch asyncData可以讓我們?cè)陧?yè)面繪制前調(diào)用方法獲取需要的數(shù)據(jù)源;第一次時(shí)在服務(wù)端會(huì)被調(diào)用,之后客戶(hù)端也會(huì)在頁(yè)面之前被調(diào)用.fetchasyncData非常相似,區(qū)別只在于fetch只會(huì)用來(lái)改變store的狀態(tài),不能填充數(shù)據(jù). *需要的一點(diǎn).如果在方法中調(diào)用this會(huì)報(bào)錯(cuò).因?yàn)?code>asyncData & fetch在服務(wù)端會(huì)被調(diào)用所以this的當(dāng)前組件并沒(méi)有實(shí)例化
  • Render 被渲染

6. 一些遇到的坑

  • Window 或 Document 對(duì)象未定義屠橄?

    這是因?yàn)橐恍┲患嫒菘蛻?hù)端的腳本被打包進(jìn)了服務(wù)端的執(zhí)行腳本中去。 對(duì)于只適合在客戶(hù)端運(yùn)行的腳本闰挡,需要通過(guò)使用 process.browser 變量來(lái)判斷導(dǎo)入.

  • 服務(wù)端渲染v-for 列表

    當(dāng)頁(yè)面有列表內(nèi)容在客戶(hù)端渲染,刷新頁(yè)面服務(wù)端會(huì)重復(fù)渲染列表結(jié)構(gòu),生成兩份. 需要用<no-ssr/>組件進(jìn)行設(shè)置,從而不在無(wú)武器渲染中呈現(xiàn)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锐墙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子长酗,更是在濱河造成了極大的恐慌溪北,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夺脾,死亡現(xiàn)場(chǎng)離奇詭異之拨,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)咧叭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)蚀乔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人菲茬,你說(shuō)我怎么就攤上這事吉挣。” “怎么了生均?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵听想,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我马胧,道長(zhǎng)汉买,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任佩脊,我火速辦了婚禮蛙粘,結(jié)果婚禮上垫卤,老公的妹妹穿的比我還像新娘。我一直安慰自己出牧,他們只是感情好穴肘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著舔痕,像睡著了一般评抚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上伯复,一...
    開(kāi)封第一講書(shū)人閱讀 51,775評(píng)論 1 307
  • 那天慨代,我揣著相機(jī)與錄音,去河邊找鬼啸如。 笑死侍匙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叮雳。 我是一名探鬼主播想暗,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼帘不!你這毒婦竟也來(lái)了说莫?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤厌均,失蹤者是張志新(化名)和其女友劉穎唬滑,沒(méi)想到半個(gè)月后告唆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體棺弊,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年擒悬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了模她。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡懂牧,死狀恐怖侈净,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情僧凤,我是刑警寧澤畜侦,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站躯保,受9級(jí)特大地震影響旋膳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜途事,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一验懊、第九天 我趴在偏房一處隱蔽的房頂上張望擅羞。 院中可真熱鬧,春花似錦义图、人聲如沸减俏。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)娃承。三九已至,卻和暖如春怕篷,著一層夾襖步出監(jiān)牢的瞬間草慧,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工匙头, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留漫谷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓蹂析,卻偏偏與公主長(zhǎng)得像舔示,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子电抚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容

  • 目錄 UI組件 開(kāi)發(fā)框架 實(shí)用庫(kù) 服務(wù)端 輔助工具 應(yīng)用實(shí)例 Demo示例 UI組件 element ★31142...
    吳佳浩閱讀 10,946評(píng)論 1 61
  • 內(nèi)容 UI組件 開(kāi)發(fā)框架 實(shí)用庫(kù) 服務(wù)端 輔助工具 應(yīng)用實(shí)例 Demo示例 UI組件 element ★13489...
    秋玄語(yǔ)道閱讀 13,715評(píng)論 3 116
  • 前天老公都下班回來(lái)了惕稻,大寶去別人家玩還不知道回來(lái),我要下去收衣服蝙叛,順便去逮他回來(lái)俺祠。我剛進(jìn)那朋友家的們,臭小子便馬上...
    紅豬豬閱讀 819評(píng)論 0 2
  • 40歲后的你蔫缸,經(jīng)歷了很多的事,看清了很多的人际起,品嘗了很多的苦拾碌,已經(jīng)進(jìn)入了不惑之年,沒(méi)有了青春期的氣盛街望,沒(méi)有...
    武傳華閱讀 392評(píng)論 0 0
  • 聞江湖-其一 孤樓紅葉畫(huà)知秋校翔, 揮劍鳳弦一點(diǎn)愁。 滄山紛紜沉江月灾前, 誰(shuí)飲紅塵英雄仇防症? --------------...
    景黎閱讀 242評(píng)論 0 2