在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
相关产品推荐
相关产品推荐

