阅读说明
软件版本
- 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模块出现路径问题