Rails 6 次加载中需要自定义 JS,但随后 none 的函数可以正常工作

Custom JS required in Rails 6 loads, but then none of the functions work

快把我逼疯了,因为它应该如此简单!!!

    // file: /app/javascript/packs/application.js
    require("jquery")
    require("custom/sites_manage")

    // file: /app/javascript/custom/sites_manage.js
    console.log(">>> this file is being loaded")
    function testFunc() {
      return "asdf"
    }

当我启动本地服务器并转到主页时,我确实在控制台中看到 >>> this file is being loaded 太棒了!但是当我打电话给 testFunc() 时,我得到:Uncaught ReferenceError: testFunc is not defined

为什么???我不认为我在这个主题上所做的与众多 answers/tutorials 有什么不同(例如,, or this one

这个问题可能有两个原因:

Firstone:js 文件正在加载到当前的 iframe 中,但在无法访问的上下文中。解决方法:在testFunc的定义下添加一行window.publicTestFunc = testFunc;像这样:

function testFunc() {
  return "asdf";
}
window.publicTestFunc = testFunc;

如果问题是上下文引起的,现在您应该可以从上下文外部调用 publicTestFunc。

第二个原因:js文件正在iframe上加载。在这种情况下,解决问题有点复杂,iframe 与 ondata 事件之间的消息传递,或者使用 iframe url 哈希是唯一可用的通信机制......所以通常总是更好的主意来找出为什么会这样正在发生(如果是这种情况,我需要更多信息)。

编辑:可能还有第三个原因:js文件是作为网络工作者加载的……网络工作者也有独立的上下文。通信情况类似iframe场景

然而,可能是第一个原因,使用 window.publicfunction = privatefunction 你应该可以调用你的函数。

当您使用 webpack 时,您需要导出您的函数以允许其他文件访问它:

function testFunc() {
  return "asdf"
}
export default testFunc;

并使用它:

import testFunc from '../path/to/custom/sites_manage.js'
testFunc()