Loading chunk failed问题处理

当使用懒加载时,由于服务器文件名与浏览器缓存名不匹配,可能导致'Loading chunk failed'错误。通过引入'webpack-retry-chunk-load-plugin'可以防止因网络等问题引发的加载失败,同时利用ErrorBoundary捕获并重新加载来处理此类问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 出现该报错主要是因为,用户浏览页面期间,懒加载导致的服务器文件名和浏览器缓存文件名不一致,所以获取不到文件。

解决方式:

1.引入webpack-retry-chunk-load-plugin,避免因为网络或其他问题导致的加载失败

2.错误边界ErrorBoundry捕捉并重新加载

    
//webpack-retry-chunk-load-plugin配置
   let {RetryChunkLoadPlugin} = require('webpack-retry-chunk-load-plugin')
   new RetryChunkLoadPlugin({
      cacheBust: `function() {
        return Date.now();
      }`,
      maxRetries: 2,
    })
import React from 'react'
import { observer, inject } from 'mobx-react'
import Component from 'edt-components/Component'
import { sessionStorage } from 'utils/storage'
import FullLoading from 'edt-components/FullLoading'
import _ from 'lodash'
@observer
class ErrorBoundary extends Component {
  constructor(props) {
    super(props)
    this.data = {
      hasError: false,
      errorType: null
    }
    this.clearLoadingChunk()
  }
  componentDidCatch(error, errorInfo) {
    this.handleError(error, errorInfo)
  }
  clearLoadingChunk = () => {
    window.clearTimeout(this.clearTimer)
    this.clearTimer = window.setTimeout(() => {
      sessionStorage.removeItem('loadingChunk')
    }, 60000)
  }
  handleError = (error, errorInfo) => {
    this.setData({hasError: true})
    this.handleLoadingChunkError(error)
  }
  handleLoadingChunkError = (error, errorInfo) => {
    //页面浏览期间重新发布,会出现浏览器缓存文件名和服务器文件名不一致,导致下载js失败白屏的问题
    const loadFailed = new RegExp(/Loading chunk (\d)+ failed/g)
    if (error && error.message && error.message.match(loadFailed)) {
      this.setData({errorType: ERROR_ENUM.RELOADING})
      let loadingChunk = sessionStorage.getItem('loadingChunk')
      loadingChunk = _.isNumber(loadingChunk) ? loadingChunk + 1 : 1
      if (loadingChunk > 2) {
        this.setData({errorType: ERROR_ENUM.LOAD_FAIL})
        //当前流程结束,重置loadingChunk
        sessionStorage.setItem('loadingChunk', 0)
      } else {
        sessionStorage.setItem('loadingChunk', loadingChunk)
        window.location.reload()
      }
    }
  }
  renderErrorContent = () => {
    const {errorType} = this.data
    if (errorType === ERROR_ENUM.LOAD_FAIL) {
      return (
        <h3>页面加载失败, 请刷新页面重新加载...</h3>
      )
    }
    if (errorType === ERROR_ENUM.RELOADING) {
      return (
        <FullLoading/>
      )
    }
  }
  render() {
    return this.data.hasError ? this.renderErrorContent() : this.props.children
  }
}

//页面错误类型枚举
const ERROR_ENUM = {
  LOAD_FAIL: 'LOAD_FAIL',
  RELOADING: 'RELOADING'
}

export default ErrorBoundary

 

### 解决 UmiJS 4.0 加载 Chunk 失败的问题 UmiJS 是一个可插拔的企业级 react 应用框架,在使用过程中可能会遇到加载 chunk 文件失败的情况。以下是针对此问题的分析和解决方案。 #### 可能的原因 1. **网络请求失败** 如果 `http://localhost:8080/remoteEntry.js` 的资源无法被正确加载,则可能是由于服务器未正常提供文件或者客户端未能成功发起请求[^1]。 2. **模块联邦配置错误** 在微前端场景下,如果 `app1` 和 `app2` 使用了 Webpack Module Federation 配置,而 `app1` 提供的远程入口 (`remoteEntry.js`) 路径设置有误或未正确暴露组件,则可能导致解析失败。 3. **动态导入机制问题** 类似于 `require('bundle-loader!./a.js')` 这样的动态加载方式可能存在问题,尤其是在异步加载时,Webpack 或者 UmiJS 对依赖关系处理不当会引发类似的错误[^2]。 4. **环境变量或缓存冲突** 某些情况下,浏览器端可能存在旧版本的 JS 缓存,或者服务端的静态资源配置不一致也会导致此类问题发生。 --- #### 解决方案 ##### 方法一:验证并修复路径配置 确认 `app1` 是否已通过正确的 URL 导出了其远程条目 (Remote Entry),即检查 `webpack.config.js` 中关于 Module Federation 插件的相关部分: ```javascript new ModuleFederationPlugin({ name: 'app1', filename: 'remoteEntry.js', // 确保此处与实际访问地址匹配 exposes: { './Header': './src/components/Header' // 曝光 Header 组件给其他应用调用 }, }); ``` 同时确保 `app2` 正确引入了来自 `app1` 的模块定义: ```javascript new ModuleFederationPlugin({ remotes: { app1: 'app1@http://localhost:8080/remoteEntry.js' } }) ``` 上述代码片段需严格遵循官方文档中的最佳实践来避免潜在的拼写错误或其他语法问题。 ##### 方法二:调整 Webpack 输出策略 对于生产环境中可能出现的跨域资源共享(CORS)限制或者其他性能瓶颈,可以尝试优化 Webpack 构建选项: - 设置公共路径(`publicPath`) - 启用长期缓存(long-term caching) 例如修改 Webpack 配置如下所示: ```javascript output: { publicPath: 'auto', // 自动检测当前运行环境下的基础路径 }, optimization: { splitChunks: { chunks: 'all' }, // 将第三方库单独打包成独立chunk } ``` 这一步骤有助于减少因路径映射不清而导致的加载失败风险。 ##### 方法三:清理缓存重新部署 强制清除本地以及远端的所有相关缓存数据后再执行完整的构建流程: ```bash rm -rf node_modules dist .cache && npm install && umi build --clean ``` 此外还需注意重启开发服务器以同步最新的改动效果。 ##### 方法四:增强网络层稳定性 考虑到偶尔发生的瞬态连接中断现象,适当增大 TCP 协议栈缓冲区大小能够提升大流量条件下的传输效率: ```shell sysctl -w net.core.rmem_default=4194304 sysctl -w net.core.rmem_max=4194304 sysctl -w net.core.wmem_default=4194304 sysctl -w net.core.wmem_max=4194304 ``` 尽管这些参数通常适用于数据库后台进程如 Oracle 数据库实例遭遇崩溃恢复期间内存分配不足的情形[^3],但对于高并发 web 请求同样具备一定的借鉴意义。 --- ### 总结 综上所述,解决 UmiJS 4.0 加载 chunk 失败的关键在于仔细排查各环节之间的交互逻辑是否存在偏差,并采取针对性措施逐一排除干扰因素直至恢复正常运作状态为止。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值