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

在Phoenix LiveView项目中集成three.js失败,请求问题排查

排查Phoenix LiveView中Three.js立方体不渲染的问题

以下是针对你代码的关键问题及修复方案:

1. 初始化判断条件未触发

你的hook中通过this.el.dataset.initialized === "false"判断是否初始化,但对应的<div>元素未设置data-initialized属性,导致initThreeScene()永远不会执行。

修复:
给容器div添加初始属性:

<div id="three-container" phx-hook="ThreeInit" data-initialized="false"></div>

或者直接移除判断逻辑(无需重复初始化场景时):

mounted() {
  this.initThreeScene();
}

2. Three.js压缩版的导入方式错误

three.min.js通常为UMD格式而非ES模块,用import * as THREE导入无法正确获取THREE对象。

修复方案二选一:

  • 改用页面脚本标签引入:
    在lib/portfolio_web/templates/layout/root.html.heex中添加:

    <script src="<%= Routes.static_path(@conn, "/assets/vendor/three.min.js") %>"></script>
    

    同时删除app.js中的import * as THREE和window.THREE = THREE两行。

  • 安装npm版three.js(推荐):

    cd assets
    npm install three
    

    然后在app.js中正常导入:

    import * as THREE from 'three';
    window.THREE = THREE;
    

3. 容器元素样式缺失

默认<div>高度为0,即使渲染了WebGL画布也无法显示。

修复:
在assets/css/app.css中添加容器样式:

#three-container {
  width: 100%;
  height: calc(100vh - 60px); /* 可根据页面布局调整高度 */
}

4. LiveView模板语法过时

你使用了旧版~L模板宏,当前Phoenix LiveView推荐使用~H(HEEx模板),虽旧版兼容但建议更新:

def render(assigns) do
  ~H"""
  <h1>Hello, World!</h1>
  <div id="three-container" phx-hook="ThreeInit" data-initialized="false"></div>
  """
end

额外调试建议

  • 打开浏览器控制台(F12),查看是否存在JavaScript报错(如THREE未定义、WebGL初始化失败等)。
  • 确认app.js已正确打包并加载到页面中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:32:35