vite 静态资源打包配置,echart 主题引入,build上线问题,vue3-echart5使用

前情提要

在经历了vite打包实战后,我入手了echart实战,线下运行一切正常,但是打包上线后出现了异常
TypeError: Cannot create property 'series' onstring '<IDOCTYPE html>,挑战又来了,又是一个学习的过程;


原因分析

在寻求了各方大佬的提议及本人实践最终问题得以解决,分析过程如下

  1. echart是否存在版本问题;
  2. 引入方式是否正确;
  3. 问题根源在何处

最终我从问题根源发现了猫腻,这个报错是说不能创建属性series为string,因为build后的代码是丑化的,所以只能回到项目代码;

项目代码中我使用了echart的主题,利用axios来读取json,这一步不能说把我害惨了,也只能说又促使我了解了更多的内容;
代码如下:

//获取本地json
onMounted(() => {
    getChartData().then(res=>{
        console.log(res);
    })
    echarts.registerTheme('wonderland', wonderland);
    myChart = echarts.init(document.getElementById('chart'), 'wonderland');
    // 绘制图表
    myChart.setOption({
    });
})
//getChartData.js
import httpRequest from '@/axios/index'

// 查询json
export function getChartData() {
    return httpRequest({
        url: '/src/assets/json/wonderland.json',
        method: 'get',
        baseURL:'',
    })
}

echart的官方引入方式,这里我不去展开,关键说axios读取json会有什么后果:文件没有明确引入,打包工具不会解析到,也就是说打包后的文件里就没有json,线上项目拿不到配置当然报错


实战解析

那么既然发现了问题根源,就来尝试一下好的解决方案:

  1. 改用import 引入 json; 其实这里再引入js我们的程序就变味了,因为我在网上进行了大量的搜索web及vite的json读取方案,大多停留在dev环境中,具体打包工具如何去配置这些问题,站在应用角度其实不重要,因为json一般用在配置或者是请求当中,必要情况可以依靠服务器读取。但是站在学习角度,很重要,但是今天,我觉得我必须放它一马,来日再站
  2. json文件改用js文件,采用模块化形式导出,因为我们整个系统的运行基本依赖模块化,这样不论是打包的角度还是线下开发都十分合理;

这里有俩个题外话:

  1. echart的主题是支持js引入的,如果我用js就没有这一系列问题,但是json用户也大有人在,所以我不踩你也得踩,索性,我发表出来以供学习
  2. 静态资源打包配置vite官方有说法

在这里插入图片描述

了解了以上,我的实战如下:

//wonderland.js
export default {
    "color": [
        "#4ea397",
        "#22c3aa",
        "#7bd9a5",
        "#d0648a",
        "#f58db2",
        "#f2b3c9"
    ],
    "backgroundColor": "rgba(255,255,255,0)",
    "textStyle": {}.....
 }
//改写引入方式
import wonderland from '@/tool/wonderland'
onMounted(() => {
    echarts.registerTheme('wonderland', wonderland);
    myChart = echarts.init(document.getElementById('chart'), 'wonderland');
    // 绘制图表
    myChart.setOption({
    });
})

到这里我的问题得以解决,线上也正常了,但是留下了一个疑问:

rollupOptions: {
      output: { //静态资源分类打包
        chunkFileNames: 'static/js/[name]-[hash].js',
        entryFileNames: 'static/js/[name]-[hash].js',
        assetFileNames: 'static/[ext]/name-[hash].[ext]',
        manualChunks(id) { //静态资源分拆打包
          if (id.includes('node_modules')) {
            return id.toString().split('node_modules/')[1].split('/')[0].toString();
          }
        }
      }
    }

assetFileNames: 会把项目中依赖的文件,进行处理,例如你assets目录下有一张图片,但是你没有在项目中引入,打包会忽略;
我的疑问也在这里,import xx.js 就算是依赖引入,import xx.json却不被分包处理,为什么?求指教


最后

📚 vite专栏
☃️ 个人简介:一个喜爱技术的人。
🌞 励志格言: 脚踏实地,虚心学习。
❗如果文章还可以,记得用你可爱的小手点赞👍关注✅,我会在第一时间回、回访,欢迎进一步交流。


版权声明:本文为g18204746769原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>