Vuejs 中的动态导入

Posted

技术标签:

【中文标题】Vuejs 中的动态导入【英文标题】:dynamic imports in Vuejs 【发布时间】:2020-10-27 09:34:51 【问题描述】:

我正在为我的应用程序使用服务器端渲染的 vue(不是使用 vue-cli 引导的)。我的应用程序目前使用 Vue.component() 在我的服务器的 base.html 中加载的 index.js 文件中全局注册所有 vue 组件。

我需要执行代码拆分,以便根据 url 路径仅加载所需的组件,为此我使用动态导入语法来加载组件。

Vue.component('component-a', () => import(/* webpackChunkName: "component-a" */ './component-a.vue'))

我收到以下错误(当前正在加载 http://localhost:8000/dashboard/ 上的组件) 它尝试像这样在/dashboard/<chunk.js> 中搜索块:

GET http://localhost:8000/dashboard/component-a.tmp2hr7_bhp.js net::ERR_ABORTED 404 (Not Found)

还有这个

[Vue warn]: Failed to resolve async component: () => __webpack_require__.e(/*! import() | component-a */ "component-a").then(__webpack_require__.bind(null, /*! ./component-a.vue */ "./dashboard/static/dashboard/scripts/component-a"))
Reason: ChunkLoadError: Loading chunk component-a failed.
(error: http://localhost:8000/dashboard/component-a.tmp2hr7_bhp.js)

我使用没有任何自定义 webpack 配置的基本 vue-cli 引导应用程序对此进行了测试,它工作得很好。不知道为什么这会导致问题在这里也尝试了 babel plugin-syntax-dynamic-import 但没有工作。

不确定,是否存在路径问题(因为它将文件卡盘名称附加到 url 路径),因为 webpack 无法找到块 js 文件...感谢您的帮助!

【问题讨论】:

【参考方案1】:

我认为是路径问题。

尝试在你的 webpack 配置中设置别名(这是 vue-cli 默认使用的):

 alias: 
      '@': path.resolve(__dirname, 'yourRootFolder')
    

现在像这样在组件路径中使用@。 Vue.component('component-a', () => import(/* webpackChunkName: "component-a" */ '@/component-a.vue'))

【讨论】:

【参考方案2】:

假设组件在同一目录中,这是正确的:

Vue.component('component-a', () => import(/* webpackChunkName: "component-a" */ './component-a.vue'))

【讨论】:

【参考方案3】:

你的 webpack.config.js 的 output 属性文件名中的文件名是动态创建的,其中有 [name].[chunkhash].js 你可以将其更改为[name].js 如下所述。

output: 
  filename: '[name].js',
  ...
,

我认为这将解决问题。

【讨论】:

以上是关于Vuejs 中的动态导入的主要内容,如果未能解决你的问题,请参考以下文章

Vuejs .vue 文件:动态少导入

将道具动态传递给VueJS中的动态组件

VueJS / Tailwind 中的动态类 + 变量

以编程方式为 VueJS 中的动态组件绑定自定义事件

VueJs 中的动态类和颜色绑定?

Vuejs大应用懒加载动态组件