前端项目打包后无法加载动态资源(Failed to fetch dynamically imported module)

1、问题描述

前端项目打包到生产环境,用户在页面操作时会出现页面报错,无法加载动态资源的错误,但是刷新一下就可以了

2、原因

因为版本更新导致客户端与最新的版本不一致,存在资源未更新的情况,用户在使用的过程中停留在某个页面,没有刷新重新获取资源,就会导致报错

3、解决方法(纯前端,目前来说比较简单的解决方法)

解决思路:通过调用fs库的方法在打包时创建version.json保存版本号,同时在localStorage存储版本号信息,通过对比版本号是否一致强制刷新页面,获取最新的资源防止报错。

第一步:在根目录下创建build文件夹和build.js文件

第二步:在build.js中添加以下代码

// console.log("build---->文件开始执行!");
import fs from "fs";
import path from "path";

function getRootPath(...dir) {
  return path.resolve(process.cwd(), ...dir);
}
const runBuild = async () => {
  try {
    const OUTPUT_DIR = "dist";
    const VERSION = "version.json";
    const versionJson = {
      version: "V_" + Math.floor(Math.random() * 10000) + Date.now(),
    };
    fs.writeFileSync(
      getRootPath(`${OUTPUT_DIR}/${VERSION}`),
      JSON.stringify(versionJson)
    );
    // console.log(`version file is build successfully!`);
  } catch (error) {
    // console.error("version build error:\n" + error);
    process.exit(1);
  }
};
runBuild();
// console.log("build---->文件执行结束!");

第三步:src/router/index.ts 在路由中添加跳转前的判断

注意:添加import.meta.env.VITE_ENV === "PRODUCTION"判断是否为生产环境,开发环境不需要刷新获取资源,登录页也不需要,注意排除,否则会导致用户停留在登录页时,会造成重复登录

import axios from "axios";

router.beforeEach((to, from, next) => {
  ...
    if (from.path !== "/" && import.meta.env.VITE_ENV === "PRODUCTION") {
      checkAppNewVersion();
    }
  ...
});

// 监听页面打开显示
document.addEventListener("visibilitychange", function () {
  if (!document.hidden) {
    if (import.meta.env.VITE_ENV === "PRODUCTION") {
      checkAppNewVersion();
    }
  }
});

// 检查服务端是否已经更新,如果更新刷新页面
async function checkAppNewVersion() {
  const url = `/version.json?t=${Date.now()}`;
  let res = null;
  try {
    res = await axios.get(url);
  } catch (err) {
    console.error("checkAppNewVersion error: ", err);
  }
  if (!res) return;
  const version = res.data.version;
  if (version && version !== localStorage.getItem("version")) {
    localStorage.setItem("version", version);
    window.location.reload();
  }
  localStorage.setItem("version", version);
}

第四步:package.json 配置打包时执行build.js文件

"type": "module",
  "scripts": {
    "dev": "-----",
    "build": "vite build && node ./build/build.js",
    "preview": "------"
  },

第五步:准备摸鱼

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值