使用 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.erb
或 action.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'
}));
使用 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.$ = $
刚刚将我的 Rails 应用程序中的 js 管道替换为 webpacker
。
大多数事情都可以正常工作,但是呈现 js 的控制器不再按预期工作。
def action
format.js { render "javascript_partial" }
end
通常情况下,如果 render
.
javascript_partial.js.erb
或 action.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'
}));
使用 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.$ = $