nuxt

想要學(xué)習(xí)nuxt.js颗圣,首先要弄清楚客戶端渲染和服務(wù)端渲染這兩個概念。

一屁使、客戶端渲染 VS 服務(wù)端渲染

1. 客戶端渲染

簡單理解就是在岂,在服務(wù)端放一個html 頁面,客戶端發(fā)起請求時蛮寂,服務(wù)端把頁面(響應(yīng)的是字符串)發(fā)送過去洁段。客戶端從上到下依次解析共郭,如果發(fā)現(xiàn)ajax請求就再發(fā)送新請求祠丝,拿到ajax 響應(yīng)結(jié)果以后渲染模板引擎。整個過程至少要發(fā)起兩次請求除嘹。如圖:

客戶端渲染.png

但是写半,這種渲染方式存在的弊端也日益顯露出來,比如首屏渲染慢尉咕,不利于seo等問題叠蝇。想對應(yīng)的,服務(wù)端渲染恰好彌補(bǔ)了這些不足年缎。

2. 服務(wù)端渲染:

也稱SSR悔捶,即server side render的縮寫。在服務(wù)端渲染出完整的首屏dom結(jié)構(gòu)单芜,直接發(fā)送到瀏覽器蜕该;前端拿到的內(nèi)容包括首屏及完整spa結(jié)構(gòu),應(yīng)用激活后依然按照spa方式運(yùn)行洲鸠。整個過程只向服務(wù)端發(fā)起一次請求堂淡。如圖:

image.png
服務(wù)端渲染有兩大優(yōu)點(diǎn):

一是更利于SEO馋缅。因?yàn)榕老x只會爬取源碼,不會執(zhí)行腳本绢淀。使用了MVVM框架之后萤悴,頁面的大多數(shù)DOM元素是在客戶端根據(jù)js動態(tài)生成的,可供爬蟲抓取分析的內(nèi)容很少皆的。而且瀏覽器爬蟲不會等數(shù)據(jù)加載完成之后再去抓取覆履。服務(wù)端渲染返回的是已經(jīng)獲取了異步數(shù)據(jù)并執(zhí)行JavaScript腳本的最終HTML,爬蟲就可以抓取完整的頁面信息费薄。
二是更利于首屏渲染内狗。對服務(wù)端渲染而言,首屏渲染是node發(fā)送過來的html字符串义锥,不依賴于js文件柳沙,這樣用戶就能更快地看到頁面內(nèi)容。尤其是大型單頁應(yīng)用拌倍,資源請求量大赂鲤,造成首屏渲染加載緩慢,使用服務(wù)端渲染就可以在很大程度上解決首頁的白屏等待問題柱恤。
Nuxt.js作為Vue.js的通用框架数初,就常被用來作SSR。

二梗顺、nuxt.js

nuxt是一個專注于ui渲染的應(yīng)用框架泡孩,可以快速搭建項(xiàng)目,還提供了服務(wù)端渲染的功能寺谤。

1. 安裝

直接用vue-cli安裝
vue init nuxt-community/starter-template <project-name>

2. nuxt推薦的項(xiàng)目結(jié)構(gòu)

assets——資源文件
components——組件
layouts——布局仑鸥,默認(rèn)default。所有頁面都會加載在布局頁面中的<nuxt />標(biāo)簽中变屁。如果要在普通頁面中使用下級路由眼俊,則要在頁面中添加<nuxt-child />
middleware——中間件:每個頁面加載前調(diào)用,在頁面中調(diào)用的方法是middleware: 'middlewareName'粟关。
node_modules——依賴包
nuxt.config.js——個性化配置
package.json——
pages——頁面疮胖。根頁面是index.vue,二級頁面只要添加文件夾闷板。動態(tài)路由頁面的名稱格式是:_變量.vue
plugins——插件
static——靜態(tài)文件(不需要webpack打包的)澎灸。
store——狀態(tài)管理
yarn.lock

3. 生命周期

Nuxt在vue的基礎(chǔ)上對生命周期做了擴(kuò)展:

export defualt {
  middleware(){ }, // 服務(wù)端
  validate(){ },  // 服務(wù)端
  asyncData(){ },  // 服務(wù)端
  fetch(){ },  // store數(shù)據(jù)加載
  beforeCreate(){ },  // 服務(wù)端和客戶端都會執(zhí)行
  created(){ },  //  服務(wù)端和客戶端都會執(zhí)行
  beforeMount(){ }, // 
  mounted(){ } // 客戶端
}
4. asyncData(context)

如果需要服務(wù)端渲染,首次渲染時一定要使用這個方法遮晚。它可以在渲染組件前異步獲取數(shù)據(jù)性昭。asyncData傳入context參數(shù),可以獲取一些信息鹏漆,如:

export default {
  asyncData(ctx){
    ctx.app   // 根實(shí)例
    ctx.route   // 路由實(shí)例
    ctx.params   // 路由參數(shù)
    ctx.query   // 路由問號后的參數(shù)
    ctx.error   // 錯誤處理方法
  }
}

使用這個方法時要注意巩梢,如果由于服務(wù)器或api錯誤導(dǎo)致無法渲染创泄,就要做好容錯機(jī)制艺玲,可以使用context.error方法括蝠。我們可以這樣做:

async asyncData(ctx){
  try {
    throw new Error()
  } catch {
    ctx.error( {statusCode: 500, message: '服務(wù)器開小差了~'} ) // 這里的statusCode參數(shù)必須是http狀態(tài)碼
  }
}

此時,錯誤頁可以通過/layout/error.vue自定義饭聚。
注意:該方法在服務(wù)端執(zhí)行忌警,返回的數(shù)據(jù)與data()返回的數(shù)據(jù)合并。該方法在組件初始化前被調(diào)用秒梳,所以不能通過this引用實(shí)例對象法绵。

5. head()

用于更新頭部信息title/descripe等,可以通過this獲取組件數(shù)據(jù)酪碘。

6. middleware()

在特定頁面實(shí)戰(zhàn)中間件使用axios請求數(shù)據(jù):
(1)nuxt項(xiàng)目默認(rèn)安裝axios朋譬,所以只要安裝proxy即可

npm install @nuxtjs/proxy

(2)在nuxt.config.js中加上:

export default {
  modules: [
    '@nuxtjs/axios',
    '@nuxtjs/proxy'
  ],
  proxy: {
    './api': {
      target: 'http://www.xxx.com',
      changeOrigin: true,
      pathRewrite: {
        '^/api': ''
      }
    }
  }
}

(3)頁面中使用

import axios from 'axios'
export default {
    data () {
        return {
          page: 0
        }
    },
    async asyncData () {
        let data = await axios.get('http://localhost:3000/api/admin/list')
        return {
          page: data.data.page
        }
  },
}

采用 import axios from 'axios' 方式引入axios時,接口參數(shù)前須加baseURL兴垦。

5. 使用scss

(1)安裝sass

npm i node-sass sass-loader scss-loader --save-dev

(2)如果要全局使用某個scss文件徙赢,要借助sass-resources-loader,還需要在nuxt.config.js的build配置中調(diào)整導(dǎo)出的loader配置:

export default {
  build: {
    extend(config, { isDev, isClient }){
      const sassResourcesLoader = {
        loader: 'sass-resources-loader',
        options: {
          resources: [
            // 填寫需要全局注入scss的文件
            'assets/styles/mixins.scss'
          ]
        }
      }
      // 修改 scss sass 引用的 loader探越。
      config.module.rules.forEach((rule) => {  
        if (rule.test.toString() === '/\\.vue$/') {  
          rule.options.loaders.sass.push(sassResourcesLoader)  
          rule.options.loaders.scss.push(sassResourcesLoader)  
        }  
        if (['/\\.sass$/', '/\\.scss$/'].indexOf(rule.test.toString()) !== -1) {  
          rule.use.push(sassResourcesLoader)  
        }  
      })  
    }
  }
}
6. nuxt和vue的區(qū)別

(1)路由
nuxt按照 pages 文件夾的目錄結(jié)構(gòu)自動生成路由
vue需在 src/router/index.js 手動配置路由
(2)入口頁面
nuxt頁面入口為 layouts/default.vue
vue頁面入口為 src/App.vue
(3)webpack配置
nuxt內(nèi)置webpack狡赐,允許根據(jù)服務(wù)端需求,在 nuxt.config.js 中的build屬性自定義構(gòu)建webpack的配置钦幔,覆蓋默認(rèn)配置枕屉。
vue關(guān)于webpack的配置存放在build文件夾下。

7. 編譯過程

(1)加載nuxt.config.js鲤氢;
(2)初始化nuxt搀擂,builder,開始執(zhí)行構(gòu)建卷玉;
(3)準(zhǔn)備模板使用的參數(shù)哥倔,然后根據(jù)模板生成真正的webpack編譯的js;
(4)分別執(zhí)行客戶端編譯和服務(wù)端編譯揍庄,生成最終的js腳本咆蒿;
(5)編譯成功后,就需要啟動服務(wù)蚂子,監(jiān)聽端口沃测,這個是在npm run start中實(shí)現(xiàn)的。

關(guān)于nuxt.js先寫這些了食茎,更多內(nèi)容還是要去看官網(wǎng)文檔哦~

關(guān)注微信公眾號【CC前端手記】一起學(xué)更多前端小知識吧~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒂破,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子别渔,更是在濱河造成了極大的恐慌附迷,老刑警劉巖惧互,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異喇伯,居然都是意外死亡喊儡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進(jìn)店門稻据,熙熙樓的掌柜王于貴愁眉苦臉地迎上來艾猜,“玉大人,你說我怎么就攤上這事捻悯〈以撸” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵今缚,是天一觀的道長算柳。 經(jīng)常有香客問我,道長姓言,這世上最難降的妖魔是什么瞬项? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮事期,結(jié)果婚禮上滥壕,老公的妹妹穿的比我還像新娘。我一直安慰自己兽泣,他們只是感情好绎橘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著唠倦,像睡著了一般称鳞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上稠鼻,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天冈止,我揣著相機(jī)與錄音,去河邊找鬼候齿。 笑死熙暴,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的慌盯。 我是一名探鬼主播周霉,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼亚皂!你這毒婦竟也來了俱箱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤灭必,失蹤者是張志新(化名)和其女友劉穎狞谱,沒想到半個月后乃摹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡跟衅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年孵睬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片与斤。...
    茶點(diǎn)故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡肪康,死狀恐怖荚恶,靈堂內(nèi)的尸體忽然破棺而出撩穿,到底是詐尸還是另有隱情,我是刑警寧澤谒撼,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布食寡,位于F島的核電站,受9級特大地震影響廓潜,放射性物質(zhì)發(fā)生泄漏抵皱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一辩蛋、第九天 我趴在偏房一處隱蔽的房頂上張望呻畸。 院中可真熱鬧,春花似錦悼院、人聲如沸伤为。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绞愚。三九已至,卻和暖如春颖医,著一層夾襖步出監(jiān)牢的瞬間位衩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工熔萧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留糖驴,地道東北人。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓佛致,卻偏偏與公主長得像贮缕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子晌杰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評論 2 354

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