如何在 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 函数全局化 的相关文章

  • 如何从 JavaScript 中的字符串中删除空白字符?

    如何从 JavaScript 中的字符串中删除空白字符 修剪很容易 但我不知道如何将它们从inside字符串 例如 222 334 gt 222334 您可以使用正则表达式 如下所示来替换所有空格 var oldString 222 334
  • 如何在bootstrap中默认隐藏侧边栏?

    我在这里有一个很好的参考 作为 Bootstrap 在设计 Web 表单应用程序时的侧边栏 http startbootstrap com template overviews simple sidebar http startbootst
  • 您可以将现有的 div 复制到模式对话框吗

    我有一个带有多个面板的仪表板来显示不同的信息 我希望能够添加一个按钮来以模式显示面板 我正在使用引导程序 我所能找到的只是已经编写的模态 我想复制作为面板的 div 标签的内容 然后将其显示在模型中 但我不确定如何进行 该面板的 html
  • 使用命名的成功/错误回调在 AngularJS 中声明一个 Promise

    我正在尝试做一些与 http 服务非常相似的事情 根据我的理解 http 返回一个 Promise 对象 使用它时 语法是 http success function data success callback error function
  • Angularjs 完整日历不显示事件

    我正在用那个https github com angular ui ui calendar https github com angular ui ui calendar在 Angularjs 中使用 FullCalendar 它显示日历并
  • JavaScript:常量属性

    在javascript中 我可以将对象的属性声明为常量吗 这是一个示例对象 var XU Cc Components classes or function aXU this Cc Components classes var XU new
  • 如何循环遍历对象数组并生成键值对?

    我有一个像这样的对象数组 let someObj items id 12 value true id 34 value true id 56 value false 我想将其添加到现有对象中 其中 id 是该对象的键 如下所示 let ob
  • 避免在 ES6 的函数内定位 this 的对象作用域

    例如 我正在使用 D3 js 运行一个项目 导入特定模块并调用它们的函数 Setup TypeScript ES6 导入特定的 D3 组件 角6 我有一个对象 在本例中是一个角度指令 并在 SVG 画布上绘制一些圆圈 并希望它们在拖动事件上
  • 如何在 javascript 中基于类型字符串创建新对象?

    如何基于变量类型字符串 包含对象名称 在 javascript 中创建新对象 现在我有 随着更多工具的出现 列表会变得更长 function getTool name switch name case SelectTool return n
  • 如何知道浏览器空闲时间?

    如何跟踪浏览器空闲时间 我用的是IE8 我没有使用任何会话管理 也不想在服务器端处理它 这是纯 JavaScript 方法来跟踪空闲时间 并在达到一定限制时执行一些操作 var IDLE TIMEOUT 60 seconds var idl
  • 将 onclick 事件应用于页面加载时不存在的元素

    我将列表样式设置为看起来像选择框 并且当用户单击列表中的元素时我想触发一个函数 但是该元素是通过加载的AJAX因此 当页面加载并且我无法绑定时不存在onclick事件到它onDomReady 如果我把它作为一个普通的选择列表 我可以只标记一
  • JavaScript Promise 不执行 .then()

    我在 JavaScript 中的 Promise 方面遇到了一些问题 我想做的是获得一个地址列表 然后对于每个地址 我需要调用地理编码 API 来获取 lat lng 然后我将继续将标记与热图一起绘制 这是我的代码 let promiseK
  • 根据特定字符获取整个字符串或子字符串

    我有一个包含 MIME 类型的字符串 例如application json 现在我想将其与实际的 HTTP 标头进行比较 在本例中content type 如果标头包含 MIME 类型 那么就很简单 if mimeType contentT
  • JavaScript 提升解释

    下面的片段有什么区别 var a 0 function b a 10 return function a b console log a gt 10 and var a 0 function b a 10 return function a
  • Aurelia - 仅 HTML 自定义元素的内联定义

    我的 Aurelia 视图模型中有一个递归对象 如下所示 Class BottomlessPit Name string MorePits BottomlessPit null 因此 我想在 Aurelia 视图中使用递归模板 它只会在一个
  • Outlook 加载项,无法读取未定义的属性“BeginRequestEventArgs”

    我使用 Visual Studio 开发了 Outlook 插件 我的插件有一个按钮 用于填充会议邀请正文中的详细信息并添加所需的与会者 这在 99 的情况下都有效 但是 时不时地它会给我下面的 JavaScript 错误 Uncaught
  • 弹出窗口的动态高度取决于内容,可能吗?

    是否有可能获得一个宽度始终为 400px 的弹出窗口 但根据弹出窗口中的内容动态高度 我已经看到了这个 但不知道如何将其应用到弹出窗口 调整 iframe 的宽度高度以适应其中的内容 https stackoverflow com ques
  • AngularJS 在指令运行之前通过 AJAX 检索数据

    我正在使用 AngularUIuiMap http angular ui github com directives map实例化谷歌地图的指令 uiMap 指令非常适合处理硬编码数据 mapOptions and myMarkers 但是
  • 搜索多维数组 JavaScript

    我有一个如下所示的数组 selected products 0 r1 7up 61 Albertsons selected products 1 r3 Arrowhead 78 Arrowhead selected products 2 r
  • D3 将现有 SVG 字符串(或元素)追加(插入)到 DIV

    我到处寻找这个问题的答案 并找到了一些我认为可能有用的资源 但最终没有让我找到答案 这里有一些 外部SVG http bl ocks org mbostock 1014829 嵌入SVG https stackoverflow com qu

随机推荐

  • 如何在表单 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