主要问题
基于vue3+pinia的项目打包部署上线后无法正常运行。报错为:Uncaught TypeError: Failed to resolve module specifier "vue". Relative references must start with either "/", "./", or "../"。
问题原因
排查后发现是因为vue是通过cdn引入了,pinia则是通过本地打包。所以运行过程中pinia想挂载在vue实例中,但是vue实例可能还没准备好,于是也就造成了目前的错误
问题解决
既然是缺少vue包,要么将vue在本地打包,要么在把pinia也cdn引入得了。我选择了第二种。
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'
import { Plugin as importToCDN } from 'vite-plugin-cdn-import''
export default defineConfig({
plugins: [
vue(),
importToCDN({
modules: [
{
name: 'vue',
var: 'Vue',
path: 'https://cdn.bootcdn.net/ajax/libs/vue/3.3.4/vue.global.prod.js'
},
{
name: 'vue-router',
var: 'VueRouter',
path: 'https://cdn.bootcdn.net/ajax/libs/vue-router/4.2.4/vue-router.global.prod.js'
},
{
name: 'naive-ui',
var: 'naive',
path: 'https://cdn.bootcdn.net/ajax/libs/naive-ui/2.34.4/index.prod.min.js'
},
//将pinia也通过cdn引入
{
name: 'pinia',
var: 'Pinia',
path: 'https://cdn.jsdelivr.net/npm/pinia@2.1.7/dist/pinia.iife.min.js'
}
]
}),
],
resolve: {
alias: {
'@': path.resolve(__dirname, './src')
}
},
})
又一个问题
但是但是本以为这样就ok了,结果部署上线又报错,提示:VueDemi is not defined
问题原因
查看了其他博主内容和github,大概是因为pinia考虑兼容vue3和vue2写法,所以需要vue-demi这个库来实现兼容。但是我的库里面没有包含该内容,所以也就导致了该内容。
问题解决
既然没有vue-demi,我就引入不就好了。不过我又考虑了是应该从cdn引入还是把它打包来弄呢?但是想了想了,加入pinia是本地安装打包,那就根本不需要vue-demi啊。如果从cdn引入,肯定考虑压缩包体积啊,vue-demi也cdn一把梭啊。故考虑引入cdn,然后解决问题。
作为新手,这样问题和解决方案确实没见过且看不懂,但是大为震撼!
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'
import { Plugin as importToCDN } from 'vite-plugin-cdn-import'
import { visualizer } from 'rollup-plugin-visualizer'
export default defineConfig({
plugins: [
vue(),
importToCDN({
modules: [
{
name: 'vue',
var: 'Vue',
path: 'https://cdn.bootcdn.net/ajax/libs/vue/3.3.4/vue.global.prod.js'
},
//cdn引入vue-demi
{
name: 'vue-demi',
var: 'VueDemi',
path: 'https://cdn.jsdelivr.net/npm/vue-demi@0.14.6/lib/index.iife.min.js'
},
{
name: 'vue-router',
var: 'VueRouter',
path: 'https://cdn.bootcdn.net/ajax/libs/vue-router/4.2.4/vue-router.global.prod.js'
},
{
name: 'naive-ui',
var: 'naive',
path: 'https://cdn.bootcdn.net/ajax/libs/naive-ui/2.34.4/index.prod.min.js'
},
{
name: 'pinia',
var: 'Pinia',
path: 'https://cdn.jsdelivr.net/npm/pinia@2.1.7/dist/pinia.iife.min.js'
}
]
}),
],
resolve: {
alias: {
'@': path.resolve(__dirname, './src')
}
},
})