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 相关文章推荐
Firefox和IE浏览器兼容JS脚本写法小结
Jul 07 Javascript
谷歌浏览器 insertCell与appendChild的区别
Feb 12 Javascript
基于Jquery与WebMethod投票功能实现代码
Jan 19 Javascript
jQuery实现的产品自动360度旋转展示特效源码分享
Aug 21 Javascript
分享jQuery封装好的一些常用操作
Jul 28 Javascript
JS实现字符串转驼峰格式的方法
Dec 16 Javascript
微信公众号菜单配置微信小程序实例详解
Mar 31 Javascript
Node.js学习之地址解析模块URL的使用详解
Sep 28 Javascript
在微信小程序里使用watch和computed的方法
Aug 02 Javascript
elementUI Tree 树形控件的官方使用文档
Apr 25 Javascript
vue中如何实现后台管理系统的权限控制的方法步骤
Sep 05 Javascript
Vue使用Three.js加载glTF模型的方法详解
Jun 14 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
索尼ICF-SW100收音机评测
2021/03/02 无线电
php socket通信(tcp/udp)实例分析
2016/02/14 PHP
javascript中负数算术右移、逻辑右移的奥秘探索
2013/10/17 Javascript
JQueryiframe页面操作父页面中的元素与方法(实例讲解)
2013/11/19 Javascript
js简单的表格添加行和删除行操作示例
2014/03/31 Javascript
JavaScript中的prototype和constructor简明总结
2014/04/05 Javascript
javascript实现相同事件名称,不同命名空间的调用方法
2015/06/26 Javascript
node.js读取文件到字符串的方法
2015/06/29 Javascript
jquery结婚电子请柬特效源码分享
2015/08/21 Javascript
一个字符串中出现次数最多的字符 统计这个次数【实现代码】
2016/04/29 Javascript
解决拦截器对ajax请求的拦截实例详解
2016/12/21 Javascript
webpack 2的react开发配置实例代码
2017/07/28 Javascript
深入理解Vue官方文档梳理之全局API
2017/11/22 Javascript
jQuery插件jsonview展示json数据
2018/05/26 jQuery
使用p5.js实现动态GIF图片临摹重现
2019/10/23 Javascript
《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析
2020/04/07 Javascript
[02:07]2017国际邀请赛中国区预选赛直邀战队前瞻
2017/06/23 DOTA
[14:19]2018年度COSER大赛-完美盛典
2018/12/16 DOTA
在Python的Django框架中获取单个对象数据的简单方法
2015/07/17 Python
Python第三方库的安装方法总结
2016/06/06 Python
浅谈python中的__init__、__new__和__call__方法
2017/07/18 Python
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
2017/08/08 Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
2018/01/02 Python
python中ASCII码和字符的转换方法
2018/07/09 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
Django框架获取form表单数据方式总结
2020/04/22 Python
Django框架安装及项目创建过程解析
2020/09/14 Python
Visual Studio Code搭建django项目的方法步骤
2020/09/17 Python
黄色火烈鸟:De Gele Flamingo
2019/03/18 全球购物
如何在C# winform中异步调用web services
2015/09/21 面试题
医务工作者先进事迹材料
2014/01/26 职场文书
最新结婚典礼主持词
2014/03/14 职场文书
领导干部作风整顿个人剖析材料
2014/10/11 职场文书
关于拾金不昧的感谢信
2015/01/21 职场文书
2015年教师节演讲稿范文
2015/03/19 职场文书
承诺书模板大全
2015/05/04 职场文书