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 相关文章推荐
javascript面向对象编程(一) 实例代码
Jun 25 Javascript
JavaScript高级程序设计 阅读笔记(十八) js跨平台的事件
Aug 14 Javascript
动态创建script标签实现跨域资源访问的方法介绍
Feb 28 Javascript
JavaScript异步回调的Promise模式封装实例
Jun 07 Javascript
javascript函数特点实例分析
May 14 Javascript
js点击返回跳转到指定页面实现过程
Aug 20 Javascript
node.js 动态执行脚本
Jun 02 Javascript
jquery获取select,option所有的value和text的实例
Mar 06 Javascript
Vuex 使用 v-model 配合 state的方法
Nov 13 Javascript
在mpvue框架中使用Vant WeappUI组件库的注意事项【推进】
Jun 09 Javascript
原生JS 实现的input输入时表格过滤操作示例
Aug 03 Javascript
vue从零实现一个消息通知组件的方法详解
Mar 16 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
php函数之子字符串替换 str_replace
2011/03/23 PHP
php数组去除空值函数分享
2015/02/02 PHP
php实现的单一入口应用程序实例分析
2015/09/23 PHP
PHP中addcslashes与stripcslashes函数用法分析
2016/01/07 PHP
php+mysql+jquery实现日历签到功能
2017/02/27 PHP
Js nodeType 属性全面解析
2013/11/14 Javascript
JS 屏蔽按键效果与改变按键效果的示例代码
2013/12/24 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
2015/06/05 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
2015/12/13 Javascript
JavaScript实战之带收放动画效果的导航菜单
2016/08/16 Javascript
手机端图片缩放旋转全屏查看PhotoSwipe.js插件实现
2016/08/25 Javascript
Vue.js组件tabs实现选项卡切换效果
2016/12/01 Javascript
简单实现js浮动框
2016/12/13 Javascript
js清除浏览器缓存的几种方法
2017/03/15 Javascript
react 兄弟组件如何调用对方的方法示例
2018/10/23 Javascript
react项目如何使用iconfont的方法步骤
2019/03/13 Javascript
JavaScript中关于base64的一些事
2019/05/06 Javascript
Vue表单绑定的实例代码(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)
2019/05/13 Javascript
JS继承定义与使用方法简单示例
2020/02/19 Javascript
举例讲解Python设计模式编程的代理模式与抽象工厂模式
2016/01/16 Python
基于Python实现的ID3决策树功能示例
2018/01/02 Python
使用Python 统计高频字数的方法
2019/01/31 Python
python中时间模块的基本使用教程
2019/05/14 Python
Python (Win)readline和tab补全的安装方法
2019/08/27 Python
python运用pygame库实现双人弹球小游戏
2019/11/25 Python
解决pycharm最左侧Tool Buttons显示不全的问题
2019/12/17 Python
利用Python实现Json序列化库的方法步骤
2020/09/09 Python
python 使用三引号时容易犯的小错误
2020/10/21 Python
采购文员岗位职责
2013/11/20 职场文书
便利店投资创业计划书
2014/02/08 职场文书
函授本科个人自我鉴定
2014/03/25 职场文书
2015年数学教研组工作总结
2015/05/23 职场文书
担保书怎么写 ?
2019/04/22 职场文书
《弟子规》读后感:知廉耻、明是非、懂荣辱、辨善恶
2019/12/03 职场文书
Vue操作Storage本地化存储
2022/04/29 Vue.js
Python实现信息管理系统
2022/06/05 Python