关于cdn 引入 vue 问题,项目使用了 unplugin-auto-import 自动引入插件,
打包后报错:
cdn 打包场景:
//利用vite-plugin-cdn-import
viteCDNPlugin({
modules: [
{
name: "vue",
var: "Vue",
path: "https://cdnjs.cloudflare.com/ajax/libs/vue/3.2.45/vue.global.prod.min.js",
},
]
})
//部分rollup配置
rollupOptions: {
external: ["element-plus", 'echarts', 'vue','vue-demi'],
plugins: [
commonjs(),
externalGlobals({
vue: "Vue",
"element-plus": "ElementPlus",
'echarts': 'echarts',
// 'xlsx': 'xlsx'
// 👇 配置 vue-demi 全局变量 👇
"vue-demi": "VueDemi",
// 'vue-router': 'VueRouter',
// 'pinia': 'pinia',
// 'axios':'axios'
}),
],
output: { //静态资源分类打包
format: 'es',
globals: {
vue: 'Vue',
// 'vue-router': 'VueRouter',
},
}
版本环境
"vite": "^4.0.0",
"unplugin-auto-import": "^0.12.1"
"vue": "^3.2.45",
寄语:我用尽了这三年来的搜索功力,实在没有解决,但是cdn优化势在必行。有vue+vite构建经验的朋友,望拔刀相助,不胜感激。
参考GPT和自己的思路,根据错误提示 "Failed to resolve module specifier "vue". Relative references must start with either "/", "./", or "../"",你的代码尝试使用了相对引用来导入 Vue 模块,但是该模块不在当前的相对路径中。这可能是由于 unplugin-auto-import 插件自动引入 Vue 模块而不是使用 CDN 的原因,因此可以尝试禁用该插件或者调整其配置。
如果你已经在使用 CDN,可以直接从 CDN 引入 Vue,而不需要使用 unplugin-auto-import。具体来说,你可以通过以下方式从 CDN 引入 Vue:
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/3.2.45/vue.global.prod.min.js"></script>
这里假设你使用的是全局引入版本的 Vue,如果你使用的是单文件组件版本的 Vue,则需要在代码中进行相应的修改。
如果你想继续使用 unplugin-auto-import 插件,你需要调整其配置,以确保它不会自动引入 Vue 模块,而是使用从 CDN 引入的全局 Vue。你可以在 unplugin-auto-import 插件的配置中添加如下内容:
autoImport: {
// ...
imports: {
// ...
vue: {
// 禁用自动引入
disabled: true,
// 手动引入全局 Vue
// 这里假设你使用的是全局引入版本的 Vue
default: 'Vue',
path: 'https://cdnjs.cloudflare.com/ajax/libs/vue/3.2.45/vue.global.prod.min.js',
},
},
},
这样配置后,unplugin-auto-import 将不再自动引入 Vue 模块,而是使用全局变量 Vue。如果你使用的是单文件组件版本的 Vue,则需要将 default 属性修改为相应的值。
该回答引用ChatGPT
根据报错信息,似乎是在自动引入插件的过程中,未能正确识别 Vue 模块的导入路径,导致在打包后无法正确解析 Vue 模块。
这可能与 unplugin-auto-import 插件本身的配置有关。建议检查 unplugin-auto-import 插件的配置,确保它正确地配置了 Vue 模块的导入路径。
同时,由于你使用了 viteCDNPlugin,需要在 rollup 的配置中正确设置 external 和 globals,以确保 Vue 模块的引入正确地指向 CDN 资源。
可以尝试在 rollup 的配置中,将 external 设置为 ["vue"],将 globals 设置为 { vue: "Vue" }。这样可以告诉 rollup 在打包时不要将 Vue 打包进去,而是直接使用 CDN 引入的 Vue。
例如:
export default {
// ...
build: {
rollupOptions: {
external: ["vue"],
output: {
globals: {
vue: "Vue"
}
}
}
}
}
该回答引用GPTᴼᴾᴱᴺᴬᴵ
根据报错信息,提示无法解析模块规范符号 "vue",可能是因为使用了 CDN 引入 Vue,而自动引入插件使用了 ES 模块的 import 语法。
-
可以尝试在自动引入插件中配置 Vue 的全局变量名,使其能够在 ES 模块中被正确引用。根据你提供的部分 rollup 配置,似乎已经配置了 Vue 的全局变量名为 "Vue",应该不是这个问题。
-
另外,根据你提供的代码,看起来使用了 Vite 作为构建工具,但同时也提供了部分 Rollup 配置。如果你的项目中同时使用了 Vite 和 Rollup 进行构建,需要确保它们的配置是一致的,否则可能会出现不兼容的问题。
这么难吗这条路,来个大佬呀
根据报错信息来看,可能是因为在使用cdn引入vue的时候,由于vue的路径不是以"/", "./", 或 "../"开头,所以无法识别vue的路径。解决这个问题有以下几种方法:
将unplugin-auto-import插件中的vue引入相关配置修改为cdn路径。具体来说,可以在配置文件中添加如下代码:
javascript
Copy code
// vite.config.js
export default {
plugins: [
vue({
template: {
compilerOptions: {
isCustomElement: (tag) => tag.startsWith('my-')
}
}
}),
AutoImport({
imports: ['vue'],
dts: 'src/auto-imports.d.ts',
resolvers: [
{
match: /\/vue$/,
id: () => 'vue/dist/vue.esm-bundler.js',
},
],
}),
// ...
],
};
在项目中直接引入vue的cdn地址,而不是使用unplugin-auto-import插件自动引入。可以在index.html文件中添加如下代码:
html
Copy code
<!-- index.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>My App</title>
<script src="https://cdn.jsdelivr.net/npm/vue@3.0.5/dist/vue.esm-browser.js"></script>
<!-- ... -->
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>
以上两种方法都可以解决cdn引入vue时报错的问题。如果您仍然无法解决问题,可以提供更多错误信息和代码细节,以便更好地进行排查。