记一次vue项目Loading chunk chunk-25849c4c failed.问题

本文探讨了页面打开后空白且JS加载失败的问题,通过修改路由错误处理和移除预加载插件,作者揭示了如何避免503问题并优化前端资源加载。

表现:页面一段时间没打开再次打开后页面空白加载不出来,控制台看到有js文件加载失败,报错Loading chunk chunk-25849c4c failed.

于是看了网上的解决办法,路由onError处理

const pattern = /Loading chunk (\S)+ failed/g // 网上这里是\n 或者\d那是数字,我的是字符串改成了\S
  const isChunkLoadFailed = error.message.match(pattern)
  if (isChunkLoadFailed) {
     window.location.reload()
  } else {
    console.log(error.message)
  }

但是这样处理后我的问题变成页面直接变成503了,刷新会正常,而且强刷ctrl+f5出现概率很大

image.png

也不是一定503直接白屏,有时候是部分js加载失败,但是页面还是正常出来的,把这个js地址放浏览器看有时候直接有内容,有时候是503刷新后正常

image.png

于是又找了解决503的办法,实在是没有效果

由于这些文件是预加载文件,我就干脆将预加载去掉了,在配置文件vue.config.js加上

chainWebpack: (config) => {
  // 移除 prefetch preload 插件
  config.plugins.delete('preload')
  config.plugins.delete('prefetch')
}

强刷了几次试试没有那个问题了

在前端开发中,当使用 Webpack 等打包工具进行构建时,CSS 和 JS 文件通常会被分割为不同的 chunk,以实现按需加载和缓存优化。如果遇到 `Error: Loading CSS chunk chunk-4fa1 failed` 这类错误,通常意味着浏览器在加载某个 CSS chunk 时失败了,可能是由于网络问题、文件路径错误、缓存策略不当或 Webpack 配置不合理引起的。 ### 错误原因分析 1. **Webpack 输出配置问题** 如果 `output.filename` 和 `MiniCssExtractPlugin` 的 `filename` 配置不正确,可能导致浏览器无法正确解析文件路径,从而导致 chunk 加载失败。例如,路径中未正确使用 `[contenthash]`,会导致缓存失效或加载错误的文件名[^1]。 ```javascript output: { filename: 'js/built.[contenthash:10].js', path: resolve(__dirname, 'build') } ``` 同时确保 CSS 文件使用了 `MiniCssExtractPlugin` 并正确配置了 `[contenthash]`: ```javascript new MiniCssExtractPlugin({ filename: 'css/built.[contenthash:10].css' }) ``` 2. **缓存问题** 使用 `chunkhash` 或 `contenthash` 可以更精细地控制缓存。如果使用 `hash` 或 `chunkhash` 而非 `contenthash`,即使只改动了一个文件,也可能导致所有相关 chunk 的 hash 值变化,从而强制浏览器重新加载所有资源。建议使用 `contenthash` 来确保只有内容变化时才更新 hash 值[^1]。 3. **路由配置问题(React/Vue 项目)** 在某些框架(如 React + React Router 或 Vue CLI)中,如果路由配置错误或动态导入(`import()`)方式不正确,也可能导致 chunk 加载失败。例如,在 Vue CLI 中,如果使用了异步组件但未正确配置 Webpack 分块策略,可能导致 chunk 无法正确加载。 4. **构建环境或依赖问题** 有时构建工具本身的 bug 或依赖版本不兼容也会导致 chunk 加载失败。例如,Vue CLI 项目中若遇到 `chromedriver` 安装失败,可能间接影响构建流程,从而导致输出文件异常。此时可以尝试使用淘宝镜像安装依赖: ```bash npm install chromedriver --chromedriver_cdnurl=http://cdn.npm.taobao.org/dist/chromedriver ``` 5. **Nuxt.js 初始化问题** 如果使用 Nuxt.js 并通过 `new Nuxt(config)` 初始化实例时出现 `TypeError: Nuxt is not a constructor`,这可能是因为引入方式错误或版本不兼容。确保使用的是官方推荐的导入方式: ```javascript const { Nuxt, Builder } = require('nuxt') ``` 6. **网络请求失败** 浏览器开发者工具中查看 Network 面板,确认 CSS chunk 是否返回 404 或 500 错误。这可能是由于部署路径配置错误或 CDN 缓存未更新所致。 ### 解决方案 - **检查 Webpack 配置**:确保使用 `MiniCssExtractPlugin` 并正确配置 `filename`,使用 `[contenthash]` 而非 `[hash]` 或 `[chunkhash]`。 - **清除缓存并重新构建**:执行 `npm run build` 前清除缓存(如删除 `node_modules/.cache`)。 - **检查路由配置**:确保异步组件或懒加载路由配置正确,避免 chunk 名冲突。 - **使用稳定依赖版本**:确保 `webpack`、`mini-css-extract-plugin` 等依赖版本兼容。 - **检查部署路径**:确认静态资源路径正确,避免 404 错误。 - **使用浏览器开发者工具调试**:查看 Network 面板,确认具体失败的请求和响应状态。 --- ### 示例 Webpack 配置优化 ```javascript const path = require('path') const MiniCssExtractPlugin = require('mini-css-extract-plugin') module.exports = { entry: './src/index.js', output: { filename: 'js/built.[contenthash:10].js', path: path.resolve(__dirname, 'build') }, module: { rules: [ { test: /\.css$/, use: [ MiniCssExtractPlugin.loader, 'css-loader' ] } ] }, plugins: [ new MiniCssExtractPlugin({ filename: 'css/built.[contenthash:10].css' }) ] } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值