Github

Apache ECharts 官方提供了在微信小程序中使用Echarts 的代码实例和 ec-canvas 组件,但是未发布 npm 包。

此项目在官方代码之上修改支持 ec-canvas 组件传入 echarts 可支持 npm 引入 echarts 或本地自定义构建后的 echarts,更符合 Web 开发体验。

并且发布 npm 包,支持小程序通过 npm 安装使用。并支持 Taro 按需引入 echarts 减小打包体积。

安装

  1. npm install echarts-for-weixin

小程序引用

参考代码 tools/demo

  1. 首先在页面的 json 文件加入 usingComponents 配置字段
  1. {
  2. "usingComponents": {
  3. "ec-canvas": "echarts-for-weixin"
  4. }
  5. }
  1. 项目根目录创建 package.json 并执行 npm install 安装依赖
  1. {
  2. "dependencies": {
  3. "echarts": "^5.1.2",
  4. "echarts-for-weixin": "^1.0.0"
  5. }
  6. }
  1. 小程序开发者工具中构建 npm

点击开发者工具中的菜单栏:工具 —> 构建 npm

construction.png

  1. 在页面中引入 echarts,可以从 npm 引入 echarts,也可以引入本地自定义构建的 echarts 以减小体积
  1. import * as echarts from 'echarts' // 从 npm 引入 echarts
  2. import * as echarts from './echarts' // 或者从本地引入自定义构建的 echarts
  1. 然后可以在对应页面的 wxml 中直接使用该组件
  1. <view class="container">
  2. <ec-canvas id="mychart-dom-bar" canvas-id="mychart-bar" echarts="{{ echarts }}" ec="{{ ec }}"></ec-canvas>
  3. </view>
  1. ec-canvas 的具体用法和如何初始化图表请参考 Echarts 官方小程序示例
  1. import * as echarts from 'echarts'
  2. let chart = null;
  3. function initChart(canvas, width, height, dpr) {
  4. chart = echarts.init(canvas, null, {
  5. width: width,
  6. height: height,
  7. devicePixelRatio: dpr // new
  8. });
  9. canvas.setChart(chart);
  10. var option = {
  11. tooltip: {
  12. trigger: 'axis',
  13. axisPointer: { // 坐标轴指示器,坐标轴触发有效
  14. type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
  15. },
  16. confine: true
  17. },
  18. legend: {
  19. data: ['热度', '正面', '负面']
  20. },
  21. grid: {
  22. left: 20,
  23. right: 20,
  24. bottom: 15,
  25. top: 40,
  26. containLabel: true
  27. },
  28. xAxis: [
  29. {
  30. type: 'value',
  31. axisLine: {
  32. lineStyle: {
  33. color: '#999'
  34. }
  35. },
  36. axisLabel: {
  37. color: '#666'
  38. }
  39. }
  40. ],
  41. yAxis: [
  42. {
  43. type: 'category',
  44. axisTick: { show: false },
  45. data: ['汽车之家', '今日头条', '百度贴吧', '一点资讯', '微信', '微博', '知乎'],
  46. axisLine: {
  47. lineStyle: {
  48. color: '#999'
  49. }
  50. },
  51. axisLabel: {
  52. color: '#666'
  53. }
  54. }
  55. ],
  56. series: [
  57. {
  58. name: '热度',
  59. type: 'bar',
  60. label: {
  61. normal: {
  62. show: true,
  63. position: 'inside'
  64. }
  65. },
  66. data: [300, 270, 340, 344, 300, 320, 310],
  67. itemStyle: {
  68. // emphasis: {
  69. // color: '#37a2da'
  70. // }
  71. }
  72. },
  73. {
  74. name: '正面',
  75. type: 'bar',
  76. stack: '总量',
  77. label: {
  78. normal: {
  79. show: true
  80. }
  81. },
  82. data: [120, 102, 141, 174, 190, 250, 220],
  83. itemStyle: {
  84. // emphasis: {
  85. // color: '#32c5e9'
  86. // }
  87. }
  88. },
  89. {
  90. name: '负面',
  91. type: 'bar',
  92. stack: '总量',
  93. label: {
  94. normal: {
  95. show: true,
  96. position: 'left'
  97. }
  98. },
  99. data: [-20, -32, -21, -34, -90, -130, -110],
  100. itemStyle: {
  101. // emphasis: {
  102. // color: '#67e0e3'
  103. // }
  104. }
  105. }
  106. ]
  107. };
  108. chart.setOption(option);
  109. return chart;
  110. }
  111. Page({
  112. data: {
  113. echarts,
  114. ec: {
  115. onInit: initChart
  116. }
  117. },
  118. onReady() {
  119. setTimeout(function () {
  120. // 获取 chart 实例的方式
  121. console.log(chart)
  122. }, 2000);
  123. }
  124. })

Taro 引用

参考代码 examples/taro

准备工作

  1. 安装依赖
  1. npm install echarts-for-weixin
  1. 在项目根目录中新建文件 project.package.json 或者自定义命名,此文件是小程序的 package.json,并在下一步中添加小程序自定义构建 npm 方式。这么做的目的是为了能够共享项目 node_modules
  2. project.configsetting 中添加小程序自定义构建 npm 方式,参考 自定义 node_modules 和 miniprogram_npm 位置的构建 npm 方式
  1. {
  2. "setting": {
  3. "packNpmManually": true,
  4. "packNpmRelationList": [
  5. {
  6. "packageJsonPath": "../project.package.json",
  7. "miniprogramNpmDistDir": "./"
  8. }
  9. ]
  10. }
  11. }
  1. 执行 Taro 的开发或者打包命令进行项目开发
  1. npm run dev:weapp
  1. 小程序开发者工具中构建 npm。注意:小程序开发工具打开的项目目录是 dist 文件夹

点击开发者工具中的菜单栏:工具 —> 构建 npm

construction.png

引入 Echarts

  1. 在全局的 app.config.js 中添加或者在单个需要使用到 echarts 的页面配置中添加引用组件
  1. {
  2. "usingComponents": {
  3. "ec-canvas": "echarts-for-weixin"
  4. }
  5. }
  1. 在页面中引入 echarts,可以从 npm 引入 echarts,也可以引入本地自定义构建的 echarts 以减小体积
  1. import * as echarts from 'echarts' // 从 npm 引入 echarts
  2. import * as echarts from './echarts' // 或者从本地引入自定义构建的 echarts
  1. 将引入的 echarts 传给组件
  1. <ec-canvas
  2. id='mychart-dom-area'
  3. canvas-id='mychart-area'
  4. echarts={echarts} // 将引入的 echarts 传给组件
  5. ec={this.state.ec}
  6. />
  1. ec-canvas 的具体用法和如何初始化图表请参考 Echarts 官方小程序示例
  1. function initChart(canvas, width, height) {
  2. const chart = echarts.init(canvas, null, {
  3. width: width,
  4. height: height
  5. })
  6. canvas.setChart(chart)
  7. const model = {
  8. yCates: ['Saturday', 'Friday', 'Thursday',
  9. 'Wednesday', 'Tuesday', 'Monday',
  10. 'Sunday'],
  11. xCates: ['1', '2', '3', '4', '5'],
  12. data: [
  13. // [yCateIndex, xCateIndex, value]
  14. [0, 0, 5], [0, 1, 7], [0, 2, 3], [0, 3, 5], [0, 4, 2],
  15. [1, 0, 1], [1, 1, 2], [1, 2, 4], [1, 3, 8], [1, 4, 2],
  16. [2, 0, 2], [2, 1, 3], [2, 2, 8], [2, 3, 6], [2, 4, 7],
  17. [3, 0, 3], [3, 1, 7], [3, 2, 5], [3, 3, 1], [3, 4, 6],
  18. [4, 0, 3], [4, 1, 2], [4, 2, 7], [4, 3, 8], [4, 4, 9],
  19. [5, 0, 2], [5, 1, 2], [5, 2, 3], [5, 3, 4], [5, 4, 7],
  20. [6, 0, 6], [6, 1, 5], [6, 2, 3], [6, 3, 1], [6, 4, 2]
  21. ]
  22. }
  23. const data = model.data.map(function (item) {
  24. return [item[1], item[0], item[2] || '-']
  25. })
  26. const option = {
  27. tooltip: {
  28. position: 'top'
  29. },
  30. animation: false,
  31. grid: {
  32. bottom: 60,
  33. top: 10,
  34. left: 80
  35. },
  36. xAxis: {
  37. type: 'category',
  38. data: model.xCates
  39. },
  40. yAxis: {
  41. type: 'category',
  42. data: model.yCates
  43. },
  44. visualMap: {
  45. min: 1,
  46. max: 10,
  47. show: false,
  48. calculable: true,
  49. orient: 'horizontal',
  50. left: 'center',
  51. bottom: 10,
  52. inRange: {
  53. color: ['#37A2DA', '#32C5E9', '#67E0E3', '#91F2DE', '#FFDB5C', '#FF9F7F'],
  54. }
  55. },
  56. series: [{
  57. name: 'Punch Card',
  58. type: 'heatmap',
  59. data: data,
  60. label: {
  61. normal: {
  62. show: true
  63. }
  64. },
  65. itemStyle: {
  66. emphasis: {
  67. shadowBlur: 10,
  68. shadowColor: 'rgba(0, 0, 0, 0.5)'
  69. }
  70. }
  71. }]
  72. }
  73. chart.setOption(option)
  74. return chart
  75. }
  76. export default class Echarts extends React.Component {
  77. state = {
  78. ec: {
  79. onInit: initChart
  80. }
  81. }
  82. render () {
  83. return (
  84. <View className='echarts'>
  85. <ec-canvas
  86. id='mychart-dom-area'
  87. canvas-id='mychart-area'
  88. echarts={echarts}
  89. ec={this.state.ec}
  90. />
  91. </View>
  92. )
  93. }
  94. }

Taro 按需引用

参考代码 examples/taro-manual-load

注意:小程序开发者工具打开的项目目录是打包后的 dist 目录

准备工作

  1. 安装依赖
  1. npm install echarts-for-weixin
  1. 在项目根目录中新建文件 project.package.json 或者自定义命名,此文件是小程序的 package.json,并在下一步中添加小程序自定义构建 npm 方式。并配置 config/index.js 中的 copy 选项,将 project.package.json 复制到 dist 目录下并且重命名为 package.json。并且复制 node_modules/echarts-for-weixindist/node_modules/echarts-for-weixin 避免在小程序开发者工具中打开的项目重新安装依赖

config/index.js

  1. {
  2. copy: {
  3. patterns: [
  4. { from: 'project.package.json', to: 'dist/package.json' }, // 指定需要 copy 的文件
  5. { from: 'node_modules/echarts-for-weixin/', to: 'dist/node_modules/echarts-for-weixin/' }
  6. ],
  7. options: {}
  8. }
  9. }
  1. project.configsetting 中添加小程序自定义构建 npm 方式,参考 自定义 node_modules 和 miniprogram_npm 位置的构建 npm 方式
  1. {
  2. "setting": {
  3. "packNpmManually": true,
  4. "packNpmRelationList": [
  5. {
  6. "packageJsonPath": "./package.json",
  7. "miniprogramNpmDistDir": "./"
  8. }
  9. ]
  10. }
  11. }
  1. 执行 Taro 的开发或者打包命令进行项目开发
  1. npm run dev:weapp
  1. 小程序开发者工具中构建 npm。注意:小程序开发工具打开的项目目录是 dist 文件夹

点击开发者工具中的菜单栏:工具 —> 构建 npm

construction.png

引入 Echarts

  1. 在全局的 app.config.js 中添加或者在单个需要使用到 echarts 的页面配置中添加引用组件
  1. {
  2. "usingComponents": {
  3. "ec-canvas": "echarts-for-weixin"
  4. }
  5. }
  1. 在页面中引入 echarts/core 和需要的组件,Taro 打包会只打包引入的组件,这样达到按需引入的目的
  1. // Import the echarts core module, which provides the necessary interfaces for using echarts.
  2. import * as echarts from 'echarts/core';
  3. // Import charts, all with Chart suffix
  4. import {
  5. // LineChart,
  6. BarChart,
  7. // PieChart,
  8. // ScatterChart,
  9. // RadarChart,
  10. // MapChart,
  11. // TreeChart,
  12. // TreemapChart,
  13. // GraphChart,
  14. // GaugeChart,
  15. // FunnelChart,
  16. // ParallelChart,
  17. // SankeyChart,
  18. // BoxplotChart,
  19. // CandlestickChart,
  20. // EffectScatterChart,
  21. // LinesChart,
  22. // HeatmapChart,
  23. // PictorialBarChart,
  24. // ThemeRiverChart,
  25. // SunburstChart,
  26. // CustomChart,
  27. } from 'echarts/charts';
  28. // import components, all suffixed with Component
  29. import {
  30. // GridSimpleComponent,
  31. GridComponent,
  32. // PolarComponent,
  33. // RadarComponent,
  34. // GeoComponent,
  35. // SingleAxisComponent,
  36. // ParallelComponent,
  37. // CalendarComponent,
  38. // GraphicComponent,
  39. // ToolboxComponent,
  40. TooltipComponent,
  41. // AxisPointerComponent,
  42. // BrushComponent,
  43. TitleComponent,
  44. // TimelineComponent,
  45. // MarkPointComponent,
  46. // MarkLineComponent,
  47. // MarkAreaComponent,
  48. // LegendComponent,
  49. // LegendScrollComponent,
  50. // LegendPlainComponent,
  51. // DataZoomComponent,
  52. // DataZoomInsideComponent,
  53. // DataZoomSliderComponent,
  54. // VisualMapComponent,
  55. // VisualMapContinuousComponent,
  56. // VisualMapPiecewiseComponent,
  57. // AriaComponent,
  58. // TransformComponent,
  59. DatasetComponent,
  60. } from 'echarts/components';
  61. // Import renderer, note that introducing the CanvasRenderer or SVGRenderer is a required step
  62. import {
  63. CanvasRenderer,
  64. // SVGRenderer,
  65. } from 'echarts/renderers';
  66. // Register the required components
  67. echarts.use(
  68. [
  69. TitleComponent,
  70. TooltipComponent,
  71. GridComponent,
  72. BarChart,
  73. CanvasRenderer,
  74. HeatmapChart,
  75. VisualMapComponent,
  76. VisualMapContinuousComponent,
  77. VisualMapPiecewiseComponent,
  78. ]
  79. );
  1. 将引入的 echarts 传给组件
  1. <ec-canvas
  2. id='mychart-dom-area'
  3. canvas-id='mychart-area'
  4. echarts={echarts} // 将引入的 echarts 传给组件
  5. ec={this.state.ec}
  6. />
  1. ec-canvas 的具体用法和如何初始化图表请参考 Echarts 官方小程序示例
  1. function initChart(canvas, width, height) {
  2. const chart = echarts.init(canvas, null, {
  3. width: width,
  4. height: height
  5. })
  6. canvas.setChart(chart)
  7. const model = {
  8. yCates: ['Saturday', 'Friday', 'Thursday',
  9. 'Wednesday', 'Tuesday', 'Monday',
  10. 'Sunday'],
  11. xCates: ['1', '2', '3', '4', '5'],
  12. data: [
  13. // [yCateIndex, xCateIndex, value]
  14. [0, 0, 5], [0, 1, 7], [0, 2, 3], [0, 3, 5], [0, 4, 2],
  15. [1, 0, 1], [1, 1, 2], [1, 2, 4], [1, 3, 8], [1, 4, 2],
  16. [2, 0, 2], [2, 1, 3], [2, 2, 8], [2, 3, 6], [2, 4, 7],
  17. [3, 0, 3], [3, 1, 7], [3, 2, 5], [3, 3, 1], [3, 4, 6],
  18. [4, 0, 3], [4, 1, 2], [4, 2, 7], [4, 3, 8], [4, 4, 9],
  19. [5, 0, 2], [5, 1, 2], [5, 2, 3], [5, 3, 4], [5, 4, 7],
  20. [6, 0, 6], [6, 1, 5], [6, 2, 3], [6, 3, 1], [6, 4, 2]
  21. ]
  22. }
  23. const data = model.data.map(function (item) {
  24. return [item[1], item[0], item[2] || '-']
  25. })
  26. const option = {
  27. tooltip: {
  28. position: 'top'
  29. },
  30. animation: false,
  31. grid: {
  32. bottom: 60,
  33. top: 10,
  34. left: 80
  35. },
  36. xAxis: {
  37. type: 'category',
  38. data: model.xCates
  39. },
  40. yAxis: {
  41. type: 'category',
  42. data: model.yCates
  43. },
  44. visualMap: {
  45. min: 1,
  46. max: 10,
  47. show: false,
  48. calculable: true,
  49. orient: 'horizontal',
  50. left: 'center',
  51. bottom: 10,
  52. inRange: {
  53. color: ['#37A2DA', '#32C5E9', '#67E0E3', '#91F2DE', '#FFDB5C', '#FF9F7F'],
  54. }
  55. },
  56. series: [{
  57. name: 'Punch Card',
  58. type: 'heatmap',
  59. data: data,
  60. label: {
  61. normal: {
  62. show: true
  63. }
  64. },
  65. itemStyle: {
  66. emphasis: {
  67. shadowBlur: 10,
  68. shadowColor: 'rgba(0, 0, 0, 0.5)'
  69. }
  70. }
  71. }]
  72. }
  73. chart.setOption(option)
  74. return chart
  75. }
  76. export default class Echarts extends React.Component {
  77. state = {
  78. ec: {
  79. onInit: initChart
  80. }
  81. }
  82. render () {
  83. return (
  84. <View className='echarts'>
  85. <ec-canvas
  86. id='mychart-dom-area'
  87. canvas-id='mychart-area'
  88. echarts={echarts}
  89. ec={this.state.ec}
  90. />
  91. </View>
  92. )
  93. }
  94. }
  1. 可以查看小程序开发者工具中的依赖分析,确定文件大小以及是否正确按需引入

manual-load.png

参考链接