You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PIXIJS AJAX切换应用时同名纹理缓存未清除解决方案咨询

PIXIJS多应用切换资源缓存问题解决方案

你之前的清理逻辑存在几个核心问题:销毁顺序错误、未正确销毁纹理实例直接清空缓存对象、时间戳拼接逻辑有缺陷、Loader实例复用残留记录,可按以下步骤修正:

第一步:修正资源清理逻辑

调整销毁顺序,先销毁应用实例再清理缓存,必须遍历销毁每个纹理实例再清空缓存对象,不要复用全局Loader实例,每次切换新建Loader更彻底:

if (app) {
  // 先销毁应用实例,释放所有绑定的资源引用
  app.destroy({
    children: true,
    texture: true,
    baseTexture: true
  });
  app = null;
}

// 遍历销毁所有纹理实例,避免PIXI内部持有残留引用
for (const textureKey in PIXI.utils.TextureCache) {
  const texture = PIXI.Texture.removeFromCache(textureKey);
  if (texture && !texture.destroyed) {
    texture.destroy(true);
  }
}
for (const baseTextureKey in PIXI.utils.BaseTextureCache) {
  const baseTexture = PIXI.utils.BaseTextureCache[baseTextureKey];
  if (baseTexture && !baseTexture.destroyed) {
    baseTexture.destroy(true);
  }
}

// 清空缓存对象
PIXI.utils.TextureCache = {};
PIXI.utils.BaseTextureCache = {};

// 每次切换直接新建Loader实例,比reset清理更彻底
loader = new PIXI.Loader();
loader.resources = {};

第二步:修正时间戳拼接逻辑

原有拼接逻辑未处理URL已带查询参数的场景,会导致时间戳不生效,修正如下:

let add = function (arr) {
  if (loader.loading) return;
  const timestamp = new Date().getTime();
  for (var i in arr) {
    let url = arr[i];
    // 兼容已有查询参数的URL
    url += url.includes('?') ? '&' : '?';
    url += `t=${timestamp}`;
    loader.add(i, url);
  }
};

第三步:调整AJAX加载逻辑

全局禁用jQuery AJAX缓存,避免加载的应用内容被浏览器缓存:

// 全局设置jQuery禁用AJAX缓存
$.ajaxSetup({
  cache: false
});

$.get(href, function (data) {
  // 先执行上述清理逻辑,再初始化新应用
  // 新应用初始化代码
});

异常排查

如果调整后仍有问题,打开浏览器开发者工具网络面板,勾选「禁用缓存」后复现操作:

  • 确认图片请求是否携带了新的时间戳参数,状态码是否为200而非304
  • 如果出现304,检查服务端静态资源配置是否强制忽略URL查询参数,可调整为在路径中加入随机串而非查询参数规避

内容的提问来源于stack exchange,提问作者Renderer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 17:18:02