使用 webpacker 从 Rails 控制器渲染 js

Rendering js from a Rails controller with webpacker

刚刚将我的 Rails 应用程序中的 js 管道替换为 webpacker

大多数事情都可以正常工作,但是呈现 js 的控制器不再按预期工作。

def action
  format.js { render "javascript_partial" }
end

通常情况下,如果 render.

中未指定,上面的代码将执行我认为名为 javascript_partial.js.erbaction.js.erb 的文件

问题似乎是这些文件与 webpacker 管道没有连接,因此无法访问像 jquery 这样的全局库或显式管理它们自己的 imports.

此代码现在会导致客户端语法错误,因为它无法访问 jquery $ 函数:

$("#element").html(<= j render partial: 'partial', locals: { object: @object } %>

在我看来,我有一个与内联 js 相关的问题。像下面这样的东西,

<%= form.collection_select ... onchange: 'Rails.fire(this.form, "submit")' %>

不再起作用,因为内联js无法访问Rails.

等全局对象

这似乎是一个简单的问题,但我无法在任何地方找到文档。

有人知道如何协调 webpacker 与历史预期的 Rails/js 行为吗?我需要带回 sprockets 吗?


如果有帮助,我的 javascript/packs/application.js 文件看起来像,

import Rails from 'rails-ujs';
import Turbolinks from 'turbolinks';

Rails.start();
Turbolinks.start();

$(document).on("turbolinks:load", () => {
  // initial setup ...
});

上面的工作非常好,并且可以访问 jquery 因为我已经在 config/webpack/environment.js,

中导出了它
environment.plugins.append('Provide', new webpack.ProvidePlugin({
  $: 'jquery',
  jQuery: 'jquery',
  jquery: 'jQuery'
}));

感谢 this wonderful article

使用 expose-loader 将关键库暴露给遍及您的应用程序的香草 JavaScript

1) 安装依赖,

yarn add expose-loader --dev

2) 配置config/webpack/environment.js,

const { environment } = require('@rails/webpacker');

environment.config.merge({
  module: {
    rules: [
      {
        test: require.resolve('jquery'),
        use: [{
          loader: 'expose-loader',
          options: '$'
        }, {
          loader: 'expose-loader',
          options: 'jQuery'
        }]
      },
      {
        test: require.resolve('rails-ujs'),
        use: [{
          loader: 'expose-loader',
          options: 'Rails'
        }]
      }
    ]
  }
});

module.exports = environment;

我有一个类似的问题,我在字符串上有未定义的 $ $("#element").html(insert_code)

我的配置与你的类似,我通过在文件末尾公开来解决pack/application.js

window.jQuery = jQuery
window.$ = $