网页开发过程中,我们有时会遇到HTML页面白屏的问题,即打开网页时页面显示空白,没有任何内容。这不仅令用户困惑,也使开发者头疼不已。本文将分享一些常见的HTML页面白屏问题解决方法,帮助你快速解决这个问题,让你的网页焕然一新!
第一步:检查HTML代码
首先,我们需要检查HTML代码是否正确。常见的错误包括标签未闭合、标签嵌套错误等。这些错误可能会导致页面无法正常显示。因此,仔细检查HTML代码,确保没有语法错误是解决白屏问题的第一步。
第二步:检查CSS文件
HTML页面的样式通常由CSS文件控制。如果CSS文件中存在错误或者无法正常加载,可能会导致页面白屏。我们可以通过以下步骤检查CSS文件是否存在问题:
1、检查CSS文件路径是否正确:确保CSS文件的路径正确,并且文件存在于指定的位置。可以通过浏览器开发者工具查看网络面板,检查CSS文件是否被成功加载。
2、检查CSS文件语法错误:使用CSS验证工具,如W3C CSS验证服务,检查CSS文件是否存在语法错误。如果存在错误,及时修复。
3、检查CSS选择器和样式规则:检查CSS文件中的选择器和样式规则是否正确。可能存在选择器与HTML元素不匹配或样式规则冲突的情况。可以通过逐个注释掉样式规则,逐步排查问题。
第三步:检查JavaScript代码
JavaScript代码也可能导致页面白屏。以下是检查JavaScript代码的步骤:
1、检查JS文件路径是否正确:与CSS文件类似,确保JS文件的路径正确,并且文件存在于指定的位置。通过浏览器开发者工具查看控制台面板,检查是否有JS文件加载错误的提示信息。
2、检查JS代码语法错误:使用JS语法检查工具,检查JS代码是否存在语法错误。如果有错误,及时修复。
3、检查JS代码逻辑错误:检查JS代码中的逻辑是否正确。可能存在变量未定义、函数未调用或者逻辑错误等问题。可以通过调试工具,如浏览器开发者工具中的调试器,逐步排查问题。
第四步:排查网络请求问题
如果前面的步骤都没有发现问题,那么可能是网络请求出现了问题。以下是一些排查网络请求问题的方法:
1、检查网络连接:确保你的设备已连接到互联网,并且网络连接稳定。
2、检查资源加载状态:通过浏览器开发者工具的网络面板,检查页面中的资源加载状态。可能存在资源加载失败或者超时的情况,导致页面白屏。
3、检查服务器配置:如果你使用了服务器端脚本语言,如PHP,检查服务器配置是否正确。可能存在服务器配置问题导致页面无法正确渲染。
第五步:优化页面性能
如果以上方法都没有解决问题,那么可能是页面性能问题导致白屏。以下是一些优化页面性能的方法:
1、压缩和合并文件:将CSS和JS文件进行压缩和合并,减少文件的大小和数量,提高页面加载速度。
2、使用缓存:利用浏览器缓存机制,将静态资源进行缓存,减少服务器的请求次数,提高页面加载速度。
3、异步加载资源:使用异步加载技术,如异步加载JS文件或使用延迟加载,减少页面加载时间。
4、减少HTTP请求:减少页面中的HTTP请求次数等。
结语:
通过以上五个步骤,我们可以逐步排查HTML页面白屏问题,并解决它们。不同的问题可能需要不同的解决方法,因此需要耐心和细心地分析和排查。在开发过程中,我们也要时刻关注页面性能,优化页面加载速度,提高用户体验。
上流行的解决方案是将assetsPublicPath: '/'改成'./',下面说一下这个解决方案的弊端:
通常页面空白的问题出现大多数是由于Spring Boot端配置了server.servlet.context-path,上下文改变了css, js等文件的访问路径,文件无法加载导致index.html显示空白。'/'改成'./'是将绝对路径变为相对路径,可以动态适应Spring Boot端上下文的改变,这是为什么这个解决方案起作用的原因。
Vue项目部署在Spring Boot出现的另一个常见问题是当刷新浏览器的时候出现white label, 也就是404错误,解决的方案基本是把error page配置成为Vue的index.html。
这两个解决方案有冲突的地方,当router出现子路径的时候刷新浏览器,error page会指向Vue的index.html页面,此时页面中访问css,js文件的路径是相对路径,也就是上下文路径+router子路径,这将导致css,js再次无法正常加载,这就是相对路径的弊端。
由于router会出现子路径,因此必须保证assetsPublicPath为绝对路径,下面讲一下保持绝对路径的解决方案:
1 假设Spring Boot端配置server.servlet.context-path: api, 对应Vue的/config/index.js中assetsPublicPath: '/'改成 '/api/'
2 router/index.js中配置base: '/api/', 这是保证浏览器刷新时上下文参数和router跳转路径一致。
3 对于Ajax请求需要配置baseURL, 如果使用Axios, 可以采用如下方法在main.js中配置
// http request 拦截器 Axios.interceptors.request.use( config => { if (localStorage.getItem('id_token')) { config.headers.Authorization = localStorage.getItem('id_token') } config.baseURL = '/api' return config }, err => { return Promise.reject(err) })
4 另外需要注意的一点,按照Spring Boot默认配置, 在Vue端/config/index.js中assetsSubDirectory: 'static'要改变为其它字符,比如:'content', 'vue', 'api'等等。
5 试过将assetsSubDirectory配置为空,它和另一个css图片加载的方案有冲突,图片加载解决方案是在/build/util.js中加一行配置
// Extract CSS when that option is specified
// (which is the case during production build)
if (options.extract) {
return ExtractTextPlugin.extract({
use: loaders,
fallback: 'vue-style-loader',
publicPath: '../../'
})
结尾附上Spring Boot端将error page指向Vue的index.html代码:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.web.server.ConfigurableWebServerFactory; import org.springframework.boot.web.server.ErrorPage; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpStatus; @Configuration public class ServletConfig { private static final Logger logger = LoggerFactory.getLogger(ServletConfig.class); @Bean public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer() { logger.info("come to 404 error page"); return factory -> { ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/index.html"); factory.addErrorPages(error404Page); }; } }
对前端全栈工程师感兴趣的同学关注我的头条号,并在后台私信发送关键字:“前端”即可获取免费的前端全栈工程师学习资料
知识体系已整理好,欢迎免费领取。还有面试视频分享可以免费获取。关注我,可以获得没有的架构经验哦!!
了,周末闲来无事,突然有个诡异想法!
如题,惯性思路很简单,就是直接撸上一个空内容的html。
注:以下都是在现代浏览器中执行,主要为**Chrome 版本 120.0.6099.217(正式版本) (64 位)和Firefox123.0.1 (64 位) **
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>demo</title>
</head>
<body>
</body>
</html>
؏؏☝ᖗ乛◡乛ᖘ☝؏؏~
但是,要优雅~咱玩的花一点,如果这个HTML中加入一行文字,比如下面这样,如何让这行文字一直不显示出来呢?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>demo</title>
</head>
<body>
<div>放我出去!!!</div>
</body>
</html>
思考几秒~有了,江湖一直传言,Javascrip代码执行不是影响Render树生成么,上循环!于是如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>demo</title>
</head>
<body>
<div>放我出去!!!</div>
<script>
while (1) {
let a;
}
// 或者这样
/*(function stop() {
var message = confirm("我不想让文字出来!");
if (message == true) {
stop()
} else {
stop()
}
})()*/
</script>
</body>
</html>
```一下一下
bingo,可以实现,那再换个思路呢?加载资源?
说干就干,在开发者工具上,设置上下载速度为1kb/s,测试了以下三种类型资源
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>demo</title>
</head>
<body>
<!-- <link rel="stylesheet" href="https://lf3-cdn-tos.bytescm.com/obj/static/xitu_juejin_web/static/bytedesign.min.css" as="style"/> -->
<!-- <img src="https://lf3-cdn-tos.bytescm.com/obj/static/xitu_juejin_web/static/bytedesign.min.css"/> -->
<div class="let-it-go">放我出去!!!</div>
<script src="https://lf3-cdn-tos.bytescm.com/obj/static/log-sdk/collect/5.1/collect.js"></script>
<style>
.let-it-go {
color: red;
}
</style>
</body>
</html>
总得来说,JS和CSS文件,需要排在.let-it-go元素前面或者样式前面,才会影响到渲染DOM或者CSSOM,图片或者影片之类的,不管放前面还是后面,都无影响。如果在css文件中,一直有import外部CSS,也是有很大影响!
但正如题目,这种只能影响一时,却不能一直影响,就算你在代码里写一个在头部不停插入脚本,也没有用,比如如下这么写,按,依旧无效:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>demo</title>
</head>
<body>
<link rel="stylesheet" href="https://lf3-cdn-tos.bytescm.com/obj/static/xitu_juejin_web/static/bytedesign.min.css"
as="style" />
<!-- <img src="https://lf3-cdn-tos.bytescm.com/obj/static/xitu_juejin_web/static/bytedesign.min.css"/> -->
<script>
// setInterval(()=>{
// 不停插入script脚本 或者css文件
let index = '';
(function fetchFile() {
var script = document.createElement('script');
script.src = `https://lf3-cdn-tos.bytescm.com/obj/static/log-sdk/collect/5.1/collect${index}.js`;
document.head.appendChild(script);
script.onload = () => {
fetchFile()
}
script.onerror = () => {
fetchFile()
}
index+=1
// 创建一个 link 元素
//var link = document.createElement('link');
// 设置 link 元素的属性
// link.rel = 'stylesheet';
// link.type = 'text/css';
// link.href = 'https://lf3-cdn-tos.bytescm.com/obj/static/xitu_juejin_web/app.f81e9f9${index}.css';
// 将 link 元素添加到文档的头部
//document.head.appendChild(link);
})()
// },1000)
</script>
<div class="let-it-go">放我出去!!!</div>
<style>
.let-it-go {
color: red;
}
</style>
<!-- <script src="https://lf3-cdn-tos.bytescm.com/obj/static/log-sdk/collect/5.1/collect.js"></script> -->
</body>
</html>
那么,还有别的方法吗?暂时没有啥想法了,等后续再在这篇上续接~
另外,在实验过程中,有一个方式让我很意外,以为以下代码也会造成页面一直空白,但好像不行。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>demo</title>
</head>
<body>
<div id="appp"></div>
<script>
(function createElement() {
var parentElement = document.getElementById('appp');
// 创建新的子元素
var newElement = document.createElement('div');
// 添加文本内容(可选)
newElement.textContent = '这是新的子元素';
// 将新元素添加到父元素的子元素列表的末尾
parentElement.appendChild(newElement);
createElement()
})()
</script>
<div class="let-it-go">放我出去!!!</div>
</body>
</html>
这可以很好的证明,插入DOM元素这个任务,会在主HTML渲染之后再执行。
祝周末愉快~
作者:大怪v
链接:https://juejin.cn/post/7344164779629985818
*请认真填写需求信息,我们会在24小时内与您取得联系。