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 Clone Bug解决代码
Dec 22 Javascript
JS的Document属性和方法小结
Sep 17 Javascript
Jquery ajaxStart()与ajaxStop()方法(实例讲解)
Dec 18 Javascript
键盘上一张下一张兼容IE/google/firefox等浏览器
Jan 28 Javascript
js中不同的height, top的区别对比
Sep 24 Javascript
基于jquery animate操作css样式属性小结
Nov 27 Javascript
JavaScript中在光标处插入添加文本标签节点的详细方法
Mar 22 Javascript
Vue 自定义动态组件实例详解
Mar 28 Javascript
Vue实现内部组件轮播切换效果的示例代码
Apr 07 Javascript
React-router4路由监听的实现
Aug 07 Javascript
mui js控制开关状态、修改switch开关的值方法
Sep 03 Javascript
React中的Context应用场景分析
Jun 11 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
农民和部队如何穿矿
2020/03/04 星际争霸
用php写的serv-u的web申请账号的程序
2006/10/09 PHP
PHP zlib扩展实现页面GZIP压缩输出
2010/06/17 PHP
PHP之生成GIF动画的实现方法
2013/06/07 PHP
php去除头尾空格的2种方法
2015/03/16 PHP
laravel Task Scheduling(任务调度)在windows下的使用详解
2019/10/22 PHP
js parsefloat parseint 转换函数
2010/01/21 Javascript
js indexOf()定义和用法
2012/10/21 Javascript
现代 JavaScript 开发编程风格Idiomatic.js指南中文版
2014/05/28 Javascript
vue图片加载与显示默认图片实例代码
2017/03/16 Javascript
详解A标签中href=""的几种用法
2017/08/20 Javascript
form表单数据封装成json格式并提交给服务器的实现方法
2017/12/14 Javascript
详解webpack-dev-server使用http-proxy解决跨域问题
2018/01/13 Javascript
jQuery实现动态显示select下拉列表数据的方法
2018/02/05 jQuery
微信小程序中使用ECharts 异步加载数据的方法
2018/06/27 Javascript
Vue和React组件之间的传值方式详解
2019/01/31 Javascript
Node中对非阻塞I/O、事件循环的知识点总结
2020/01/05 Javascript
JSON获取属性值方法代码实例
2020/06/30 Javascript
JS数组转字符串实现方法解析
2020/09/04 Javascript
[01:38]完美世界DOTA2联赛(PWL)宣传片:第一站
2020/10/26 DOTA
python中如何使用朴素贝叶斯算法
2017/04/06 Python
linux环境下python中MySQLdb模块的安装方法
2017/06/16 Python
python 不以科学计数法输出的方法
2018/07/16 Python
基于python实现学生管理系统
2018/10/17 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
2019/11/11 Python
python 和c++实现旋转矩阵到欧拉角的变换方式
2019/12/04 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
2020/06/23 Python
python压包的概念及实例详解
2021/02/17 Python
惠普加拿大在线商店:HP加拿大
2017/09/15 全球购物
美国隐形眼镜网上商店:Lens.com
2019/09/03 全球购物
国际贸易专业个人求职信范文分享
2013/12/14 职场文书
小学生感恩父母演讲稿
2014/08/28 职场文书
涉及车辆房产分割的离婚协议书范文
2014/10/12 职场文书
Golang 编译成DLL文件的操作
2021/05/06 Golang
MySQL基础快速入门知识总结(附思维导图)
2021/09/25 MySQL
基于CSS制作创意端午节专属加载特效
2022/06/01 HTML / CSS