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 容错处理代码, 屏蔽错误信息
Mar 09 Javascript
jquery移动listbox的值原理及代码
May 03 Javascript
页面js遇到乱码问题的解决方法是和无法转码的情况
Apr 30 Javascript
探寻Javascript执行效率问题
Nov 12 Javascript
JS折半插入排序算法实例
Dec 02 Javascript
Bootstrap~多级导航(级联导航)的实现效果【附代码】
Mar 08 Javascript
一句jQuery代码实现返回顶部效果(简单实用)
Dec 28 Javascript
javascript 初学教程及五子棋小程序的简单实现
Jul 04 Javascript
swiper动态改变滑动内容的实现方法
Jan 17 Javascript
浅析Vue 生命周期
Jun 21 Javascript
详解基于 Node.js 的轻量级云函数功能实现
Jul 08 Javascript
vue-router路由模式详解(小结)
Aug 26 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
全国FM电台频率大全 - 18 湖南省
2020/03/11 无线电
global.php
2006/12/09 PHP
php 转换字符串编码 iconv与mb_convert_encoding的区别说明
2011/11/10 PHP
PHP的curl实现get,post和cookie(实例介绍)
2013/06/17 PHP
PHP中set error handler函数用法小结
2015/11/11 PHP
PHP中Socket连接及读写数据超时问题分析
2016/07/19 PHP
yii2中dropDownList实现二级和三级联动写法
2017/04/26 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
2020/05/25 PHP
jquery中map函数遍历数组用法实例
2015/05/18 Javascript
jQuery的end()方法使用详解
2015/07/15 Javascript
Grunt入门教程(自动任务运行器)
2015/08/06 Javascript
Jquery实现纵向横向菜单
2016/01/24 Javascript
jQuery实现鼠标经过购物车出现下拉框代码(推荐)
2016/07/21 Javascript
浅谈JavaScript中的apply/call/bind和this的使用
2017/02/26 Javascript
windows下vue.js开发环境搭建教程
2017/03/20 Javascript
详解vue中computed 和 watch的异同
2017/06/30 Javascript
node.js 发布订阅模式的实例
2017/09/10 Javascript
jquery实现楼层滚动效果
2018/01/01 jQuery
vuex页面刷新后数据丢失的方法
2019/01/17 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
让mocha支持ES6模块的方法实现
2020/01/14 Javascript
vant 中van-list的用法说明
2020/11/11 Javascript
python网络编程调用recv函数完整接收数据的三种方法
2017/03/31 Python
Python中使用Selenium环境安装的方法步骤
2021/02/22 Python
西尔斯百货官网:Sears
2016/09/06 全球购物
澳大利亚香水在线:Price Rite Mart
2017/12/28 全球购物
洛杉矶生活休闲而精致的基础品牌:Mika Jaymes
2018/01/07 全球购物
微软马来西亚官方网站:Microsoft马来西亚
2019/11/22 全球购物
简单介绍Object类的功能、常用方法
2013/10/02 面试题
结构和类有什么异同
2012/07/16 面试题
美术教师自我鉴定
2014/02/12 职场文书
酒店行政人事部经理职务说明书
2014/02/26 职场文书
音乐教育感言
2014/03/05 职场文书
纪念九一八爱国演讲稿600字
2014/09/14 职场文书
2015年圣诞节活动总结
2015/03/24 职场文书
MySQL Shell import_table数据导入的实现
2021/08/07 MySQL