Nuxt.js之自动路由原理的实现方法


Posted in Javascript onNovember 21, 2018

Nuxt.js 是一个基于 Vue.js 的通用应用框架。集成了Vue 2、Vue-Router、 Vuex、Vue-Meta,用于开发完整而强大的 Web 应用。

它的特性有服务端渲染、强大的路由功能,支持异步数据、HTML头部标签管理等。

今天主要介绍的就是Nuxt的特性之一,强大的路由功能。nuxt.js会根据pages目录结构自动生成vue-router模块的路由配置。

nuxt源码地址: https://github.com/nuxt/nuxt.js

建议打开源码跟着文章的步骤看,第一次写,文中有任何错误或者表述不清的地方,欢迎批评指正。

首先介绍下nuxt路由的使用

nuxt会根据pages下的文件自动生成路由并引入,支持vue-router的基础路由,动态路由,嵌套路由等。基础路由很简单,需要注意的是,在使用动态路由时,需要创建对应的以下划线作为前缀的 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'
   }]
  }

生成的动态路由, users-id 的路由路径带有 :id? 参数,表示该路由是可选的。如果你想将它设置为必选的路由,需要在 users/_id 目录内创建一个 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项目的简约的构建系统,在这里它自定义了一个配置backpack.config.js扩展webpack,backpack dev命令是以开发模式运行webpack。

第二步

再看自定义的backpack.config.js,返回了server文件下的index.js

Nuxt.js之自动路由原理的实现方法

第三步

再查看index.js,在这里它搭建了服务器端口号,读取了nuxt.config文件,并且初始化了nuxt类。引入了node module中nuxt的Nuxt, Builder

Nuxt.js之自动路由原理的实现方法

第四步

现在可以去nuxt的源码看具体是怎么自动生成路由的了
在builder.js中,对所有文件进行打包,其中有一步就是构建路由

generateRoutesAndFiles, 它引入了glob库对page下的文件进行遍历,并进行了字符串的处理,最后将所有的vue文件地址,整个的项目地址和pages作为参数传给createRoutes 函数

Nuxt.js之自动路由原理的实现方法

第五步

再看createRoutes函数具体做了什么 (common/utils.js)
在createRoutes函数中对传过来的所有文件地址进行遍历,再对每一个文件地址字符串处理,以中划线进行拼接。以此作为route.name

Nuxt.js之自动路由原理的实现方法

再用lodash库对routes进行查找,这里就可以看出为什么使用嵌套路由要在同路径下再加一个同名的vue文件,它的判断条件就是在routes中找到 name:route.name的集合

如果有嵌套路由,暂时route.path为空,没有嵌套路由就直接以'/'拼接route.path,这里就可以看到动态路由的合成原理,如果是动态路由,route.path将会以 : 替换 _ ,末尾加上 ?

Nuxt.js之自动路由原理的实现方法

将route.name和route.path都放入routes中,进行排序,路径短的先放入,最后调用cleanChildrenRoutes函数,对嵌套路由进行处理。

至此对routes的path 和name的命名的处理已经结束。

第六步

再回到build.js中, 打包完后会生成模版文件,routes.js

在模版文件route.js中, 实例了项目的路由

并引入了路由组件,在引入时,将组件命名为下划线加上组件的hash值并去重引入

Nuxt.js之自动路由原理的实现方法

这样就是一个完整的自动生成路由的过程。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
初探jquery——表单应用范例
Feb 20 Javascript
jQuery学习笔记(3)--用jquery(插件)实现多选项卡功能
Apr 08 Javascript
JS制作简单的三级联动
Mar 18 Javascript
JavaScript中用sort()方法对数组元素进行排序的操作
Jun 09 Javascript
JavaScript实现定时隐藏与显示图片的方法
Aug 06 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
Jan 09 Javascript
React中jquery引用的实现方法
Sep 12 jQuery
基于jQuery Ajax实现下拉框无刷新联动
Dec 06 jQuery
vue cli 3.x 项目部署到 github pages的方法
Apr 17 Javascript
详解vue 路由跳转四种方式 (带参数)
Apr 28 Javascript
vue日历/日程提醒/html5本地缓存功能
Sep 02 Javascript
Vue——解决报错 Computed property "****" was assigned to but it has no setter.
Dec 19 Vue.js
nuxt.js中间件实现拦截权限判断的方法
Nov 21 #Javascript
Nuxt.js SSR与权限验证的实现
Nov 21 #Javascript
详解nuxt路由鉴权(express模板)
Nov 21 #Javascript
使用vue-cli webpack 快速搭建项目的代码
Nov 21 #Javascript
Angular刷新当前页面的实现方法
Nov 21 #Javascript
详解ES6系列之私有变量的实现
Nov 21 #Javascript
jQuery实现上下滚动公告栏详细代码
Nov 21 #jQuery
You might like
在yii中新增一个用户验证的方法详解
2013/06/20 PHP
php缓冲输出实例分析
2015/01/05 PHP
PHP的命令行命令使用指南
2015/08/18 PHP
thinkPHP模板中for循环与switch语句用法示例
2016/11/30 PHP
laravel 中如何使用ajax和vue总结
2017/08/16 PHP
Javascript执行效率全面总结
2013/11/04 Javascript
鼠标移入移出事件改变图片的分辨率的两种方法
2013/12/17 Javascript
javascript 使用for循环时该注意的问题-附问题总结
2015/08/19 Javascript
理解javascript定时器中的单线程
2016/02/23 Javascript
Bootstrap基本组件学习笔记之进度条(15)
2016/12/08 Javascript
整理关于Bootstrap导航的慕课笔记
2017/03/29 Javascript
js中的事件委托或是事件代理使用详解
2017/06/23 Javascript
详解用Node.js实现Restful风格webservice
2017/09/29 Javascript
JS匿名函数和匿名自执行函数概念与用法分析
2018/03/16 Javascript
基于JS实现html中placeholder属性提示文字效果示例
2018/04/19 Javascript
vue.js实现回到顶部动画效果
2019/07/31 Javascript
javaScript实现一个队列的方法
2020/07/14 Javascript
[05:29]2014DOTA2国际邀请赛 赛后专访:LGDNewbee顺利过关
2014/07/13 DOTA
Python文本特征抽取与向量化算法学习
2017/12/22 Python
python实现画圆功能
2018/01/25 Python
TensorFlow实现创建分类器
2018/02/06 Python
Python不使用int()函数把字符串转换为数字的方法
2018/07/09 Python
Python3批量生成带logo的二维码方法
2019/06/24 Python
Python queue队列原理与应用案例分析
2019/09/27 Python
浅谈Python中的异常和JSON读写数据的实现
2020/02/27 Python
python如何写出表白程序
2020/06/01 Python
一文读懂python Scrapy爬虫框架
2021/02/24 Python
英国网上香水店:Fragrance Direct
2016/07/20 全球购物
印度尼西亚最大的电商平台:Tokopedia(印尼版淘宝)
2017/12/02 全球购物
泰国办公用品购物网站:OfficeMate
2018/02/04 全球购物
Feelunique德国官方网站:欧洲最大的在线美容零售商
2019/07/20 全球购物
法制宣传口号
2014/06/16 职场文书
移交协议书
2014/08/19 职场文书
践行三严三实心得体会
2014/10/13 职场文书
医药公司采购员岗位职责
2015/04/03 职场文书
北京爱情故事观后感
2015/06/12 职场文书