由于JS库错误,Javascript无法在生产Rails页面上工作

Javascript not working on Production Rails page due to JS library error?

本文关键字:Rails 工作 JS 错误 Javascript 由于      更新时间:2023-09-26

我有一些简单的javascript来隐藏和显示我的网页上的文本块,这曾经工作得很好。我最近在assets/javascripts中放置了一个新的javascript库,以便在我的网站上创建其他视觉效果。它工作得很好,但现在我的简单javascript不再在线工作,尽管它仍然在本地工作。Chrome控制台显示来自库的错误消息("未捕获的ReferenceError: Raphael未定义")。

这可能会阻止我的javascript的其余部分在生产服务器上工作,而不是在我的本地开发服务器上?我如何防止资源库从加载到其他页面,所以它不会破坏一切?

是的,这会破坏你剩下的代码。当您在生产环境中运行rails时,如果您使用了sprokets并要求将所有内容都放入application.js中,那么所有内容都将被处理成单个文件。如果在该文件中的任何一点javascript代码失败,那么它将破坏文件的其余部分(这是相当烦人的)

你可以有条件地包括拉斐尔库,我假设你已经这样做,因此错误,但在你的javascript代码,你也可以检查,看看它是否被定义。我要做的是在使用Raphael的代码周围加上一些东西,比如:

if (typeof Raphael !== "undefined") {
    ... Raphael code goes here...
}

这样,如果库没有加载,没关系,你的代码不会中断,如果它被加载,那么你的Raphael特定的代码将正常运行:)

更多信息

我也会将Raphael库移到vendor目录中。这更有意义,因为这是专门针对您没有自己添加/创建的资产。

rails现在自动加载Raphael的原因很可能是由于application.js的默认配置。默认情况下,rails使用

设置此设置。
//= require_tree .

这将包括资产目录下的所有JS文件,但如果你想有条件地包括文件,那就有点尴尬了。

如果你想让它在每页的基础上是有条件的,你可以改变你的application.html布局来添加一个新的JS包括,它将包括raphael库只有当它被告知(通过一个变量或其他机制)

如果您添加如下内容:

<%= javascript_include_tag("raphael") if @raphael %>

显然,将raphael更改为库文件的实际名称,那么它将只包含if,如果@raphael变量为true。你可以在任何地方设置,无论是在控制器中,还是在视图的顶部,甚至是在你从视图调用的视图助手中。完全由你决定