npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

echarts-chain

v1.0.2

Published

A webpack-chain inspired API for generating ECharts configurations

Downloads

11

Readme

echarts-chain

npm version

一个受 webpack-chain 启发的 ECharts 配置链式生成工具。通过链式 API 提供更优雅、更灵活的方式来构建 ECharts 配置。

✨ 特性

  • 🔗 链式 API: 流畅的链式调用,代码更优雅
  • 🎯 类型安全: 提供 TypeScript 类型定义
  • 📦 模块化: 清晰的模块划分,易于扩展
  • 🔄 可复用: 配置可以轻松复用和组合
  • 🎨 灵活配置: 支持条件配置、批量配置等多种方式
  • 🚀 零依赖: 核心库无任何依赖

📦 安装

使用任意包管理器安装:

pnpm add echarts echarts-chain
# 或者
npm i echarts echarts-chain
yarn add echarts echarts-chain

🚀 快速开始

支持三种使用方式:ESM、CommonJS、UMD。

  • ESM(现代打包器):

    import createChart, { EChartsChain } from 'echarts-chain';
    // 结合 ECharts
    import * as echarts from 'echarts';
    
    /**
     * 创建并渲染基础折线图
     */
    function renderBasicLine(dom: HTMLElement) {
      const chart = echarts.init(dom);
    
      const options = createChart()
        .title(t => t.text('基础折线图').left('center'))
        .xAxis('x')
        .type('category')
        .data(['Mon', 'Tue', 'Wed', 'Thu', 'Fri'])
        .quit()
        .yAxis('y')
        .type('value')
        .quit()
        .series('sales')
        .name('销量')
        .type('line')
        .data([120, 200, 150, 80, 70])
        .quit()
        .toConfig();
    
      chart.setOption(options);
    }
  • CommonJS(Node 或旧环境):

    const createChart = require('echarts-chain').default;
    const echarts = require('echarts');
    
    /**
     * 创建并渲染柱状图
     */
    function renderBar(dom) {
      const chart = echarts.init(dom);
      const options = createChart()
        .title(t => t.text('月度销售数据').left('center'))
        .xAxis('month')
        .type('category')
        .data(['1月', '2月', '3月', '4月', '5月', '6月'])
        .quit()
        .yAxis('value')
        .type('value')
        .quit()
        .series('bar')
        .name('销售额')
        .type('bar')
        .data([2500, 3200, 2800, 3500, 4200, 3900])
        .quit()
        .toConfig();
      chart.setOption(options);
    }
  • UMD(浏览器直接引入):

    <script src="https://unpkg.com/echarts/dist/echarts.min.js"></script>
    <script src="https://unpkg.com/echarts-chain/dist/index.min.js"></script>
    <script>
      /**
       * 创建并渲染折线图(UMD)
       */
      function renderLine(dom) {
        var chart = echarts.init(dom);
        var options = EChartsChain.createChart()
          .title(function (t) {
            t.text('UMD 示例').left('center');
          })
          .xAxis('x')
          .type('category')
          .data(['A', 'B', 'C', 'D'])
          .quit()
          .yAxis('y')
          .type('value')
          .quit()
          .series('s1')
          .name('数据')
          .type('line')
          .data([10, 20, 30, 40])
          .quit()
          .toConfig();
        chart.setOption(options);
      }
    </script>

🧩 使用示例

以下示例均来自库的链式 API,便于直接复制使用。

import createChart from 'echarts-chain';

/**
 * 示例 1:基础折线图
 */
function basicLineChart() {
  const chart = createChart();
  chart
    .title(title => {
      title.text('基础折线图示例').subtext('使用 echarts-chain 生成').left('center');
    })
    .tooltip(tooltip => {
      tooltip.trigger('axis').axisPointer({ type: 'cross' });
    })
    .legend(legend => {
      legend.data(['销量', '成本']).top('bottom');
    })
    .grid('main')
    .left('10%')
    .right('10%')
    .bottom('15%')
    .containLabel(true)
    .quit()
    .xAxis('category')
    .type('category')
    .boundaryGap(false)
    .data(['周一', '周二', '周三', '周四', '周五', '周六', '周日'])
    .quit()
    .yAxis('value')
    .type('value')
    .quit()
    .series('sales')
    .name('销量')
    .type('line')
    .data([120, 132, 101, 134, 90, 230, 210])
    .smooth(true)
    .quit()
    .series('cost')
    .name('成本')
    .type('line')
    .data([80, 90, 70, 100, 60, 150, 140])
    .smooth(true)
    .quit();
  return chart.toConfig();
}

/**
 * 示例 2:柱状图
 */
function basicBarChart() {
  const chart = createChart();
  chart
    .title(t => t.text('月度销售数据').left('center'))
    .tooltip({ trigger: 'axis' })
    .xAxis('month')
    .type('category')
    .data(['1月', '2月', '3月', '4月', '5月', '6月'])
    .quit()
    .yAxis('value')
    .type('value')
    .quit()
    .series('bar')
    .name('销售额')
    .type('bar')
    .data([2500, 3200, 2800, 3500, 4200, 3900])
    .itemStyle({ color: '#5470c6', borderRadius: [5, 5, 0, 0] })
    .quit();
  return chart.toConfig();
}

/**
 * 示例 3:条件配置 when
 */
function conditionalChart() {
  const chart = createChart();
  const showLegend = true;
  const dataType: 'line' | 'bar' = 'line';
  chart
    .title(t => t.text('条件配置示例').left('center'))
    .when(showLegend, c => c.legend(l => l.data(['数据1', '数据2']).top('bottom')))
    .xAxis('x')
    .type('category')
    .data(['A', 'B', 'C', 'D', 'E'])
    .quit()
    .yAxis('y')
    .type('value')
    .quit()
    .series('data1')
    .name('数据1')
    .type(dataType)
    .data([10, 20, 30, 40, 50])
    .when(dataType === 'line', s => s.smooth(true))
    .quit()
    .series('data2')
    .name('数据2')
    .type(dataType)
    .data([15, 25, 35, 45, 55])
    .quit();
  return chart.toConfig();
}

/**
 * 示例 4:批量配置 options
 */
function batchConfiguration() {
  const chart = createChart();
  chart.options({
    title: { text: '批量配置示例', left: 'center' },
    tooltip: { trigger: 'axis' },
    xAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] },
    yAxis: { type: 'value' },
    series: [{ name: 'Data', type: 'line', data: [150, 230, 224, 218, 135, 147, 260] }],
  });
  return chart.toConfig();
}

/**
 * 示例 5:复杂图表(多轴/多系列/区域缩放)
 */
function complexChart() {
  const chart = createChart();
  chart
    .title(t => t.text('复杂图表示例').subtext('多坐标轴、多系列').left('center'))
    .tooltip(tp => tp.trigger('axis').axisPointer({ type: 'cross' }))
    .legend(l => l.data(['蒸发量', '降水量', '平均温度']).top('bottom'))
    .grid('main')
    .left('10%')
    .right('10%')
    .bottom('15%')
    .top('15%')
    .containLabel(true)
    .quit()
    .xAxis('months')
    .type('category')
    .data(['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'])
    .axisPointer({ type: 'shadow' })
    .quit()
    .yAxis('rainfall')
    .type('value')
    .name('水量')
    .position('left')
    .axisLabel({ formatter: '{value} ml' })
    .quit()
    .yAxis('temperature')
    .type('value')
    .name('温度')
    .position('right')
    .axisLabel({ formatter: '{value} °C' })
    .quit()
    .series('evaporation')
    .name('蒸发量')
    .type('bar')
    .yAxisIndex(0)
    .data([2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3])
    .quit()
    .series('precipitation')
    .name('降水量')
    .type('bar')
    .yAxisIndex(0)
    .data([2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3])
    .quit()
    .series('temperature')
    .name('平均温度')
    .type('line')
    .yAxisIndex(1)
    .data([2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2])
    .smooth(true)
    .quit()
    .dataZoom('slider')
    .type('slider')
    .start(0)
    .end(100)
    .quit()
    .dataZoom('inside')
    .type('inside')
    .start(0)
    .end(100)
    .quit();
  return chart.toConfig();
}

🧠 API 速览

  • createChart():创建链式对象,最终通过 .toConfig() 输出 ECharts 配置
  • 顶层配置:title(fn|obj), legend(fn|obj), tooltip(fn|obj), toolbox(fn|obj), dataset(obj), aria(obj)
  • 结构化配置:grid(name?), xAxis(name?), yAxis(name?), series(name),每个子对象支持链式细粒度设置
  • 批量与条件:options(obj) 批量合并;when(cond, thenFn, elseFn?) 条件配置
  • 返回父级:quit() 回到上一层链式对象;数组类容器统一通过 .toConfig() 合并到最终配置
  • 实用方法:toJSON(space?) 将配置序列化;fromConfig(obj) 从已有配置反向构建;clone() 深拷贝当前链

📄 类型与构建

  • ESM 构建输出在 es/,CJS 在 lib/,UMD 在 dist/
  • 每个目录都包含 TypeScript 类型声明(.d.ts