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

Barba.js过渡后Three.js网格消失,返回主页无法初始化场景

Three.js + Barba.js 返回主页不渲染问题排查方案

核心排查方向

  • DOM元素绑定问题
    Barba.js切换页面时会替换DOM内容,返回主页时你可能仍在使用旧的canvas引用,而非当前DOM中的新canvas。必须在afterEnter钩子中重新获取页面上的canvas元素,再绑定给Three.js渲染器。

  • Three.js实例未正确重置
    离开主页时如果没销毁旧的场景、渲染器实例,返回时新创建的实例可能无法抢占资源。要在beforeLeave钩子中清理资源:

    barba.hooks.beforeLeave(() => {
      // 销毁渲染器
      if (renderer) renderer.dispose();
      // 清理场景中所有几何体和材质
      if (scene) {
        scene.traverse(obj => {
          if (obj.geometry) obj.geometry.dispose();
          if (obj.material) obj.material.dispose();
        });
      }
      // 停止渲染循环
      cancelAnimationFrame(animationId);
    });
    
  • 渲染循环未重启
    页面离开时如果停掉了渲染循环,返回主页必须重新启动。确保afterEnter中调用渲染循环函数:

    function renderLoop() {
      animationId = requestAnimationFrame(renderLoop);
      renderer.render(scene, camera);
    }
    
    barba.hooks.afterEnter(data => {
      if (data.next.namespace === 'home') {
        initThreeJS();
        addObjects();
        renderLoop();
      }
    });
    
  • 网格未加入当前场景
    控制台能检测到网格实例,但画面不显示,大概率是网格加到了旧场景里。addObjects函数要确保使用重新初始化后的scene实例:

    function addObjects() {
      const cube = new THREE.Mesh(new THREE.BoxGeometry(), new THREE.MeshBasicMaterial({ color: 0x00ff00 }));
      scene.add(cube); // 这里的scene必须是initThreeJS中新创建的实例
    }
    

关键代码调整要点

  1. 初始化Three.js时,必须从当前DOM获取canvas:
function initThreeJS() {
  const canvas = document.getElementById('three-canvas');
  if (!canvas) return;

  scene = new THREE.Scene();
  camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
  renderer = new THREE.WebGLRenderer({ canvas });

  renderer.setSize(window.innerWidth, window.innerHeight);
  camera.position.z = 5;
}
  1. 确保Barba钩子只在主页触发初始化逻辑,避免其他页面误执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 11:22:21