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 相关文章推荐
用js判断页面是否加载完成实现代码
Dec 11 Javascript
Ajax异步提交表单数据的说明及方法实例
Jun 22 Javascript
JS简单操作select和dropdownlist实例
Nov 26 Javascript
JS判断页面是否出现滚动条的方法
Jul 17 Javascript
详解Angular的双向数据绑定(MV-VM)
Dec 26 Javascript
AngularJS使用拦截器实现的loading功能完整实例
May 17 Javascript
基于rem的移动端响应式适配方案(详解)
Jul 07 Javascript
babel之配置文件.babelrc入门详解
Feb 22 Javascript
angular2模块和共享模块详解
Apr 08 Javascript
Node.js操作系统OS模块用法分析
Jan 04 Javascript
夯基础之手撕javascript继承详解
Nov 09 Javascript
Vue项目打包、合并及压缩优化网页响应速度
Jul 07 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
Jquery优化效率 提升性能解决方案
2010/09/06 Javascript
js导出格式化的excel 实例方法
2013/07/17 Javascript
JavaScript获取伪元素(Pseudo-Element)属性的方法技巧
2015/03/13 Javascript
requireJS使用指南
2016/04/27 Javascript
响应式表格之固定表头的简单实现
2016/08/26 Javascript
el表达式 写入bootstrap表格数据页面的实例代码
2017/01/11 Javascript
bootstrap suggest搜索建议插件使用详解
2017/03/25 Javascript
深究AngularJS如何获取input的焦点(自定义指令)
2017/06/12 Javascript
bootstrap基本配置_动力节点Java学院整理
2017/07/14 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
2018/01/12 Javascript
在vue项目中使用sass的配置方法
2018/03/20 Javascript
解决Mac安装thrift因bison报错的问题
2018/05/17 Javascript
vue-cli history模式实现tomcat部署报404的解决方式
2019/09/06 Javascript
Vue项目接入Paypal实现示例详解
2020/06/04 Javascript
使用wxpython实现的一个简单图片浏览器实例
2014/07/10 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
2017/06/12 Python
Python编程求质数实例代码
2018/01/31 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
2018/12/19 Python
Python面向对象程序设计多继承和多态用法示例
2019/04/08 Python
浅谈Python小波分析库Pywavelets的一点使用心得
2019/07/09 Python
如何进行Linux分区优化
2013/02/12 面试题
保险专业大学生职业规划书
2014/03/03 职场文书
岗位竞聘书范文
2014/03/31 职场文书
小学生家长寄语
2014/04/02 职场文书
房产转让协议书
2014/04/11 职场文书
爱耳日活动总结
2014/04/30 职场文书
卫生系统先进事迹
2014/05/13 职场文书
奥运会口号
2014/06/13 职场文书
工作批评与自我批评范文
2014/10/16 职场文书
个人合作协议范本
2015/08/06 职场文书
幼儿园保教工作总结2015
2015/10/15 职场文书
浅谈移动端中的视口(viewport)的具体使用
2021/04/13 HTML / CSS
Python合并pdf文件的工具
2021/07/01 Python
使用 Apache Superset 可视化 ClickHouse 数据的两种方法
2021/07/07 Servers
OpenCV实现常见的四种图像几何变换
2022/04/01 Python
HTML 里 img 元素的 src 和 srcset 属性的区别详解
2023/05/21 HTML / CSS