vue-router启用history模式下的开发及非根目录部署方法
为什么要有hash和history
对于Vue这类渐进式前端开发框架,为了构建SPA(单页面应用),需要引入前端路由系统,这也就是Vue-Router存在的意义。前端路由的核心,就在于——改变视图的同时不会向后端发出请求。
为了达到这一目的,浏览器当前提供了以下两种支持:
1.hash——即地址栏URL中的#符号(此hash不是密码学里的散列运算)。
比如这个URL:http://www.abc.com/#/hello,hash的值为#/hello。它的特点在于:hash虽然出现在URL中,“#”后面的内容不会被包括在HTTP请求中,对后端完全没有影响,因此改变hash不会重新加载页面。
2.history——利用了HTML5HistoryInterface中新增的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 constconfig=require('../config') module.exports={ output:{ publicPath:process.env.NODE_ENV==='production' ?config.build.assetsPublicPath :config.dev.assetsPublicPath } } //build/webpack.dev.conf.js constcommon=require('./webpack.common') module.exports=merge(common,{ devServer:{ historyApiFallback:true } }
然后在提供服务的服务器配置中做如下配置(以nginx为例):
location/test/project1{ alias.../project1;//项目的真实路径 indexindex.html; try_files$uri$uri//test/project1/index.html; }
try_files会按顺序检查参数中的资源是否存在,并返回第一个找到的资源,如果都没有找到,它会让nginx内部重定向到会后一个参数。
对了,所以它的的作用是解决刷新404的问题。
这里值得注意的是try_files的参数是绝对路径。
至此,你开启history模式的项目就可以顺利的跑在任何路径了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。