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 相关文章推荐
JS OOP包机制,类创建的方法定义
Nov 02 Javascript
jquery防止重复执行动画避免页面混乱
Apr 22 Javascript
Python脚本后台运行的几种方式
Mar 09 Javascript
jquery序列化方法实例分析
Jun 10 Javascript
readonly和disabled属性的区别
Jul 26 Javascript
javascript图片切换综合实例(循环切换、顺序切换)
Jan 13 Javascript
JavaScript事件详细讲解
Jun 27 Javascript
AngularJs定制样式插入到ueditor中的问题小结
Aug 01 Javascript
浅析BootStrap Treeview的简单使用
Oct 12 Javascript
angularjs使用directive实现分页组件的示例
Feb 07 Javascript
用POSTMAN发送JSON格式的POST请求示例
Sep 04 Javascript
10行代码实现微信小程序滑动tab切换
Dec 28 Javascript
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
实现php加速的eAccelerator dll支持文件打包下载
2007/09/30 PHP
php zip文件解压类代码
2009/12/02 PHP
PHP获取php,mysql,apche的版本信息示例代码
2014/01/16 PHP
ThinkPHP实现支付宝接口功能实例
2014/12/02 PHP
PHP实现生成数据字典功能示例
2018/05/24 PHP
Javascript & DHTML 实例编程(教程)DOM基础和基本API
2007/06/02 Javascript
javascript flash下fromCharCode和charCodeAt方法使用说明
2008/01/12 Javascript
JavaScript Event事件学习第一章 Event介绍
2010/02/07 Javascript
ExtJs grid行 右键菜单的两种方法
2010/06/19 Javascript
JS隐藏参数post传值实例
2013/04/18 Javascript
JavaScript fontsize方法入门实例(按照指定的尺寸来显示字符串)
2014/10/17 Javascript
修改js confirm alert 提示框文字的简单实例
2016/06/10 Javascript
基于BootStrap实现局部刷新分页实例代码
2016/08/08 Javascript
javascript加载xml 并解析各节点的值(实现方法)
2016/10/12 Javascript
Vue组件通信实践记录(推荐)
2017/08/15 Javascript
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
2017/11/19 Javascript
js登录滑动验证的实现(不滑动无法登陆)
2018/01/03 Javascript
jQuery中getJSON跨域原理的深入讲解
2020/09/02 jQuery
Vue使用路由钩子拦截器beforeEach和afterEach监听路由
2020/11/16 Javascript
Python使用当前时间、随机数产生一个唯一数字的方法
2017/09/18 Python
python中使用正则表达式的连接符示例代码
2017/10/10 Python
神经网络相关之基础概念的讲解
2018/12/29 Python
在Python 中实现图片加框和加字的方法
2019/01/26 Python
用python 实现在不确定行数情况下多行输入方法
2019/01/28 Python
调用HTML5的Canvas API绘制图形的快速入门指南
2016/06/17 HTML / CSS
司机的工作范围及职责
2013/11/13 职场文书
会计系毕业求职信
2014/08/07 职场文书
2014年乡镇工作总结
2014/11/21 职场文书
学校百日安全活动总结
2015/05/07 职场文书
2015年幼儿园安全工作总结
2015/05/12 职场文书
投诉书范文
2015/07/02 职场文书
《小小的船》教学反思
2016/02/18 职场文书
确保减税降费落地生根,用实实在在措施
2019/07/19 职场文书
iOS 16进一步确认,一共支持16款iPhone
2022/04/28 数码科技
redis lua限流算法实现示例
2022/07/15 Redis
SpringBoot前端后端分离之Nginx服务器下载安装过程
2022/08/14 Servers