You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

导入Vue组件报错:请求的模块未提供'default'导出

解决ASP.NET Core导入Vite构建的Vue SFC组件时的导出错误

问题背景

之前在ASP.NET Core应用中,用CDN加载Vue搭配非SFC组件(内联模板)能正常运行:

<div id="app"></div>
<script type="module">
   import { createApp } from 'vue';
   import MyComponent from '../js/Vue/my-component.js?v=@version';
   createApp(MyComponent).mount('#app');
</script>

切换到SFC格式后,在子目录用Vite搭建Vue项目,修改vite.config.js尝试构建单个组件:

import { resolve } from 'path';
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';

export default defineConfig({
  plugins: [vue()],
  build: {
    minify: false,
    outDir: '../wwwroot/js/Vue',
    emptyOutDir: true,
    rollupOptions: {
      input: {
        helloWorld: resolve(__dirname, 'src/HelloWorld/index.html')
      }, 
      output: {
        entryFileNames: `assets/js/[name].js`,
        chunkFileNames: `assets/js/[name].js`,
        assetFileNames: `assets/[ext]/[name].[ext]`,
      }
    }
  }
})

父应用页面导入代码:

<div id="helloWorld"></div>

<script type="module">
    import { createApp } from 'vue';
    import HelloWorld from '../js/Vue/assets/js/helloWorld.js?v=@version';
    
    createApp(HelloWorld).mount('#helloWorld');
</script>

同时配置了importmap:

<script type="importmap">
  {
    "imports": {
      "vue": "https://unpkg.com/vue@3/dist/vue.esm-browser.js"
    }
  }
</script>

执行导入时出现错误:

Uncaught SyntaxError: The requested module '../js/Vue/assets/js/helloWorld.js?v=xxx' does not provide an export named 'default'

问题原因

当前Vite配置是把index.html作为入口构建完整的Vue应用,产物是启动整个应用的代码,没有对外暴露组件的default导出,所以父应用无法直接import到组件。

解决步骤

1. 调整Vite为组件库构建模式

修改vite.config.js,切换到library模式,指定组件入口并外部化Vue:

import { resolve } from 'path';
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';

export default defineConfig({
  plugins: [vue()],
  build: {
    minify: false,
    outDir: '../wwwroot/js/Vue',
    emptyOutDir: true,
    // 配置组件库构建模式
    lib: {
      // 指向组件的导出文件(可以直接是.vue,或专门的js导出文件)
      entry: resolve(__dirname, 'src/HelloWorld/HelloWorld.vue'),
      name: 'HelloWorld',
      fileName: 'hello-world' // 构建后的文件名
    },
    rollupOptions: {
      // 把Vue设为外部依赖,使用父应用的CDN版本
      external: ['vue'],
      output: {
        globals: {
          vue: 'Vue'
        }
      }
    }
  }
})

2. (推荐)创建组件导出入口

在src/HelloWorld下新建index.js,专门导出组件:

import HelloWorld from './HelloWorld.vue';
export default HelloWorld;

然后把vite.config中的entry路径改成resolve(__dirname, 'src/HelloWorld/index.js'),结构更清晰。

3. 修改父应用导入路径

构建完成后,产物会生成在../wwwroot/js/Vue/hello-world.js,父页面修改导入代码:

<div id="helloWorld"></div>

<script type="module">
    import { createApp } from 'vue';
    import HelloWorld from '../js/Vue/hello-world.js?v=@version';
    
    createApp(HelloWorld).mount('#helloWorld');
</script>

4. 验证产物

打开构建后的hello-world.js,应该能看到export default HelloWorld之类的导出语句,说明组件已正确对外暴露。

额外说明

  • 用library模式构建的产物符合ES模块规范,适配当前的importmap配置。
  • 外部化Vue可以减小组件包体积,同时避免重复加载Vue实例。

内容的提问来源于stack exchange,提问作者Conor McCarthy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 10:18:12