vue-router启用history模式下的开发及非根目录部署方法


Posted in Javascript onDecember 23, 2018

 为什么要有 hash 和 history

对于 Vue 这类渐进式前端开发框架,为了构建 SPA(单页面应用),需要引入前端路由系统,这也就是 Vue-Router 存在的意义。前端路由的核心,就在于 —— 改变视图的同时不会向后端发出请求。

为了达到这一目的,浏览器当前提供了以下两种支持:

1.hash —— 即地址栏 URL 中的 # 符号(此 hash 不是密码学里的散列运算)。

比如这个 URL:http://www.abc.com/#/hello,hash 的值为 #/hello。它的特点在于:hash 虽然出现在 URL 中,“#”后面的内容不会被包括在 HTTP 请求中,对后端完全没有影响,因此改变 hash 不会重新加载页面。

2.history —— 利用了 HTML5 History Interface 中新增的 pushState() 和 replaceState() 方法。(需要特定浏览器支持)
这两个方法应用于浏览器的历史记录栈,在当前已有的 back、forward、go 的基础之上,它们提供了对历史记录进行修改的功能。只是当它们执行修改时,虽然改变了当前的 URL,但浏览器不会立即向后端发送请求。

因此可以说,hash 模式和 history 模式都属于浏览器自身的特性,Vue-Router 只是利用了这两个特性(通过调用浏览器提供的接口)来实现前端路由。

vue-router 的 history 模式是个提高颜值的好东西,没有了 hash 的路由看起来清爽许多。

开发的时候,如果我们使用 devServer 来启动服务,由于一般不共用端口,我们一般不存在非根目录的问题。

而刷新后 404 的问题可以借助 historyApiFallback 来解决。

但当我们项目对外开放时,往往无法在域名根目录下提供服务,这个时候资源的访问路径与开发时的根目录就有了区别。

首先,我们通过 webpack 来配置一下项目中所有资源的基础路径,让这份代码在开发和生产环境中都可以正确找到资源。

// config/index.js
module.exports = {
  dev: {
    ...
    // 开发环境根目录 - 服务根目录 - 绝对路径
    assetsPublicPath: '/'
    ...
  },
  build: {
    ...
    // 生产环境根目录 - 服务器访问路径 - 绝对路径
    assetsPublicPath: '/test/project1/'
    ...
  }
}

 
// build/webpack.common.conf.js
const config = require('../config')
module.exports = {
  output: {
    publicPath: process.env.NODE_ENV === 'production'
      ? config.build.assetsPublicPath
      : config.dev.assetsPublicPath
  }
}

// build/webpack.dev.conf.js
const common = require('./webpack.common')
module.exports = merge(common, {
  devServer: {
    historyApiFallback: true
  }
}

然后在提供服务的服务器配置中做如下配置(以 nginx 为例):

location /test/project1 {
    alias .../project1; // 项目的真实路径
    index index.html;
    try_files $uri $uri/ /test/project1/index.html;
}

try_files 会按顺序检查参数中的资源是否存在,并返回第一个找到的资源,如果都没有找到,它会让 nginx 内部重定向到会后一个参数。

对了,所以它的的作用是解决刷新 404 的问题。

这里值得注意的是 try_files 的参数是绝对路径。

至此,你开启 history 模式的项目就可以顺利的跑在任何路径了。

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

Javascript 相关文章推荐
prototype Element学习笔记(Element篇三)
Oct 26 Javascript
IE与Firefox在JavaScript上的7个不同写法小结
Sep 14 Javascript
jQuery的实现原理的模拟代码 -4 重要的扩展函数 extend
Aug 03 Javascript
js获取指定日期前后的日期代码
Aug 20 Javascript
JS判断客服QQ号在线还是离线状态的方法
Jan 13 Javascript
JS实现响应鼠标点击动画渐变弹出层效果代码
Mar 25 Javascript
原生JS实现的双色球功能示例
Feb 02 Javascript
vue-cli和v-charts实现可视化图表过程解析
Oct 08 Javascript
vue开发中遇到的问题总结
Apr 07 Javascript
weui上传多图片,压缩,base64编码的示例代码
Jun 22 Javascript
什么是SOLID
Mar 24 Javascript
Vue3实现简易音乐播放器组件
Aug 14 Vue.js
小程序实现人脸识别功能(百度ai)
Dec 23 #Javascript
优雅的elementUI table单元格可编辑实现方法详解
Dec 23 #Javascript
基于webpack4.X从零搭建React脚手架的方法步骤
Dec 23 #Javascript
JavaScript基于数组实现的栈与队列操作示例
Dec 22 #Javascript
jQuery实现侧边栏隐藏与显示的方法详解
Dec 22 #jQuery
JavaScript时间日期操作实例小结【5个示例】
Dec 22 #Javascript
JavaScript文本特效实例小结【3个示例】
Dec 22 #Javascript
You might like
PHP面向对象概念
2011/11/06 PHP
thinkphp实现把数据库中的列的值存到下拉框中的方法
2017/01/20 PHP
PHP基于socket实现客户端和服务端通讯功能
2017/07/13 PHP
Use Word to Search for Files
2007/06/15 Javascript
使用js对select动态添加和删除OPTION示例代码
2013/08/12 Javascript
9行javascript代码获取QQ群成员具体实现
2013/10/16 Javascript
jQuery 文本框得失焦点的简单实例
2014/02/19 Javascript
给js文件传参数(详解)
2014/07/13 Javascript
jquery制作select列表双向选择示例代码
2014/09/02 Javascript
JavaScript Split()方法
2015/12/18 Javascript
js 弹出对话框(遮罩)透明,可拖动的简单实例
2016/07/11 Javascript
深入理解JS实现快速排序和去重
2016/10/17 Javascript
html+javascript+bootstrap实现层级多选框全层全选和多选功能
2017/03/09 Javascript
vue结合Echarts实现点击高亮效果的示例
2018/03/17 Javascript
Angular2中监听数据更新的方法
2018/08/31 Javascript
如何使用less实现随机下雪动画详解
2019/01/02 Javascript
jQuery-Citys省市区三级菜单联动插件使用详解
2019/07/26 jQuery
js实现翻牌小游戏
2020/07/31 Javascript
[40:53]完美世界DOTA2联赛PWL S3 Magma vs DLG 第二场 12.18
2020/12/20 DOTA
为Python程序添加图形化界面的教程
2015/04/29 Python
Python2包含中文报错的解决方法
2018/07/09 Python
django项目搭建与Session使用详解
2018/10/10 Python
由面试题加深对Django的认识理解
2019/07/19 Python
Anaconda+vscode+pytorch环境搭建过程详解
2020/05/25 Python
Python实现自动签到脚本的示例代码
2020/08/19 Python
Python安装第三方库攻略(pip和Anaconda)
2020/10/15 Python
pymysql模块使用简介与示例
2020/11/17 Python
总结30个CSS3选择器
2017/04/13 HTML / CSS
html如何对span设置宽度
2019/10/30 HTML / CSS
标准导师推荐信(医学类)
2013/10/28 职场文书
高一自我鉴定
2013/12/17 职场文书
快餐店的创业计划书范文
2014/01/29 职场文书
生物制药专业自我鉴定
2014/02/19 职场文书
地球物理学专业推荐信
2014/09/08 职场文书
村长反四风问题个人对照检查材料
2014/09/21 职场文书
Nginx解决403 forbidden的完整步骤
2021/04/01 Servers