使用Webpacker从Rails控制器渲染js

sam*_*ker 10 javascript ruby-on-rails erb ecmascript-6 webpack

刚用替换了Rails应用程序中的js管道webpacker

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

def action
  format.js { render "javascript_partial" }
end
Run Code Online (Sandbox Code Playgroud)

通常,上面的代码会在我的视图中执行一个文件,javascript_partial.js.erb或者action.js.erb在中未指定的话render

问题似乎是这些文件没有与webpacker管道的连接,因此无法访问类似的全局库jquery或无法对其进行显式管理imports

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

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

我认为行内js有一个相关问题。类似以下内容

<%= form.collection_select ... onchange: 'Rails.fire(this.form, "submit")' %>
Run Code Online (Sandbox Code Playgroud)

不再起作用,因为内联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 ...
});
Run Code Online (Sandbox Code Playgroud)

上面的方法工作得很好,并且可以访问,jquery因为我已将其导出到中config/webpack/environment.js

environment.plugins.append('Provide', new webpack.ProvidePlugin({
  $: 'jquery',
  jQuery: 'jquery',
  jquery: 'jQuery'
}));
Run Code Online (Sandbox Code Playgroud)

sam*_*ker 10

通过这篇精彩的文章弄清楚了!

使用expose-loader暴露关键库香草JavaScript整个应用洒。

1)安装依赖项

yarn add expose-loader --dev
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢您回来并回答这个问题。仅需注意,我必须对我的命名空间使用require.resolve('@ rails / ujs'),但非常明显的错误。这个答案是唯一真正解决问题的方法。我只需要我的远程js模板即可访问$。而已。我现在试图通过淘汰链轮来取得成功,但令人尴尬的是,仅仅针对一堆愚蠢的dom选择器(我知道,我学到了这一课),弄清楚如何公开jquery是多么困难。我距离git reset大约有5分钟的路程-加强此分支,所以我身上有啤酒! (2认同)