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 相关文章推荐
用javascript模仿ie的自动完成类似自动完成功的表单
Dec 12 Javascript
treepanel动态加载数据实现代码
Dec 15 Javascript
JS 页面计时器示例代码
Oct 28 Javascript
jQuery实现隔行背景色变色
Nov 24 Javascript
jQuery实现图片预加载效果
Nov 27 Javascript
微信公众平台开发教程(六)获取个性二维码的实例
Dec 02 Javascript
Bootstrap 手风琴菜单的实现代码
Jan 20 Javascript
基于jquery实现二级联动效果
Mar 30 jQuery
Angular4 组件通讯方法大全(推荐)
Jul 12 Javascript
前端axios下载excel文件(二进制)的处理方法
Jul 31 Javascript
vue移动端项目缓存问题实践记录
Oct 29 Javascript
序列化模块json代码实例详解
Mar 03 Javascript
小程序实现人脸识别功能(百度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
自己动手,丰衣足食 - 短波框形天线制作
2021/03/01 无线电
Windows下部署Apache+PHP+MySQL运行环境实战
2012/08/31 PHP
php的ZipArchive类用法实例
2014/10/20 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
PHP检测接口Traversable用法详解
2017/12/29 PHP
Laravel框架文件上传功能实现方法示例
2019/04/16 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
2020/05/12 PHP
javascript(jquery)利用函数修改全局变量的代码
2009/11/02 Javascript
js中查找最近的共有祖先元素的实现代码
2010/12/30 Javascript
javascript使用prototype完成单继承
2014/12/24 Javascript
jQuery实现的仿select功能代码
2015/08/19 Javascript
AngularJS中处理多个promise的方式
2016/02/02 Javascript
JavaScript中子对象访问父对象的方式详解
2016/09/01 Javascript
vue-cli项目中使用Mockjs详解
2018/05/14 Javascript
微信小程序学习笔记之跳转页面、传递参数获得数据操作图文详解
2019/03/28 Javascript
vue props 单项数据流实例分享
2020/02/16 Javascript
[05:09]第二届DOTA2亚洲邀请赛决赛日比赛集锦:iG 3:0 OG夺冠
2017/04/05 DOTA
[43:24]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.12
2020/12/17 DOTA
Python 包含汉字的文件读写之每行末尾加上特定字符
2016/12/12 Python
python判断字符串或者集合是否为空的实例
2019/01/23 Python
windows环境中利用celery实现简单任务队列过程解析
2019/11/29 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
2020/04/26 Python
python实现发送邮件
2021/03/02 Python
HTML5去掉输入框type为number时的上下箭头的实现方法
2020/01/03 HTML / CSS
柏林通行证:Berlin Pass
2018/04/11 全球购物
请问如下代码执行后a和b的值分别是什么
2016/05/05 面试题
运动会稿件300字
2014/02/14 职场文书
幼儿园课题实施方案
2014/05/14 职场文书
2014年教师个人工作总结
2014/11/10 职场文书
医生个人年终总结
2015/02/28 职场文书
评职称个人总结
2015/03/05 职场文书
2015年惩防体系建设工作总结
2015/05/22 职场文书
2015法院个人工作总结范文
2015/05/25 职场文书
单位工作证明范本
2015/06/15 职场文书
Golang中异常处理机制详解
2021/06/08 Golang
python绘制简单直方图(质量分布图)的方法
2022/04/21 Python