我刚刚在我的项目中添加了ember-cli-fastboot
(github),以便为抓取工具机器人提供预渲染服务器。
完成以下安装步骤后,启动服务器(ember fastboot --serve-assets
)时收到错误消息:
jQuery is not defined
ReferenceError: jQuery is not defined
at <anonymous>:66304:16 [...]
缓存中有什么要清理吗? 我错过了一些明显的东西吗?
答案 0 :(得分:5)
FastBoot在Node中呈现,特别是在V8虚拟机中,这意味着它无法访问运行jQuery所需的DOM。此外,作为沙盒vm,它无法访问运行FastBoot代码的相同全局命名空间(除非您明确地将其传递到沙箱中,请参阅https://www.ember-fastboot.com/docs/user-guide上的“使用白名单节点依赖关系”)
如果您通过jQuery节点模块传递jQuery,并在您的应用程序代码中公开,您仍然无法在FastBoot模式下运行jQuery的大部分API,因为它严重依赖于DOM API在这种环境中存在。
但有时您需要在浏览器中进行一些DOM操作,以处理复杂的动画或用户交互。建议的解决方案是在didInsertElement
或willInsertElement
组件生命周期事件处理程序中保留所有需要DOM操作的代码,这些处理程序明确地不在FastBoot模式下运行。
另一个不推荐使用的选项是将对jQuery的调用包装错误,并通过检查以确保您不在FastBoot中(请参阅上面的用户指南中的“FastBoot服务”)
在这种情况下,您不需要将模块列入白名单,因为FastBoot永远不应该执行依赖于jQuery的代码。
附注: Ember清楚地呈现HTML,它需要一些方法来构建类似DOM的结构。 FastBoot作者创建了SimpleDOM,它在Application Instance init时传递给渲染引擎。它是用于构造层次结构的DOM方法的一个非常小的子集,然后序列化为HTML字符串。