如何在 webpacker Rails 6 中使 JS 函数全局化

2023-12-03

我尝试像以前在 Rails 5 中那样组织我的前端。我有一些带有函数的 js 文件,并根据我的需要在代码的不同位置使用了这些函数。但在 Rails 6 中,使用 js 是完全不同的。不管怎样,我想我已经了解了 packs 和 webpacker 的主要想法。但是如何使用自定义的js函数呢?将其写入一个文件并在另一个文件中使用?应该有办法做到这一点。

例如,我有一些自定义的 js 包:

应用程序/javascript/packs/custom_pack_with_functions.coffee:

console.log 'hey'

@hi = () ->
  console.log 'HI'

我希望hi在我看来,该功能将可用。

一些_view.html.slim:

= javascript_pack_tag 'custom_pack_with_functions'

javascript:
  hi()

但是当我进入适当的页面时,我在控制台中只看到以下消息:

hey
ReferenceError: hi is not defined

​ 如何定义hi可以从任何地方使用它的功能吗?


默认情况下,Webpack 不会使模块在全局范围内可用。您可以通过以下几种方法来做到这一点:

  1. 将函数分配给全局window对象,即window.hi = function() { ... }。我不喜欢在很多地方出现这样的副作用,所以这是我最不喜欢的选择,但也许是最容易理解的。

  2. 你可以看看使用expose-loader。这意味着自定义您的 webpack 配置以将选定模块中的选定函数“公开”到全局范围。它对于少数情况可以很好地工作,但对于许多用例来说会变得乏味。

  3. 从入口点导出选定的函数并配置 webpack 进行打包你的包作为一个库。如果您喜欢从视图调用全局函数,这是我最喜欢的方法。我在我的博客上专门为 Webpacker 写过这种方法.

    // app/javascript/packs/application.js
    
    export * from '../myGlobalFunctions'
    
    
    // config/webpack/environment.js
    
    environment.config.merge({
      output: {
        // Makes exports from entry packs available to global scope, e.g.
        // Packs.application.myFunction
        library: ['Packs', '[name]'],
        libraryTarget: 'var'
      },
    })
    
    :javascript
      Packs.application.hi()
    
  4. 根本不要使用全局函数;使用不同的机制从 webpack JS 中触发该函数,例如在给定页面的事件侦听器中或在给定元素存在的情况下。

    // app/javascript/initializer.js
    
    import hi from '../hi';
    
    document.addEventListener('DOMContentLoaded', () => {
      if ( /* some logic for my page is true */ ) {
        hi()
      }
    });
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 webpacker Rails 6 中使 JS 函数全局化 的相关文章

随机推荐

  • 如何在表单 Serialize() ajax 上包含提交按钮名称和值

    我遇到了麻烦 我的代码不起作用 因为我的服务器脚本端需要来自提交按钮的名称 我正在使用Ajax方法 并且正在使用data serialize 当我点击提交时 它不起作用 这是我的 JavaScript 代码 function buy pro
  • ASP.net MVC 验证在不正确的字段上突出显示和图标 Jquery

    我正在寻找一种方法来更改默认的 ASP net MVC 验证 以便不再在每个不正确的表单字段旁边放置消息 而是放置一个图标 然后我会在页面的其他位置列出错误 该图标将是一个图像 因此我需要在不正确的字段旁边渲染图像标签 除了放置一个图标之外
  • M power 查询 - 重建此数据组合

    在 M 中获取以下查询的错误消息 我尝试在合并步骤之前拆分为 2 个不同的查询 但仍然收到 这不会直接访问数据源 请重建数据组合 错误 let Source Query List from SP cols if Type Indicator
  • 如何从 Microsoft Word 文档中删除超链接?

    我正在编写一个 VB 宏来为我的工作做一些文档处理 搜索文本行并将括号内的文本放入列表 框 中 当我想删除文档中的所有超链接然后生成新的超链接 不一定在原始超链接的位置 时 问题就出现了 那么问题是如何删除现有的超链接 我当前的问题是 每次
  • 让docker容器连接到网络设备

    我正在尝试制作一些 docker 容器来容纳我的一些日常工具 但我的很多工具都依赖于能够连接到设备 通过 WiFi 来提取数据 我一直在做研究 并且很困惑试图了解需要做什么 如果有的话 来支持这种情况 我知道通常 docker 容器是服务器
  • JTextPane 追加新字符串

    每篇文章都会回答 如何将字符串附加到 JEditorPane 的问题 是这样的 jep setText jep getText new string 我已经尝试过这个 jep setText b Termination time b Cri
  • pyqtgraph滚动图:以块的形式绘制,仅显示当前窗口中最新的10秒样本

    我在使用 pyqtgraph 滚动图时遇到问题 预期成绩 预期结果与实际结果非常相似pyqtgraph 示例 滚动图 plot5 X值是时间 可以通过简单的函数生成 Y 值是随机值 每 10 秒采样一次作为一个块 每个图最多可以有 1 个数
  • 使用 Oracle 数据库的 Django InspectDB 问题

    安装cx oracle并运行inspectdb 似乎没有得到任何输出 有人可以帮忙吗 将inspectdb 与Oracle 一起使用是否存在已知问题 下面是命令和settings py python manage py inspectdb
  • Nexus 7 在 Windows 7 x64 中通过“adb devices”通过 USB 不可见

    我已经做了显而易见的事情 从最新的 Android SDK 安装了 USB 驱动程序 并在平板电脑中打开了 USB 调试 当 的时候Nexus 7连接后 设备将显示在 Windows 中装置经理作为 Android Phone Androi
  • 如何在网页中隐藏敏感信息?

    我正在尝试将一个包含测验数据 包括答案 的 json 对象从我的代码发送到 javascript 我用了 var quizJson 但问题是 我的用户足够聪明 可以使用查看源代码并揭示答案 有什么建议吗 提前致谢 唯一正确的解决方案是不以任
  • 从现有 .Net 项目自动创建 UML 图的免费工具

    是否有任何免费工具可以从现有的 Net Visual Studio 2005 项目自动创建 UML 图 如果您使用的是 Visual Studio Team Suite 2005 注意 不是 2008 我相信您可以选择将 Net 代码逆向工
  • MongoDB 将写入锁定到什么级别? (或者:“每个连接”是什么意思

    在 mongodb 文档中 它说 从版本 2 2 开始 MongoDB 对大多数读写操作在每个数据库的基础上实现了锁 一些全局操作 通常是涉及多个数据库的短期操作 仍然需要全局 实例 范围锁 在 2 2 之前 每个 mongod 实例只有一
  • 如何使用 XPath Selenium 和 Python 从

    标签获取文本

    我需要用 XPath 从 a 中的文本中捕获一行 p 我需要存储文本Content type text plain charset us ascii到 python 中的变量中 但我收到下一个错误 selenium common excep
  • 处理异步方法的取消

    我在用着Parse作为应用程序的数据存储 我正在实现他们的Facebook登入功能 AFAIK 此登录方法与其他异步方法没有任何不同 因此希望它适用 因此 有一个 Login xaml 页面 其中有一个 使用 Facebook 登录 按钮
  • 如何防止 Angular JS 的属性更改

    我在我的项目中使用 AngularJs 并且我的 viewModel 上有一个连接到下拉列表的属性 默认情况下会选择该下拉列表有一个空值 我想要的是防止用户在选择其他值后选择该空值 我已经开始关注 watch 但我不知道是否有某种方法可以取
  • 未初始化的常量 Cucumber::Rails::Database (NameError) cucumber + mongoid

    大家好 我是黄瓜新手 我有一个带有 mongoid 的应用程序 我的数据库中有database cleanerGemfile gem database cleaner gt 0 7 2 group gt test In my app fea
  • h5py OSError:无法打开文件(未找到文件签名)

    我对使用 h5py 时收到的错误感到有点困惑 我正在尝试应用 python 脚本来循环访问位于不同目录中的 h5py 文件集 例如 第一组 h5py 文件位于 减少 rho 0 75 2 数据 快照 当我运行 python 脚本时fromR
  • Web 服务器不支持 InnoDB MYSQL

    我创建了一个数据库InnoDB引擎 现在我正在使用www 000webhost com并且它不支持InnoDB Engine 我应该怎么办 我的数据库已完成 可以启动了 有谁知道如何解决这个问题吗 我曾经也有过一样的问题 我被迫使用的提供程
  • XPages - 仅在日期字段中保存日期

    我正在使用编辑框控件来显示日期字段 保存 XPage 时 我只想保存日期 现在日期和时间都被保存 有什么办法可以做到这一点吗 这是我的代码
  • 如何在 webpacker Rails 6 中使 JS 函数全局化

    我尝试像以前在 Rails 5 中那样组织我的前端 我有一些带有函数的 js 文件 并根据我的需要在代码的不同位置使用了这些函数 但在 Rails 6 中 使用 js 是完全不同的 不管怎样 我想我已经了解了 packs 和 webpack