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 相关文章推荐
jQuery TextBox自动完成条
Jul 22 Javascript
基于jQuery中对数组进行操作的方法
Apr 16 Javascript
window.open打开页面居中显示的示例代码
Dec 27 Javascript
jQuery选择器简明总结(含用法实例,一目了然)
Apr 25 Javascript
jQuery实现的类似淘宝网站搜索框样式代码分享
Aug 24 Javascript
判断js的Array和Object的实现方法
Aug 29 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
Sep 27 Javascript
JS实现的判断方法、变量是否存在功能示例
Mar 28 Javascript
JavaScript创建对象的常用方式总结
Aug 10 Javascript
微信小程序 wx:for遍历循环使用实例解析
Sep 09 Javascript
layui 弹出层值回传解决方式
Nov 14 Javascript
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
Jan 13 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+MYSQL会员系统的开发实例教程
2014/08/23 PHP
10个超级有用值得收藏的PHP代码片段
2015/01/22 PHP
php使用for语句输出三角形的方法
2015/06/09 PHP
简单实现php上传文件功能
2017/09/21 PHP
基于jQuery制作迷你背词汇工具
2010/07/27 Javascript
Jquery ThickBox插件使用心得(不建议使用)
2010/09/08 Javascript
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
2013/01/06 Javascript
JS生成不重复随机数组的函数代码
2014/06/10 Javascript
jQuery实现的登录浮动框效果代码
2015/09/26 Javascript
javascript运动框架用法实例分析(实现放大与缩小效果)
2016/01/08 Javascript
js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码
2016/04/30 Javascript
论Bootstrap3和Foundation5网格系统的异同
2016/05/16 Javascript
基于Bootstrap3表格插件和分页插件实例详解
2016/05/17 Javascript
利用fecha进行JS日期处理
2016/11/21 Javascript
jquery操作ID带有变量的节点实例
2016/12/07 Javascript
Vue.js基础知识小结
2017/01/13 Javascript
JavaScript严格模式下关于this的几种指向详解
2017/07/12 Javascript
layui中使用jquery控制radio选中事件的示例代码
2018/08/15 jQuery
深入理解令牌认证机制(token)
2019/08/22 Javascript
微信小程序实现登录注册功能
2020/12/29 Javascript
python使用in操作符时元组和数组的区别分析
2015/05/19 Python
python提取字典key列表的方法
2015/07/11 Python
详解Python发送邮件实例
2016/01/10 Python
Python3.X 线程中信号量的使用方法示例
2017/07/24 Python
Python爬取qq空间说说的实例代码
2018/08/17 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
2020/02/03 Python
python中uuid模块实例浅析
2020/12/29 Python
VSCode中autopep8无法运行问题解决方案(提示Error: Command failed,usage)
2021/03/02 Python
html2canvas生成清晰的图片实现打印的示例代码
2019/09/30 HTML / CSS
受希腊女神灵感的晚礼服、鸡尾酒礼服和婚纱:THEIA
2018/04/15 全球购物
英国领先的在线旅游和休闲零售商:lastminute.com
2019/01/23 全球购物
C有"按引用传递"吗
2016/09/06 面试题
考试作弊被抓检讨书
2014/01/10 职场文书
幼儿园卫生保健制度
2015/08/05 职场文书
CSS 左边固定宽右边自适应的6种方法
2022/05/15 HTML / CSS