vue.js - 如何修复生产中找不到的 vue 动态异步组件?

标签 vue.js webpack vue-component es6-promise nuxt.js

我使用组件的路径和文件名动态导入 nuxt.js 中的组件。它在开发中运行良好,当您第一次加载网站时,但在生产中,当您导航到新页面时,组件不会加载 - 错误 404。

编辑:组件是可见的,但不是 react 性的。因此,它们在服务器端渲染,但在客户端不起作用。

我怀疑这是 webpack 的问题,我尝试使用魔术注释来保留文件名,但这并没有改变任何东西。

我有一个带有自定义 CMS 的网站,因此我可以直接在我的帖子中使用任何组件。例如,如果我认为注册组件位于页面中间会更好,那么我可以将其放置在那里。

我正在使用最新版本的node.js、express 和 nuxt.js。

下面的代码在初始加载时效果很好,但在路线更改时效果不佳。

<template>
  <component :is="comp" />
</template>

<script>

export default {
  name: 'DynamicComponent',
  props: {
    componentName: {
      type: String,
      default: ''
    }
  },
  computed: {
    comp() {
      return () => import(`@/components/dynamic/${this.componentName}`)
    }
  }
}

</script>

我对 webpack 的理解是它会代码分割 @/components/dynamic 文件夹中的所有文件。它确实做到了这一点,并为它们提供了所有散列文件名。

任何帮助将不胜感激。

最佳答案

我认为您的问题在于您在计算方法中使用响应式(Reactive)数据的方式。

如果您在计算方法中使用响应式(Reactive)数据,Vue 会跟踪该关系。这样当 react 数据发生变化时,计算值就会重新计算。

在您的情况下, react 数据不是直接在计算方法中使用,而是在其中的匿名函数中使用。所以 Vue 无法创建这种关系。

尝试将其重写为

computed: {
    comp() {
      const componentName = this.componentName;
      return () => import(`@/components/dynamic/${componentName}`);
    }
  }

关于vue.js - 如何修复生产中找不到的 vue 动态异步组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58571271/

相关文章:

javascript - vue js 组件中的 this.$route 只返回 undefined

vuejs2 - v-btn内部路由与使用router-link之间的区别

javascript - 如何动态使用 v-model 和 v-select

javascript - 如何用 require.ensure (对于 webpack)替换 import 语法?

angular - 在 Angular 9 构建过程中删除未使用的 CSS

javascript - importvelocity.ui总是返回 'Velocity must be loaded first. Aborting.'

javascript - 第一次单击时,复选框不会向 Vue 对象传递任何内容

vue.js - vue2-google-maps 自定义样式

vue.js - 定义和使用 Vue.config.keyCodes 时不能使用驼峰式属性名称

vue.js - Vuelidate 复选框验证