如何使 JS 错误不会阻止 Trix 工作?

Posted

技术标签:

【中文标题】如何使 JS 错误不会阻止 Trix 工作?【英文标题】:How do I make that JS errors don't prevent Trix from working? 【发布时间】:2020-08-11 22:51:31 【问题描述】:

这是related to this question。

我发现有一些 JS 文件抛出了一个错误,似乎阻止了 Trix 正确执行(或根本无法执行)。

这就是我的app/javascript/packs/application.js 的样子:

// This file is automatically compiled by Webpack, along with any other files
// present in this directory. You're encouraged to place your actual application logic in
// a relevant structure within app/javascript and only use these pack files to reference
// that code so it'll be compiled.

require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")
require("local-time").start()

window.Rails = Rails

import '../src/popper.min'
import '../src/jquery.min'
import 'bootstrap'

import '../src/aos'
// import '../src/clipboard.min'
// import '../src/jquery.fancybox.min'
// import '../src/flatpickr.min'
// import '../src/flickity.pkgd.min'
// import '../src/ion.rangeSlider.min'
// import '../src/isotope.pkgd.min'
// import '../src/jarallax.min'
// import '../src/jarallax-video.min'
// import '../src/jarallax-element.min'
// import '../src/jquery.countdown.min'
// import '../src/jquery.smartWizard.min'
// import '../src/plyr.polyfilled.min'
// import '../src/prism'
// import '../src/scrollMonitor'
// import '../src/smooth-scroll.polyfills.min'
// import '../src/svg-injector.umd.production'
// import '../src/svg-injector'
// import '../src/twitterFetcher_min'
// import '../src/typed.min'
// import '../src/theme'

$(document).on("turbolinks:load", () => 
  $('[data-toggle="tooltip"]').tooltip()
  $('[data-toggle="popover"]').popover()
)

import "controllers"

require("trix")
require("@rails/actiontext")

我尝试将require("trix") 调用放在此文件的顶部,但它仍然不起作用。

考虑到这里所有的 JS 依赖项,我是否可以确保 trixactiontext 文件无论如何都能执行?

【问题讨论】:

1) I tried putting the require("trix") calls at the top of this file and it still doesn't work. - 它以什么方式失败了? 2) 为什么要在导入中使用失败的js 文件?如果有任何失败,那么不仅trix,而且失败之后的所有代码和所有导入都不会被执行。 3) 一个最小的可重现示例将不胜感激(最好在一些在线 REPL 上) 删除$(document).on("turbolinks:load", () => $('[data-toggle="tooltip"]').tooltip() $('[data-toggle="popover"]').popover() )还会出现这种情况吗? 您收到的实际错误信息是什么? 【参考方案1】:

试试这个通用答案:在 *.js 文件中逐行注释

【讨论】:

【参考方案2】:

您可以尝试将非功能代码放在 try-catch 中,并将要执行的文件放在 finally 块中,而不管 try-catch 结果如何

【讨论】:

【参考方案3】:

您可以通过覆盖window.onerror 函数来告诉您的浏览器忽略Javascript 错误。通常不建议这样做,因为它可能会导致意外行为,并且通常最好让代码在没有错误的情况下运行。错误处理是个好东西!

话虽如此,这将阻止错误导致您的脚本停止运行。

function errorIgnorer() 
   return true;


window.onError = errorIgnorer;

MDN docs 表示某些事件侦听器仍会触发,无论如何。在这些情况下,您也可以使用类似的方法来消除错误处理。

【讨论】:

【参考方案4】:

考虑到这里的所有 JS 依赖项,我是否可以确保 trix 和 actiontext 文件无论如何都被执行?

不,所有文件都必须正常运行。

当然,您可以将它们包装在 try catch 块中,但如果您需要它们为您的应用程序提供功能,这可能行不通。

$(document).on("turbolinks:load", () => $('[data-toggle="tooltip"]').tooltip() $('[data-toggle="popover"]').popover() )

如果你删除上面的代码,它仍然会发生吗?那并不真正属于那里(请参阅代码顶部的 webpack 评论)

【讨论】:

是的,如果我删除该代码,它仍然会发生。还有其他想法吗? @marcamillion 如果你不提供任何额外的信息,我怀疑会有任何额外的想法。如果您留下您的问题,那么我在下面的评论就是您的答案:trix 或任何东西都没有办法也没有理由被执行。错误应该被修复,而不是避免。

以上是关于如何使 JS 错误不会阻止 Trix 工作?的主要内容,如果未能解决你的问题,请参考以下文章

Plotly 条形图上的错误栏阻止的文本

CORS 仅阻止 localhost 请求

如何阻止我的 UI 冻结?

#pragma once 不会阻止多个变量定义

如何通过 https 修复 css 和 js 的“阻止加载混合活动内容”

如何解决此错误跨域读取阻塞 (CORB) 阻止了在邮递员上工作的跨域响应