Vue에서 라우팅 전환의 흰색 화면 문제에 대한 심층 분석(코드 포함)
이전 글 "Vue에서 complie 데이터의 양방향 바인딩 원리에 대한 간략한 분석(상세 코드 설명)"에서 Vue에서 complie 데이터의 양방향 바인딩 원리에 대해 배웠습니다. 다음 글은 Vue에서 라우팅할 때 흰색 화면이 나타나는 문제를 이해하는 데 도움이 될 것입니다.
vue
에서 라우팅 전환 시 흰색 화면이 나오는 경우는 사실 개발 과정에서 한번도 접한 적이 없습니다. vue
路由切换的白屏,事实上在开发的过程中,我一直没有遇到过。
我有个哥们遇到这个问题,问我怎么解决的,我晕了,我没遇到这样的问题啊,我怎么解决啊啊啊啊。。
事实上是遇到过一回的。
以下内容于 2019-07-25 修改。
服务器部署配置问题
这个问题造成的白屏体现在:
首页可以正常浏览,但是------通过$router.push('/home')
跳转页面 正常,然后刷新就是白屏或 404
本不想在文章加入这个问题和解决方案,因为官网已经提供了正确的部署姿势,(Vue
的路由模式自行查看文档),主要是针对HTML5 History
模式:
const router = new VueRouter({ mode: 'history', routes: [...] })
dev
和build
都没有问题,这个是肯定的,所以问题就出在服务器配置上,以nginx
为例,正确的配置如下:
location / { .... try_files $uri $uri/ /index.html; #重点 }
Apache
,原生 Node.js
,IIS
,Caddy
,Firebase
主机
请查看
vur-router
后端配置例子地址:https://router.vuejs.org/zh/guide/essentials/history-mode.html#%E5%90%8E%E7%AB%AF%E9%85%8D%E7%BD%AE%E4%BE%8B%E5%AD%90
以上内容于 2019-07-25 修改。
以下内容于 2019-04-23 修改。
如果你是使用脚手架初始化环境,可以跳过这部分。如果自己配置webpack
,可以接着看确定做了如下配置
devServer: { ... contentBase: false, //必须 historyApiFallback: true, //必须 ... }, entry: { app: ['./src/main.js'], vendors: ['vue', 'vue-router'] //注意这里 }, plugins: [ .... new HtmlWebpackPlugin({ ... chunks: ['vendors', 'app'], //注意这里,这里的chunks 要包含入口的 entry }) ]
以上内容于2019-04-23修改。
场景一:IE9(兼容性问题)
严格来说不是白屏的问题,应该说是兼容性问题,直接就是不支持,报错了,渲染无法执行造成的。解决方式就是
npm i babel-polyfill -D
然后在入口mian.js引入就完事了,就着么简单
import "babel-polyfill";
或者
//webpack entry: { app: ['babel-polyfill','./src/main.js'], vendors: ['vue', 'vue-router'] },
以下内容于2019-04-23修改。
假如真的是js
兼容性问题,那么真的只是引入babel-polyfill
或者在webpack
入口加入babel-polyfill
问题就能解决吗,其实不一定的,这个要看项目的使用情况。babel-polyfill
不是万能的。那么如何排查兼容性问题呢(假如真的是兼容性问题)。因为我们在手机上直接调试,有些错误不会那么容易显而易见。我是这么调试的。(仅供参考!)
<template> <div> <!-- 错误直接显示在这里. 不用 alert() ,console.log() --> {{error}} ... <!-- other element --> </div> </template> <script> export default{ data{ return { error:'' } }, moundted:{ try{ //一些请求数据的方法 }catch(e){ //这里抛出异常 this.error = e } } } </script>
这里要说的是有些兼容性问题是bable-polyfill
搞不定的。比如URLSearchParams
let data = new URLSearchParams(); for (var key in params) { data.append(key, params[key]); }
那么肯定会报URLSearchParams is not undefined
,然后,错误只在一些低端的机型,一些偶然的场合出错.加大了错误的排查。
以下可以解决URLSearchParams is not undefined
//# console npm i url-search-params-polyfill //# mian.js import 'url-search-params-polyfill';
以上内容于2019-04-23修改。
场景二 :如下图
有人说是在iphone 5s或者6s上会出现这种问题,肯定不是手机的bug。于是我重现了场景,真的和设备无关
所以这个跟设备真的没有关系。知道问题所在,当然解决办法也有许多
方案一:暴力愚蠢型
//路由跳转前滚动条清零 document.body.scrollTop = document.documentElement.scrollTop = 0; this.$router.push({ path: "/a/b/c" });
方案二:可行但不可选型
//给router 加一个监听,一旦改变,执行清零,然后再跳转 let routers = new Router({.....}) routers.beforeEach(function (to, from, next) { ...... document.body.scrollTop = document.documentElement.scrollTop = 0 next() })
虽然可行,但是感觉着么干有点愚蠢。因为还有更好的写法,这个写法更佳优雅
方案三:最佳型
其实官方已经提供了当路由切换时,控制滚动位置的方式。scrollBehavior
使用方式如下:
const router = new VueRouter({ routes: [...], scrollBehavior (to, from, savedPosition) { // return 期望滚动到哪个的位置 { x: number, y: number } | { selector: string } | } })
scrollBehavior
方法接收to
和from
路由对象。第三个参数savedPosition
当且仅当popstate
导航(通过浏览器的前进/后退按钮触发) 时才可用。
所以假如要解决白屏的问题,可以着么干
const router = new VueRouter({ routes: [...], scrollBehavior (to, from, savedPosition) { return savedPosition || { x: 0, y: 0 } } })
也就是说,当用户点击返回、前进的时候,页面会滚动到之前位置,(微信朋友圈的文章就是这样的,读一半返回,再进来接着刚才的位置阅读)
如果是新的page
被mounted
进来的时候,就重置为 0
$router를 통해. push('/ home')
페이지가 정상적으로 점프한 다음 새로 고쳐져 흰색 화면이나 404가 나타납니다🎜🎜이 문제와 해결 방법을 기사에 포함하고 싶지 않았습니다. 공식 웹사이트에서 올바른 배포 상태(Vue
라우팅 모드에 대한 문서를 직접 확인하세요), 주로 HTML5 기록
모드에 대해: 🎜<meta http-equiv="Expires" content="0" /> <meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Cache-control" content="no-cache" /> <meta http-equiv="Cache" content="no-cache" />
dev에는 문제가 없습니다.
및 build
는 확실하므로 문제는 서버 구성에 있습니다. nginx
를 예로 들면 올바른 구성은 다음과 같습니다. 🎜rrreee 🎜Apache
, 기본 Node.js
, IIS
, Caddy
, Firebase
호스트🎜 🎜🎜vur-router
백엔드 구성 예시를 확인하세요🎜🎜 주소: https://router.vuejs.org/zh/guide/essentials/history-mode.html#%E5%90% 8E%E7%AB%AF%E9%85%8D%E7%BD%AE%E4 %BE%8B%E5%AD%90🎜🎜🎜🎜위 내용은 2019-07-25에 수정되었습니다. 🎜🎜🎜🎜2019-04-23에 다음 내용이 수정되었습니다. 🎜🎜🎜스캐폴딩 초기화 환경을 사용하는 경우 이 부분을 건너뛰어도 됩니다. webpack
을 직접 구성하시면 아래와 같은 구성이 되었는지 확인하실 수 있습니다🎜rrreee🎜🎜위 내용은 2019-04-23에 수정되었습니다. 🎜🎜시나리오 1: IE9(호환성 문제)
🎜엄밀히 말하면 흰색 화면 문제는 아니고 단순히 호환성 문제라고 해야 할까요. 렌더링을 실행할 수 없습니다. 해결책은 🎜rrreee🎜 다음 입구에서 main.js로 가져오는 것입니다. 🎜rrreee🎜 또는🎜rrreee🎜🎜다음 내용은 2019-04-23에 수정되었습니다. 🎜🎜🎜정말
js
호환성 문제라면 babel-polyfill
을 도입하거나 babel을 <code>webpack</에 추가하면 됩니다. code> 항목 -polyfill
을 사용하면 문제를 해결할 수 있습니까? 실제로는 프로젝트 사용법에 따라 해결되지 않을 수도 있습니다. babel-polyfill
은 만병통치약이 아닙니다. 따라서 호환성 문제를 해결하는 방법(실제로 호환성 문제인 경우) 우리는 전화로 직접 디버깅하고 있기 때문에 일부 오류는 쉽게 눈에 띄지 않습니다. 이것이 내가 디버깅한 방법입니다. (참고용!) 🎜rrreee🎜여기서 제가 말씀드리고 싶은 것은 bable-polyfill
이 해결할 수 없는 호환성 문제가 있다는 것입니다. 예를 들어, URLSearchParams
🎜rrreee🎜는 확실히 URLSearchParams가 정의되지 않았습니다
라고 보고합니다. 그러면 오류는 일부 저가형 모델에서만 발생하며 가끔 오류가 발생합니다. 조사가 늘어날 예정이다. 🎜🎜다음 방법으로 URLSearchParams가 정의되지 않음
문제를 해결할 수 있습니다.🎜rrreee🎜🎜위 내용은 2019-04-23에 수정되었습니다. 🎜🎜🎜시나리오 2: 아래와 같습니다🎜🎜어떤 사람들은 이 문제가 iPhone 5s 또는 6s에서 발생한다고 말합니다. 이것은 확실히 휴대폰의 버그가 아닙니다. 그래서 그 장면을 재현해보았는데, 기기와는 전혀 관련이 없습니다🎜🎜
scrollBehavior
🎜🎜사용 방법은 다음과 같습니다. 🎜rrreee🎜 scrollBehavior
메서드는 to
및 from
라우팅 객체를 수신합니다. 세 번째 매개변수 savedPosition
은 popstate
탐색(브라우저의 앞으로/뒤로 버튼에 의해 트리거됨)인 경우에만 사용할 수 있습니다. 🎜🎜흰색 화면 문제를 해결하고 싶다면 어떻게 해야 할까요🎜rrreee🎜즉, 사용자가 뒤로 또는 앞으로를 클릭하면 페이지가 이전 위치로 스크롤됩니다. (이것은 WeChat의 기사입니다. 순간, 반 읽기 뒤로 갔다가 들어와 이전 위치부터 계속 읽기) 🎜🎜새 페이지
가 마운트
되어 들어오면 로 재설정됩니다. >0
. 🎜完美的解决了这个问题。
但是这也是个问题,框架为什么不默认呢,假如自定义的时候可以overwirte
。
场景三: 缓存的原因(2019.4.15)
我们根据版本号(或者hash
)去控制缓存问题,当我们发布新版本,会发现html里面引用的版本号却是旧的版本号 ,这种情况是入口index.html
文件被缓存了,很多时候我们设置禁止html
文件被缓存,但依然会出现被缓存的情况。比如在头部加
<meta http-equiv="Expires" content="0" /> <meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Cache-control" content="no-cache" /> <meta http-equiv="Cache" content="no-cache" />
仍然解决不了问题,关于web
的缓存策略,推荐这篇文章:Http缓存机制
一旦index.html
被缓存了,之后我们使用了全量更新,也就是每次发版本之前会干掉之前的js
和css
文件,那么被缓存的index.html
会无法加载之前旧的js,css
还有一些其他的静态资源文件,而新的js
和css
则不会被加载,那么白屏就诞生了。
这个时候我们就要配合服务端来解决index.html
的缓存问题
解决缓存的问题请转到这里:Vue index.html入口缓存问题
[完]
推荐学习:vue.js教程
위 내용은 Vue에서 라우팅 전환의 흰색 화면 문제에 대한 심층 분석(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Vue 프레임워크를 사용하여 프런트엔드 프로젝트를 개발할 때 배포 시 여러 환경을 배포하게 되는데, 개발 환경, 테스트 환경, 온라인 환경에서 호출되는 인터페이스 도메인 이름이 다른 경우가 많습니다. 어떻게 구별할 수 있나요? 그것은 환경 변수와 패턴을 사용하는 것입니다.

구성요소화와 모듈화의 차이점: 모듈화는 코드 논리의 관점에서 구분되며, 코드 계층 개발을 용이하게 하고 각 기능 모듈의 기능이 일관되게 유지되도록 합니다. 컴포넌트화는 UI 인터페이스 관점에서 계획하는 것으로 프런트엔드의 컴포넌트화는 UI 컴포넌트의 재사용을 용이하게 합니다.

vscode 자체는 Vue 파일 구성 요소를 지원하여 정의로 이동하지만 지원은 매우 약합니다. vue-cli 구성에 따라 다양한 유연한 사용법을 작성할 수 있어 생산 효율성을 향상시킬 수 있습니다. 그러나 vscode 자체에서 제공하는 기능이 파일 정의로 점프하는 것을 지원하지 못하게 하는 것은 이러한 유연한 쓰기 방법입니다. 이러한 유연한 작성 방법과 호환되고 작업 효율성을 높이기 위해 Vue 파일을 지원하는 vscode 플러그인을 작성하여 정의로 이동했습니다.

Ace는 JavaScript로 작성된 내장형 코드 편집기입니다. Sublime, Vim 및 TextMate와 같은 기본 편집기의 기능 및 성능과 일치합니다. 모든 웹페이지와 JavaScript 애플리케이션에 쉽게 삽입할 수 있습니다. Ace는 Cloud9 IDE의 메인 편집자로 유지되며 Mozilla Skywriter(Bespin) 프로젝트의 후속 버전입니다.

서문: vue3 개발에서 반응형은 반응형 데이터를 구현하는 방법을 제공합니다. 일상적인 개발에서 자주 사용되는 API입니다. 이 기사에서 저자는 내부 작동 메커니즘을 탐구합니다.

Vue.js는 오늘날 프런트엔드 개발에서 매우 인기 있는 프레임워크가 되었습니다. Vue.js가 계속 발전함에 따라 단위 테스트는 점점 더 중요해지고 있습니다. 오늘은 Vue.js 3에서 단위 테스트를 작성하는 방법을 살펴보고 몇 가지 모범 사례와 일반적인 문제 및 솔루션을 제공하겠습니다.

Vue.js에서 개발자는 JSX 구문과 템플릿 구문이라는 두 가지 다른 구문을 사용하여 사용자 인터페이스를 만들 수 있습니다. 두 구문 모두 장점과 단점이 있습니다. 차이점, 장점 및 단점을 논의해 보겠습니다.

Vue3 동적 구성 요소에서 예외를 처리하는 방법은 무엇입니까? 다음 기사에서는 Vue3 동적 구성 요소 예외 처리 방법에 대해 설명합니다. 이것이 모든 사람에게 도움이 되기를 바랍니다.
