无法获取在 webpacker 编译的 JS 文件中设置的视图变量 rails
Can't get variables on view that were set in JS files compiled by webpacker rails
Rails 5.2.3
Webpacker 4.0.2
我有 layouts/application.html.erb
我打电话给 dateFormat.initialize();
此函数在javascript/packs/application.js
中定义
const dateFormat = {
railsDateMask: "YYYY/MM/DD",
initialize() {
}
}
当我转到索引页面时,浏览器控制台出现异常
ReferenceError: dateFormat is not defined
之前 - 此代码在 assets/javascripts/application.js
中并且一切正常
我找到了很多解释,其中一个解决方案不是 const dateFormat
而是 global.dateFormat
,但我认为这不是最好的解决方案,也许有另一种方式。
默认情况下,Webpack 不会将任何内容导出到全局范围。您可以像建议的那样执行 window.dateFormat = ...
之类的操作,但我更喜欢将 Webpack 配置为导出选定的模块。工作量增加了一点,但更加灵活,也更不容易出错。
首先,您需要从入口点导出所需的全局引用。因此,将您的对象声明为 app/javascript/packs/application.js
:
的导出
export const dateFormat = { ... };
现在告诉 Webpack 你想从 config/webpack/environment.js
.
中的 Webpack 配置导出你的输出到 window 目标
environment.config.merge({
output: {
library: ['Packs', '[name]'],
libraryTarget: 'window',
}
})
上面的配置说 "make my application exports available on window
from Packs.application
"。例如,要从控制台或视图中访问导出的 dateFormat
对象,请使用 window.Packs.application.dateFormat
.
注意:命名空间Packs.[name]
是任意的;使用适合您的应用程序的任何东西。 [name]
占位符将为每个入口点创建一个单独的命名空间,如果您最终使用多个入口点,这将有助于防止冲突。
Rails 5.2.3
Webpacker 4.0.2
我有 layouts/application.html.erb
我打电话给 dateFormat.initialize();
此函数在javascript/packs/application.js
const dateFormat = {
railsDateMask: "YYYY/MM/DD",
initialize() {
}
}
当我转到索引页面时,浏览器控制台出现异常
ReferenceError: dateFormat is not defined
之前 - 此代码在 assets/javascripts/application.js
中并且一切正常
我找到了很多解释,其中一个解决方案不是 const dateFormat
而是 global.dateFormat
,但我认为这不是最好的解决方案,也许有另一种方式。
默认情况下,Webpack 不会将任何内容导出到全局范围。您可以像建议的那样执行 window.dateFormat = ...
之类的操作,但我更喜欢将 Webpack 配置为导出选定的模块。工作量增加了一点,但更加灵活,也更不容易出错。
首先,您需要从入口点导出所需的全局引用。因此,将您的对象声明为 app/javascript/packs/application.js
:
export const dateFormat = { ... };
现在告诉 Webpack 你想从 config/webpack/environment.js
.
environment.config.merge({
output: {
library: ['Packs', '[name]'],
libraryTarget: 'window',
}
})
上面的配置说 "make my application exports available on window
from Packs.application
"。例如,要从控制台或视图中访问导出的 dateFormat
对象,请使用 window.Packs.application.dateFormat
.
注意:命名空间Packs.[name]
是任意的;使用适合您的应用程序的任何东西。 [name]
占位符将为每个入口点创建一个单独的命名空间,如果您最终使用多个入口点,这将有助于防止冲突。