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 相关文章推荐
菜鸟javascript基础资料整理2
Dec 06 Javascript
jquery实现一个简单好用的弹出框
Sep 26 Javascript
JS实现双击屏幕滚动效果代码
Oct 28 Javascript
js判断复选框是否选中及选中个数的实现代码
May 30 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
Jan 09 Javascript
用纯Node.JS弹出Windows系统消息提示框实例(MessageBox)
May 17 Javascript
微信小程序实现image组件图片自适应宽度比例显示的方法
Jan 16 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
Jun 17 Javascript
解决vue v-for src 图片路径问题 404
Nov 12 Javascript
JavaScript交换变量的常用方法小结【4种方法】
May 07 Javascript
基于aotu.js实现微信自动添加通讯录中的联系人功能
May 28 Javascript
Vue3为什么这么快
Sep 23 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
windows下升级PHP到5.3.3的过程及注意事项
2010/10/12 PHP
php堆排序实现原理与应用方法
2015/01/03 PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
2015/12/07 PHP
浅谈javascript的数据类型检测
2010/07/10 Javascript
jquery动态改变onclick属性导致失效的问题解决方法
2013/12/04 Javascript
JS实现局部选择打印和局部不选择打印
2014/04/03 Javascript
浅析jquery unbind()方法移除元素绑定的事件
2016/05/24 Javascript
JavaScript编码风格指南(中文版)
2016/08/26 Javascript
jQuery实现对网页节点的增删改查功能示例
2017/09/18 jQuery
VS Code转换大小写、修改选中文字或代码颜色的方法
2017/12/15 Javascript
动态加载权限管理模块中的Vue组件
2018/01/16 Javascript
element-ui 表格数据时间格式化的方法
2018/08/24 Javascript
node中的密码安全(加密)
2018/09/17 Javascript
JavaScript前端开发时数值运算的小技巧
2020/07/28 Javascript
python读文件逐行处理的示例代码分享
2013/12/27 Python
举例讲解Python设计模式编程的代理模式与抽象工厂模式
2016/01/16 Python
pycham查看程序执行的时间方法
2018/11/29 Python
python scp 批量同步文件的实现方法
2019/01/03 Python
Python中模块(Module)和包(Package)的区别详解
2019/08/07 Python
python实现简易学生信息管理系统
2020/04/05 Python
python 统计文件中的字符串数目示例
2019/12/24 Python
Python单元测试模块doctest的具体使用
2020/02/10 Python
django实现后台显示媒体文件
2020/04/07 Python
keras的ImageDataGenerator和flow()的用法说明
2020/07/03 Python
python绘制分布折线图的示例
2020/09/24 Python
基于HTML5的WebGL经典3D虚拟机房漫游动画
2017/11/15 HTML / CSS
HTML5 3D旋转相册的实现示例
2019/12/03 HTML / CSS
Clarins娇韵诗美国官网:法国天然护肤品牌
2016/09/26 全球购物
Original Penguin美国官网:布拉德皮特、强尼德普喜爱的服装品牌
2016/10/25 全球购物
巴基斯坦电子产品购物网站:Home Shopping
2017/09/14 全球购物
标准导师推荐信(医学类)
2013/10/28 职场文书
教学个人的自我评价分享
2014/02/16 职场文书
竞聘演讲稿开场白
2014/08/25 职场文书
教师思想作风整顿个人剖析材料
2014/10/10 职场文书
励志语录:只有自己足够强大,才能不被别人践踏
2020/01/09 职场文书
CentOS7和8下安装Maven3.8.4
2022/04/07 Servers