Nuxt.js 入門

SEO 工作的目的:

seo 的工作目的是為了讓網(wǎng)站更利于讓各大搜索引擎抓取和收錄,增加產(chǎn)品的曝光率。

前言

Nuxt 是 Vue 上的 SSR,也就是服務(wù)端渲染應(yīng)用框架,可在很大程度上解決當(dāng)前 SPA 和 CSR 的首頁加載慢,不利于 SEO 的問題。

簡單的說Nuxt.js是Vue.js的通用框架,最常用的就是用來作SSR(服務(wù)器端渲染)。再直白點說,就是Vue.js原來是開發(fā)SPA(單頁應(yīng)用)的,但是隨著技術(shù)的普及,很多人想用Vue開發(fā)多頁應(yīng)用,并在服務(wù)端完成渲染。這時候就出現(xiàn)了Nuxt.js這個框架,她簡化了SSR的開發(fā)難度。還可以直接用命令把我們制作的vue項目生成為靜態(tài)html

什么是SSR?

SSR,即服務(wù)器渲染,就是在服務(wù)器端將對Vue頁面進行渲染生成html文件,將html頁面?zhèn)鬟f給瀏覽器。

SSR兩個優(yōu)點:

  • SEO 不同于SPA的HTML只有一個無實際內(nèi)容的HTML和一個app.js,SSR生成的HTML是有內(nèi)容的,這讓搜索引擎能夠索引到頁面內(nèi)容。
  • 更快內(nèi)容到達時間 傳統(tǒng)的SPA應(yīng)用是將bundle.js從服務(wù)器獲取,然后在客戶端解析并掛載到dom。而SSR直接將HTML字符串傳遞給瀏覽器。大大加快了首屏加載時間。

Nuxt.js的官方網(wǎng)站是這樣介紹的:

NuxtJS 讓你構(gòu)建你的下一個 Vue.js 應(yīng)用程序變得更有信心。這是一個 開源 的框架,讓 web 開發(fā)變得簡單而強大。

Nuxt.js是特點(優(yōu)點):

  • 基于 Vue.js
  • 自動代碼分層
  • 服務(wù)端渲染
  • 強大的路由功能,支持異步數(shù)據(jù)
  • 靜態(tài)文件服務(wù)
  • ES6/ES7 語法支持
  • 打包和壓縮 JS 和 CSS
  • HTML頭部標(biāo)簽管理
  • 本地開發(fā)支持熱加載
  • 集成ESLint
  • 支持各種樣式預(yù)處理器: SASS、LESS、 Stylus等等
1. Nuxt環(huán)境搭建和Hello World

Nuxt.js 十分簡單易用。一個簡單的項目只需將 nuxt 添加為依賴組件即可。

為了快速入門,Nuxt.js 團隊創(chuàng)建了腳手架工具 create-nuxt-app(確保安裝了 npx(npx 在 NPM 版本 5.2.0 默認安裝了))。

npx create-nuxt-app nuxtdmo

現(xiàn)在運行在 http://localhost:3000 上運行

Nuxt自動生成了項目目錄,如下:。

|-- .nuxt                            // Nuxt自動生成,臨時的用于編輯的文件,build
|-- assets                           // 用于組織未編譯的靜態(tài)資源入LESS、SASS 或 JavaScript
|-- components                       // 用于自己編寫的Vue組件,比如滾動組件,日歷組件,分頁組件
|-- layouts                          // 布局目錄,用于組織應(yīng)用的布局組件,不可更改。
|-- middleware                       // 用于存放中間件
|-- pages                            // 用于存放寫的頁面,我們主要的工作區(qū)域
|-- plugins                          // 用于存放JavaScript插件的地方
|-- static                           // 用于存放靜態(tài)資源文件,比如圖片
|-- store                            // 用于組織應(yīng)用的Vuex 狀態(tài)管理。
|-- .editorconfig                    // 開發(fā)工具格式配置
|-- .eslintrc.js                     // ESLint的配置文件,用于檢查代碼格式
|-- .gitignore                       // 配置git不上傳的文件
|-- nuxt.config.json                 // 用于組織Nuxt.js應(yīng)用的個性化配置,已覆蓋默認配置
|-- package-lock.json                // npm自動生成,用于幫助package的統(tǒng)一性設(shè)置的,yarn也有相同的操作
|-- package-lock.json                // npm自動生成,用于幫助package的統(tǒng)一性設(shè)置的,yarn也有相同的操作
|-- package.json                     // npm包管理配置文件
2.Nuxt常用配置項

配置IP和端口

開發(fā)中經(jīng)常會遇到端口被占用或者指定IP的情況。我們需要在根目錄下的package.json里對config項進行配置。比如現(xiàn)在我們想把IP配置成127.0.0.1,端口設(shè)置1818。

//package.json
"config":{
    "nuxt":{
      "host":"127.0.0.1",
      "port":"1818"
    }
  },

配置好后,我們在終端中輸入npm run dev,然后你會看到服務(wù)地址改為了127.0.0.1:1818.

配置全局CSS

在開發(fā)多頁項目時,都會定義一個全局的CSS來初始化我們的頁面渲染,比如把padding和margin設(shè)置成0,網(wǎng)上也有非常出名的開源css文件normailze.css。要定義這些配置,需要在nuxt.config.js里進行操作。

比如現(xiàn)在我們要把頁面字體設(shè)置為紅色,就可以在assets/css/normailze.css文件,然后把字體設(shè)置為紅色。

 <!--assets/css/normailze.css-->
 html{
    color:red;
}

<!--/nuxt.config.js-->
css:['~assets/css/normailze.css'],

設(shè)置好后,需要在終端輸入npm run dev 。然后你會發(fā)現(xiàn)字體已經(jīng)變成了紅色。

配置webpack的loader

nuxt.config.js里是可以對webpack的基本配置進行覆蓋的,比如現(xiàn)在我們要配置一個url-loader來進行小圖片的64位打包。就可以在nuxt.config.jsbuild選項里進行配置

build: {

    loaders:[
      {
        test:/\.(png|jpe?g|gif|svg)$/,
        loader:"url-loader",
        query:{
          limit:10000,
          name:'img/[name].[hash].[ext]'
        }
      }
    ],

    /*
    ** Run ESLint on save
    */
    extend (config, { isDev, isClient }) {
      if (isDev && isClient) {
        config.module.rules.push({
          enforce: 'pre',
          test: /\.(js|vue)$/,
          loader: 'eslint-loader',
          exclude: /(node_modules)/
        })
      }
    }
  }
3.Nuxt路由

Nuxt的路由配置

簡單demo

在about文件夾下新建index.vue文件,并寫入下面的代碼:

<template>
  <div>
      <h2>About Index page</h2>
      <ul>
        <li><a href="/">Home</a></li>
      </ul>
  </div>
</template>

在news文件夾下新建index.vue文件,并寫入下面的代碼:

<template>
  <div>
      <h2>News Index page</h2>
       <ul>
        <li><a href="/">Home</a></li>
      </ul>
  </div>
</template>

修改原來的pages文件夾下的index.vue,刪除沒用的代碼,寫入下面代碼:

<template>
  <div>
    <ul>
      <li><a href="/">HOME</a></li>
      <li><a href="/about">ABOUT</a></li>
      <li><a href="/news">NEWS</a></li>
    </ul>
  </div>
</template>

<script>

export default {
  components: {

  }
}
</script>

<style>

</style>

你現(xiàn)在你打開瀏覽器,發(fā)現(xiàn)都已經(jīng)ok了,不需要你單獨配置路由,因為Nuxt.js都為我們作好了,不用寫任何配置代碼。

雖然上面的例子跳轉(zhuǎn)已經(jīng)成功,但是Nuxt.js并不推薦這<a>標(biāo)簽的作法,它為我們準備了<nuxt-link>標(biāo)簽(vue中叫組件)。我們先把首頁的<a>標(biāo)簽替換成<nuxt-link>

<template>
  <div>
    <ul>
      <li><nuxt-link :to="{name:'index'}">HOME</nuxt-link></li>
      <li><nuxt-link :to="{name:'about'}">ABOUT</nuxt-link></li>
      <li><nuxt-link :to="{name:'news'}">NEWS</nuxt-link></li>
    </ul>
  </div>
</template>

<script>

export default {
  components: {

  }
}
</script>

<style>

</style>

我們再次預(yù)覽頁面,也是可以進行正常跳轉(zhuǎn)的,在實際開發(fā)中盡量使用標(biāo)簽的方法跳轉(zhuǎn)路由。

params傳遞參數(shù)

路由經(jīng)常需要傳遞參數(shù),我們可以簡單的使用params來進行傳遞參數(shù),我們現(xiàn)在向新聞頁面(news)傳遞個參數(shù),然后在新聞頁面進行簡單的接收。

我們先修改pages下的Index.vue文件,給新聞的跳轉(zhuǎn)加上params參數(shù),傳遞3306ID。

<template>
  <div>
    <ul>
      <li><nuxt-link :to="{name:'index'}">HOME</nuxt-link></li>
      <li><nuxt-link :to="{name:'about'}">ABOUT</nuxt-link></li>
      <li><nuxt-link :to="{name:'news',params:{newsId:3306}}">NEWS</nuxt-link></li>
    </ul>
  </div>
</template>

<script>

export default {
  components: {

  }
}
</script>

<style>

</style>

在news文件夾下的index.vue里用$route.params.newsId進行接收,代碼如下:

<template>
  <div>
      <h2>News Index page</h2>
      <p>NewsID:{{$route.params.newsId}}</p>
       <ul>
        <li><a href="/">Home</a></li>
      </ul>
  </div>
</template>

動態(tài)路由

新聞詳細頁面: 我在news文件夾下面新建了_id.vue的文件,以下畫線為前綴的Vue文件就是動態(tài)路由,然后在文件里邊有 $route.params.id來接收參數(shù)。

<!--/pages/news/_id.vue-->
<template>
  <div>
      <h2>News-Content [{{$route.params.id}}]</h2>
      <ul>
        <li><a href="/">Home</a></li>
      </ul>
  </div>
</template>

修改新聞首頁路由:

<!--/pages/news/index.vue-->
<template>
  <div>
      <h2>News Index page</h2>
      <p>NewsID:{{$route.params.newsId}}</p>
       <ul>
        <li><a href="/">Home</a></li>
        <li><a href="/news/123">News-1</a></li>
        <li><a href="/news/456">News-2</a></li>
      </ul>
  </div>
</template>

代碼寫好后,打開npm run dev 進行查看,我們已經(jīng)進入了新聞詳細頁,并在詳細頁中取得了傳遞過來的新聞ID.

動態(tài)參數(shù)校驗

進入一個頁面,對參數(shù)傳遞的正確性校驗是必須的,Nuxt.js也貼心的為我們準備了校驗方法validate( )。

<!--/pages/news/_id.vue-->
export default {

  validate ({ params }) {
    // Must be a number
    return /^\d+$/.test(params.id)
  }

}

我們使用了validate方法,并把params傳遞進去,然后用正則進行了校驗,如果正則返回了true正常進入頁面,如果返回false進入404頁面。

4. Nuxt的默認模版和默認布局

默認模板
Nuxt為我們提供了超簡單的默認模版訂制方法,只要在根目錄下創(chuàng)建一個app.html就可以實現(xiàn)了。現(xiàn)在我們希望每個頁面的最上邊都加入“Hollo Word” 這幾個字,我們就可以使用默認模版來完成。

<!DOCTYPE html>
<html lang="en">
<head>
   {{ HEAD }}
</head>
<body>
    <p>Hollo Word/p>
    {{ APP }}
</body>

這里的{{ HEAD }}讀取的是nuxt.config.js里的信息,{{APP}} 就是我們寫的pages文件夾下的主體頁面了。需要注意的是HEAD和APP都需要大寫,如果小寫會報錯的。

這里還有一個小坑需要大家注意,就是如果你建立了默認模板后,記得要重啟服務(wù)器,否則你的顯示不會成功;但是默認布局是不用重啟服務(wù)器。

默認布局
和默認模板類似的功能還有默認布局,但是從名字上你就可以看出來,默認布局主要針對于頁面的統(tǒng)一布局使用。它在位置根目錄下的layouts/default.vue。需要注意的是在默認布局里不要加入頭部信息,只是關(guān)于<template>標(biāo)簽下的內(nèi)容統(tǒng)一訂制。

需求,我們在每個頁面的最頂部放入“我是默認布局 ”這幾個字,看一下在默認布局里的實現(xiàn)。

<!--/layouts/default.vue-->
<template>
  <div>
    <p>我是默認布局</p>
    <nuxt/>
  </div>
</template>

這里的<nuxt/>就相當(dāng)于我們每個頁面的內(nèi)容,你也可以把一些通用樣式放入這個默認布局里,但是個人不建議這樣寫,會增加頁面的復(fù)雜程度。

總結(jié):要區(qū)分默認模版和默認布局的區(qū)別,模版可以訂制很多頭部信息,包括IE版本的判斷;模版只能定制<template>里的內(nèi)容,跟布局有關(guān)系。在工作中修改時要看情況來編寫代碼

5.Nuxt的錯誤頁面和個性meta設(shè)置

建立錯誤頁面

在根目錄下的layouts文件夾下建立一個error.vue文件,它相當(dāng)于一個顯示應(yīng)用錯誤的組件。

<!--/layouts/error.vue--->
<template>
 <div>
     <h2 v-if="error.statusCode==404">404頁面不存在</h2>
     <h2 v-else>500服務(wù)器錯誤</h2>
     <ul>
         <li><nuxt-link to="/">HOME</nuxt-link></li>
     </ul>
 </div>
</template>

<script>
export default {
 props:['error'],
}
</script>

代碼用v-if進行判斷錯誤類型,需要注意的是這個錯誤是你需要在<script>里進行聲明的,如果不聲明程序是找不到error.statusCode的。

個性meta設(shè)置

頁面的Meta對于SEO的設(shè)置非常重要,比如你現(xiàn)在要作個新聞頁面,那為了搜索引擎對新聞的收錄,需要每個頁面對新聞都有不同的title和meta設(shè)置。直接使用head方法來設(shè)置當(dāng)前頁面的頭部信息就可以了。我們現(xiàn)在要把New-1這個頁面設(shè)置成個性的meta和title。

1.我們先把pages/news/index.vue頁面的鏈接進行修改一下,傳入一個title,目的是為了在新聞具體頁面進行接收title,形成文章的標(biāo)題。

<li><nuxt-link :to="{name:'news-id',params:{id:123,title:'jspang.com'}}">News-1</nuxt-link></li>

2.第一步完成后,我們修改/pages/news/_id.vue,讓它根據(jù)傳遞值變成獨特的meta和title標(biāo)簽。

<template>
  <div>
      <h2>News-Content [{{$route.params.id}}]</h2>
      <ul>
        <li><a href="/">Home</a></li>
      </ul>
  </div>
</template>
<script>
export default {

  validate ({ params }) {
    // Must be a number
    return /^\d+$/.test(params.id)
  },
  data(){
    return{
      title:this.$route.params.title,
    }
  },
//獨立設(shè)置head信息
  head(){
      return{
        title:this.title,
        meta:[
          {hid:'description',name:'news',content:'This is news page'}
        ]
      }
    }
}

</script>

注意:為了避免子組件中的meta標(biāo)簽不能正確覆蓋父組件中相同的標(biāo)簽而產(chǎn)生重復(fù)的現(xiàn)象,建議利用 hid 鍵為meta標(biāo)簽配一個唯一的標(biāo)識編號。

6.靜態(tài)資源和打包

直接引入圖片

我們在網(wǎng)上任意下載一個圖片,放到項目中的static文件夾下面,然后可以使用下面的引入方法進行引用.

<div><img src="~static/logo.png" /></div>

這種引用方法是不用估計相對路徑的,“~”就相當(dāng)于定位到了項目跟目錄,這時候你的圖片路徑就不會出現(xiàn)錯誤,就算打包也是正常的。

CSS引入圖片

如果在CSS中引入圖片,方法和html中直接引入是一樣的,也是用“~”符號引入。

<style>
  .diss{
    width: 300px;
    height: 100px;
    background-image: url('~static/logo.png')
  }
</style>

這時候在npm run dev 下是完全正常的,那我們看一下打包。

打包靜態(tài)HTML并運行

用Nuxt.js制作完成后,你可以打包成靜態(tài)文件并放在服務(wù)器上,進行運行。

在終端中輸入:

npm run generate

本地驗證:
在dist文件夾下輸入live-server就可以了。

SEO知識點:https://www.cnblogs.com/lxl0419/p/10401812.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容