javascript - Rails 6 在 Rails View 中使用 Webpacker javascript 函数

标签 javascript ruby-on-rails webpacker

我想重用我在几个不同 View 中编写的 JavaScript 函数。我怎样才能在 Rails 6 中做到这一点?到目前为止,我能够使用的唯一解决方案是在 javascript 文件中将函数定义为 window.functionName = function() {}

然而,许多其他关于此的帖子都表示这是一个糟糕的解决方案,应该避免。定义可以在 Rails View 中使用的函数的正确方法是什么?

最佳答案

如果您使用 Webpacker,我建议将您的 JavaScript 应用程序导出为库

首先,导出您想要从 View 中访问的任何引用。这些引用必须从 Webpacker 代码的入口点导出,通常是 application.js 文件,即 app/javascript/packs/application.js (Webpacker 5) 或 app/packs/entrypoints/application.js(Webpacker 6)。

// app/javascript/packs/application.js

import { functionName } from '../src/functionName'

export functionName // <== we want this function to be available in the view

在您的 Webpacker 配置中,您可以添加此代码片段以表明您希望将 JavaScript 代码视为库。

Webpacker 5

// config/webpack/environment.js
const { environment } = require('@rails/webpacker')

environment.config.merge({
  output: {
    // Choose whatever you want for `library`, [name] is a placeholder
    library: ['Packs', '[name]'],

    // Attach the library to the global scope in the browser
    libraryTarget: 'window'
  },
})

module.exports

Webpacker 6

// config/webpack/base.js

const { webpackConfig, merge } = require('@rails/webpacker')

module.exports = merge(webpackConfig, {
  output: {
    // Makes exports from entry packs available to global scope, e.g.
    library: ['Packs', '[name]'],
    libraryTarget: 'window'
  },
})

通过上述配置,webpack 会将一个名为 Packs 的模块导出到全局范围。 Packs 变量将具有与 [name] 的每个条目相对应的属性。对于名为 application.js 的入口点,您可以在 View 中将函数作为 Packs.application 的属性进行访问。

示例:

<%= javascript_pack_tag 'application' %>
<script>
Packs.application.functionName()
</script>

关于javascript - Rails 6 在 Rails View 中使用 Webpacker javascript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66609678/

相关文章:

ruby-on-rails - Ruby on Rails,rake 数据库 :seed or db:reset - how do you dictate which mode (development/test/production)?

ruby-on-rails - 运行 Rails 应用程序时出现 webpacker 错误。 'TypeError: environment.plugins.set is not a function'

ruby-on-rails - Webpacker::Manifest::MissingEntryError 与普通 Rails 6 应用程序

javascript - "Converting circular structure to JSON"BigQuery 从云函数 NodeJs 插入

javascript - 如何在 Chrome 的文本区域中选择 "replace"文本范围?

javascript - AngularFire 获取 child 的数据

javascript - Extjs 表单验证

ruby-on-rails - RSpec 中是否有与 Cucumber 的 "Scenarios"等效的内容,还是我以错误的方式使用 RSpec?

ruby-on-rails - Rails Bundler gems 安装

Rails 5 中的 Webpacker 需要很长时间才能编译那么多文件。我怎样才能看到它在做什么?