【前端基础】script引入资源脚本加载失败解决方案(重新加载获取备用资源)

问题描述

现在假设有一个script资源加载失败,代码如下

<!DOCTYPE html>
<html>
<head>
	<title>script 资源加载失败</title>
</head>
<body>
	<script src="http:hdh.sdas.asdas/1.js"></script>
</body>
</html>

我们希望在加载失败的时候进行一系列的解决操作,那么就需要有两步操作:

  1. 捕获加载失败事件
  2. 对加载失败操作进行处理(重新获取重试)

捕获加载失败事件

注意:
这里既然是捕获 script 资源加载错误,就要在 script 资源加载之前注册监听事件。因此把这段代码放在所有 script 标签之前

全局监听错误事件

在这里插入图片描述

true: 是一个可选的参数,表示在捕获阶段触发事件处理程序。在事件传播过程中,捕获阶段是指从最外层的元素向目标元素的阶段。这里设置为true表示在捕获阶段触发处理程序,如果设置为false或省略,则在冒泡阶段触发处理程序(从目标元素向最外层的元素)。

<!DOCTYPE html>
<!DOCTYPE html>
<html>
<head>
	<title>script 资源加载失败</title>
	<script type="text/javascript">
		<!-- 这里需要添加 true 属性 -->
		window.addEventListener('error',(e)=>{
			console.log('有错误')
		},true)
	</script>
</head>
<body>
	<script src="http:hdh.sdas.asdas/1.js"></script>
</body>
</html>

捕获资源加载失败类型错误

首先我们打印一下监听事件的 e 元素,会发现 script 加载失败事件的属性和别的错误属性有两个特征,只要把握住这两个特征就可以进行判断处理:

  1. 特点1:是个 Event 对象
  2. 特点2:target 属性为 script

在这里插入图片描述

<!DOCTYPE html>
<html>
<head>
	<title>script 资源加载失败</title>
	<script type="text/javascript">
		<!-- 这里需要添加 true 属性 -->
		window.addEventListener('error',(e)=>{
			const tag = e.target
			// 添加判断事件类型
			if(tag.tagName === 'SCRIPT' && !(e instanceof ErrorEvent)){
				console.log('有错误')
			}
		},true)
	</script>
</head>
<body>
	<script src="http:hdh.sdas.asdas/1.js"></script>
</body>
</html>

完整案例代码

在这里插入图片描述

<!DOCTYPE html>
<html>
<head>
	<title>script 资源加载失败</title>
	<script type="text/javascript">

		// 这里是模拟的一些备用域名
		const domains = [
			'test.1.com',
			'test.2.com',
			'test.3.com'
		]
		// 最大的重试次数
		const maxRetry = 5
		// 资源加载信息
		const retryInfo = {}

		window.addEventListener('error',(e)=>{

			console.log('e',e)
			const tag = e.target

			// 只对 script 加载失败错误进行处理
			if(tag.tagName === 'SCRIPT' && !(e instanceof ErrorEvent)){
				const url = new URL(tag.src)
				console.log('url',url)

				// 如果该文件没有加载失败信息,则初始化
				if(!retryInfo[url.pathname]){
					retryInfo[url.pathname] = {
						times:0,
						nextIndex:0
					}
				}

				const info = retryInfo[url.pathname]
				console.log('info',retryInfo)

				// 加载失败次数小于最大重试次数
				if(info.times < maxRetry){
					url.host = domains[info.nextIndex]

					// 阻塞页面后续的加载
					document.write(`<script src="${url.toString()}">\<\/script>`)

					// 以下这种方式就不会按顺序加载 script 内容
					// const script = document.createElement('script')
					// script.src = url.toString()
					// document.body.insertBefore(script,tag)

					// 下标循环
					info.nextIndex = (info.nextIndex + 1) % domains.length
					info.times++
				}
			}
		},true)
	</script>
</head>
<body>
	<!-- 模拟一个加载失败的资源 -->
	<script src="http:hdh.sdas.asdas/1.js"></script>
</body>
</html>
### Vue前端图片加载失败的原因及解决方案 #### 一、路径问题导致的图片加载失败 如果项目中的 `assets` 文件夹下的图片在动态获取时无法显示,则可能是由于路径解析错误引起的。Vue 的构建工具会对 `assets` 下的文件进行处理并重新命名,因此可能导致路径失效。解决此问题的方法是将图片放置到 `public` 文件夹下[^1]。 ```html <img src="/images/example.png" alt="example"> ``` 上述代码中 `/images/example.png` 是相对于 `public` 文件夹的绝对路径。 --- #### 二、图片懒加载优化 对于页面中有大量图片的情况,可能会因为一次性加载过多资源而导致性能下降甚至加载失败。此时可以通过实现图片懒加载来解决问题。Vue 可以借助第三方库如 `v-lazy` 实现懒加载功能[^2]: ```html <template> <div> <img v-lazy="imageUrl" alt="Lazy Image"> </div> </template> <script> export default { data() { return { imageUrl: 'https://example.com/image.jpg' }; } }; </script> ``` 通过这种方式,仅当图片进入视口范围时才触发实际加载操作,从而降低初始加载压力。 --- #### 三、首次加载缓慢引发的加载失败 如果用户的网络环境较差或者服务器响应时间较长,可能造成图片未能及时加载完成而显示空白区域。针对这种情况,可以从以下几个方面入手改善[^3]: - **启用 Gzip 压缩**:利用 Webpack 插件 `compression-webpack-plugin` 对打包后的静态资源进行压缩,减小传输大小。 - **图片压缩**:引入 `image-webpack-loader` 插件对大尺寸图片进行预处理,进一步缩减其体积。 配置示例如下所示: ```javascript const CompressionWebpackPlugin = require('compression-webpack-plugin'); const ImageMinimizerPlugin = require('image-minimizer-webpack-plugin'); module.exports = { configureWebpack: { plugins: [ new CompressionWebpackPlugin({ algorithm: 'gzip', test: /\.(js|css|html|svg)$/, }), new ImageMinimizerPlugin({ minimizerOptions: { // Lossless optimization with custom options // Feel free to experiment with options for better result for you plugins: [ ['gifsicle', { interlaced: true }], ['jpegtran', { progressive: true }], ['optipng', { optimizationLevel: 5 }] ] }, }) ], }, }; ``` --- #### 四、图片加载失败时的默认占位图设置 为了避免用户体验受损,在图片加载失败的情况下可以提供一张备用的占位图像作为替代方案。具体做法是在 `<img>` 标签上绑定 `onerror` 属性[^4]: ```html <img :src="dynamicImageUrl" onerror="this.src='https://example.com/placeholder.jpg'; this.onerror=null;" /> ``` 这样即使目标图片不可用,用户仍能看到一个友好的提示图标而非空白框体。 --- #### 五、路由懒加载缓解首屏渲染负担 当应用规模较大时,所有组件都被打包成单一文件会显著增加首页加载耗时。为此推荐采用 Vue Router 提供的支持 Webpack 异步模块导入机制的功能——即所谓的“懒加载”。它允许开发者只在特定路由被激活后再去请求对应的脚本片段而不是一开始就全部下载下来[^5]。 样例如下: ```javascript const routes = [ { path: '/home', component: () => import('@/views/Home.vue') }, ]; ``` 以上方式能够有效减少初次访问所需的数据量进而提升整体效率表现。 --- ### 总结 综上所述,Vue 应用中遇到的照片无法加载现象通常由多种因素共同作用所致,包括但不限于相对路径设定不当、未实施合理的延迟策略以及缺乏必要的异常捕获手段等。采取恰当措施逐一排查这些问题有助于保障最终呈现效果达到预期标准。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值