代码之家  ›  专栏  ›  技术社区  ›  sambecker

用webpacker从rails控制器渲染js

  •  0
  • sambecker  · 技术社区  · 6 年前

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

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

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

    通常,上面会在我的视图中执行一个名为 javascript_partial.js.erb action.js.erb 如果未在中指定 render .

    问题似乎是这些文件与 韦伯包装公司 因此无法访问全局库,如 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'
    }));
    
    0 回复  |  直到 6 年前
        1
  •  2
  •   sambecker    6 年前

    多亏了 this wonderful article !

    使用 expose-loader 向vanilla公开密钥库 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;