Nuxt介紹
Nuxt.js 是一個基於 Vue.js 的通用應用框架。
預設了利用Vue.js開發服務端渲染的應用所需要的各種配置,同時,也為基於 Vue.js 的應用提供生成對應的靜態站點的功能。
nuxt運作
Nuxt.js 整合了以下元件/框架,用於開發完整而強大的 Web 應用:
Vue 2
Vue-Router
Vuex (當配置了 Vuex 狀態樹配置項 時才會引入)
Vue-Meta
另外,Nuxt.js 使用 Webpack 和 vue-loader 、 babel-loader 來處理程式碼的自動化構建工作(如打包、程式碼分層、壓縮等等)。
Nuxt 特性
- 基於 Vue.js
- 自動程式碼分層
- 服務端渲染
- 強大的路由功能,支援非同步資料
- 靜態檔案服務
- ES6/ES7 語法支援
- 打包和壓縮 JS 和 CSS
- HTML頭部標籤管理
- 本地開發支援熱載入
- 整合ESLint
- 支援各種樣式前處理器: SASS、LESS、 Stylus等等
- 支援HTTP/2 推送
nuxt 實踐
我們直接生成一個新的專案看一下,start ~
從圖中可見很多選項,包含服務端應用,前端UI框架,axios,語法校驗,應用模式等,這個大家根據專案自行選擇即可。 安裝完畢~我們去看看目錄結構吧~ 目錄十分清晰跑一下~
校驗報錯~找到對應頁面,control+s手動儲存一下就好OK~我們來看看主要配置
Nuxt 主要配置
layouts
用於頁面佈局,layouts/default.vue,可用於頁面的通用佈局,也可以自定義佈局,在頁面中通過layouts引用即可
<nuxt/>
這個就是頁面的主體,在這個佈局上新增的東西會展示在所有有頁面上
例如:我在layout/default.vue
頁面新增了一行程式碼,在其他頁面上都會展示
<template>
<div>
// 自定義了一行
<p>我是default模板上加的文字</p>
<nuxt/>
</div>
</template>
複製程式碼
新建pages/demo1.vue
檔案
<template>
<p>我是demo1頁面</p>
</template>
複製程式碼
我們直接儲存,看下展示效果
首頁:
demo1:
很直觀了 ~
自定義佈局,在頁面直接通過layouts引用即可,例:
<template>
<p>我是demo2</p>
</template>
<script>
export default {
layout: 'demo-template'
}
</script>
複製程式碼
layout/error.vue
為預設錯誤頁面,可接收錯誤資訊物件,只支援服務端部署方式
pages
page裡新建檔案會直接生成固定路由,無需人肉新增路由,例:http://127.0.0.1:3000/demo1
路由
Nuxt.js 依據 pages
目錄結構自動生成vue-router
模組的路由配置。
頁面之間可以通過<nuxt-link>
跳轉,這個和我們使用router-link
一樣。
動態路由在檔案前面新增_
即可,路由元件內也可內建引數校驗器,會返回一個布林值,例:
export default {
validate ({ params }) {
// 必須是number型別
return /^\d+$/.test(params.id)
}
}
複製程式碼
此外還支援巢狀路由,動態巢狀路由等,更多請檢視路由-Nuxt.js
nuxt.config.js
這個檔案是個靈魂檔案,一切的配置都在這裡整合
const pkg = require('./package')
module.exports = {
複製程式碼
// 初始化的選過的,別亂改
mode: 'universal',
複製程式碼
/*
** Headers of the page
** 基本沒啥需要在這改的,頁面的自定義內容可到頁面具體配置
*/
head: {
title: pkg.name,
meta: [
{ charset: 'utf-8' },
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
{ hid: 'description', name: 'description', content: pkg.description }
],
link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }]
},
複製程式碼
/*
** Customize the progress-bar color
** color String 'black' 進度條的顏色
** failedColor String 'red' 頁面載入失敗時的顏色 (當 data 或 fetch 方法返回錯誤時)。
** height String '2px' 進度條的高度 (在進度條元素的 style 屬性上體現)。
** throttle Number 200 在ms中,在顯示進度條之前等待指定的時間。用於防止條形閃爍。
** duration Number 5000 進度條的最大顯示時長,單位毫秒。Nuxt.js 假設頁面在該時長內載入完畢。
** rtl Boolean false 從右到左設定進度條的方向。
** 可在頁面禁用
*/
loading: { color: '#fff' },
複製程式碼
/*
** 該配置項用於定義應用的全域性(所有頁面均需引用的)樣式檔案、模組或第三方庫。
** 如果要使用 sass 就必須要安裝 node-sass和sass-loader 。
*/
css: [
'@/assets/css/main.scss'
],
複製程式碼
/*
** 在根目錄plugins下新增的外掛,需要在這指定路徑,可配置引數:
** src: String (檔案的路徑)
** ssr: Boolean (預設為 true) 如果值為 false,該檔案只會在客戶端被打包引入。
*/
plugins: [{
src:'~plugins/axios',
ssr: false
}],
複製程式碼
/*
** modules是Nuxt.js擴充套件,可以擴充套件它的核心功能並新增無限的整合
** https://zh.nuxtjs.org/guide/modules/
*/
modules: [
// Doc: https://github.com/nuxt-community/axios-module#usage
'@nuxtjs/axios'
],
複製程式碼
/*
** https://zh.nuxtjs.org/api/configuration-build/
** 配置太多,基本需要擴充套件的配置都可以在這裡新增
*/
build: {
/*
** You can extend webpack config here
*/
extend(config, ctx) {
// Run ESLint on save
if (ctx.isDev && ctx.isClient) {
config.module.rules.push({
enforce: 'pre',
test: /\.(js|vue)$/,
loader: 'eslint-loader',
exclude: /(node_modules)/
})
}
}
}
}
複製程式碼
部署
Nuxt部署分為服務端渲染應用部署和靜態應用部署,初始化專案的時候,先確定好這個再開發,以免踩坑。 服務端部署:
npm run build
npm run start
複製程式碼
靜態部署:
npm run generate
複製程式碼
如果確定是靜態部署,需要注意在服務端執行的方法都生效,比如created,asyncData等,當接入非同步請求時會報錯。靜態部署動態路由也是不可用的。