Nuxt.js之自動路由原理的實現(xiàn)方法
Nuxt.js 是一個基于 Vue.js 的通用應用框架。集成了Vue 2、Vue-Router、 Vuex、Vue-Meta,用于開發(fā)完整而強大的 Web 應用。
它的特性有服務端渲染、強大的路由功能,支持異步數(shù)據(jù)、HTML頭部標簽管理等。
今天主要介紹的就是Nuxt的特性之一,強大的路由功能。nuxt.js會根據(jù)pages目錄結構自動生成vue-router模塊的路由配置。
nuxt源碼地址: https://github.com/nuxt/nuxt.js
建議打開源碼跟著文章的步驟看,第一次寫,文中有任何錯誤或者表述不清的地方,歡迎批評指正。
首先介紹下nuxt路由的使用
nuxt會根據(jù)pages下的文件自動生成路由并引入,支持vue-router的基礎路由,動態(tài)路由,嵌套路由等。基礎路由很簡單,需要注意的是,在使用動態(tài)路由時,需要創(chuàng)建對應的以下劃線作為前綴的 Vue文件或目錄
例如:
pages/ --| users/ -----| _id.vue --| index.vue
Nuxt.js 生成對應的路由配置表為:
router: {
routes: [{
name: 'index',
path: '/',
component: 'pages/index.vue'
},
{
name: 'users-id',
path: '/users/:id?',
component: 'pages/users/_id.vue'
}]
}
生成的動態(tài)路由, users-id 的路由路徑帶有 :id? 參數(shù),表示該路由是可選的。如果你想將它設置為必選的路由,需要在 users/_id 目錄內(nèi)創(chuàng)建一個 index.vue 文件。
其次需要注意的是在使用嵌套路由時,需要在pages下添加一個 同名的Vue 文件,用來存放子視圖組件。
例如:
pages/ --| users/ -----| _id.vue -----| index.vue --| users.vue
Nuxt.js 生成對應的路由配置表為:
router: {
routes: [{
path: '/users',
component: 'pages/users.vue',
children: [{
path: '',
component: 'pages/users/index.vue',
name: 'users'
},
{
path: ':id',
component: 'pages/users/_id.vue',
name: 'users-id'
}]
}]
}
接下來看為什么要這么寫,包括怎么自動生成路由的原理。
第一步
從npm run dev 說起,package.json 中,npm run dev 運行之后的命令是
dev : "PORT=3004backpack dev"
ps: Backpack是Node.js項目的簡約的構建系統(tǒng),在這里它自定義了一個配置backpack.config.js擴展webpack,backpack dev命令是以開發(fā)模式運行webpack。
第二步
再看自定義的backpack.config.js,返回了server文件下的index.js

第三步
再查看index.js,在這里它搭建了服務器端口號,讀取了nuxt.config文件,并且初始化了nuxt類。引入了node module中nuxt的Nuxt, Builder

第四步
現(xiàn)在可以去nuxt的源碼看具體是怎么自動生成路由的了
在builder.js中,對所有文件進行打包,其中有一步就是構建路由
generateRoutesAndFiles, 它引入了glob庫對page下的文件進行遍歷,并進行了字符串的處理,最后將所有的vue文件地址,整個的項目地址和pages作為參數(shù)傳給createRoutes 函數(shù)

第五步
再看createRoutes函數(shù)具體做了什么 (common/utils.js)
在createRoutes函數(shù)中對傳過來的所有文件地址進行遍歷,再對每一個文件地址字符串處理,以中劃線進行拼接。以此作為route.name

再用lodash庫對routes進行查找,這里就可以看出為什么使用嵌套路由要在同路徑下再加一個同名的vue文件,它的判斷條件就是在routes中找到 name:route.name的集合
如果有嵌套路由,暫時route.path為空,沒有嵌套路由就直接以'/'拼接route.path,這里就可以看到動態(tài)路由的合成原理,如果是動態(tài)路由,route.path將會以 : 替換 _ ,末尾加上 ?

將route.name和route.path都放入routes中,進行排序,路徑短的先放入,最后調(diào)用cleanChildrenRoutes函數(shù),對嵌套路由進行處理。
至此對routes的path 和name的命名的處理已經(jīng)結束。
第六步
再回到build.js中, 打包完后會生成模版文件,routes.js
在模版文件route.js中, 實例了項目的路由
并引入了路由組件,在引入時,將組件命名為下劃線加上組件的hash值并去重引入

這樣就是一個完整的自動生成路由的過程。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Vue-router結合transition實現(xiàn)app前進后退動畫切換效果的實例
下面小編就為大家?guī)硪黄猇ue-router結合transition實現(xiàn)app前進后退動畫切換效果的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
基于前端VUE+ElementUI實現(xiàn)table行上移或下移功能(支持跨頁移動)
有時候需要前端實現(xiàn)上移和下移功能,下面這篇文章主要給大家介紹了關于如何基于前端VUE+ElementUI實現(xiàn)table行上移或下移(支持跨頁移動)的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-07-07
vue使用svg文件補充-svg放大縮小操作(使用d3.js)
這篇文章主要介紹了vue使用svg文件補充-svg放大縮小操作(使用d3.js),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
ElementUI中el-dropdown-item點擊事件無效問題
這篇文章主要介紹了ElementUI中el-dropdown-item點擊事件無效問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04

