element tree不刷新视图_Vue项目布署后,刷新页面404的真正原因找到了

e81cdd6383dc47c8d454b3291a655395.png

从一篇日记说起

我是一个小前端,我有写日记的习惯

2020年10月17 天气 晴

今天天气不错,心情也跟着好起来了

辛辛苦苦加班两个星期终于完成了产品需求,到了要上线的时候了,嘴里也不知不觉哼起了“劳资今晚不加班”的小曲

一顿操作猛如虎,终端执行 npm run build 一把梭,将构建产出的 dist 文件夹扔给了发际线愈发上移的后端同学,让其帮忙布署到服务器上

不一会,后端同学说项目布署好了,并扔回给了我一个线上链接

怀着激动的心,用颤抖的手慌忙点开,我没有放过页面上的每一个细节,毕竟都是用自己的头发换回来的,页面的上每一个按钮我都要复点一次以确保它们没有问题,几分钟后,我的脸上慢慢洋溢出来了笑容,因为我认为这是一次完美的“线上行动”

赶紧平复了一下心情,在公司项目里 @BOSS,自豪的表示项目已完美上线,BOSS 们可以验收

~ Wow! 平常高冷女神范的运营小姐姐给我发消息了,哈哈,一定是要夸我写的这个系统太好用了吧,点开

7c0e783aec38e6b33554f46a78983c3f.png

赶紧自己试了试,只要一刷新还真是这样,今天又得加班了!

为什么会出现404

我们先来看一下我们给到后端的dist文件ac9772e4ccdb348ac2c0835e6b18aa8c.png

可以看到dist下只有一个 index.html 文件及一些静态资源,这个是因为Vue是单页应用(SPA),只有一个index.html作为入口文件,其它的路由都是通过JS来进行跳转

接着我们再来分析一下后端 nginx 的配置

server {
  // 监听80端口
  listen 80;
  // 定义你的站点名称
  server_name website.com;
  // 根据请求 URI 设置配置
  location / {
      // 站点根目录,这里为 vue 构建出来的 dist 目录
      root   /www/dist;
      // 站点初始页为index.html 或 index.htm
      index  index.html index.htm;
  }
}

我们现在可以根据 nginx 配置得出,当我们在地址栏输入 website.com 时,这时会打开我们 dist 目录下的 index.html 文件,然后我们在跳转路由进入到 website.com/login

关键在这里,当我们在 website.com/login 页执行刷新操作,nginx location 是没有相关配置的,所以就会出现 404 的情况

为什么hash模式下没有问题

router hash 模式我们都知道是用符号#表示的,如  website.com/#/login, hash 的值为 #/login

它的特点在于:hash 虽然出现在 URL 中,但不会被包括在 HTTP 请求中,对服务端完全没有影响,因此改变 hash 不会重新加载页面

hash 模式下,仅 hash 符号之前的内容会被包含在请求中,如 website.com/#/login 只有 website.com 会被包含在请求中 ,因此对于服务端来说,即使没有配置location,也不会返回404错误

单页应用(SPA)概念

我们前面有提到单页应用,那什么是单页应用呢?

单页应用

单页应用(single-page application),缩写SPA 是一种网络应用程序或网站的模型,它通过动态重写当前页面来与用户交互,而非传统的从服务器重新加载整个新页面。这种方法避免了页面之间切换打断用户体验,使应用程序更像一个桌面应用程序。在单页应用中,所有必要的代码(HTML、JavaScript和CSS)都通过单个页面的加载而检索,或者根据需要(通常是为响应用户操作)动态装载适当的资源并添加到页面。尽管可以用位置散列或HTML5历史API来提供应用程序中单独逻辑页面的感知和导航能力,但页面在过程中的任何时间点都不会重新加载,也不会将控制转移到其他页面

大白话来讲:

一个杯子,早上装的牛奶,中午装的是开水,晚上装的是茶,我们可以发现,变的始终是内容,而容器还是那个容器

当然,每种技术都有其利弊,单页应用也是如此

利:

  1. 无刷新体验,这个应该是最显著的有点,由于路由分发直接在浏览器端完成,页面是不刷新,对用户的响应非常及时,因此提升了用户体验

  2. 完全的前端组件化,前端开发不再以页面为单位,更多地采用组件化的思想,代码结构和组织方式更加规范化,便于修改和调整

弊:

  1. 首屏较长,要在一个页面上为用户提供产品的所有功能,在这个页面加载的时候,首先要加载大量的静态资源,这个加载时间相对比较长

  2. 不利于 SEO,单页页面,数据在前端渲染,就意味着没有 SEO,或者需要使用变通的方案

Router的实现

为了让大家加深大家对 Router 的理解,这里我们实现一个最简洁的 Router

hash 模式

核心通过监听url中的hash来进行路由跳转

// 定义 Router
class Router {
    constructor () {
        this.routes = {}; // 存放路由path及callback
        this.currentUrl = '';
        
        // 监听路由change调用相对应的路由回调
        window.addEventListener('load', this.refresh, false);
        window.addEventListener('hashchange', this.refresh, false);
    }
    
    route(path, callback){
        this.routes[path] = callback;
    }
    
    push(path) {
        this.routes[path] && this.routes[path]()
    }
}

// 使用 router
window.miniRouter = new Router();
miniRouter.route('/', () => console.log('page1'))
miniRouter.route('/page2', () => console.log('page2'))

miniRouter.push('/') // page1
miniRouter.push('/page2') // page2

history 模式

history 模式核心借用 HTML5 history api,api 提供了丰富的 router 相关属性

先了解一个几个相关的api

  • history.pushState 浏览器历史纪录添加记录
  • history.replaceState 修改浏览器历史纪录中当前纪录
  • history.popState 当 history 发生变化时触发
// 定义 Router
class Router {
    constructor () {
        this.routes = {};
        this.listerPopState()
    }
    
    init(path) {
        history.replaceState({path: path}, null, path);
        this.routes[path] && this.routes[path]();
    }
    
    route(path, callback){
        this.routes[path] = callback;
    }
    
    push(path) {
        history.pushState({path: path}, null, path);
        this.routes[path] && this.routes[path]();
    }
    
    listerPopState () {
        window.addEventListener('popstate' , e => {
            const path = e.state && e.state.path;
            this.routers[path] && this.routers[path]()
        })
    }
}

// 使用 Router

window.miniRouter = new Router();
miniRouter.route('/', ()=> console.log('page1'))
miniRouter.route('/page2', ()=> console.log('page2'))

// 跳转
miniRouter.push('/page2')  // page2

解决404

看到这里我相信大部分同学都能想到怎么解决问题了,

产生问题的本质是因为我们的路由是通过JS来执行视图切换的,

当我们进入到子路由时刷新页面,web容器没有相对应的页面此时会出现404

所以我们只需要配置将任意页面都重定向到 index.html,把路由交由前端处理

还是以 nginx 为例,更多版本的大家可以前往https://router.vuejs.org/zh/guide/essentials/history-mode.html 查看

location / {
  try_files $uri $uri/ /index.html;
}

这里有一个小细节,如果出现真的 404 页面了呢?比如 website.com/notfound

因为这么做以后,你的服务器就不再返回 404 错误页面,因为对于所有路径都会返回 index.html 文件。为了避免这种情况,你应该在 Vue 应用里面覆盖所有的路由情况,然后在给出一个 404 页面

const router = new VueRouter({
  mode: 'history',
  routes: [
    { path: '*', component: NotFoundComponent }
  ]
})
62178af9e1871902bc36cf1636d4a6cd.png

??两个猪头是什么意思..能不能评论区告诉我..

包邮送书

今天为大家推荐一本新书《Vue.js入门与商城开发实战》,免费包邮送给大家

简单介绍一下

本书主要面向Vue.js的初级入门者,涵盖详细的理论知识、布局分析和逻辑分析,还有丰富的实战案例、详细的代码解说,具有很强的实用性。

全书主要内容分三部分:基础知识、技能提升、商城开发案例。

  • 基础知识部分包括Vue.js入门、数据绑定、表单和双向数据绑定、条件和循环指令、样式绑定、事件处理器、监听和计算属性。

  • 技能提升部分包括Vue.js的组件,自定义指令和响应接口,路由、动画和过渡,Vue.js中的插件Axios等。

  • 商城开发案例部分包括一个商城项目的大部分功能,如首页开发、用户管理、实现产品和新闻页面、购物和订单处理等

更多信息大家可以点击下方小程序查看

这次准备了多种方式抽奖,「集赞、走心、在看」这三种方式都可以参与!感谢亲爱的读者们,你们的支持也是我持续更文最大的动力。

为了避免中奖后失联,请务必添加小萌猫微信:

8537ef73c1606e4168782b71fc94ed1e.png

留言抽奖 (5+5)

  • 大奖: 留言点赞数「第1,2,3名」可获得一本 《Vue.js入门与商城开发实战》
  • 走心奖: 留言「2名」可获得一本 《Vue.js入门与商城开发实战》
  • 参与奖: 随机抽取「5位」优质评论送出「10.24元」红包

再看抽奖 (3+5)

ps: 记得先添加小萌猫微信,不然看不到哪些小伙伴点在看

  • 大奖: 随机抽取「3位」可获得一本 《Vue.js入门与商城开发实战》
  • 次奖: 随机抽取「5位」优质评论送出「10.24元」红包
- END -
近期不要再问我跨域的问题了 | 原理剖析Webpack 5 发布,Chrome 86 支持本地文件系统若此文有用,何不素质三连❤️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编程加速服务器_FPGA加速驱动新时代的数据洪流,下篇

目 录人工智能计算加速器产品系列的相关布局FPGA开发的痛点与潜在方案结语在《FPGA加速驱动新时代的数据洪流,上篇》中,老石介绍了英特尔应对大数据时代的整体战略布局,特别是基于FPGA的各类智能网卡和网络解决方案。在本篇中,老石…

respond with a status of 40_高中英语作文高分秘籍!50组高级替换词+40个高级句型+88个高级词组,还不快记下!...

很多同学都发现,高中阶段对于写作的考查要求更高,一篇没有错误但平淡无奇的文章是拿不到高分的,保证正确性的前提下,写作必须要有出彩之处才能得到阅卷老师的青睐,今天就为大家分享高中写作50组高级替换词40个高级句型…

iphone分屏功能怎么用_iPhone上10个隐藏小技巧,怎么用怎么爽

离上一期iPhone技巧已经过了四个多月时间了,不少朋友在后台一直催小雷赶紧出下一期。为了不让你等太久,所以今天小雷就奉上新的一期(也是防止你们等得不耐烦了以至于想捶我)。这期干货实在太多,如果其中有一些你们之前get过的话,就…

太阳能板如何串联_太阳能光伏系统单晶和多晶模组的差异?农村家庭自用如何科学选择...

太阳能光伏想必大家都耳熟能详,因其环保且属于可再生能源,目前在农村很多居民屋顶都已经铺设了光伏发电系统,即节省了电费开支又能并入国家电网,所以近些年来我国的光伏产业得到了很好的发展,是目前发展最快的清洁能源…

数据查询和业务流分开_TiDB HTAP 助力小红书业务升级

作者介绍:张亿皓,小红书基础技术部资深开发工程师,负责数据库相关的研发和落地工作。TiDB 在小红书业务场景的应用简介2017 年,小红书已经开始在生产业务中使用 TiDB ,真正成体系的去做 TiDB 的落地是在 2018 年&#…

php server自定义函数,php:SQL Server用户自定义的函数种类详解

关于SQL Server用户自定义的函数,有标量函数、表值函数(内联表值函数、多语句表值函数)两种。题外话,可能有部分朋友不知道SQL Serve用户自定义的函数应该是写在哪里,这里简单提示一下,在Microsoft SQL Server Managerment Studio…

vlan为什么能隔离广播域_路由交换技术-VLAN原理及配置

VLAN原理及配置1. 背景网络中计算机的数量越来越多,传统的以太网开到面临冲突严重,广播泛滥及安全性无法保障等问题VLAN(virtual local area network)即虚拟局域网,是将一个物理的局域网在逻辑上划分为多个广播域的技术,通过在交换…

刀片 显卡 排行_AMD发布RadeonRX6000系列游戏显卡 4599元起

10月30日消息,据国外媒体报道,AMD日前发布了Radeon RX 6000系列游戏显卡,该系列显卡包括AMD Radeon(镭龙) RX 6800显卡和RX 6800 XT显卡,以及新旗舰RX 6900 XT显卡。AMD Radeon RX 6000系列显卡(图片来自AMD官网)AMD Radeon RX 68…

等保2.0安全管理制度对比_一手资料!等保2.0云计算安全与风险评估

一、等保2.0对云计算发展提出“新要求”与等保1.0的标准体系相比,等保2.0在适用性、时效性、易用性、可操作性上得到进一步扩充和完善,以适应云计算、物联网、工业控制系统等新技术的发展。如下表给出了等保2.0发生的重要变化。针对等保2.0标准提出的新要…

mt4 指标 涨跌幅 颜色k线_通达信精选指标——彩色K线指标

通达信精选指标——彩色K线指标VAR1:LLV(L,10); VAR2:HHV(H,25); 趋势:EMA((C-VAR1)/(VAR2-VAR1),10); AA:趋势>REF(趋势,1); BB:趋势<REF(趋势,1); 买入:DRAWICON(CROSS(AA,BB),L-0.1,23); 卖出:DRAWICON(CROSS(BB,AA),H0.1,15); {红} STICKLINE(AA,C,OPEN,3.5,0),COLOR…

matlab如何建立时间温度曲线,matlab如何绘时间曲线?

2007-02-12针对春夏秋冬四季的气候特点&#xff0c;应该如何进补四季的饮食宜忌中国古代医学家在漫长的生活实践中&#xff0c;逐步体会到人与自然界存在着非常密切的关系。自然界一年四季的变化&#xff0c;直接影响着人体的生理功能和病理变化&#xff0c;这就是“天人相应”…

erp系统原理和实施第五版pdf_【图片】生产制造企业ERP系统选型及实施“避坑”指南!【企业管理软件吧】...

随着企业经营环境的变化、信息技术的不断发展&#xff0c;基于ERP系统的信息化管理模式必将朝着更加科学化、集成化、智能化、网络化的方向发展。实施ERP是一场“变革”&#xff0c;那也就必然存在着失败的可能。对于众多制造企业而言&#xff0c;在ERP系统应用方面需要进一步加…

检测电脑硬件的软件_【软件分享】PowerDVD | PotPlayer | AIDA64

PowerDVD软件介绍&#xff1a;PowerDVD是一款知名的蓝光影音播放软件&#xff0c;支持8K超清、4K蓝光与HDR影像及VR360影片播放。全方位支持播放多种热门影音格式&#xff0c;包括影片、光碟、ISO 档案以及相片&#xff0c;无论是在 PC 或 TV 设备播放都没问题。搭载独家TrueTh…

sqlserver如何从周一计算周_纯零基础,花10周时间,完全搞定Python,有没有可能?...

最简单适合小白练手的 10 个Python小项目&#xff0c;十天就能搞定Python。今天我推荐大家一本书&#xff1a;《面向零基础的Python小项目》&#xff0c;如果你集中精力&#xff0c;花10周&#xff0c;也就是两个半月时间&#xff0c;搞定Python&#xff0c;真的不再是一句空谈…

cannot load php5,Cannot load php5apache2_4.dll into server解决办法

我们正在装置好Apache,但装置PHP设置装备摆设完成以后,再次启动apache的时间涌现了毛病 the requested operation has failed; Apache没法启动,检察Ap]一.原因1:我们在安装好Apache服务器,一开始正常,但安装PHP配置完成之后,再次启动apache的时候出现了错误 the requested oper…

graphics 位深度_热门上海乐家人才公寓深度解析又是一个神

热门上海乐家人才公寓深度解析又是一个神提前来电预约看房可售楼处员工优惠5000元到20000元&#xff0c;免费专车接送/自驾报销路费&#xff0c;并可售楼处员工价格优惠&#xff01;老带客户带新客户&#xff0c;还可奖励iPhonePro&#xff0c;新客户有更多优惠&#xff01;更多…

JAVA头部声明异常,Java 异常详解

一.异常与错误的区别再讲异常之前我们就应该要知道异常和错误的区别Error类和Exception类的父类都是throwable类&#xff0c;他们的区别是&#xff1a;Error类一般是指与虚拟机相关的问题&#xff0c;如系统崩溃&#xff0c;虚拟机错误&#xff0c;内存空间不足&#xff0c;方法…

什么是面向对象_什么是面向对象?新手程序员必掌握的技能

面向对象是指基于逻辑对象的概念构建的编程语言&#xff0c;系统或软件方法。它通过创建&#xff0c;利用和操纵可重用对象来执行特定任务&#xff0c;过程或目标。什么是面向对象&#xff1f;面向对象程序设计是种具有对象概念的程序编程典范&#xff0c;同时也是一种程序开发…

弹出键盘布局上移_评测 | 别买了HHKB键盘不知道这些新功能!

⇪ 点击“蓝字”关注我们 ⇪ 关于HHKB静电容键盘的新品系列&#xff0c;小U已经与大家分享了不少“评测”&#xff0c;虽然距离新品发布已经有一段时间&#xff0c;但大家的热情依旧不减呀&#xff0c;每一次都能从小伙伴们的反馈中看到新的小惊喜。那么今天&#xff0c;咱们…

如何访问docker内php,主机怎么访问docker里的程序

主机怎么访问docker里的程序需求&#xff1a;1&#xff1a;本机访问docker中的应用2&#xff1a;其他机器访问docker中的应用3&#xff1a;dockerB中访问dockerA中的应用已知环境&#xff1a;主机IP&#xff1a;192.168.220.123容器A已启动&#xff0c;IP&#xff1a;172.17.0.…