问题原因

问题源头在于 vite.config.mts 里的 build.rollupOptions.output.manualChunks 配置。

build: {
      minify: false,
      rollupOptions: {
        output: {
          manualChunks: {
          'element-plus': ['element-plus'],
          'vue-vendor': ['vue', 'vue-router', 'pinia'],
          'utils': ['@vueuse/core', 'radash']
          }
        }
      }
    },

我这边强行把 “element-plus” 和 “vue-vendor” 拆成两个独立分包,结果 Rollup 把 Vue 运行时的一些共享模块(例如 @vue/shared 中的工具方法)塞进了 “element-plus” 包;而 “vue-vendor” 包里又去引用这些方法,于是出现:
vue-vendor → import … from “./element-plus-BumPoAHN.js”
element-plus 包自身在顶层又需要 import { ref } from “./vue-vendor-CW5nSPGq.js”
这就形成了一个循环依赖。浏览器加载时,先执行 element-plus-BumPoAHN.js,它顶层调用了 ref();但此时 vue-vendor 还没执行到 class RefImpl 的定义,ref() 内部访问 RefImpl 就落在了 TDZ(Temporal Dead Zone)里,于是抛出 Uncaught ReferenceError: Cannot access ‘RefImpl’ before initialization,页面无法继续渲染。

解决思路:

最简单:删掉或放弃这段 manualChunks 自定义拆包,让 Vite/ Rollup 按默认策略分包。
如果确实需要手动拆包,要确保不会把 Vue 自身的共享依赖拆到 element-plus 包里,可考虑只拆 element-plus,其余交给 Rollup 自动处理,或在 manualChunks 中把 @vue/shared、@vue/runtime-* 等一起归到 “vue-vendor”,避免循环引用。

一旦去掉这个错误的手动拆包或重新规划拆包,重新打包后,报错就会消失。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐