前端项目打包后无法加载动态资源(Failed to fetch dynamically imported module)
社会瑶.vue 2024-08-09 14:33:02 阅读 52
1、问题描述
前端项目打包到生产环境,用户在页面操作时会出现页面报错,无法加载动态资源的错误,但是刷新一下就可以了
2、原因
因为版本更新导致客户端与最新的版本不一致,存在资源未更新的情况,用户在使用的过程中停留在某个页面,没有刷新重新获取资源,就会导致报错
3、解决方法(纯前端,目前来说比较简单的解决方法)
解决思路:通过调用fs库的方法在打包时创建version.json保存版本号,同时在localStorage存储版本号信息,通过对比版本号是否一致强制刷新页面,获取最新的资源防止报错。
第一步:在根目录下创建build文件夹和build.js文件
第二步:在build.js中添加以下代码
<code>// 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": "------"
},
第五步:准备摸鱼
上一篇: 2024年10个超炫酷的前端 3D 开源项目,那几个你用?
下一篇: 一款允许使用Docker部署本地托管的、基于 Web 的 PDF 操作工具
本文标签
前端项目打包后无法加载动态资源(Failed to fetch dynamically imported module)
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。