无法获取在 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] 占位符将为每个入口点创建一个单独的命名空间,如果您最终使用多个入口点,这将有助于防止冲突。