Vue.js应用程序可在开发中工作,但无法在Rails 5.2.0 / Webpacker的生产环境中安装模板-黑屏,控制台无错误

san*_*e89 5 ruby-on-rails webpack vue.js webpacker

我正在使用Rails 5.2.0和Webpacker gem来部署Vue应用程序。

show.html.erb文件非常简单:

<div data-behavior="vue-app"><MyComponent></MyComponent></div>

然后在我的入门包中,包是packs / my_vue_app.js:

import TurbolinksAdapter from 'vue-turbolinks';
import Vue from 'vue/dist/vue.esm'
Vue.use(TurbolinksAdapter);
import MyComponent from '../components/my_app/index.vue'

document.addEventListener('turbolinks:load', () => {

  var element = $('[data-behavior="vue-app"]');

  if(!element) { return };

  console.log('Initializing Vue');

  const app = new Vue({
    el: element[0],
    data: {

    },
    components: { MyComponent }
  })
})
Run Code Online (Sandbox Code Playgroud)

在开发中,一切正常。该应用程序已安装且正常运行。

但是在生产中,在页面加载和JS运行之后,<div data-behavior="vue-app">将从分页中删除,仅保留<!-- -->在原处。

在控制台中,绝对没有错误。我可以使用DevTools确认pack js文件已加载并已解析,因为console.log已打印在控制台中。

哎呀,Vue运行正常的证明是,在<div>解析JS之后,已从DOM中删除了整个安装位置。

最奇怪的是,我可以通过在console.log行上附加调试器并在调试器暂停执行时将其关闭来使应用程序挂载ONCE。即使当时我看到应用程序正在安装也很艰难,但后来却无法安装它,甚至再也不用调试器了……这真的非常奇怪。

这些是package.json的版本:

"vue": "^2.5.16", "vue-loader": "14.2.2", "vue-template-compiler": "^2.5.16",

Rails应用程序是全新的,除了默认设置外没有其他配置。

Webpacker gem是3.5.3,Rails是5.2.0。

在此上花了很长时间之后,我才发现以下github问题:https : //github.com/rails/webpacker/issues/1520

编辑:我提供了一个实际发生此错误的实际生产应用程序的链接:https : //planilha.tramitacaointeligente.com.br/planilhas/ED2sUXz32-R9CJKdkmtf8Q

您会看到它没有安装。这是开发中的同一页面:

已安装应用的屏幕截图

san*_*e89 6

我最终设法通过更改Vue应用程序加载的定义方式解决了该问题。

尝试import Vue from 'vue'(而不是from 'vue/dist/vue.esm'),然后:

const app = new Vue({
    el: domElement,
    render: h => h(RootComponent)
  })
Run Code Online (Sandbox Code Playgroud)

Webpacker gem的hello_vue.js支架中显示的注释告诉您,您可以选择使用DOM作为模板,也可以使用呈现功能加载组件。它们都可以在开发中使用,但是只有后者(使用vue而不是vue / dist / vue.esm使用vue加载具有渲染功能的组件并渲染:h => h(RootComponent)在生产中对我有用。

到目前为止,这是我一生中最长,最令人沮丧的调试会话,因为控制台中绝对没有错误,您只能盯着空白屏幕,并且Vue正在运行,因为它从中删除了安装到的DOM元素DOM。

解决方案的来源:https : //stackoverflow.com/a/48651338/1290457,这是Webpacker gem https://github.com/rails/webpacker/issues/1520上的github问题(当前已打开)

我仍然不知道如何在生产环境中使用DOM作为Vue的模板。


小智 5

我在 Rails 5.2 + webpack Vue 中遇到了类似的问题。一切都在开发中很好,但在生产中却不起作用。经过几个小时的调查,我找到了原因。这是来自webpaker gem docs 的推荐 。

添加这个

Rails.application.config.content_security_policy do |policy|
  if Rails.env.development?
    policy.script_src :self, :https, :unsafe_eval
  else
    policy.script_src :self, :https
  end
end
Run Code Online (Sandbox Code Playgroud)

破坏生产。删除else部分 - 解决问题。

Chrome 默默地忽略了这一点。Firefox 显示警告。