背景

nuxt 3.0直接引入vue-echarts会报错,按以下配置修改即可。

配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// nuxt.config.js
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
devtools: { enabled: true },
modules: [
'@element-plus/nuxt'
],
elementPlus: {},
buildModules: ["@nuxtjs/composition-api/module"],
build: {
transpile: [/echarts/, /zrender/, /tslib/, /resize-detector/]
},
})

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// pages/index.vue
<template>
<div>
<client-only>
<v-chart class="chart" :option="option" />
</client-only>
</div>
</template>

<script>
import { use } from 'echarts/core';
import { CanvasRenderer } from 'echarts/renderers';
import { PieChart } from 'echarts/charts';
import {
TitleComponent,
TooltipComponent,
LegendComponent,
} from 'echarts/components';
import VChart, { THEME_KEY } from 'vue-echarts';
import { ref, defineComponent } from 'vue';

use([
CanvasRenderer,
PieChart,
TitleComponent,
TooltipComponent,
LegendComponent,
]);

export default defineComponent({
name: 'HelloWorld',
components: {
VChart,
},
provide: {
[THEME_KEY]: 'dark',
},
setup() {
const option = ref({
title: {
text: 'Traffic Sources',
left: 'center',
},
tooltip: {
trigger: 'item',
formatter: '{a} <br/>{b} : {c} ({d}%)',
},
legend: {
orient: 'vertical',
left: 'left',
data: ['Direct', 'Email', 'Ad Networks', 'Video Ads', 'Search Engines'],
},
series: [
{
name: 'Traffic Sources',
type: 'pie',
radius: '55%',
center: ['50%', '60%'],
data: [
{ value: 335, name: 'Direct' },
{ value: 310, name: 'Email' },
{ value: 234, name: 'Ad Networks' },
{ value: 135, name: 'Video Ads' },
{ value: 1548, name: 'Search Engines' },
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)',
},
},
},
],
});

return { option };
},
});
</script>

<style scoped>
.chart {
height: 100vh;
}
</style>

报错记录

错误1 tslib

运行 yarn build 后,会报以下错:

1
[nuxt] [request error] [unhandled] [500] Cannot find module 'C:\Users\jianqiao\Desktop\remoteControl\.output\server\node_modules\tslib\modules\index.js' imported from C:\Users\jianqiao\Desktop\remoteControl\.output\server\chunks\app\server.mjs

解决办法

/tslib/ 添加到 transpile 中。

注:通过alias添加tslib,还是会有问题,见参考文章nuxt github issue

错误2 ESM错误

运行 yarn build 后,会报以下错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[Vue Router warn]: uncaught error during route navigation:
file:///C:/Users/jianqiao/Desktop/remoteControl/.output/server/chunks/app/_nuxt/index-318c28a5.mjs:2
import { addListener, removeListener } from 'resize-detector';
^^^^^^^^^^^
SyntaxError: Named export 'addListener' not found. The requested module 'resize-detector' is a CommonJS module, which may not support all module.exports as named exports.
CommonJS modules can always be imported via the default export, for example using:

import pkg from 'resize-detector';
const { addListener, removeListener } = pkg;

at ModuleJob._instantiate (node:internal/modules/esm/module_job:127:21)
at async ModuleJob.run (node:internal/modules/esm/module_job:191:5)
at async Promise.all (index 0)
at async ESMLoader.import (node:internal/modules/esm/loader:337:24)
at async setup (file:///C:/Users/jianqiao/Desktop/remoteControl/.output/server/chunks/app/server.mjs:470:76)
at async Object.callAsync (file:///C:/Users/jianqiao/Desktop/remoteControl/.output/server/node_modules/unctx/dist/index.mjs:72:16)
at async applyPlugin (file:///C:/Users/jianqiao/Desktop/remoteControl/.output/server/chunks/app/server.mjs:124:35)
at async applyPlugins (file:///C:/Users/jianqiao/Desktop/remoteControl/.output/server/chunks/app/server.mjs:140:7)
at async createNuxtAppServer (file:///C:/Users/jianqiao/Desktop/remoteControl/.output/server/chunks/app/server.mjs:957:7)
at async Object.renderToString (file:///C:/Users/jianqiao/Desktop/remoteControl/.output/server/node_modules/vue-bundle-renderer/dist/runtime.mjs:176:19)

解决办法

参考最后的nuxt官方文档中的esm,把 /resize-detector/ 添加到 transpile

参考文章

nuxt github issue

github nuxt-bridge-echarts repo

nuxt doc ems