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的仿照flash放大图片效果代码
Mar 16 Javascript
定义JavaScript二维数组采用定义数组的数组来实现
Dec 09 Javascript
图解JavaScript中的this关键字
May 28 Javascript
js和jquery实现监听键盘事件示例代码
Jun 24 Javascript
实例讲解使用原生JavaScript处理AJAX请求的方法
May 10 Javascript
分享javascript实现的冒泡排序代码并优化
Jun 05 Javascript
JS实现对中文字符串进行utf-8的Base64编码的方法(使其与Java编码相同)
Jun 21 Javascript
JS获取html元素的标记名实现方法
Oct 08 Javascript
jQuery页面弹出框实现文件上传
Feb 09 Javascript
详解vue的diff算法原理
May 20 Javascript
深入解析ES6中的promise
Nov 08 Javascript
Vue2.0实现简单分页及跳转效果
Jul 29 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
我的论坛源代码(六)
2006/10/09 PHP
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
2014/06/12 PHP
php实现图片上传、剪切功能
2016/05/07 PHP
PHP正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法分析
2017/02/04 PHP
php实现查询功能(数据访问)
2017/05/23 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
2017/06/11 PHP
php+Ajax无刷新验证用户名操作实例详解
2019/03/04 PHP
用javascript实现给出的盒子的序列是否可连为一矩型
2007/08/30 Javascript
在Javascript里访问SharePoint列表数据的实现方法
2011/05/22 Javascript
jQuery ui 利用 datepicker插件实现开始日期(minDate)和结束日期(maxDate)
2014/05/22 Javascript
jQuery实现在列表的首行添加数据
2015/05/19 Javascript
基于JS模仿windows文件按名称排序效果
2016/06/29 Javascript
jquery实现input框获取焦点的简单实例
2017/01/26 Javascript
基于JS实现bookstore静态页面的实例代码
2017/02/22 Javascript
Node.js五大应用性能技巧小结(必须收藏)
2017/08/09 Javascript
vuejs 制作背景淡入淡出切换动画的实例
2018/09/01 Javascript
解决vue脚手架项目打包后路由视图不显示的问题
2018/09/20 Javascript
用Electron写个带界面的nodejs爬虫的实现方法
2019/01/29 NodeJs
JS实现动态倒计时功能(天数、时、分、秒)
2019/12/12 Javascript
JavaScript语法约定和程序调试原理解析
2020/11/03 Javascript
简单的Python的curses库使用教程
2015/04/11 Python
Django中ORM表的创建和增删改查方法示例
2017/11/15 Python
django获取from表单multiple-select的value和id的方法
2019/07/19 Python
python实现日志按天分割
2019/07/22 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
2020/01/07 Python
Python3的socket使用方法详解
2020/02/18 Python
定义css设备类型-Media Queries图表简介及使用方法
2013/01/21 HTML / CSS
英国行业制服供应商:Alexandra
2019/09/14 全球购物
应届毕业生的个人自我鉴定
2013/10/24 职场文书
文明青少年标兵事迹材料
2014/01/28 职场文书
离婚协议书格式
2014/11/21 职场文书
趵突泉导游词
2015/02/03 职场文书
2015年度房地产工作总结
2015/04/09 职场文书
mysql数据库实现设置字段长度
2022/06/10 MySQL
MySQL数据库实验实现简单数据库应用系统设计
2022/06/21 MySQL
python语言中pandas字符串分割str.split()函数
2022/08/05 Python