📦 Uni ECharts 是如何使用定制 echarts 的?一篇文章轻松掌握!

Uni ECharts 是适用于 uni-app 的 Apache ECharts 组件,无需繁琐的步骤即可轻松在 uni-app 平台上使用 echarts。

官网 & 文档:uni-echarts.xiaohe.ink

Github:github.com/xiaohe0601/...

🤓 前言

朋友们好啊,我是 Uni ECharts 掌门人小何。

刚才有个朋友问我:"何老师,发生甚么事了?" 我说怎么回事?给我发了两张截图。

我一看!噢,原来是昨天,有两个小程序,页面很多,一个 400 多页,一个 500 多页。

塔们说,哎...有一个说是主包实在是放不下 echarts 了,何老师你能不能教教我优化功法?帮助我改善一下我的小程序体积。

我说可以,我说你直接 npm 安装 echarts 按需引用,不好用,他不服气。

我说小朋友,你一个组件同时兼容所有端,不需要条件编译,他说你这也没用。

我说我这个有用,这是抹平差异,传统开发是讲一次编译、多端覆盖,二百多行代码的条件编译都抵不过我这个小组件。

他说要和我试试,我说可以。我一说,他啪一下就把条件编译给写出来了,很快啊,然后上来就是一个 require,吭!一个 ifdef,吭!一个 ifndef!

我全部防出去了,防出去以后自然是传统开发宜点到为止,Uni ECharts 藏在 Github 没给他看。我笑一下,准备上班,因为这时间按传统开发的点到为止他已经输了,如果 Uni ECharts 发力,一下就把他条件编译整破防了,放在 Github 没给他看。

他也承认,说条件编译写起来繁琐。啊,我收手的时间不聊了,他突然袭击说 npm 装的 echarts 不能放到分包,啊,我大意了啊,没有考虑到。

哎,他的条件编译给我脸打了一下,但是没关系啊!他也说了,他截图也说了,两分多钟以后,当时流眼泪了,捂着眼我就说停...停,然后两分多钟以后就好了。

我说小伙子你不讲武德,你不懂,他忙说何老师对不...对不起,我不懂规矩。啊,他说他是乱打的,他可不是乱打啊,ifdef、ifndef 训练有素,后来他说他练过 两年半 开源,看来是有备而来。

这两个年轻人,不讲武德。来,骗!来,偷袭!我 22 岁的老同志。这好吗?这不好。我说小朋友你不懂,开发要以和为贵,不是好勇斗狠,要讲武德。

我劝!这位年轻人,耗子尾汁,好好反思。年轻人要脚踏实地,不要急功近利,以后不要再犯这样的聪明,小聪明啊!更不要搞窝里斗!谢谢朋友们!

灵感来源 @德莱厄斯

🪄 定制 ECharts

👉 前往 Uni ECharts 官网 定制 ECharts 查看完整内容

通常情况,使用 按需导入 就能有效减小打包体积,但是在某些场景如果需要使用定制的 ECharts,在 Uni ECharts 中可以配合 provideEcharts 实现,具体参考以下步骤:

  1. 使用 ECharts 官网的 在线定制 功能根据需求选择需要使用的模块构建并下载 echarts.min.js 到本地;

  2. 由于 Vite 默认仅支持 ESM 模块,但是 ECharts 官网的在线定制功能并不支持下载 ESM 格式的产物,所以 Uni ECharts 提供了一个 CLI 工具可以轻松将其转换为 ESM 格式,使用示例如下:

    shell 复制代码
    # pnpm
    pnpm dlx @uni-echarts/c2e@latest
    
    # npm
    npx @uni-echarts/c2e@latest
    shell 复制代码
    ┌  Uni ECharts Transform CLI
    │
    ●  Transform input echarts.min.js to ESM
    │
    ◇  Input file
    │  ./echarts.min.js
    │
    ◇  Output file
    │  ./echarts.esm.js
    │
    ◇  Transform completed!
    │
    └  Output: /path/to/echarts.esm.js

    受限于 echarts.min.js 的内容,目前转换后的 ESM 产物不支持 Tree-Shaking,无法剔除未使用的代码,并且需要使用默认导入,示例如下:

    js 复制代码
    import echarts from "/path/to/echarts.esm.js";
  3. 将转换后的 echarts.esm.js 放入项目中,注意不要 放到 static 目录(因为小程序仅支持 ES5,无法识别 export 语法)。

  4. 调用 provideEchartsecharts 提供给组件,根据 Uni ECharts 的引入方式参考下述指引:

    • NPM 方式

      2.0.0 开始,npm 方式可以通过修改 Vite 插件配置轻松使用!

      js 复制代码
      // vite.config.js[ts]
      import { UniEcharts } from "uni-echarts/vite";
      import { defineConfig } from "vite";
      
      export default defineConfig({
        // ...
        plugins: [
          UniEcharts({
            echarts: {
              // 传实际的 echarts 文件路径,例如:"@/plugins/echarts.esm.js"
              provide: "/path/to/echarts.esm.js",
              importType: "default"
            }
          })
        ]
      });

      当然,也可以手动调用,示例如下:

      js 复制代码
      import { provideEcharts } from "uni-echarts/shared";
      import echarts from "/path/to/echarts.esm.js";
      
      provideEcharts(echarts);
    • Uni Modules 方式

      使用 uni-modules 方式需要手动调用,示例如下:

      js 复制代码
      import { provideEcharts } from "@/uni_modules/xiaohe-echarts";
      import echarts from "/path/to/echarts.esm.js";
      
      provideEcharts(echarts);

因为目前转换后的 ESM 产物不支持 Tree-Shaking,所以使用定制 echarts 时不再需要调用 echarts.use 按需注册组件。

💻 使用组件

html 复制代码
<template>
  <uni-echarts custom-class="chart" :option="option"></uni-echarts>
</template>
js 复制代码
import { ref } from "vue";
import echarts from "/path/to/echarts.esm.js";

const option = ref({
  legend: {
    top: 10,
    left: "center"
  },
  tooltip: {
    trigger: "item",
    textStyle: {
      // #ifdef MP-WEIXIN
      // 临时解决微信小程序 tooltip 文字阴影问题
      textShadowBlur: 1
      // #endif
    }
  },
  series: [
    {
      type: "pie",
      radius: ["30%", "52%"],
      label: {
        show: false,
        position: "center"
      },
      itemStyle: {
        borderWidth: 2,
        borderColor: "#ffffff",
        borderRadius: 10
      },
      emphasis: {
        label: {
          show: true,
          fontSize: 20
        }
      }
    }
  ],
  dataset: {
    dimensions: ["来源", "数量"],
    source: [
      ["Search Engine", 1048],
      ["Direct", 735],
      ["Email", 580],
      ["Union Ads", 484],
      ["Video Ads", 300]
    ]
  }
});
css 复制代码
.chart {
  height: 300px;
}

💡 前往 Uni ECharts 官网 快速开始 查看完整内容

❤️ 支持 & 鼓励

如果 Uni ECharts 对你有帮助,可以通过以下渠道对我们表示鼓励:

无论 ⭐️ 还是 💰 支持,我们铭记于心,这将是我们继续前进的动力,感谢您的支持!

🍵 写在最后

我是 xiaohe0601,热爱代码,目前专注于 Web 前端领域。

欢迎关注我的微信公众号「小何不会写代码」,我会不定期分享一些开发心得、最佳实践以及技术探索等内容,希望能够帮到你!

📚 推荐阅读

相关推荐
光影少年2 小时前
Vue 2 / Vue 3 diff算法
前端·javascript·vue.js
yanghuashuiyue2 小时前
Vue3难以统一的命名规范
前端·vue.js·typescript
码界奇点3 小时前
基于Spring Cloud与Vue.js的微服务前后端分离系统设计与实现
vue.js·后端·spring cloud·微服务·毕业设计·源代码管理
mini_0553 小时前
elementPlus版本升级,el-select默认值显示问题
前端·javascript·vue.js
C_心欲无痕3 小时前
vue3 - watchPostEffect在DOM 更新后的副作用处理
前端·vue.js
小杨梅君4 小时前
Vue3与iframe通信方案详解:本地与跨域场景
前端·vue.js
C_心欲无痕5 小时前
vue3 - watchEffect对响应式副作用进行管理
前端·javascript·vue.js
Front思5 小时前
uniapp实现物流节点
uni-app
前端小臻5 小时前
RustFs 前端开发
javascript·vue.js·rustfs