为什么我的 Vue JS Nuxt 延迟加载组件捆绑在 app.js 中,而不是单独加载?

Why is my Vue JS Nuxt lazy loaded component bundled in app.js, not loaded separately?

我刚开始使用 Nuxt,但已经使用 VueJS 一段时间了。为了进行测试,我尝试延迟加载使用 create-nuxt-app 命令创建的教程组件。 (我也尝试过我自己的组件,但又回到了一个新的应用程序来尝试让延迟加载工作)。不幸的是,该组件不是延迟加载的。

我的新应用程序中的索引页面非常简单。它有一个按钮来显示名为“LazyTutorial”的教程组件,以指示延迟加载。该组件使用 v-if 隐藏它,直到单击该按钮。

<template>
  <div>
    <h1>Welcome!</h1>
    <button @click="start">
      Show tutorial
    </button>
    <LazyTutorial v-if="showTutorial"></LazyTutorial>
  </div>
</template>

<script lang="ts">
import Vue from 'vue'

export default Vue.extend({
  name: 'IndexPage',
  data () {
    return {
      showTutorial: false
    }
  },
  methods: {
    start () {
      this.showTutorial = true
    }
  }
})
</script>

Tutorial组件与原来的没有变化。

据我所见(例如:Debbie O'Brien's Nuxt Auto Components and Lazy Loading),这只是使用动态加载组件(nuxt.config.js 中的components:true)和“Lazy”前缀的问题在组件上。

该应用程序构建良好并按预期工作从用户的角度 - 但组件代码被捆绑到 app.js 文件中,它不是延迟加载的。当我点击按钮时它没有出现在网络选项卡中,因为它已经在应用程序文件中。

我 运行 在本地使用 npm run dev

我是不是漏掉了一些配置设置?这里有什么问题?

这是我的版本号依赖列表:

"dependencies": {
    "@nuxtjs/axios": "^5.13.6",
    "@nuxtjs/pwa": "^3.3.5",
    "bootstrap": "^4.6.1",
    "bootstrap-vue": "^2.21.2",
    "core-js": "^3.19.3",
    "nuxt": "^2.15.8",
    "vue": "^2.6.14",
    "vue-server-renderer": "^2.6.14",
    "vue-template-compiler": "^2.6.14",
    "webpack": "^4.46.0"
  },

运行 Windows 10(如果相关)

Nuxt2 使用 Webpack4 并且(可能出于性能原因)它在开发过程中没有显示 .vue 组件的延迟加载。

也就是说,当您捆绑项目时(npm run build && npm run start 在您的情况下),它工作得非常好(可以在开发工具的网络选项卡中看到)。


作为旁注,Nuxt3 变体将是

<template>
  <button @click="shownComponent = !shownComponent">toggle me please</button>
  <lazy-test v-if="shownComponent" />
</template>

<script setup>
const shownComponent = ref(false)
</script>

并在开发期间正确导入它

这可能是因为 Vite 在这方面做得更好,或者可能有更明确的 HMR 设置。反正RC版本是really close so I would recommend maybe checking 。特别是如果你是 TS 的重度用户。

否则,您将需要查找并了解如何配置 Webpack 的 HMR 设置(免责声明:我不确定是否可行)。