阅读说明
软件版本
- vite v5.3.1
 - vue v3.4.29
 - rollup-plugin-external-globals v0.11.0
 - vite-plugin-external v4.3.1
 
背景
最近在将基于vite、vue的前端项目中的依赖包改成CDN外部形式。
打包完以后访问页面,遇到了如题的报错,完整报错如下:
 | 
 | 
该报错会在不同的使用场景下会出现,我的场景是打包成CDN外部依赖的时候遇到的。
问题过程
处理成外部CDN我用到的是fengxinming/vite-plugins vite-plugin-external插件包的形式,根据文档介绍,采用了常规使用的写法。
vite.config.ts关键配置如下:
 | 
 | 
打包前的index.html如下:
 | 
 | 
打包以后的index.html:
 | 
 | 
访问该页面以后,遇到了如标题的报错内容。
然后查看打包以后的index.js(index-Bc_167s1.js),只放关键内容:
 | 
 | 
可以看到这里有引入vue和vue-router,当注释imoprt {xxx} from vue以后,可以看到报错内容变成了:
 | 
 | 
说明就是这里import的问题,直接注释只是屏蔽了该报错,并不能解决问题,因为在index.js下面有使用到import进来的相关模块。
那怎么解决呢?
一番捣鼓以后,解决方式有两种。
解决方法一
关键属性是interop:'auto',先放上解决方法:
修改你的vite.config.ts文件:
 | 
 | 
重新打包即可。
fengxinming/vite-plugins vite-plugin-external的文档其实是有介绍的,称之为使用兼容的方式读取外部依赖,并说明了参数加与不加的区别,但对于我个人来说并不是很醒目和清晰,并且文档对于interop的作用也没有过多的介绍,虽然在折腾的情况下解决了问题,但只知道它能解决问题,并不知其作用。
知其然而不知其所以然对我这种强迫症来说是不能忍受的。
但毕竟前端水平有限,仅浅浅捣鼓一下,底层原理先不深究,日后再说,这里当抛砖引玉,留给读者琢磨了。
首先查看vite-plugin-external配置项的interop参数定义:
 | 
 | 
可以看出是一个可选参数,但默认值并不是auto,只是声明了其参数可能的值。
通过修改./node_modules/.pnpm/vite-plugin-external@4.3.1/node_modules/vite-plugin-external/dist/index.mjs文件关键位置如下:
 | 
 | 
的方式进行确认,interop的默认值是undefined。
 | 
 | 
当设置interop的值为auto,重新打包,观察一下index.js文件前后的变化,关键内容如下:
 | 
 | 
可以清晰观察到,未设置interop的情况下,vue依赖需要通过import {xxx} vue的方式进行引入,而当设置interop:'auto'的情况下,vue依赖变成了var e=Vue全局的方式进行引入,问题得到解决。
解决方法二
需要用到rollup-plugin-external-globals包,修改rollup配置的方式。
vite.config.ts关键内容如下:
 | 
 | 
重新打包即可。
该方式暂时不深入,以记录为主。
参考
- vite3 + vue3 + pinia 配置 CDN 后打包部署后出现 Failed to resolve module specifier “vue“ 报错处理-CSDN博客
 - vue动态路由异步加载import组件,加载不到module的问题_sync recursive-CSDN博客
 - vue.js - Error resolving module specifier “vue”. Relative module specifiers must start with “./”, “../” or “/” - Stack Overflow
 - vite2如何使用cdn加载vue等包
 - 前端新工具–vite从入门到实战(一)
 - HTML文档引入JS模块出现路径问题