@amaster.ai/taro-echarts-ui 1.1.0-beta.44 → 1.1.0-beta.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +4 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -3
- package/dist/index.d.ts +5 -3
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,5 @@
|
|
|
1
|
-
'use strict';var components=require('@tarojs/components'),
|
|
1
|
+
'use strict';var components=require('@tarojs/components'),O=require('@tarojs/taro'),react=require('react'),platform=require('zrender/lib/core/platform'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var O__default=/*#__PURE__*/_interopDefault(O);var k=null;function dt(){if(k)return k;try{k=O__default.default.createOffscreenCanvas({type:"2d",width:2,height:2})?.getContext("2d");}catch{}return k}function L(){O__default.default.getEnv()!==O__default.default.ENV_TYPE.WEB&&platform.setPlatformAPI({createCanvas:()=>{try{return O__default.default.createOffscreenCanvas({type:"2d",width:1,height:1})}catch{return {getContext:()=>null}}},measureText:(t,n)=>{let e=dt();if(!e)return {width:0};try{return e.font=n||"12px sans-serif",{width:e.measureText(t)?.width||0}}catch{return {width:0}}},loadImage:(t,n,e)=>{try{let r=O__default.default.createImage?.();if(!r)return e();r.onload=()=>n(r),r.onerror=e,r.src=t;}catch{e();}},requestAnimationFrame:t=>setTimeout(t,16),cancelAnimationFrame:t=>clearTimeout(t)});}function v(t,n){t.addEventListener||(t.addEventListener=()=>{}),t.removeEventListener||(t.removeEventListener=()=>{}),t.dispatchEvent||(t.dispatchEvent=()=>{});let e=t.getContext.bind(t);t.getContext=s=>s==="2d"||s==="2d-text"?n:e(s),t.style||(t.style={}),t.setAttribute||(t.setAttribute=()=>{}),t.getAttribute||(t.getAttribute=()=>null),t.removeAttribute||(t.removeAttribute=()=>{}),t.getBoundingClientRect||(t.getBoundingClientRect=()=>({top:0,left:0,width:t.width,height:t.height,right:t.width,bottom:t.height}));let r=t.devicePixelRatio||1,a=(s,h)=>{Object.getOwnPropertyDescriptor(t,s)||Object.defineProperty(t,s,{get:h});};return a("offsetWidth",()=>t.width/r),a("offsetHeight",()=>t.height/r),a("clientWidth",()=>t.width/r),a("clientHeight",()=>t.height/r),t}var D=null,V=false;async function _(){if(D)return D;L();let t=await import('echarts/core');if(!V){let{CanvasRenderer:n}=await import('echarts/renderers'),{PieChart:e,BarChart:r,LineChart:a,ScatterChart:s,RadarChart:h,MapChart:m,TreeChart:C,TreemapChart:y,GraphChart:l,GaugeChart:o,FunnelChart:R,ParallelChart:A,SankeyChart:T,BoxplotChart:b,CandlestickChart:x,EffectScatterChart:P,LinesChart:M,HeatmapChart:W,PictorialBarChart:z,ThemeRiverChart:i,SunburstChart:d,CustomChart:g}=await import('echarts/charts'),{TitleComponent:u,TooltipComponent:S,GridComponent:c,PolarComponent:f,RadarComponent:p,GeoComponent:I,SingleAxisComponent:w,ParallelComponent:E,CalendarComponent:j,GraphicComponent:q,ToolboxComponent:Q,AxisPointerComponent:U,BrushComponent:J,LegendComponent:K,DataZoomComponent:tt,DataZoomInsideComponent:et,DataZoomSliderComponent:rt,VisualMapComponent:nt,VisualMapContinuousComponent:ot,VisualMapPiecewiseComponent:it,TimelineComponent:st,AriaComponent:at,TransformComponent:ct,DatasetComponent:ut,MarkPointComponent:pt,MarkLineComponent:ht,MarkAreaComponent:lt}=await import('echarts/components');t.use([n,e,r,a,s,h,m,C,y,l,o,R,A,T,b,x,P,M,W,z,i,d,g,u,S,c,f,p,I,w,E,j,q,Q,U,J,K,tt,et,rt,nt,ot,it,st,at,ct,ut,pt,ht,lt]),V=true;}return D=t,t}function H(t,n){if(t==null||t==="")return n;if(typeof t=="number")return `${t}px`;let e=String(t),r=e.match(/^(-?\d+(?:\.\d+)?)(rpx)$/i);return r&&r[1]?`${parseFloat(r[1])/2}px`:e}function yt(t){if(!t||typeof t!="object")return {};let n={};for(let[e,r]of Object.entries(t))r!=null&&typeof r!="function"&&(typeof r!="string"&&typeof r!="number"||(typeof r=="string"&&r.includes("rpx")?n[e]=H(r,r):n[e]=r));return n}function gt(t){let n={},e=t.split(";");for(let r of e){let a=r.trim();if(!a)continue;let s=a.indexOf(":");if(s===-1)continue;let h=a.slice(0,s).trim(),m=a.slice(s+1).trim();if(h&&m){let C=h.replace(/-([a-z])/g,(y,l)=>l.toUpperCase());n[C]=m;}}return n}function St(t){return t?typeof t=="string"?gt(t):t:{}}var $={shadowBlur:0,shadowColor:"transparent",shadowOffsetX:0,shadowOffsetY:0};function F(t){if(!t||typeof t!="object")return t;if(Array.isArray(t))return t.map(e=>F(e));let n={};for(let e in t)if(Object.prototype.hasOwnProperty.call(t,e)){let r=t[e];e==="shadowBlur"||e==="shadowOffsetX"||e==="shadowOffsetY"?n[e]=0:e==="shadowColor"?n[e]="transparent":typeof r=="object"&&r!==null?n[e]=F(r):n[e]=r;}return n}function wt(t){if(!t||typeof t!="object")return t;let n=F(t);return n.tooltip&&typeof n.tooltip=="object"&&(n.tooltip={...n.tooltip,...$}),Array.isArray(n.series)&&(n.series=n.series.map(e=>e&&typeof e=="object"&&e.emphasis?{...e,emphasis:{...e.emphasis,itemStyle:{...e.emphasis.itemStyle||{},...$}}}:e)),n}function xt(t){return t?!t.endsWith("%")&&t!=="auto":false}function X({option:t,height:n="100%",width:e="100%",className:r="",style:a,defaultHeight:s="300px"}){let h=St(a),m=h.height,C=m||(xt(n)?n:void 0),y={width:e,height:m||n,...h},l=react.useMemo(()=>`chart_${Math.random().toString(36).slice(2,11)}`,[]),o=react.useRef(null),[R,A]=react.useState(false),T=react.useRef(null),b=O__default.default.getEnv()!==O__default.default.ENV_TYPE.WEB,x=react.useMemo(()=>wt(t),[t]);react.useEffect(()=>{if(!b){let u=true;(async()=>{try{let f=await _();if(!u)return;let p=document.getElementById(l);if(!p)return;o.current?.dispose(),o.current=f.init(p),o.current.setOption(x),A(!0);}catch(f){console.error("[ECharts] H5 init failed:",f);}})();let c=()=>o.current?.resize();return window.addEventListener("resize",c),()=>{u=false,window.removeEventListener("resize",c),o.current?.dispose(),o.current=null;}}let i=true,d=async(u=0)=>{i&&O__default.default.createSelectorQuery().select(`#${l}`).fields({node:true,size:true}).exec(async S=>{if(!i)return;if(!S?.[0]?.node){u<5&&setTimeout(()=>d(u+1),200*(u+1));return}let c=S[0].node,f=c.getContext("2d");if(!f)return;let p=O__default.default.getSystemInfoSync().pixelRatio,I=S[0].width,w=S[0].height;!C&&(w<=0||!w)&&(console.warn(`[ECharts] Warning: Container has no explicit height. ECharts will use default height (${s}), but the canvas may not be visible. To fix this, either:
|
|
2
|
+
1. Set parent container height: <View style={{ height: '300px' }}>
|
|
3
|
+
2. Set ECharts height prop: <ECharts height="300px" />
|
|
4
|
+
3. Set ECharts style: <ECharts style={{ height: '300px' }} />`),w=parseInt(s)||300),T.current=c,c.width=I*p,c.height=w*p,f.scale(p,p),c.devicePixelRatio=p,v(c,f),o.current?.dispose(),o.current=null;try{let E=await _();if(!i)return;o.current=E.init(c,null,{width:I,height:w,devicePixelRatio:p}),o.current.setOption(x),A(!0);}catch(E){console.error("[ECharts] Init failed:",E);}});},g=setTimeout(()=>d(),50);return ()=>{i=false,clearTimeout(g),o.current?.dispose(),o.current=null;}},[l,b]),react.useEffect(()=>{R&&o.current&&o.current.setOption(x,true);},[x,R]);let P=(i,d)=>{if(!o.current||!T.current)return;let g=i.touches[0]||i.changedTouches[0];if(!g)return;let u=T.current.getBoundingClientRect();o.current.getZr().handler.dispatch(d,{zrX:g.x-u.left,zrY:g.y-u.top,preventDefault:()=>{},stopPropagation:()=>{},stopImmediatePropagation:()=>{}});},M=i=>{P(i,"mousedown");},W=i=>P(i,"mousemove"),z=i=>{P(i,"mouseup"),P(i,"click");};if(!b){let i=C?H(C,s):H(n,"100%"),d={...yt(y),width:H(y.width,"100%"),height:i};return jsxRuntime.jsx("div",{id:l,className:r||void 0,style:d})}return jsxRuntime.jsx(components.Canvas,{id:l,type:"2d",className:r||void 0,style:{width:y.width||"100%",height:y.height||s},disableScroll:true,onTouchStart:M,onTouchMove:W,onTouchEnd:z})}exports.ECharts=X;exports.setupCanvasPolyfill=v;exports.setupWeappZrenderPlatform=L;//# sourceMappingURL=index.cjs.map
|
|
2
5
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/weappPlatform.ts","../src/polyfill.ts","../src/ECharts.tsx"],"names":["measureCtx","getMeasureCtx","Taro","setupWeappZrenderPlatform","setPlatformAPI","text","font","ctx","src","onload","onerror","img","cb","id","setupCanvasPolyfill","canvas","originalGetContext","type","dpr","defineSize","prop","value","echartsMod","echartsRegistered","getEcharts","echarts","CanvasRenderer","PieChart","BarChart","LineChart","ScatterChart","RadarChart","MapChart","TreeChart","TreemapChart","GraphChart","GaugeChart","FunnelChart","ParallelChart","SankeyChart","BoxplotChart","CandlestickChart","EffectScatterChart","LinesChart","HeatmapChart","PictorialBarChart","ThemeRiverChart","SunburstChart","CustomChart","TitleComponent","TooltipComponent","GridComponent","PolarComponent","RadarComponent","GeoComponent","SingleAxisComponent","ParallelComponent","CalendarComponent","GraphicComponent","ToolboxComponent","AxisPointerComponent","BrushComponent","LegendComponent","DataZoomComponent","DataZoomInsideComponent","DataZoomSliderComponent","VisualMapComponent","VisualMapContinuousComponent","VisualMapPiecewiseComponent","TimelineComponent","AriaComponent","TransformComponent","DatasetComponent","MarkPointComponent","MarkLineComponent","MarkAreaComponent","convertRpx","defaultValue","str","match","cleanStyleForH5","style","cleaned","key","parseStyleString","styleStr","declarations","declaration","trimmed","colonIndex","property","camelProperty","_","letter","normalizeStyle","DISABLE_SHADOW_CONFIG","processShadowProps","obj","item","result","disableShadowInOption","option","series","ECharts","height","width","className","normalizedStyle","mergedStyle","canvasId","useMemo","chartRef","useRef","isReady","setIsReady","useState","canvasNodeRef","isWeapp","processedOption","useEffect","mounted","container","error","handleResize","initChart","retryCount","res","canvasWidth","canvasHeight","timer","handleTouch","e","eventType","touch","box","onTouchStart","onTouchMove","onTouchEnd","h5Style","jsx","Canvas"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * 小程序 ZRender 平台适配\n * 通过 setPlatformAPI 接管 createCanvas/measureText,避免 ECharts 污染 Taro 渲染器\n */\n\n// @ts-ignore\nimport { setPlatformAPI } from 'zrender/lib/core/platform'\nimport Taro from '@tarojs/taro'\n\nlet measureCtx: any = null\n\nfunction getMeasureCtx() {\n if (measureCtx) return measureCtx\n try {\n const offscreen = Taro.createOffscreenCanvas({ type: '2d', width: 2, height: 2 })\n measureCtx = offscreen?.getContext('2d')\n } catch {}\n return measureCtx\n}\n\n/** 设置小程序 zrender 平台 API,必须在 import echarts 之前调用 */\nexport function setupWeappZrenderPlatform() {\n if (Taro.getEnv() === Taro.ENV_TYPE.WEB) return\n\n setPlatformAPI({\n createCanvas: () => {\n try {\n return Taro.createOffscreenCanvas({ type: '2d', width: 1, height: 1 })\n } catch {\n return { getContext: () => null } as any\n }\n },\n\n measureText: (text: string, font: string) => {\n const ctx = getMeasureCtx()\n if (!ctx) return { width: 0 }\n try {\n ctx.font = font || '12px sans-serif'\n return { width: ctx.measureText(text)?.width || 0 }\n } catch {\n return { width: 0 }\n }\n },\n\n loadImage: (src: string, onload: (img: any) => void, onerror: () => void) => {\n try {\n // @ts-ignore\n const img = (Taro as any).createImage?.()\n if (!img) return onerror()\n img.onload = () => onload(img)\n img.onerror = onerror\n img.src = src\n } catch {\n onerror()\n }\n },\n\n requestAnimationFrame: (cb: FrameRequestCallback) => setTimeout(cb, 16) as unknown as number,\n cancelAnimationFrame: (id: number) => clearTimeout(id),\n } as any)\n}\n","/**\n * Canvas Polyfill - 给小程序 canvas 节点补充 ECharts 需要的 DOM 兼容属性\n */\n\nexport function setupCanvasPolyfill(canvas: any, ctx: any) {\n if (!canvas.addEventListener) canvas.addEventListener = () => {}\n if (!canvas.removeEventListener) canvas.removeEventListener = () => {}\n if (!canvas.dispatchEvent) canvas.dispatchEvent = () => {}\n\n const originalGetContext = canvas.getContext.bind(canvas)\n canvas.getContext = (type: string) => {\n return (type === '2d' || type === '2d-text') ? ctx : originalGetContext(type)\n }\n\n if (!canvas.style) canvas.style = {}\n if (!canvas.setAttribute) canvas.setAttribute = () => {}\n if (!canvas.getAttribute) canvas.getAttribute = () => null\n if (!canvas.removeAttribute) canvas.removeAttribute = () => {}\n\n if (!canvas.getBoundingClientRect) {\n canvas.getBoundingClientRect = () => ({\n top: 0, left: 0,\n width: canvas.width, height: canvas.height,\n right: canvas.width, bottom: canvas.height,\n })\n }\n\n const dpr = canvas.devicePixelRatio || 1\n const defineSize = (prop: string, value: () => number) => {\n if (!Object.getOwnPropertyDescriptor(canvas, prop)) {\n Object.defineProperty(canvas, prop, { get: value })\n }\n }\n defineSize('offsetWidth', () => canvas.width / dpr)\n defineSize('offsetHeight', () => canvas.height / dpr)\n defineSize('clientWidth', () => canvas.width / dpr)\n defineSize('clientHeight', () => canvas.height / dpr)\n\n return canvas\n}\n","/**\n * Taro ECharts 组件\n * 小程序使用 zrender setPlatformAPI,H5 使用原生能力\n */\n\nimport { Canvas } from '@tarojs/components'\nimport Taro from '@tarojs/taro'\nimport { useEffect, useRef, useState, useMemo } from 'react'\nimport type { CSSProperties } from 'react'\nimport type { EChartsOption } from 'echarts'\nimport type { EChartsType } from 'echarts/core'\nimport { setupWeappZrenderPlatform } from './weappPlatform'\nimport { setupCanvasPolyfill } from './polyfill'\n\nlet echartsMod: typeof import('echarts/core') | null = null\nlet echartsRegistered = false\n\n/** 动态加载 echarts */\nasync function getEcharts() {\n if (echartsMod) return echartsMod\n\n // 小程序环境设置平台 API(内部会判断环境)\n setupWeappZrenderPlatform()\n\n const echarts = await import('echarts/core')\n \n if (!echartsRegistered) {\n const { CanvasRenderer } = await import('echarts/renderers')\n const {\n PieChart, BarChart, LineChart, ScatterChart, RadarChart,\n MapChart, TreeChart, TreemapChart, GraphChart, GaugeChart,\n FunnelChart, ParallelChart, SankeyChart, BoxplotChart,\n CandlestickChart, EffectScatterChart, LinesChart, HeatmapChart,\n PictorialBarChart, ThemeRiverChart, SunburstChart, CustomChart,\n } = await import('echarts/charts')\n const {\n TitleComponent, TooltipComponent, GridComponent, PolarComponent,\n RadarComponent, GeoComponent, SingleAxisComponent, ParallelComponent,\n CalendarComponent, GraphicComponent, ToolboxComponent, AxisPointerComponent,\n BrushComponent, LegendComponent, DataZoomComponent, DataZoomInsideComponent,\n DataZoomSliderComponent, VisualMapComponent, VisualMapContinuousComponent,\n VisualMapPiecewiseComponent, TimelineComponent, AriaComponent,\n TransformComponent, DatasetComponent, MarkPointComponent,\n MarkLineComponent, MarkAreaComponent,\n } = await import('echarts/components')\n\n echarts.use([\n CanvasRenderer,\n PieChart, BarChart, LineChart, ScatterChart, RadarChart,\n MapChart, TreeChart, TreemapChart, GraphChart, GaugeChart,\n FunnelChart, ParallelChart, SankeyChart, BoxplotChart,\n CandlestickChart, EffectScatterChart, LinesChart, HeatmapChart,\n PictorialBarChart, ThemeRiverChart, SunburstChart, CustomChart,\n TitleComponent, TooltipComponent, GridComponent, PolarComponent,\n RadarComponent, GeoComponent, SingleAxisComponent, ParallelComponent,\n CalendarComponent, GraphicComponent, ToolboxComponent, AxisPointerComponent,\n BrushComponent, LegendComponent, DataZoomComponent, DataZoomInsideComponent,\n DataZoomSliderComponent, VisualMapComponent, VisualMapContinuousComponent,\n VisualMapPiecewiseComponent, TimelineComponent, AriaComponent,\n TransformComponent, DatasetComponent, MarkPointComponent,\n MarkLineComponent, MarkAreaComponent,\n ])\n\n echartsRegistered = true\n }\n\n echartsMod = echarts\n return echarts\n}\n\n/** 将 rpx 转换为 px(H5 inline style 需要,PostCSS 只处理 CSS 文件) */\nfunction convertRpx(value: string | number | undefined, defaultValue: string): string {\n if (value === undefined || value === null || value === '') return defaultValue\n if (typeof value === 'number') return `${value}px`\n\n const str = String(value)\n const match = str.match(/^(-?\\d+(?:\\.\\d+)?)(rpx)$/i)\n if (match && match[1]) {\n return `${parseFloat(match[1]) / 2}px`\n }\n return str\n}\n\n/** 清理 style 对象,过滤掉无效值并转换 rpx(H5 模式专用) */\nfunction cleanStyleForH5(style: CSSProperties | undefined): CSSProperties {\n if (!style || typeof style !== 'object') return {}\n\n const cleaned: CSSProperties = {}\n for (const [key, value] of Object.entries(style)) {\n // 过滤掉 null、undefined、函数和非字符串/数字值\n if (value === null || value === undefined) continue\n if (typeof value === 'function') continue\n if (typeof value !== 'string' && typeof value !== 'number') continue\n\n // 转换 rpx 值\n if (typeof value === 'string' && value.includes('rpx')) {\n cleaned[key as keyof CSSProperties] = convertRpx(value, value) as any\n } else {\n cleaned[key as keyof CSSProperties] = value as any\n }\n }\n return cleaned\n}\n\n/** 将 CSS 字符串解析为 CSSProperties 对象 */\nfunction parseStyleString(styleStr: string): CSSProperties {\n const style: CSSProperties = {}\n const declarations = styleStr.split(';')\n\n for (const declaration of declarations) {\n const trimmed = declaration.trim()\n if (!trimmed) continue\n\n const colonIndex = trimmed.indexOf(':')\n if (colonIndex === -1) continue\n\n const property = trimmed.slice(0, colonIndex).trim()\n const value = trimmed.slice(colonIndex + 1).trim()\n\n if (property && value) {\n // 将 kebab-case 转换为 camelCase\n const camelProperty = property.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase())\n ;(style as any)[camelProperty] = value\n }\n }\n\n return style\n}\n\n/** 统一处理 style 属性,支持对象和字符串形式 */\nfunction normalizeStyle(style: CSSProperties | string | undefined): CSSProperties {\n if (!style) return {}\n if (typeof style === 'string') return parseStyleString(style)\n return style\n}\n\n/** 禁用阴影的配置 */\nconst DISABLE_SHADOW_CONFIG = {\n shadowBlur: 0,\n shadowColor: 'transparent',\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n}\n\n/**\n * 递归处理对象,覆盖 shadow 相关属性\n */\nfunction processShadowProps(obj: any): any {\n if (!obj || typeof obj !== 'object') {\n return obj\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => processShadowProps(item))\n }\n\n const result: any = {}\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const value = obj[key]\n \n if (key === 'shadowBlur' || key === 'shadowOffsetX' || key === 'shadowOffsetY') {\n result[key] = 0\n } else if (key === 'shadowColor') {\n result[key] = 'transparent'\n } else if (typeof value === 'object' && value !== null) {\n result[key] = processShadowProps(value)\n } else {\n result[key] = value\n }\n }\n }\n\n return result\n}\n\n/**\n * 禁用 option 中所有的阴影配置\n * Taro 小程序下 canvas 绘制阴影效果不佳,通过覆盖方式强制关闭\n * \n * 处理策略:\n * 1. tooltip - 强制追加 shadow 禁用配置(不论原来有没有)\n * 2. emphasis.itemStyle - 强制追加 shadow 禁用配置(不论原来有没有)\n * 3. 其他属性 - 遇到 shadow 相关属性才覆盖\n */\nfunction disableShadowInOption(option: any): any {\n if (!option || typeof option !== 'object') {\n return option\n }\n\n // 先递归处理所有 shadow 属性\n const result = processShadowProps(option)\n\n // 强制处理 tooltip - 追加 shadow 禁用配置\n if (result.tooltip && typeof result.tooltip === 'object') {\n result.tooltip = {\n ...result.tooltip,\n ...DISABLE_SHADOW_CONFIG,\n }\n }\n\n // 强制处理 series 中的 emphasis.itemStyle\n if (Array.isArray(result.series)) {\n result.series = result.series.map((series: any) => {\n if (series && typeof series === 'object' && series.emphasis) {\n return {\n ...series,\n emphasis: {\n ...series.emphasis,\n itemStyle: {\n ...(series.emphasis.itemStyle || {}),\n ...DISABLE_SHADOW_CONFIG,\n },\n },\n }\n }\n return series\n })\n }\n\n return result\n}\n\nexport interface EChartsProps {\n /** ECharts 配置项 */\n option: EChartsOption\n /** 图表高度 */\n height?: string\n /** 图表宽度 */\n width?: string\n /** CSS 类名 */\n className?: string\n /** 内联样式,可以是 CSSProperties 对象或 CSS 字符串,style 中的 width/height 会覆盖单独属性 */\n style?: CSSProperties | string\n}\n\nexport default function ECharts({ \n option, \n height = '300px', \n width = '100%',\n className = '',\n style,\n}: EChartsProps) {\n const normalizedStyle = normalizeStyle(style)\n const mergedStyle: CSSProperties = { width, height, ...normalizedStyle }\n \n const canvasId = useMemo(() => `chart_${Math.random().toString(36).slice(2, 11)}`, [])\n const chartRef = useRef<EChartsType | null>(null)\n const [isReady, setIsReady] = useState(false)\n const canvasNodeRef = useRef<any>(null)\n\n const isWeapp = Taro.getEnv() !== Taro.ENV_TYPE.WEB\n \n // 处理 option,禁用所有阴影配置(小程序 canvas 阴影效果不佳)\n const processedOption = useMemo(() => {\n return disableShadowInOption(option)\n }, [option])\n\n useEffect(() => {\n // H5 环境\n if (!isWeapp) {\n let mounted = true\n \n const initH5Chart = async () => {\n try {\n const echarts = await getEcharts()\n if (!mounted) return\n \n const container = document.getElementById(canvasId)\n if (!container) return\n\n chartRef.current?.dispose()\n chartRef.current = echarts.init(container)\n chartRef.current.setOption(processedOption)\n setIsReady(true)\n } catch (error) {\n console.error('[ECharts] H5 init failed:', error)\n }\n }\n\n initH5Chart()\n\n const handleResize = () => chartRef.current?.resize()\n window.addEventListener('resize', handleResize)\n\n return () => {\n mounted = false\n window.removeEventListener('resize', handleResize)\n chartRef.current?.dispose()\n chartRef.current = null\n }\n }\n\n // 小程序环境\n let mounted = true\n\n const initChart = async (retryCount = 0) => {\n if (!mounted) return\n\n Taro.createSelectorQuery()\n .select(`#${canvasId}`)\n .fields({ node: true, size: true })\n .exec(async (res) => {\n if (!mounted) return\n\n if (!res?.[0]?.node) {\n if (retryCount < 5) {\n setTimeout(() => initChart(retryCount + 1), 200 * (retryCount + 1))\n }\n return\n }\n\n const canvas = res[0].node\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n\n const dpr = Taro.getSystemInfoSync().pixelRatio\n const canvasWidth = res[0].width\n const canvasHeight = res[0].height\n\n canvasNodeRef.current = canvas\n canvas.width = canvasWidth * dpr\n canvas.height = canvasHeight * dpr\n ctx.scale(dpr, dpr)\n canvas.devicePixelRatio = dpr\n\n setupCanvasPolyfill(canvas, ctx)\n\n chartRef.current?.dispose()\n chartRef.current = null\n\n try {\n const echarts = await getEcharts()\n if (!mounted) return\n\n chartRef.current = echarts.init(canvas, null, {\n width: canvasWidth,\n height: canvasHeight,\n devicePixelRatio: dpr,\n })\n chartRef.current.setOption(processedOption)\n setIsReady(true)\n } catch (error) {\n console.error('[ECharts] Init failed:', error)\n }\n })\n }\n\n const timer = setTimeout(() => initChart(), 50)\n\n return () => {\n mounted = false\n clearTimeout(timer)\n chartRef.current?.dispose()\n chartRef.current = null\n }\n }, [canvasId, isWeapp])\n\n useEffect(() => {\n if (isReady && chartRef.current) {\n chartRef.current.setOption(processedOption, true)\n }\n }, [processedOption, isReady])\n\n const handleTouch = (e: any, eventType: string) => {\n if (!chartRef.current || !canvasNodeRef.current) return\n\n const touch = e.touches[0] || e.changedTouches[0]\n if (!touch) return\n\n const box = canvasNodeRef.current.getBoundingClientRect()\n // @ts-ignore\n chartRef.current.getZr().handler.dispatch(eventType, {\n zrX: touch.x - box.left,\n zrY: touch.y - box.top,\n preventDefault: () => {},\n stopPropagation: () => {},\n stopImmediatePropagation: () => {},\n })\n }\n\n const onTouchStart = (e: any) => {\n handleTouch(e, 'mousedown')\n }\n const onTouchMove = (e: any) => handleTouch(e, 'mousemove')\n const onTouchEnd = (e: any) => {\n handleTouch(e, 'mouseup')\n handleTouch(e, 'click')\n }\n\n // H5 环境\n if (!isWeapp) {\n const h5Style: CSSProperties = {\n ...cleanStyleForH5(mergedStyle),\n width: convertRpx(mergedStyle.width, '100%'),\n height: convertRpx(mergedStyle.height, '300px'),\n }\n return <div id={canvasId} className={className || undefined} style={h5Style} />\n }\n\n // 小程序环境\n return (\n <Canvas\n id={canvasId}\n type=\"2d\"\n className={className || undefined}\n style={{ width: mergedStyle.width || '100%', height: mergedStyle.height || '300px' }}\n disableScroll\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onTouchEnd={onTouchEnd}\n />\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/weappPlatform.ts","../src/polyfill.ts","../src/ECharts.tsx"],"names":["measureCtx","getMeasureCtx","Taro","setupWeappZrenderPlatform","setPlatformAPI","text","font","ctx","src","onload","onerror","img","cb","id","setupCanvasPolyfill","canvas","originalGetContext","type","dpr","defineSize","prop","value","echartsMod","echartsRegistered","getEcharts","echarts","CanvasRenderer","PieChart","BarChart","LineChart","ScatterChart","RadarChart","MapChart","TreeChart","TreemapChart","GraphChart","GaugeChart","FunnelChart","ParallelChart","SankeyChart","BoxplotChart","CandlestickChart","EffectScatterChart","LinesChart","HeatmapChart","PictorialBarChart","ThemeRiverChart","SunburstChart","CustomChart","TitleComponent","TooltipComponent","GridComponent","PolarComponent","RadarComponent","GeoComponent","SingleAxisComponent","ParallelComponent","CalendarComponent","GraphicComponent","ToolboxComponent","AxisPointerComponent","BrushComponent","LegendComponent","DataZoomComponent","DataZoomInsideComponent","DataZoomSliderComponent","VisualMapComponent","VisualMapContinuousComponent","VisualMapPiecewiseComponent","TimelineComponent","AriaComponent","TransformComponent","DatasetComponent","MarkPointComponent","MarkLineComponent","MarkAreaComponent","convertRpx","defaultValue","str","match","cleanStyleForH5","style","cleaned","key","parseStyleString","styleStr","declarations","declaration","trimmed","colonIndex","property","camelProperty","_","letter","normalizeStyle","DISABLE_SHADOW_CONFIG","processShadowProps","obj","item","result","disableShadowInOption","option","series","hasExplicitHeight","height","ECharts","width","className","defaultHeight","normalizedStyle","styleHeight","explicitHeight","mergedStyle","canvasId","useMemo","chartRef","useRef","isReady","setIsReady","useState","canvasNodeRef","isWeapp","processedOption","useEffect","mounted","container","error","handleResize","initChart","retryCount","res","canvasWidth","canvasHeight","timer","handleTouch","e","eventType","touch","box","onTouchStart","onTouchMove","onTouchEnd","finalHeight","h5Style","jsx","Canvas"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * 小程序 ZRender 平台适配\n * 通过 setPlatformAPI 接管 createCanvas/measureText,避免 ECharts 污染 Taro 渲染器\n */\n\n// @ts-ignore\nimport { setPlatformAPI } from 'zrender/lib/core/platform'\nimport Taro from '@tarojs/taro'\n\nlet measureCtx: any = null\n\nfunction getMeasureCtx() {\n if (measureCtx) return measureCtx\n try {\n const offscreen = Taro.createOffscreenCanvas({ type: '2d', width: 2, height: 2 })\n measureCtx = offscreen?.getContext('2d')\n } catch {}\n return measureCtx\n}\n\n/** 设置小程序 zrender 平台 API,必须在 import echarts 之前调用 */\nexport function setupWeappZrenderPlatform() {\n if (Taro.getEnv() === Taro.ENV_TYPE.WEB) return\n\n setPlatformAPI({\n createCanvas: () => {\n try {\n return Taro.createOffscreenCanvas({ type: '2d', width: 1, height: 1 })\n } catch {\n return { getContext: () => null } as any\n }\n },\n\n measureText: (text: string, font: string) => {\n const ctx = getMeasureCtx()\n if (!ctx) return { width: 0 }\n try {\n ctx.font = font || '12px sans-serif'\n return { width: ctx.measureText(text)?.width || 0 }\n } catch {\n return { width: 0 }\n }\n },\n\n loadImage: (src: string, onload: (img: any) => void, onerror: () => void) => {\n try {\n // @ts-ignore\n const img = (Taro as any).createImage?.()\n if (!img) return onerror()\n img.onload = () => onload(img)\n img.onerror = onerror\n img.src = src\n } catch {\n onerror()\n }\n },\n\n requestAnimationFrame: (cb: FrameRequestCallback) => setTimeout(cb, 16) as unknown as number,\n cancelAnimationFrame: (id: number) => clearTimeout(id),\n } as any)\n}\n","/**\n * Canvas Polyfill - 给小程序 canvas 节点补充 ECharts 需要的 DOM 兼容属性\n */\n\nexport function setupCanvasPolyfill(canvas: any, ctx: any) {\n if (!canvas.addEventListener) canvas.addEventListener = () => {}\n if (!canvas.removeEventListener) canvas.removeEventListener = () => {}\n if (!canvas.dispatchEvent) canvas.dispatchEvent = () => {}\n\n const originalGetContext = canvas.getContext.bind(canvas)\n canvas.getContext = (type: string) => {\n return (type === '2d' || type === '2d-text') ? ctx : originalGetContext(type)\n }\n\n if (!canvas.style) canvas.style = {}\n if (!canvas.setAttribute) canvas.setAttribute = () => {}\n if (!canvas.getAttribute) canvas.getAttribute = () => null\n if (!canvas.removeAttribute) canvas.removeAttribute = () => {}\n\n if (!canvas.getBoundingClientRect) {\n canvas.getBoundingClientRect = () => ({\n top: 0, left: 0,\n width: canvas.width, height: canvas.height,\n right: canvas.width, bottom: canvas.height,\n })\n }\n\n const dpr = canvas.devicePixelRatio || 1\n const defineSize = (prop: string, value: () => number) => {\n if (!Object.getOwnPropertyDescriptor(canvas, prop)) {\n Object.defineProperty(canvas, prop, { get: value })\n }\n }\n defineSize('offsetWidth', () => canvas.width / dpr)\n defineSize('offsetHeight', () => canvas.height / dpr)\n defineSize('clientWidth', () => canvas.width / dpr)\n defineSize('clientHeight', () => canvas.height / dpr)\n\n return canvas\n}\n","/**\n * Taro ECharts 组件\n * 小程序使用 zrender setPlatformAPI,H5 使用原生能力\n */\n\nimport { Canvas } from '@tarojs/components'\nimport Taro from '@tarojs/taro'\nimport { useEffect, useRef, useState, useMemo } from 'react'\nimport type { CSSProperties } from 'react'\nimport type { EChartsOption } from 'echarts'\nimport type { EChartsType } from 'echarts/core'\nimport { setupWeappZrenderPlatform } from './weappPlatform'\nimport { setupCanvasPolyfill } from './polyfill'\n\nlet echartsMod: typeof import('echarts/core') | null = null\nlet echartsRegistered = false\n\n/** 动态加载 echarts */\nasync function getEcharts() {\n if (echartsMod) return echartsMod\n\n // 小程序环境设置平台 API(内部会判断环境)\n setupWeappZrenderPlatform()\n\n const echarts = await import('echarts/core')\n \n if (!echartsRegistered) {\n const { CanvasRenderer } = await import('echarts/renderers')\n const {\n PieChart, BarChart, LineChart, ScatterChart, RadarChart,\n MapChart, TreeChart, TreemapChart, GraphChart, GaugeChart,\n FunnelChart, ParallelChart, SankeyChart, BoxplotChart,\n CandlestickChart, EffectScatterChart, LinesChart, HeatmapChart,\n PictorialBarChart, ThemeRiverChart, SunburstChart, CustomChart,\n } = await import('echarts/charts')\n const {\n TitleComponent, TooltipComponent, GridComponent, PolarComponent,\n RadarComponent, GeoComponent, SingleAxisComponent, ParallelComponent,\n CalendarComponent, GraphicComponent, ToolboxComponent, AxisPointerComponent,\n BrushComponent, LegendComponent, DataZoomComponent, DataZoomInsideComponent,\n DataZoomSliderComponent, VisualMapComponent, VisualMapContinuousComponent,\n VisualMapPiecewiseComponent, TimelineComponent, AriaComponent,\n TransformComponent, DatasetComponent, MarkPointComponent,\n MarkLineComponent, MarkAreaComponent,\n } = await import('echarts/components')\n\n echarts.use([\n CanvasRenderer,\n PieChart, BarChart, LineChart, ScatterChart, RadarChart,\n MapChart, TreeChart, TreemapChart, GraphChart, GaugeChart,\n FunnelChart, ParallelChart, SankeyChart, BoxplotChart,\n CandlestickChart, EffectScatterChart, LinesChart, HeatmapChart,\n PictorialBarChart, ThemeRiverChart, SunburstChart, CustomChart,\n TitleComponent, TooltipComponent, GridComponent, PolarComponent,\n RadarComponent, GeoComponent, SingleAxisComponent, ParallelComponent,\n CalendarComponent, GraphicComponent, ToolboxComponent, AxisPointerComponent,\n BrushComponent, LegendComponent, DataZoomComponent, DataZoomInsideComponent,\n DataZoomSliderComponent, VisualMapComponent, VisualMapContinuousComponent,\n VisualMapPiecewiseComponent, TimelineComponent, AriaComponent,\n TransformComponent, DatasetComponent, MarkPointComponent,\n MarkLineComponent, MarkAreaComponent,\n ])\n\n echartsRegistered = true\n }\n\n echartsMod = echarts\n return echarts\n}\n\n/** 将 rpx 转换为 px(H5 inline style 需要,PostCSS 只处理 CSS 文件) */\nfunction convertRpx(value: string | number | undefined, defaultValue: string): string {\n if (value === undefined || value === null || value === '') return defaultValue\n if (typeof value === 'number') return `${value}px`\n\n const str = String(value)\n const match = str.match(/^(-?\\d+(?:\\.\\d+)?)(rpx)$/i)\n if (match && match[1]) {\n return `${parseFloat(match[1]) / 2}px`\n }\n return str\n}\n\n/** 清理 style 对象,过滤掉无效值并转换 rpx(H5 模式专用) */\nfunction cleanStyleForH5(style: CSSProperties | undefined): CSSProperties {\n if (!style || typeof style !== 'object') return {}\n\n const cleaned: CSSProperties = {}\n for (const [key, value] of Object.entries(style)) {\n // 过滤掉 null、undefined、函数和非字符串/数字值\n if (value === null || value === undefined) continue\n if (typeof value === 'function') continue\n if (typeof value !== 'string' && typeof value !== 'number') continue\n\n // 转换 rpx 值\n if (typeof value === 'string' && value.includes('rpx')) {\n cleaned[key as keyof CSSProperties] = convertRpx(value, value) as any\n } else {\n cleaned[key as keyof CSSProperties] = value as any\n }\n }\n return cleaned\n}\n\n/** 将 CSS 字符串解析为 CSSProperties 对象 */\nfunction parseStyleString(styleStr: string): CSSProperties {\n const style: CSSProperties = {}\n const declarations = styleStr.split(';')\n\n for (const declaration of declarations) {\n const trimmed = declaration.trim()\n if (!trimmed) continue\n\n const colonIndex = trimmed.indexOf(':')\n if (colonIndex === -1) continue\n\n const property = trimmed.slice(0, colonIndex).trim()\n const value = trimmed.slice(colonIndex + 1).trim()\n\n if (property && value) {\n // 将 kebab-case 转换为 camelCase\n const camelProperty = property.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase())\n ;(style as any)[camelProperty] = value\n }\n }\n\n return style\n}\n\n/** 统一处理 style 属性,支持对象和字符串形式 */\nfunction normalizeStyle(style: CSSProperties | string | undefined): CSSProperties {\n if (!style) return {}\n if (typeof style === 'string') return parseStyleString(style)\n return style\n}\n\n/** 禁用阴影的配置 */\nconst DISABLE_SHADOW_CONFIG = {\n shadowBlur: 0,\n shadowColor: 'transparent',\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n}\n\n/**\n * 递归处理对象,覆盖 shadow 相关属性\n */\nfunction processShadowProps(obj: any): any {\n if (!obj || typeof obj !== 'object') {\n return obj\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => processShadowProps(item))\n }\n\n const result: any = {}\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const value = obj[key]\n \n if (key === 'shadowBlur' || key === 'shadowOffsetX' || key === 'shadowOffsetY') {\n result[key] = 0\n } else if (key === 'shadowColor') {\n result[key] = 'transparent'\n } else if (typeof value === 'object' && value !== null) {\n result[key] = processShadowProps(value)\n } else {\n result[key] = value\n }\n }\n }\n\n return result\n}\n\n/**\n * 禁用 option 中所有的阴影配置\n * Taro 小程序下 canvas 绘制阴影效果不佳,通过覆盖方式强制关闭\n * \n * 处理策略:\n * 1. tooltip - 强制追加 shadow 禁用配置(不论原来有没有)\n * 2. emphasis.itemStyle - 强制追加 shadow 禁用配置(不论原来有没有)\n * 3. 其他属性 - 遇到 shadow 相关属性才覆盖\n */\nfunction disableShadowInOption(option: any): any {\n if (!option || typeof option !== 'object') {\n return option\n }\n\n // 先递归处理所有 shadow 属性\n const result = processShadowProps(option)\n\n // 强制处理 tooltip - 追加 shadow 禁用配置\n if (result.tooltip && typeof result.tooltip === 'object') {\n result.tooltip = {\n ...result.tooltip,\n ...DISABLE_SHADOW_CONFIG,\n }\n }\n\n // 强制处理 series 中的 emphasis.itemStyle\n if (Array.isArray(result.series)) {\n result.series = result.series.map((series: any) => {\n if (series && typeof series === 'object' && series.emphasis) {\n return {\n ...series,\n emphasis: {\n ...series.emphasis,\n itemStyle: {\n ...(series.emphasis.itemStyle || {}),\n ...DISABLE_SHADOW_CONFIG,\n },\n },\n }\n }\n return series\n })\n }\n\n return result\n}\n\nexport interface EChartsProps {\n /** ECharts 配置项 */\n option: EChartsOption\n /** 图表高度,默认 '100%' 表示填充父容器,未设置父容器高度时回退到 300px */\n height?: string\n /** 图表宽度,默认 '100%' */\n width?: string\n /** CSS 类名 */\n className?: string\n /** 内联样式,可以是 CSSProperties 对象或 CSS 字符串,style 中的 width/height 会覆盖单独属性 */\n style?: CSSProperties | string\n /** 默认高度,当无法获取容器尺寸时使用,默认 300px */\n defaultHeight?: string\n}\n\n/** 检测是否有明确的非百分比高度设置 */\nfunction hasExplicitHeight(height: string | undefined): boolean {\n if (!height) return false\n // 排除百分比和 auto\n return !height.endsWith('%') && height !== 'auto'\n}\n\nexport default function ECharts({\n option,\n height = '100%',\n width = '100%',\n className = '',\n style,\n defaultHeight = '300px',\n}: EChartsProps) {\n const normalizedStyle = normalizeStyle(style)\n const styleHeight = normalizedStyle.height as string | undefined\n\n // 优先级:style.height > height prop > '100%'\n // 如果都是百分比或 auto,则需要后续通过测量获取实际尺寸\n const explicitHeight = styleHeight || (hasExplicitHeight(height) ? height : undefined)\n const mergedStyle: CSSProperties = { width, height: styleHeight || height, ...normalizedStyle }\n \n const canvasId = useMemo(() => `chart_${Math.random().toString(36).slice(2, 11)}`, [])\n const chartRef = useRef<EChartsType | null>(null)\n const [isReady, setIsReady] = useState(false)\n const canvasNodeRef = useRef<any>(null)\n\n const isWeapp = Taro.getEnv() !== Taro.ENV_TYPE.WEB\n \n // 处理 option,禁用所有阴影配置(小程序 canvas 阴影效果不佳)\n const processedOption = useMemo(() => {\n return disableShadowInOption(option)\n }, [option])\n\n useEffect(() => {\n // H5 环境\n if (!isWeapp) {\n let mounted = true\n \n const initH5Chart = async () => {\n try {\n const echarts = await getEcharts()\n if (!mounted) return\n \n const container = document.getElementById(canvasId)\n if (!container) return\n\n chartRef.current?.dispose()\n chartRef.current = echarts.init(container)\n chartRef.current.setOption(processedOption)\n setIsReady(true)\n } catch (error) {\n console.error('[ECharts] H5 init failed:', error)\n }\n }\n\n initH5Chart()\n\n const handleResize = () => chartRef.current?.resize()\n window.addEventListener('resize', handleResize)\n\n return () => {\n mounted = false\n window.removeEventListener('resize', handleResize)\n chartRef.current?.dispose()\n chartRef.current = null\n }\n }\n\n // 小程序环境\n let mounted = true\n\n const initChart = async (retryCount = 0) => {\n if (!mounted) return\n\n Taro.createSelectorQuery()\n .select(`#${canvasId}`)\n .fields({ node: true, size: true })\n .exec(async (res) => {\n if (!mounted) return\n\n if (!res?.[0]?.node) {\n if (retryCount < 5) {\n setTimeout(() => initChart(retryCount + 1), 200 * (retryCount + 1))\n }\n return\n }\n\n const canvas = res[0].node\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n\n const dpr = Taro.getSystemInfoSync().pixelRatio\n let canvasWidth = res[0].width\n let canvasHeight = res[0].height\n\n // 如果没有明确设置高度且获取到的尺寸为 0,使用默认高度\n if (!explicitHeight && (canvasHeight <= 0 || !canvasHeight)) {\n console.warn(\n `[ECharts] Warning: Container has no explicit height. ` +\n `ECharts will use default height (${defaultHeight}), ` +\n `but the canvas may not be visible. ` +\n `To fix this, either:\\n` +\n `1. Set parent container height: <View style={{ height: '300px' }}>\\n` +\n `2. Set ECharts height prop: <ECharts height=\"300px\" />\\n` +\n `3. Set ECharts style: <ECharts style={{ height: '300px' }} />`\n )\n // 转换默认高度(如果是 rpx 转为 px)\n const fallbackHeight = parseInt(defaultHeight)\n canvasHeight = fallbackHeight || 300\n }\n\n canvasNodeRef.current = canvas\n canvas.width = canvasWidth * dpr\n canvas.height = canvasHeight * dpr\n ctx.scale(dpr, dpr)\n canvas.devicePixelRatio = dpr\n\n setupCanvasPolyfill(canvas, ctx)\n\n chartRef.current?.dispose()\n chartRef.current = null\n\n try {\n const echarts = await getEcharts()\n if (!mounted) return\n\n chartRef.current = echarts.init(canvas, null, {\n width: canvasWidth,\n height: canvasHeight,\n devicePixelRatio: dpr,\n })\n chartRef.current.setOption(processedOption)\n setIsReady(true)\n } catch (error) {\n console.error('[ECharts] Init failed:', error)\n }\n })\n }\n\n const timer = setTimeout(() => initChart(), 50)\n\n return () => {\n mounted = false\n clearTimeout(timer)\n chartRef.current?.dispose()\n chartRef.current = null\n }\n }, [canvasId, isWeapp])\n\n useEffect(() => {\n if (isReady && chartRef.current) {\n chartRef.current.setOption(processedOption, true)\n }\n }, [processedOption, isReady])\n\n const handleTouch = (e: any, eventType: string) => {\n if (!chartRef.current || !canvasNodeRef.current) return\n\n const touch = e.touches[0] || e.changedTouches[0]\n if (!touch) return\n\n const box = canvasNodeRef.current.getBoundingClientRect()\n // @ts-ignore\n chartRef.current.getZr().handler.dispatch(eventType, {\n zrX: touch.x - box.left,\n zrY: touch.y - box.top,\n preventDefault: () => {},\n stopPropagation: () => {},\n stopImmediatePropagation: () => {},\n })\n }\n\n const onTouchStart = (e: any) => {\n handleTouch(e, 'mousedown')\n }\n const onTouchMove = (e: any) => handleTouch(e, 'mousemove')\n const onTouchEnd = (e: any) => {\n handleTouch(e, 'mouseup')\n handleTouch(e, 'click')\n }\n\n // H5 环境\n if (!isWeapp) {\n // 如果没有明确高度且没有设置百分比高度,使用默认高度\n const finalHeight = explicitHeight\n ? convertRpx(explicitHeight, defaultHeight)\n : convertRpx(height, '100%')\n\n const h5Style: CSSProperties = {\n ...cleanStyleForH5(mergedStyle),\n width: convertRpx(mergedStyle.width, '100%'),\n height: finalHeight,\n }\n return <div id={canvasId} className={className || undefined} style={h5Style} />\n }\n\n // 小程序环境\n // style 保持使用百分比,让父容器决定尺寸\n // 如果父容器没有高度,init 时会使用 defaultHeight\n return (\n <Canvas\n id={canvasId}\n type=\"2d\"\n className={className || undefined}\n style={{ width: mergedStyle.width || '100%', height: mergedStyle.height || defaultHeight }}\n disableScroll\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onTouchEnd={onTouchEnd}\n />\n )\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -7,16 +7,18 @@ export { setupCanvasPolyfill } from './polyfill.cjs';
|
|
|
7
7
|
interface EChartsProps {
|
|
8
8
|
/** ECharts 配置项 */
|
|
9
9
|
option: EChartsOption;
|
|
10
|
-
/**
|
|
10
|
+
/** 图表高度,默认 '100%' 表示填充父容器,未设置父容器高度时回退到 300px */
|
|
11
11
|
height?: string;
|
|
12
|
-
/**
|
|
12
|
+
/** 图表宽度,默认 '100%' */
|
|
13
13
|
width?: string;
|
|
14
14
|
/** CSS 类名 */
|
|
15
15
|
className?: string;
|
|
16
16
|
/** 内联样式,可以是 CSSProperties 对象或 CSS 字符串,style 中的 width/height 会覆盖单独属性 */
|
|
17
17
|
style?: CSSProperties | string;
|
|
18
|
+
/** 默认高度,当无法获取容器尺寸时使用,默认 300px */
|
|
19
|
+
defaultHeight?: string;
|
|
18
20
|
}
|
|
19
|
-
declare function ECharts({ option, height, width, className, style, }: EChartsProps): react_jsx_runtime.JSX.Element;
|
|
21
|
+
declare function ECharts({ option, height, width, className, style, defaultHeight, }: EChartsProps): react_jsx_runtime.JSX.Element;
|
|
20
22
|
|
|
21
23
|
/**
|
|
22
24
|
* 小程序 ZRender 平台适配
|
package/dist/index.d.ts
CHANGED
|
@@ -7,16 +7,18 @@ export { setupCanvasPolyfill } from './polyfill.js';
|
|
|
7
7
|
interface EChartsProps {
|
|
8
8
|
/** ECharts 配置项 */
|
|
9
9
|
option: EChartsOption;
|
|
10
|
-
/**
|
|
10
|
+
/** 图表高度,默认 '100%' 表示填充父容器,未设置父容器高度时回退到 300px */
|
|
11
11
|
height?: string;
|
|
12
|
-
/**
|
|
12
|
+
/** 图表宽度,默认 '100%' */
|
|
13
13
|
width?: string;
|
|
14
14
|
/** CSS 类名 */
|
|
15
15
|
className?: string;
|
|
16
16
|
/** 内联样式,可以是 CSSProperties 对象或 CSS 字符串,style 中的 width/height 会覆盖单独属性 */
|
|
17
17
|
style?: CSSProperties | string;
|
|
18
|
+
/** 默认高度,当无法获取容器尺寸时使用,默认 300px */
|
|
19
|
+
defaultHeight?: string;
|
|
18
20
|
}
|
|
19
|
-
declare function ECharts({ option, height, width, className, style, }: EChartsProps): react_jsx_runtime.JSX.Element;
|
|
21
|
+
declare function ECharts({ option, height, width, className, style, defaultHeight, }: EChartsProps): react_jsx_runtime.JSX.Element;
|
|
20
22
|
|
|
21
23
|
/**
|
|
22
24
|
* 小程序 ZRender 平台适配
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,5 @@
|
|
|
1
|
-
import {Canvas}from'@tarojs/components';import
|
|
1
|
+
import {Canvas}from'@tarojs/components';import O from'@tarojs/taro';import {useMemo,useRef,useState,useEffect}from'react';import {setPlatformAPI}from'zrender/lib/core/platform';import {jsx}from'react/jsx-runtime';var k=null;function dt(){if(k)return k;try{k=O.createOffscreenCanvas({type:"2d",width:2,height:2})?.getContext("2d");}catch{}return k}function L(){O.getEnv()!==O.ENV_TYPE.WEB&&setPlatformAPI({createCanvas:()=>{try{return O.createOffscreenCanvas({type:"2d",width:1,height:1})}catch{return {getContext:()=>null}}},measureText:(t,n)=>{let e=dt();if(!e)return {width:0};try{return e.font=n||"12px sans-serif",{width:e.measureText(t)?.width||0}}catch{return {width:0}}},loadImage:(t,n,e)=>{try{let r=O.createImage?.();if(!r)return e();r.onload=()=>n(r),r.onerror=e,r.src=t;}catch{e();}},requestAnimationFrame:t=>setTimeout(t,16),cancelAnimationFrame:t=>clearTimeout(t)});}function v(t,n){t.addEventListener||(t.addEventListener=()=>{}),t.removeEventListener||(t.removeEventListener=()=>{}),t.dispatchEvent||(t.dispatchEvent=()=>{});let e=t.getContext.bind(t);t.getContext=s=>s==="2d"||s==="2d-text"?n:e(s),t.style||(t.style={}),t.setAttribute||(t.setAttribute=()=>{}),t.getAttribute||(t.getAttribute=()=>null),t.removeAttribute||(t.removeAttribute=()=>{}),t.getBoundingClientRect||(t.getBoundingClientRect=()=>({top:0,left:0,width:t.width,height:t.height,right:t.width,bottom:t.height}));let r=t.devicePixelRatio||1,a=(s,h)=>{Object.getOwnPropertyDescriptor(t,s)||Object.defineProperty(t,s,{get:h});};return a("offsetWidth",()=>t.width/r),a("offsetHeight",()=>t.height/r),a("clientWidth",()=>t.width/r),a("clientHeight",()=>t.height/r),t}var D=null,V=false;async function _(){if(D)return D;L();let t=await import('echarts/core');if(!V){let{CanvasRenderer:n}=await import('echarts/renderers'),{PieChart:e,BarChart:r,LineChart:a,ScatterChart:s,RadarChart:h,MapChart:m,TreeChart:C,TreemapChart:y,GraphChart:l,GaugeChart:o,FunnelChart:R,ParallelChart:A,SankeyChart:T,BoxplotChart:b,CandlestickChart:x,EffectScatterChart:P,LinesChart:M,HeatmapChart:W,PictorialBarChart:z,ThemeRiverChart:i,SunburstChart:d,CustomChart:g}=await import('echarts/charts'),{TitleComponent:u,TooltipComponent:S,GridComponent:c,PolarComponent:f,RadarComponent:p,GeoComponent:I,SingleAxisComponent:w,ParallelComponent:E,CalendarComponent:j,GraphicComponent:q,ToolboxComponent:Q,AxisPointerComponent:U,BrushComponent:J,LegendComponent:K,DataZoomComponent:tt,DataZoomInsideComponent:et,DataZoomSliderComponent:rt,VisualMapComponent:nt,VisualMapContinuousComponent:ot,VisualMapPiecewiseComponent:it,TimelineComponent:st,AriaComponent:at,TransformComponent:ct,DatasetComponent:ut,MarkPointComponent:pt,MarkLineComponent:ht,MarkAreaComponent:lt}=await import('echarts/components');t.use([n,e,r,a,s,h,m,C,y,l,o,R,A,T,b,x,P,M,W,z,i,d,g,u,S,c,f,p,I,w,E,j,q,Q,U,J,K,tt,et,rt,nt,ot,it,st,at,ct,ut,pt,ht,lt]),V=true;}return D=t,t}function H(t,n){if(t==null||t==="")return n;if(typeof t=="number")return `${t}px`;let e=String(t),r=e.match(/^(-?\d+(?:\.\d+)?)(rpx)$/i);return r&&r[1]?`${parseFloat(r[1])/2}px`:e}function yt(t){if(!t||typeof t!="object")return {};let n={};for(let[e,r]of Object.entries(t))r!=null&&typeof r!="function"&&(typeof r!="string"&&typeof r!="number"||(typeof r=="string"&&r.includes("rpx")?n[e]=H(r,r):n[e]=r));return n}function gt(t){let n={},e=t.split(";");for(let r of e){let a=r.trim();if(!a)continue;let s=a.indexOf(":");if(s===-1)continue;let h=a.slice(0,s).trim(),m=a.slice(s+1).trim();if(h&&m){let C=h.replace(/-([a-z])/g,(y,l)=>l.toUpperCase());n[C]=m;}}return n}function St(t){return t?typeof t=="string"?gt(t):t:{}}var $={shadowBlur:0,shadowColor:"transparent",shadowOffsetX:0,shadowOffsetY:0};function F(t){if(!t||typeof t!="object")return t;if(Array.isArray(t))return t.map(e=>F(e));let n={};for(let e in t)if(Object.prototype.hasOwnProperty.call(t,e)){let r=t[e];e==="shadowBlur"||e==="shadowOffsetX"||e==="shadowOffsetY"?n[e]=0:e==="shadowColor"?n[e]="transparent":typeof r=="object"&&r!==null?n[e]=F(r):n[e]=r;}return n}function wt(t){if(!t||typeof t!="object")return t;let n=F(t);return n.tooltip&&typeof n.tooltip=="object"&&(n.tooltip={...n.tooltip,...$}),Array.isArray(n.series)&&(n.series=n.series.map(e=>e&&typeof e=="object"&&e.emphasis?{...e,emphasis:{...e.emphasis,itemStyle:{...e.emphasis.itemStyle||{},...$}}}:e)),n}function xt(t){return t?!t.endsWith("%")&&t!=="auto":false}function X({option:t,height:n="100%",width:e="100%",className:r="",style:a,defaultHeight:s="300px"}){let h=St(a),m=h.height,C=m||(xt(n)?n:void 0),y={width:e,height:m||n,...h},l=useMemo(()=>`chart_${Math.random().toString(36).slice(2,11)}`,[]),o=useRef(null),[R,A]=useState(false),T=useRef(null),b=O.getEnv()!==O.ENV_TYPE.WEB,x=useMemo(()=>wt(t),[t]);useEffect(()=>{if(!b){let u=true;(async()=>{try{let f=await _();if(!u)return;let p=document.getElementById(l);if(!p)return;o.current?.dispose(),o.current=f.init(p),o.current.setOption(x),A(!0);}catch(f){console.error("[ECharts] H5 init failed:",f);}})();let c=()=>o.current?.resize();return window.addEventListener("resize",c),()=>{u=false,window.removeEventListener("resize",c),o.current?.dispose(),o.current=null;}}let i=true,d=async(u=0)=>{i&&O.createSelectorQuery().select(`#${l}`).fields({node:true,size:true}).exec(async S=>{if(!i)return;if(!S?.[0]?.node){u<5&&setTimeout(()=>d(u+1),200*(u+1));return}let c=S[0].node,f=c.getContext("2d");if(!f)return;let p=O.getSystemInfoSync().pixelRatio,I=S[0].width,w=S[0].height;!C&&(w<=0||!w)&&(console.warn(`[ECharts] Warning: Container has no explicit height. ECharts will use default height (${s}), but the canvas may not be visible. To fix this, either:
|
|
2
|
+
1. Set parent container height: <View style={{ height: '300px' }}>
|
|
3
|
+
2. Set ECharts height prop: <ECharts height="300px" />
|
|
4
|
+
3. Set ECharts style: <ECharts style={{ height: '300px' }} />`),w=parseInt(s)||300),T.current=c,c.width=I*p,c.height=w*p,f.scale(p,p),c.devicePixelRatio=p,v(c,f),o.current?.dispose(),o.current=null;try{let E=await _();if(!i)return;o.current=E.init(c,null,{width:I,height:w,devicePixelRatio:p}),o.current.setOption(x),A(!0);}catch(E){console.error("[ECharts] Init failed:",E);}});},g=setTimeout(()=>d(),50);return ()=>{i=false,clearTimeout(g),o.current?.dispose(),o.current=null;}},[l,b]),useEffect(()=>{R&&o.current&&o.current.setOption(x,true);},[x,R]);let P=(i,d)=>{if(!o.current||!T.current)return;let g=i.touches[0]||i.changedTouches[0];if(!g)return;let u=T.current.getBoundingClientRect();o.current.getZr().handler.dispatch(d,{zrX:g.x-u.left,zrY:g.y-u.top,preventDefault:()=>{},stopPropagation:()=>{},stopImmediatePropagation:()=>{}});},M=i=>{P(i,"mousedown");},W=i=>P(i,"mousemove"),z=i=>{P(i,"mouseup"),P(i,"click");};if(!b){let i=C?H(C,s):H(n,"100%"),d={...yt(y),width:H(y.width,"100%"),height:i};return jsx("div",{id:l,className:r||void 0,style:d})}return jsx(Canvas,{id:l,type:"2d",className:r||void 0,style:{width:y.width||"100%",height:y.height||s},disableScroll:true,onTouchStart:M,onTouchMove:W,onTouchEnd:z})}export{X as ECharts,v as setupCanvasPolyfill,L as setupWeappZrenderPlatform};//# sourceMappingURL=index.js.map
|
|
2
5
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/weappPlatform.ts","../src/polyfill.ts","../src/ECharts.tsx"],"names":["measureCtx","getMeasureCtx","Taro","setupWeappZrenderPlatform","setPlatformAPI","text","font","ctx","src","onload","onerror","img","cb","id","setupCanvasPolyfill","canvas","originalGetContext","type","dpr","defineSize","prop","value","echartsMod","echartsRegistered","getEcharts","echarts","CanvasRenderer","PieChart","BarChart","LineChart","ScatterChart","RadarChart","MapChart","TreeChart","TreemapChart","GraphChart","GaugeChart","FunnelChart","ParallelChart","SankeyChart","BoxplotChart","CandlestickChart","EffectScatterChart","LinesChart","HeatmapChart","PictorialBarChart","ThemeRiverChart","SunburstChart","CustomChart","TitleComponent","TooltipComponent","GridComponent","PolarComponent","RadarComponent","GeoComponent","SingleAxisComponent","ParallelComponent","CalendarComponent","GraphicComponent","ToolboxComponent","AxisPointerComponent","BrushComponent","LegendComponent","DataZoomComponent","DataZoomInsideComponent","DataZoomSliderComponent","VisualMapComponent","VisualMapContinuousComponent","VisualMapPiecewiseComponent","TimelineComponent","AriaComponent","TransformComponent","DatasetComponent","MarkPointComponent","MarkLineComponent","MarkAreaComponent","convertRpx","defaultValue","str","match","cleanStyleForH5","style","cleaned","key","parseStyleString","styleStr","declarations","declaration","trimmed","colonIndex","property","camelProperty","_","letter","normalizeStyle","DISABLE_SHADOW_CONFIG","processShadowProps","obj","item","result","disableShadowInOption","option","series","ECharts","height","width","className","normalizedStyle","mergedStyle","canvasId","useMemo","chartRef","useRef","isReady","setIsReady","useState","canvasNodeRef","isWeapp","processedOption","useEffect","mounted","container","error","handleResize","initChart","retryCount","res","canvasWidth","canvasHeight","timer","handleTouch","e","eventType","touch","box","onTouchStart","onTouchMove","onTouchEnd","h5Style","jsx","Canvas"],"mappings":"qNASA,IAAIA,CAAAA,CAAkB,KAEtB,SAASC,EAAAA,EAAgB,CACvB,GAAID,CAAAA,CAAY,OAAOA,CAAAA,CACvB,GAAI,CAEFA,CAAAA,CADkBE,CAAAA,CAAK,sBAAsB,CAAE,IAAA,CAAM,KAAM,KAAA,CAAO,CAAA,CAAG,MAAA,CAAQ,CAAE,CAAC,CAAA,EACxD,UAAA,CAAW,IAAI,EACzC,CAAA,KAAQ,CAAC,CACT,OAAOF,CACT,CAGO,SAASG,CAAAA,EAA4B,CACtCD,EAAK,MAAA,EAAO,GAAMA,EAAK,QAAA,CAAS,GAAA,EAEpCE,cAAAA,CAAe,CACb,aAAc,IAAM,CAClB,GAAI,CACF,OAAOF,EAAK,qBAAA,CAAsB,CAAE,KAAM,IAAA,CAAM,KAAA,CAAO,EAAG,MAAA,CAAQ,CAAE,CAAC,CACvE,CAAA,KAAQ,CACN,OAAO,CAAE,UAAA,CAAY,IAAM,IAAK,CAClC,CACF,EAEA,WAAA,CAAa,CAACG,EAAcC,CAAAA,GAAiB,CAC3C,IAAMC,CAAAA,CAAMN,IAAc,CAC1B,GAAI,CAACM,CAAAA,CAAK,OAAO,CAAE,KAAA,CAAO,CAAE,CAAA,CAC5B,GAAI,CACF,OAAAA,CAAAA,CAAI,KAAOD,CAAAA,EAAQ,iBAAA,CACZ,CAAE,KAAA,CAAOC,CAAAA,CAAI,YAAYF,CAAI,CAAA,EAAG,OAAS,CAAE,CACpD,MAAQ,CACN,OAAO,CAAE,KAAA,CAAO,CAAE,CACpB,CACF,EAEA,SAAA,CAAW,CAACG,EAAaC,CAAAA,CAA4BC,CAAAA,GAAwB,CAC3E,GAAI,CAEF,IAAMC,CAAAA,CAAOT,CAAAA,CAAa,eAAc,CACxC,GAAI,CAACS,CAAAA,CAAK,OAAOD,GAAQ,CACzBC,CAAAA,CAAI,MAAA,CAAS,IAAMF,EAAOE,CAAG,CAAA,CAC7BA,EAAI,OAAA,CAAUD,CAAAA,CACdC,EAAI,GAAA,CAAMH,EACZ,MAAQ,CACNE,CAAAA,GACF,CACF,CAAA,CAEA,sBAAwBE,CAAAA,EAA6B,UAAA,CAAWA,EAAI,EAAE,CAAA,CACtE,oBAAA,CAAuBC,CAAAA,EAAe,aAAaA,CAAE,CACvD,CAAQ,EACV,CCxDO,SAASC,CAAAA,CAAoBC,CAAAA,CAAaR,CAAAA,CAAU,CACpDQ,EAAO,gBAAA,GAAkBA,CAAAA,CAAO,iBAAmB,IAAM,CAAC,GAC1DA,CAAAA,CAAO,mBAAA,GAAqBA,CAAAA,CAAO,mBAAA,CAAsB,IAAM,CAAC,CAAA,CAAA,CAChEA,EAAO,aAAA,GAAeA,CAAAA,CAAO,cAAgB,IAAM,CAAC,GAEzD,IAAMC,CAAAA,CAAqBD,EAAO,UAAA,CAAW,IAAA,CAAKA,CAAM,CAAA,CACxDA,CAAAA,CAAO,WAAcE,CAAAA,EACXA,CAAAA,GAAS,IAAA,EAAQA,CAAAA,GAAS,UAAaV,CAAAA,CAAMS,CAAAA,CAAmBC,CAAI,CAAA,CAGzEF,CAAAA,CAAO,QAAOA,CAAAA,CAAO,KAAA,CAAQ,EAAC,CAAA,CAC9BA,CAAAA,CAAO,eAAcA,CAAAA,CAAO,YAAA,CAAe,IAAM,CAAC,CAAA,CAAA,CAClDA,EAAO,YAAA,GAAcA,CAAAA,CAAO,YAAA,CAAe,IAAM,MACjDA,CAAAA,CAAO,eAAA,GAAiBA,EAAO,eAAA,CAAkB,IAAM,CAAC,CAAA,CAAA,CAExDA,CAAAA,CAAO,wBACVA,CAAAA,CAAO,qBAAA,CAAwB,KAAO,CACpC,GAAA,CAAK,EAAG,IAAA,CAAM,CAAA,CACd,MAAOA,CAAAA,CAAO,KAAA,CAAO,MAAA,CAAQA,CAAAA,CAAO,OACpC,KAAA,CAAOA,CAAAA,CAAO,MAAO,MAAA,CAAQA,CAAAA,CAAO,MACtC,CAAA,CAAA,CAAA,CAGF,IAAMG,CAAAA,CAAMH,CAAAA,CAAO,kBAAoB,CAAA,CACjCI,CAAAA,CAAa,CAACC,CAAAA,CAAcC,CAAAA,GAAwB,CACnD,MAAA,CAAO,wBAAA,CAAyBN,CAAAA,CAAQK,CAAI,GAC/C,MAAA,CAAO,cAAA,CAAeL,EAAQK,CAAAA,CAAM,CAAE,IAAKC,CAAM,CAAC,EAEtD,CAAA,CACA,OAAAF,EAAW,aAAA,CAAe,IAAMJ,EAAO,KAAA,CAAQG,CAAG,EAClDC,CAAAA,CAAW,cAAA,CAAgB,IAAMJ,CAAAA,CAAO,OAASG,CAAG,CAAA,CACpDC,EAAW,aAAA,CAAe,IAAMJ,EAAO,KAAA,CAAQG,CAAG,EAClDC,CAAAA,CAAW,cAAA,CAAgB,IAAMJ,CAAAA,CAAO,MAAA,CAASG,CAAG,CAAA,CAE7CH,CACT,CCzBA,IAAIO,EAAmD,IAAA,CACnDC,CAAAA,CAAoB,MAGxB,eAAeC,CAAAA,EAAa,CAC1B,GAAIF,CAAAA,CAAY,OAAOA,CAAAA,CAGvBnB,CAAAA,GAEA,IAAMsB,CAAAA,CAAU,MAAM,OAAO,cAAc,EAE3C,GAAI,CAACF,CAAAA,CAAmB,CACtB,GAAM,CAAE,cAAA,CAAAG,CAAe,CAAA,CAAI,aAAa,mBAAmB,CAAA,CACrD,CACJ,QAAA,CAAAC,EAAU,QAAA,CAAAC,CAAAA,CAAU,UAAAC,CAAAA,CAAW,YAAA,CAAAC,EAAc,UAAA,CAAAC,CAAAA,CAC7C,QAAA,CAAAC,CAAAA,CAAU,UAAAC,CAAAA,CAAW,YAAA,CAAAC,EAAc,UAAA,CAAAC,CAAAA,CAAY,WAAAC,CAAAA,CAC/C,WAAA,CAAAC,EAAa,aAAA,CAAAC,CAAAA,CAAe,YAAAC,CAAAA,CAAa,YAAA,CAAAC,EACzC,gBAAA,CAAAC,CAAAA,CAAkB,mBAAAC,CAAAA,CAAoB,UAAA,CAAAC,CAAAA,CAAY,YAAA,CAAAC,EAClD,iBAAA,CAAAC,CAAAA,CAAmB,gBAAAC,CAAAA,CAAiB,aAAA,CAAAC,EAAe,WAAA,CAAAC,CACrD,EAAI,MAAM,OAAO,gBAAgB,CAAA,CAC3B,CACJ,eAAAC,CAAAA,CAAgB,gBAAA,CAAAC,EAAkB,aAAA,CAAAC,CAAAA,CAAe,cAAA,CAAAC,CAAAA,CACjD,eAAAC,CAAAA,CAAgB,YAAA,CAAAC,EAAc,mBAAA,CAAAC,CAAAA,CAAqB,kBAAAC,CAAAA,CACnD,iBAAA,CAAAC,EAAmB,gBAAA,CAAAC,CAAAA,CAAkB,iBAAAC,CAAAA,CAAkB,oBAAA,CAAAC,EACvD,cAAA,CAAAC,CAAAA,CAAgB,gBAAAC,CAAAA,CAAiB,iBAAA,CAAAC,EAAAA,CAAmB,uBAAA,CAAAC,GACpD,uBAAA,CAAAC,EAAAA,CAAyB,mBAAAC,EAAAA,CAAoB,4BAAA,CAAAC,GAC7C,2BAAA,CAAAC,EAAAA,CAA6B,iBAAA,CAAAC,EAAAA,CAAmB,cAAAC,EAAAA,CAChD,kBAAA,CAAAC,GAAoB,gBAAA,CAAAC,EAAAA,CAAkB,mBAAAC,EAAAA,CACtC,iBAAA,CAAAC,EAAAA,CAAmB,iBAAA,CAAAC,EACrB,CAAA,CAAI,aAAa,oBAAoB,CAAA,CAErClD,EAAQ,GAAA,CAAI,CACVC,EACAC,CAAAA,CAAUC,CAAAA,CAAUC,EAAWC,CAAAA,CAAcC,CAAAA,CAC7CC,EAAUC,CAAAA,CAAWC,CAAAA,CAAcC,EAAYC,CAAAA,CAC/CC,CAAAA,CAAaC,CAAAA,CAAeC,CAAAA,CAAaC,EACzCC,CAAAA,CAAkBC,CAAAA,CAAoBC,EAAYC,CAAAA,CAClDC,CAAAA,CAAmBC,EAAiBC,CAAAA,CAAeC,CAAAA,CACnDC,EAAgBC,CAAAA,CAAkBC,CAAAA,CAAeC,EACjDC,CAAAA,CAAgBC,CAAAA,CAAcC,EAAqBC,CAAAA,CACnDC,CAAAA,CAAmBC,EAAkBC,CAAAA,CAAkBC,CAAAA,CACvDC,CAAAA,CAAgBC,CAAAA,CAAiBC,GAAmBC,EAAAA,CACpDC,EAAAA,CAAyBC,GAAoBC,EAAAA,CAC7CC,EAAAA,CAA6BC,GAAmBC,EAAAA,CAChDC,EAAAA,CAAoBC,GAAkBC,EAAAA,CACtCC,EAAAA,CAAmBC,EACrB,CAAC,CAAA,CAEDpD,EAAoB,KACtB,CAEA,OAAAD,CAAAA,CAAaG,CAAAA,CACNA,CACT,CAGA,SAASmD,CAAAA,CAAWvD,CAAAA,CAAoCwD,EAA8B,CACpF,GAA2BxD,GAAU,IAAA,EAAQA,CAAAA,GAAU,EAAA,CAAI,OAAOwD,EAClE,GAAI,OAAOxD,GAAU,QAAA,CAAU,OAAO,GAAGA,CAAK,CAAA,EAAA,CAAA,CAE9C,IAAMyD,CAAAA,CAAM,OAAOzD,CAAK,CAAA,CAClB0D,EAAQD,CAAAA,CAAI,KAAA,CAAM,2BAA2B,CAAA,CACnD,OAAIC,GAASA,CAAAA,CAAM,CAAC,EACX,CAAA,EAAG,UAAA,CAAWA,EAAM,CAAC,CAAC,EAAI,CAAC,CAAA,EAAA,CAAA,CAE7BD,CACT,CAGA,SAASE,EAAAA,CAAgBC,CAAAA,CAAiD,CACxE,GAAI,CAACA,GAAS,OAAOA,CAAAA,EAAU,SAAU,OAAO,GAEhD,IAAMC,CAAAA,CAAyB,EAAC,CAChC,IAAA,GAAW,CAACC,CAAAA,CAAK9D,CAAK,CAAA,GAAK,MAAA,CAAO,QAAQ4D,CAAK,CAAA,CAEzC5D,GAAU,IAAA,EACV,OAAOA,GAAU,UAAA,GACjB,OAAOA,GAAU,QAAA,EAAY,OAAOA,GAAU,QAAA,GAG9C,OAAOA,GAAU,QAAA,EAAYA,CAAAA,CAAM,SAAS,KAAK,CAAA,CACnD6D,CAAAA,CAAQC,CAA0B,EAAIP,CAAAA,CAAWvD,CAAAA,CAAOA,CAAK,CAAA,CAE7D6D,CAAAA,CAAQC,CAA0B,CAAA,CAAI9D,CAAAA,CAAAA,CAAAA,CAG1C,OAAO6D,CACT,CAGA,SAASE,EAAAA,CAAiBC,EAAiC,CACzD,IAAMJ,EAAuB,EAAC,CACxBK,CAAAA,CAAeD,CAAAA,CAAS,MAAM,GAAG,CAAA,CAEvC,QAAWE,CAAAA,IAAeD,CAAAA,CAAc,CACtC,IAAME,CAAAA,CAAUD,EAAY,IAAA,EAAK,CACjC,GAAI,CAACC,CAAAA,CAAS,SAEd,IAAMC,CAAAA,CAAaD,EAAQ,OAAA,CAAQ,GAAG,CAAA,CACtC,GAAIC,IAAe,EAAA,CAAI,SAEvB,IAAMC,CAAAA,CAAWF,CAAAA,CAAQ,MAAM,CAAA,CAAGC,CAAU,EAAE,IAAA,EAAK,CAC7CpE,EAAQmE,CAAAA,CAAQ,KAAA,CAAMC,EAAa,CAAC,CAAA,CAAE,MAAK,CAEjD,GAAIC,CAAAA,EAAYrE,CAAAA,CAAO,CAErB,IAAMsE,CAAAA,CAAgBD,EAAS,OAAA,CAAQ,WAAA,CAAa,CAACE,CAAAA,CAAGC,CAAAA,GAAWA,EAAO,WAAA,EAAa,EACrFZ,CAAAA,CAAcU,CAAa,EAAItE,EACnC,CACF,CAEA,OAAO4D,CACT,CAGA,SAASa,GAAeb,CAAAA,CAA0D,CAChF,OAAKA,CAAAA,CACD,OAAOA,GAAU,QAAA,CAAiBG,EAAAA,CAAiBH,CAAK,CAAA,CACrDA,EAFY,EAGrB,CAGA,IAAMc,CAAAA,CAAwB,CAC5B,UAAA,CAAY,CAAA,CACZ,WAAA,CAAa,aAAA,CACb,cAAe,CAAA,CACf,aAAA,CAAe,CACjB,CAAA,CAKA,SAASC,EAAmBC,CAAAA,CAAe,CACzC,GAAI,CAACA,CAAAA,EAAO,OAAOA,CAAAA,EAAQ,QAAA,CACzB,OAAOA,CAAAA,CAGT,GAAI,MAAM,OAAA,CAAQA,CAAG,CAAA,CACnB,OAAOA,EAAI,GAAA,CAAIC,CAAAA,EAAQF,EAAmBE,CAAI,CAAC,EAGjD,IAAMC,CAAAA,CAAc,EAAC,CACrB,IAAA,IAAWhB,KAAOc,CAAAA,CAChB,GAAI,OAAO,SAAA,CAAU,cAAA,CAAe,KAAKA,CAAAA,CAAKd,CAAG,CAAA,CAAG,CAClD,IAAM9D,CAAAA,CAAQ4E,CAAAA,CAAId,CAAG,CAAA,CAEjBA,CAAAA,GAAQ,cAAgBA,CAAAA,GAAQ,eAAA,EAAmBA,IAAQ,eAAA,CAC7DgB,CAAAA,CAAOhB,CAAG,CAAA,CAAI,CAAA,CACLA,IAAQ,aAAA,CACjBgB,CAAAA,CAAOhB,CAAG,CAAA,CAAI,aAAA,CACL,OAAO9D,CAAAA,EAAU,UAAYA,CAAAA,GAAU,IAAA,CAChD8E,EAAOhB,CAAG,CAAA,CAAIa,EAAmB3E,CAAK,CAAA,CAEtC8E,CAAAA,CAAOhB,CAAG,EAAI9D,EAElB,CAGF,OAAO8E,CACT,CAWA,SAASC,EAAAA,CAAsBC,CAAAA,CAAkB,CAC/C,GAAI,CAACA,CAAAA,EAAU,OAAOA,GAAW,QAAA,CAC/B,OAAOA,EAIT,IAAMF,CAAAA,CAASH,EAAmBK,CAAM,CAAA,CAGxC,OAAIF,CAAAA,CAAO,OAAA,EAAW,OAAOA,CAAAA,CAAO,OAAA,EAAY,WAC9CA,CAAAA,CAAO,OAAA,CAAU,CACf,GAAGA,EAAO,OAAA,CACV,GAAGJ,CACL,CAAA,CAAA,CAIE,KAAA,CAAM,QAAQI,CAAAA,CAAO,MAAM,IAC7BA,CAAAA,CAAO,MAAA,CAASA,EAAO,MAAA,CAAO,GAAA,CAAKG,GAC7BA,CAAAA,EAAU,OAAOA,GAAW,QAAA,EAAYA,CAAAA,CAAO,QAAA,CAC1C,CACL,GAAGA,CAAAA,CACH,QAAA,CAAU,CACR,GAAGA,CAAAA,CAAO,SACV,SAAA,CAAW,CACT,GAAIA,CAAAA,CAAO,QAAA,CAAS,WAAa,EAAC,CAClC,GAAGP,CACL,CACF,CACF,CAAA,CAEKO,CACR,CAAA,CAAA,CAGIH,CACT,CAee,SAARI,CAAAA,CAAyB,CAC9B,MAAA,CAAAF,CAAAA,CACA,OAAAG,CAAAA,CAAS,OAAA,CACT,KAAA,CAAAC,CAAAA,CAAQ,OACR,SAAA,CAAAC,CAAAA,CAAY,GACZ,KAAA,CAAAzB,CACF,EAAiB,CACf,IAAM0B,CAAAA,CAAkBb,EAAAA,CAAeb,CAAK,CAAA,CACtC2B,CAAAA,CAA6B,CAAE,KAAA,CAAAH,CAAAA,CAAO,OAAAD,CAAAA,CAAQ,GAAGG,CAAgB,CAAA,CAEjEE,CAAAA,CAAWC,QAAQ,IAAM,CAAA,MAAA,EAAS,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,CAAG,EAAE,CAAC,CAAA,CAAA,CAAI,EAAE,CAAA,CAC/EC,EAAWC,MAAAA,CAA2B,IAAI,EAC1C,CAACC,CAAAA,CAASC,CAAU,CAAA,CAAIC,QAAAA,CAAS,KAAK,CAAA,CACtCC,CAAAA,CAAgBJ,OAAY,IAAI,CAAA,CAEhCK,CAAAA,CAAUnH,CAAAA,CAAK,QAAO,GAAMA,CAAAA,CAAK,SAAS,GAAA,CAG1CoH,CAAAA,CAAkBR,QAAQ,IACvBV,EAAAA,CAAsBC,CAAM,CAAA,CAClC,CAACA,CAAM,CAAC,CAAA,CAEXkB,UAAU,IAAM,CAEd,GAAI,CAACF,CAAAA,CAAS,CACZ,IAAIG,EAAU,IAAA,CAAA,CAEM,SAAY,CAC9B,GAAI,CACF,IAAM/F,CAAAA,CAAU,MAAMD,CAAAA,EAAW,CACjC,GAAI,CAACgG,CAAAA,CAAS,OAEd,IAAMC,CAAAA,CAAY,SAAS,cAAA,CAAeZ,CAAQ,CAAA,CAClD,GAAI,CAACY,CAAAA,CAAW,OAEhBV,EAAS,OAAA,EAAS,OAAA,GAClBA,CAAAA,CAAS,OAAA,CAAUtF,EAAQ,IAAA,CAAKgG,CAAS,EACzCV,CAAAA,CAAS,OAAA,CAAQ,UAAUO,CAAe,CAAA,CAC1CJ,EAAW,CAAA,CAAI,EACjB,CAAA,MAASQ,CAAAA,CAAO,CACd,OAAA,CAAQ,KAAA,CAAM,4BAA6BA,CAAK,EAClD,CACF,CAAA,GAEY,CAEZ,IAAMC,CAAAA,CAAe,IAAMZ,EAAS,OAAA,EAAS,MAAA,GAC7C,OAAA,MAAA,CAAO,gBAAA,CAAiB,SAAUY,CAAY,CAAA,CAEvC,IAAM,CACXH,EAAU,KAAA,CACV,MAAA,CAAO,oBAAoB,QAAA,CAAUG,CAAY,EACjDZ,CAAAA,CAAS,OAAA,EAAS,SAAQ,CAC1BA,CAAAA,CAAS,QAAU,KACrB,CACF,CAGA,IAAIS,CAAAA,CAAU,KAERI,CAAAA,CAAY,MAAOC,CAAAA,CAAa,CAAA,GAAM,CACrCL,CAAAA,EAELtH,CAAAA,CAAK,qBAAoB,CACtB,MAAA,CAAO,IAAI2G,CAAQ,CAAA,CAAE,CAAA,CACrB,MAAA,CAAO,CAAE,IAAA,CAAM,IAAA,CAAM,KAAM,IAAK,CAAC,EACjC,IAAA,CAAK,MAAOiB,CAAAA,EAAQ,CACnB,GAAI,CAACN,CAAAA,CAAS,OAEd,GAAI,CAACM,IAAM,CAAC,CAAA,EAAG,KAAM,CACfD,CAAAA,CAAa,GACf,UAAA,CAAW,IAAMD,EAAUC,CAAAA,CAAa,CAAC,EAAG,GAAA,EAAOA,CAAAA,CAAa,CAAA,CAAE,CAAA,CAEpE,MACF,CAEA,IAAM9G,EAAS+G,CAAAA,CAAI,CAAC,EAAE,IAAA,CAChBvH,CAAAA,CAAMQ,EAAO,UAAA,CAAW,IAAI,EAClC,GAAI,CAACR,EAAK,OAEV,IAAMW,EAAMhB,CAAAA,CAAK,iBAAA,EAAkB,CAAE,UAAA,CAC/B6H,EAAcD,CAAAA,CAAI,CAAC,EAAE,KAAA,CACrBE,CAAAA,CAAeF,EAAI,CAAC,CAAA,CAAE,OAE5BV,CAAAA,CAAc,OAAA,CAAUrG,EACxBA,CAAAA,CAAO,KAAA,CAAQgH,EAAc7G,CAAAA,CAC7BH,CAAAA,CAAO,OAASiH,CAAAA,CAAe9G,CAAAA,CAC/BX,CAAAA,CAAI,KAAA,CAAMW,EAAKA,CAAG,CAAA,CAClBH,EAAO,gBAAA,CAAmBG,CAAAA,CAE1BJ,EAAoBC,CAAAA,CAAQR,CAAG,CAAA,CAE/BwG,CAAAA,CAAS,SAAS,OAAA,EAAQ,CAC1BA,EAAS,OAAA,CAAU,IAAA,CAEnB,GAAI,CACF,IAAMtF,CAAAA,CAAU,MAAMD,GAAW,CACjC,GAAI,CAACgG,CAAAA,CAAS,OAEdT,EAAS,OAAA,CAAUtF,CAAAA,CAAQ,KAAKV,CAAAA,CAAQ,IAAA,CAAM,CAC5C,KAAA,CAAOgH,CAAAA,CACP,OAAQC,CAAAA,CACR,gBAAA,CAAkB9G,CACpB,CAAC,CAAA,CACD6F,CAAAA,CAAS,OAAA,CAAQ,UAAUO,CAAe,CAAA,CAC1CJ,EAAW,CAAA,CAAI,EACjB,OAASQ,CAAAA,CAAO,CACd,QAAQ,KAAA,CAAM,wBAAA,CAA0BA,CAAK,EAC/C,CACF,CAAC,EACL,CAAA,CAEMO,EAAQ,UAAA,CAAW,IAAML,CAAAA,EAAU,CAAG,EAAE,CAAA,CAE9C,OAAO,IAAM,CACXJ,CAAAA,CAAU,MACV,YAAA,CAAaS,CAAK,EAClBlB,CAAAA,CAAS,OAAA,EAAS,SAAQ,CAC1BA,CAAAA,CAAS,QAAU,KACrB,CACF,EAAG,CAACF,CAAAA,CAAUQ,CAAO,CAAC,EAEtBE,SAAAA,CAAU,IAAM,CACVN,CAAAA,EAAWF,CAAAA,CAAS,SACtBA,CAAAA,CAAS,OAAA,CAAQ,SAAA,CAAUO,CAAAA,CAAiB,IAAI,EAEpD,CAAA,CAAG,CAACA,CAAAA,CAAiBL,CAAO,CAAC,CAAA,CAE7B,IAAMiB,CAAAA,CAAc,CAACC,EAAQC,CAAAA,GAAsB,CACjD,GAAI,CAACrB,CAAAA,CAAS,SAAW,CAACK,CAAAA,CAAc,QAAS,OAEjD,IAAMiB,EAAQF,CAAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,EAAKA,CAAAA,CAAE,eAAe,CAAC,CAAA,CAChD,GAAI,CAACE,EAAO,OAEZ,IAAMC,EAAMlB,CAAAA,CAAc,OAAA,CAAQ,uBAAsB,CAExDL,CAAAA,CAAS,QAAQ,KAAA,EAAM,CAAE,QAAQ,QAAA,CAASqB,CAAAA,CAAW,CACnD,GAAA,CAAKC,CAAAA,CAAM,EAAIC,CAAAA,CAAI,IAAA,CACnB,GAAA,CAAKD,CAAAA,CAAM,EAAIC,CAAAA,CAAI,GAAA,CACnB,eAAgB,IAAM,CAAC,EACvB,eAAA,CAAiB,IAAM,CAAC,CAAA,CACxB,wBAAA,CAA0B,IAAM,CAAC,CACnC,CAAC,EACH,CAAA,CAEMC,EAAgBJ,CAAAA,EAAW,CAC/BD,CAAAA,CAAYC,CAAAA,CAAG,WAAW,EAC5B,CAAA,CACMK,EAAeL,CAAAA,EAAWD,CAAAA,CAAYC,EAAG,WAAW,CAAA,CACpDM,CAAAA,CAAcN,CAAAA,EAAW,CAC7BD,CAAAA,CAAYC,CAAAA,CAAG,SAAS,CAAA,CACxBD,CAAAA,CAAYC,EAAG,OAAO,EACxB,CAAA,CAGA,GAAI,CAACd,CAAAA,CAAS,CACZ,IAAMqB,CAAAA,CAAyB,CAC7B,GAAG1D,EAAAA,CAAgB4B,CAAW,EAC9B,KAAA,CAAOhC,CAAAA,CAAWgC,EAAY,KAAA,CAAO,MAAM,EAC3C,MAAA,CAAQhC,CAAAA,CAAWgC,EAAY,MAAA,CAAQ,OAAO,CAChD,CAAA,CACA,OAAO+B,GAAAA,CAAC,KAAA,CAAA,CAAI,GAAI9B,CAAAA,CAAU,SAAA,CAAWH,GAAa,MAAA,CAAW,KAAA,CAAOgC,EAAS,CAC/E,CAGA,OACEC,GAAAA,CAACC,MAAAA,CAAA,CACC,EAAA,CAAI/B,CAAAA,CACJ,KAAK,IAAA,CACL,SAAA,CAAWH,CAAAA,EAAa,MAAA,CACxB,MAAO,CAAE,KAAA,CAAOE,EAAY,KAAA,EAAS,MAAA,CAAQ,OAAQA,CAAAA,CAAY,MAAA,EAAU,OAAQ,CAAA,CACnF,aAAA,CAAa,KACb,YAAA,CAAc2B,CAAAA,CACd,YAAaC,CAAAA,CACb,UAAA,CAAYC,EACd,CAEJ","file":"index.js","sourcesContent":["/**\n * 小程序 ZRender 平台适配\n * 通过 setPlatformAPI 接管 createCanvas/measureText,避免 ECharts 污染 Taro 渲染器\n */\n\n// @ts-ignore\nimport { setPlatformAPI } from 'zrender/lib/core/platform'\nimport Taro from '@tarojs/taro'\n\nlet measureCtx: any = null\n\nfunction getMeasureCtx() {\n if (measureCtx) return measureCtx\n try {\n const offscreen = Taro.createOffscreenCanvas({ type: '2d', width: 2, height: 2 })\n measureCtx = offscreen?.getContext('2d')\n } catch {}\n return measureCtx\n}\n\n/** 设置小程序 zrender 平台 API,必须在 import echarts 之前调用 */\nexport function setupWeappZrenderPlatform() {\n if (Taro.getEnv() === Taro.ENV_TYPE.WEB) return\n\n setPlatformAPI({\n createCanvas: () => {\n try {\n return Taro.createOffscreenCanvas({ type: '2d', width: 1, height: 1 })\n } catch {\n return { getContext: () => null } as any\n }\n },\n\n measureText: (text: string, font: string) => {\n const ctx = getMeasureCtx()\n if (!ctx) return { width: 0 }\n try {\n ctx.font = font || '12px sans-serif'\n return { width: ctx.measureText(text)?.width || 0 }\n } catch {\n return { width: 0 }\n }\n },\n\n loadImage: (src: string, onload: (img: any) => void, onerror: () => void) => {\n try {\n // @ts-ignore\n const img = (Taro as any).createImage?.()\n if (!img) return onerror()\n img.onload = () => onload(img)\n img.onerror = onerror\n img.src = src\n } catch {\n onerror()\n }\n },\n\n requestAnimationFrame: (cb: FrameRequestCallback) => setTimeout(cb, 16) as unknown as number,\n cancelAnimationFrame: (id: number) => clearTimeout(id),\n } as any)\n}\n","/**\n * Canvas Polyfill - 给小程序 canvas 节点补充 ECharts 需要的 DOM 兼容属性\n */\n\nexport function setupCanvasPolyfill(canvas: any, ctx: any) {\n if (!canvas.addEventListener) canvas.addEventListener = () => {}\n if (!canvas.removeEventListener) canvas.removeEventListener = () => {}\n if (!canvas.dispatchEvent) canvas.dispatchEvent = () => {}\n\n const originalGetContext = canvas.getContext.bind(canvas)\n canvas.getContext = (type: string) => {\n return (type === '2d' || type === '2d-text') ? ctx : originalGetContext(type)\n }\n\n if (!canvas.style) canvas.style = {}\n if (!canvas.setAttribute) canvas.setAttribute = () => {}\n if (!canvas.getAttribute) canvas.getAttribute = () => null\n if (!canvas.removeAttribute) canvas.removeAttribute = () => {}\n\n if (!canvas.getBoundingClientRect) {\n canvas.getBoundingClientRect = () => ({\n top: 0, left: 0,\n width: canvas.width, height: canvas.height,\n right: canvas.width, bottom: canvas.height,\n })\n }\n\n const dpr = canvas.devicePixelRatio || 1\n const defineSize = (prop: string, value: () => number) => {\n if (!Object.getOwnPropertyDescriptor(canvas, prop)) {\n Object.defineProperty(canvas, prop, { get: value })\n }\n }\n defineSize('offsetWidth', () => canvas.width / dpr)\n defineSize('offsetHeight', () => canvas.height / dpr)\n defineSize('clientWidth', () => canvas.width / dpr)\n defineSize('clientHeight', () => canvas.height / dpr)\n\n return canvas\n}\n","/**\n * Taro ECharts 组件\n * 小程序使用 zrender setPlatformAPI,H5 使用原生能力\n */\n\nimport { Canvas } from '@tarojs/components'\nimport Taro from '@tarojs/taro'\nimport { useEffect, useRef, useState, useMemo } from 'react'\nimport type { CSSProperties } from 'react'\nimport type { EChartsOption } from 'echarts'\nimport type { EChartsType } from 'echarts/core'\nimport { setupWeappZrenderPlatform } from './weappPlatform'\nimport { setupCanvasPolyfill } from './polyfill'\n\nlet echartsMod: typeof import('echarts/core') | null = null\nlet echartsRegistered = false\n\n/** 动态加载 echarts */\nasync function getEcharts() {\n if (echartsMod) return echartsMod\n\n // 小程序环境设置平台 API(内部会判断环境)\n setupWeappZrenderPlatform()\n\n const echarts = await import('echarts/core')\n \n if (!echartsRegistered) {\n const { CanvasRenderer } = await import('echarts/renderers')\n const {\n PieChart, BarChart, LineChart, ScatterChart, RadarChart,\n MapChart, TreeChart, TreemapChart, GraphChart, GaugeChart,\n FunnelChart, ParallelChart, SankeyChart, BoxplotChart,\n CandlestickChart, EffectScatterChart, LinesChart, HeatmapChart,\n PictorialBarChart, ThemeRiverChart, SunburstChart, CustomChart,\n } = await import('echarts/charts')\n const {\n TitleComponent, TooltipComponent, GridComponent, PolarComponent,\n RadarComponent, GeoComponent, SingleAxisComponent, ParallelComponent,\n CalendarComponent, GraphicComponent, ToolboxComponent, AxisPointerComponent,\n BrushComponent, LegendComponent, DataZoomComponent, DataZoomInsideComponent,\n DataZoomSliderComponent, VisualMapComponent, VisualMapContinuousComponent,\n VisualMapPiecewiseComponent, TimelineComponent, AriaComponent,\n TransformComponent, DatasetComponent, MarkPointComponent,\n MarkLineComponent, MarkAreaComponent,\n } = await import('echarts/components')\n\n echarts.use([\n CanvasRenderer,\n PieChart, BarChart, LineChart, ScatterChart, RadarChart,\n MapChart, TreeChart, TreemapChart, GraphChart, GaugeChart,\n FunnelChart, ParallelChart, SankeyChart, BoxplotChart,\n CandlestickChart, EffectScatterChart, LinesChart, HeatmapChart,\n PictorialBarChart, ThemeRiverChart, SunburstChart, CustomChart,\n TitleComponent, TooltipComponent, GridComponent, PolarComponent,\n RadarComponent, GeoComponent, SingleAxisComponent, ParallelComponent,\n CalendarComponent, GraphicComponent, ToolboxComponent, AxisPointerComponent,\n BrushComponent, LegendComponent, DataZoomComponent, DataZoomInsideComponent,\n DataZoomSliderComponent, VisualMapComponent, VisualMapContinuousComponent,\n VisualMapPiecewiseComponent, TimelineComponent, AriaComponent,\n TransformComponent, DatasetComponent, MarkPointComponent,\n MarkLineComponent, MarkAreaComponent,\n ])\n\n echartsRegistered = true\n }\n\n echartsMod = echarts\n return echarts\n}\n\n/** 将 rpx 转换为 px(H5 inline style 需要,PostCSS 只处理 CSS 文件) */\nfunction convertRpx(value: string | number | undefined, defaultValue: string): string {\n if (value === undefined || value === null || value === '') return defaultValue\n if (typeof value === 'number') return `${value}px`\n\n const str = String(value)\n const match = str.match(/^(-?\\d+(?:\\.\\d+)?)(rpx)$/i)\n if (match && match[1]) {\n return `${parseFloat(match[1]) / 2}px`\n }\n return str\n}\n\n/** 清理 style 对象,过滤掉无效值并转换 rpx(H5 模式专用) */\nfunction cleanStyleForH5(style: CSSProperties | undefined): CSSProperties {\n if (!style || typeof style !== 'object') return {}\n\n const cleaned: CSSProperties = {}\n for (const [key, value] of Object.entries(style)) {\n // 过滤掉 null、undefined、函数和非字符串/数字值\n if (value === null || value === undefined) continue\n if (typeof value === 'function') continue\n if (typeof value !== 'string' && typeof value !== 'number') continue\n\n // 转换 rpx 值\n if (typeof value === 'string' && value.includes('rpx')) {\n cleaned[key as keyof CSSProperties] = convertRpx(value, value) as any\n } else {\n cleaned[key as keyof CSSProperties] = value as any\n }\n }\n return cleaned\n}\n\n/** 将 CSS 字符串解析为 CSSProperties 对象 */\nfunction parseStyleString(styleStr: string): CSSProperties {\n const style: CSSProperties = {}\n const declarations = styleStr.split(';')\n\n for (const declaration of declarations) {\n const trimmed = declaration.trim()\n if (!trimmed) continue\n\n const colonIndex = trimmed.indexOf(':')\n if (colonIndex === -1) continue\n\n const property = trimmed.slice(0, colonIndex).trim()\n const value = trimmed.slice(colonIndex + 1).trim()\n\n if (property && value) {\n // 将 kebab-case 转换为 camelCase\n const camelProperty = property.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase())\n ;(style as any)[camelProperty] = value\n }\n }\n\n return style\n}\n\n/** 统一处理 style 属性,支持对象和字符串形式 */\nfunction normalizeStyle(style: CSSProperties | string | undefined): CSSProperties {\n if (!style) return {}\n if (typeof style === 'string') return parseStyleString(style)\n return style\n}\n\n/** 禁用阴影的配置 */\nconst DISABLE_SHADOW_CONFIG = {\n shadowBlur: 0,\n shadowColor: 'transparent',\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n}\n\n/**\n * 递归处理对象,覆盖 shadow 相关属性\n */\nfunction processShadowProps(obj: any): any {\n if (!obj || typeof obj !== 'object') {\n return obj\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => processShadowProps(item))\n }\n\n const result: any = {}\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const value = obj[key]\n \n if (key === 'shadowBlur' || key === 'shadowOffsetX' || key === 'shadowOffsetY') {\n result[key] = 0\n } else if (key === 'shadowColor') {\n result[key] = 'transparent'\n } else if (typeof value === 'object' && value !== null) {\n result[key] = processShadowProps(value)\n } else {\n result[key] = value\n }\n }\n }\n\n return result\n}\n\n/**\n * 禁用 option 中所有的阴影配置\n * Taro 小程序下 canvas 绘制阴影效果不佳,通过覆盖方式强制关闭\n * \n * 处理策略:\n * 1. tooltip - 强制追加 shadow 禁用配置(不论原来有没有)\n * 2. emphasis.itemStyle - 强制追加 shadow 禁用配置(不论原来有没有)\n * 3. 其他属性 - 遇到 shadow 相关属性才覆盖\n */\nfunction disableShadowInOption(option: any): any {\n if (!option || typeof option !== 'object') {\n return option\n }\n\n // 先递归处理所有 shadow 属性\n const result = processShadowProps(option)\n\n // 强制处理 tooltip - 追加 shadow 禁用配置\n if (result.tooltip && typeof result.tooltip === 'object') {\n result.tooltip = {\n ...result.tooltip,\n ...DISABLE_SHADOW_CONFIG,\n }\n }\n\n // 强制处理 series 中的 emphasis.itemStyle\n if (Array.isArray(result.series)) {\n result.series = result.series.map((series: any) => {\n if (series && typeof series === 'object' && series.emphasis) {\n return {\n ...series,\n emphasis: {\n ...series.emphasis,\n itemStyle: {\n ...(series.emphasis.itemStyle || {}),\n ...DISABLE_SHADOW_CONFIG,\n },\n },\n }\n }\n return series\n })\n }\n\n return result\n}\n\nexport interface EChartsProps {\n /** ECharts 配置项 */\n option: EChartsOption\n /** 图表高度 */\n height?: string\n /** 图表宽度 */\n width?: string\n /** CSS 类名 */\n className?: string\n /** 内联样式,可以是 CSSProperties 对象或 CSS 字符串,style 中的 width/height 会覆盖单独属性 */\n style?: CSSProperties | string\n}\n\nexport default function ECharts({ \n option, \n height = '300px', \n width = '100%',\n className = '',\n style,\n}: EChartsProps) {\n const normalizedStyle = normalizeStyle(style)\n const mergedStyle: CSSProperties = { width, height, ...normalizedStyle }\n \n const canvasId = useMemo(() => `chart_${Math.random().toString(36).slice(2, 11)}`, [])\n const chartRef = useRef<EChartsType | null>(null)\n const [isReady, setIsReady] = useState(false)\n const canvasNodeRef = useRef<any>(null)\n\n const isWeapp = Taro.getEnv() !== Taro.ENV_TYPE.WEB\n \n // 处理 option,禁用所有阴影配置(小程序 canvas 阴影效果不佳)\n const processedOption = useMemo(() => {\n return disableShadowInOption(option)\n }, [option])\n\n useEffect(() => {\n // H5 环境\n if (!isWeapp) {\n let mounted = true\n \n const initH5Chart = async () => {\n try {\n const echarts = await getEcharts()\n if (!mounted) return\n \n const container = document.getElementById(canvasId)\n if (!container) return\n\n chartRef.current?.dispose()\n chartRef.current = echarts.init(container)\n chartRef.current.setOption(processedOption)\n setIsReady(true)\n } catch (error) {\n console.error('[ECharts] H5 init failed:', error)\n }\n }\n\n initH5Chart()\n\n const handleResize = () => chartRef.current?.resize()\n window.addEventListener('resize', handleResize)\n\n return () => {\n mounted = false\n window.removeEventListener('resize', handleResize)\n chartRef.current?.dispose()\n chartRef.current = null\n }\n }\n\n // 小程序环境\n let mounted = true\n\n const initChart = async (retryCount = 0) => {\n if (!mounted) return\n\n Taro.createSelectorQuery()\n .select(`#${canvasId}`)\n .fields({ node: true, size: true })\n .exec(async (res) => {\n if (!mounted) return\n\n if (!res?.[0]?.node) {\n if (retryCount < 5) {\n setTimeout(() => initChart(retryCount + 1), 200 * (retryCount + 1))\n }\n return\n }\n\n const canvas = res[0].node\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n\n const dpr = Taro.getSystemInfoSync().pixelRatio\n const canvasWidth = res[0].width\n const canvasHeight = res[0].height\n\n canvasNodeRef.current = canvas\n canvas.width = canvasWidth * dpr\n canvas.height = canvasHeight * dpr\n ctx.scale(dpr, dpr)\n canvas.devicePixelRatio = dpr\n\n setupCanvasPolyfill(canvas, ctx)\n\n chartRef.current?.dispose()\n chartRef.current = null\n\n try {\n const echarts = await getEcharts()\n if (!mounted) return\n\n chartRef.current = echarts.init(canvas, null, {\n width: canvasWidth,\n height: canvasHeight,\n devicePixelRatio: dpr,\n })\n chartRef.current.setOption(processedOption)\n setIsReady(true)\n } catch (error) {\n console.error('[ECharts] Init failed:', error)\n }\n })\n }\n\n const timer = setTimeout(() => initChart(), 50)\n\n return () => {\n mounted = false\n clearTimeout(timer)\n chartRef.current?.dispose()\n chartRef.current = null\n }\n }, [canvasId, isWeapp])\n\n useEffect(() => {\n if (isReady && chartRef.current) {\n chartRef.current.setOption(processedOption, true)\n }\n }, [processedOption, isReady])\n\n const handleTouch = (e: any, eventType: string) => {\n if (!chartRef.current || !canvasNodeRef.current) return\n\n const touch = e.touches[0] || e.changedTouches[0]\n if (!touch) return\n\n const box = canvasNodeRef.current.getBoundingClientRect()\n // @ts-ignore\n chartRef.current.getZr().handler.dispatch(eventType, {\n zrX: touch.x - box.left,\n zrY: touch.y - box.top,\n preventDefault: () => {},\n stopPropagation: () => {},\n stopImmediatePropagation: () => {},\n })\n }\n\n const onTouchStart = (e: any) => {\n handleTouch(e, 'mousedown')\n }\n const onTouchMove = (e: any) => handleTouch(e, 'mousemove')\n const onTouchEnd = (e: any) => {\n handleTouch(e, 'mouseup')\n handleTouch(e, 'click')\n }\n\n // H5 环境\n if (!isWeapp) {\n const h5Style: CSSProperties = {\n ...cleanStyleForH5(mergedStyle),\n width: convertRpx(mergedStyle.width, '100%'),\n height: convertRpx(mergedStyle.height, '300px'),\n }\n return <div id={canvasId} className={className || undefined} style={h5Style} />\n }\n\n // 小程序环境\n return (\n <Canvas\n id={canvasId}\n type=\"2d\"\n className={className || undefined}\n style={{ width: mergedStyle.width || '100%', height: mergedStyle.height || '300px' }}\n disableScroll\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onTouchEnd={onTouchEnd}\n />\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/weappPlatform.ts","../src/polyfill.ts","../src/ECharts.tsx"],"names":["measureCtx","getMeasureCtx","Taro","setupWeappZrenderPlatform","setPlatformAPI","text","font","ctx","src","onload","onerror","img","cb","id","setupCanvasPolyfill","canvas","originalGetContext","type","dpr","defineSize","prop","value","echartsMod","echartsRegistered","getEcharts","echarts","CanvasRenderer","PieChart","BarChart","LineChart","ScatterChart","RadarChart","MapChart","TreeChart","TreemapChart","GraphChart","GaugeChart","FunnelChart","ParallelChart","SankeyChart","BoxplotChart","CandlestickChart","EffectScatterChart","LinesChart","HeatmapChart","PictorialBarChart","ThemeRiverChart","SunburstChart","CustomChart","TitleComponent","TooltipComponent","GridComponent","PolarComponent","RadarComponent","GeoComponent","SingleAxisComponent","ParallelComponent","CalendarComponent","GraphicComponent","ToolboxComponent","AxisPointerComponent","BrushComponent","LegendComponent","DataZoomComponent","DataZoomInsideComponent","DataZoomSliderComponent","VisualMapComponent","VisualMapContinuousComponent","VisualMapPiecewiseComponent","TimelineComponent","AriaComponent","TransformComponent","DatasetComponent","MarkPointComponent","MarkLineComponent","MarkAreaComponent","convertRpx","defaultValue","str","match","cleanStyleForH5","style","cleaned","key","parseStyleString","styleStr","declarations","declaration","trimmed","colonIndex","property","camelProperty","_","letter","normalizeStyle","DISABLE_SHADOW_CONFIG","processShadowProps","obj","item","result","disableShadowInOption","option","series","hasExplicitHeight","height","ECharts","width","className","defaultHeight","normalizedStyle","styleHeight","explicitHeight","mergedStyle","canvasId","useMemo","chartRef","useRef","isReady","setIsReady","useState","canvasNodeRef","isWeapp","processedOption","useEffect","mounted","container","error","handleResize","initChart","retryCount","res","canvasWidth","canvasHeight","timer","handleTouch","e","eventType","touch","box","onTouchStart","onTouchMove","onTouchEnd","finalHeight","h5Style","jsx","Canvas"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 小程序 ZRender 平台适配\n * 通过 setPlatformAPI 接管 createCanvas/measureText,避免 ECharts 污染 Taro 渲染器\n */\n\n// @ts-ignore\nimport { setPlatformAPI } from 'zrender/lib/core/platform'\nimport Taro from '@tarojs/taro'\n\nlet measureCtx: any = null\n\nfunction getMeasureCtx() {\n if (measureCtx) return measureCtx\n try {\n const offscreen = Taro.createOffscreenCanvas({ type: '2d', width: 2, height: 2 })\n measureCtx = offscreen?.getContext('2d')\n } catch {}\n return measureCtx\n}\n\n/** 设置小程序 zrender 平台 API,必须在 import echarts 之前调用 */\nexport function setupWeappZrenderPlatform() {\n if (Taro.getEnv() === Taro.ENV_TYPE.WEB) return\n\n setPlatformAPI({\n createCanvas: () => {\n try {\n return Taro.createOffscreenCanvas({ type: '2d', width: 1, height: 1 })\n } catch {\n return { getContext: () => null } as any\n }\n },\n\n measureText: (text: string, font: string) => {\n const ctx = getMeasureCtx()\n if (!ctx) return { width: 0 }\n try {\n ctx.font = font || '12px sans-serif'\n return { width: ctx.measureText(text)?.width || 0 }\n } catch {\n return { width: 0 }\n }\n },\n\n loadImage: (src: string, onload: (img: any) => void, onerror: () => void) => {\n try {\n // @ts-ignore\n const img = (Taro as any).createImage?.()\n if (!img) return onerror()\n img.onload = () => onload(img)\n img.onerror = onerror\n img.src = src\n } catch {\n onerror()\n }\n },\n\n requestAnimationFrame: (cb: FrameRequestCallback) => setTimeout(cb, 16) as unknown as number,\n cancelAnimationFrame: (id: number) => clearTimeout(id),\n } as any)\n}\n","/**\n * Canvas Polyfill - 给小程序 canvas 节点补充 ECharts 需要的 DOM 兼容属性\n */\n\nexport function setupCanvasPolyfill(canvas: any, ctx: any) {\n if (!canvas.addEventListener) canvas.addEventListener = () => {}\n if (!canvas.removeEventListener) canvas.removeEventListener = () => {}\n if (!canvas.dispatchEvent) canvas.dispatchEvent = () => {}\n\n const originalGetContext = canvas.getContext.bind(canvas)\n canvas.getContext = (type: string) => {\n return (type === '2d' || type === '2d-text') ? ctx : originalGetContext(type)\n }\n\n if (!canvas.style) canvas.style = {}\n if (!canvas.setAttribute) canvas.setAttribute = () => {}\n if (!canvas.getAttribute) canvas.getAttribute = () => null\n if (!canvas.removeAttribute) canvas.removeAttribute = () => {}\n\n if (!canvas.getBoundingClientRect) {\n canvas.getBoundingClientRect = () => ({\n top: 0, left: 0,\n width: canvas.width, height: canvas.height,\n right: canvas.width, bottom: canvas.height,\n })\n }\n\n const dpr = canvas.devicePixelRatio || 1\n const defineSize = (prop: string, value: () => number) => {\n if (!Object.getOwnPropertyDescriptor(canvas, prop)) {\n Object.defineProperty(canvas, prop, { get: value })\n }\n }\n defineSize('offsetWidth', () => canvas.width / dpr)\n defineSize('offsetHeight', () => canvas.height / dpr)\n defineSize('clientWidth', () => canvas.width / dpr)\n defineSize('clientHeight', () => canvas.height / dpr)\n\n return canvas\n}\n","/**\n * Taro ECharts 组件\n * 小程序使用 zrender setPlatformAPI,H5 使用原生能力\n */\n\nimport { Canvas } from '@tarojs/components'\nimport Taro from '@tarojs/taro'\nimport { useEffect, useRef, useState, useMemo } from 'react'\nimport type { CSSProperties } from 'react'\nimport type { EChartsOption } from 'echarts'\nimport type { EChartsType } from 'echarts/core'\nimport { setupWeappZrenderPlatform } from './weappPlatform'\nimport { setupCanvasPolyfill } from './polyfill'\n\nlet echartsMod: typeof import('echarts/core') | null = null\nlet echartsRegistered = false\n\n/** 动态加载 echarts */\nasync function getEcharts() {\n if (echartsMod) return echartsMod\n\n // 小程序环境设置平台 API(内部会判断环境)\n setupWeappZrenderPlatform()\n\n const echarts = await import('echarts/core')\n \n if (!echartsRegistered) {\n const { CanvasRenderer } = await import('echarts/renderers')\n const {\n PieChart, BarChart, LineChart, ScatterChart, RadarChart,\n MapChart, TreeChart, TreemapChart, GraphChart, GaugeChart,\n FunnelChart, ParallelChart, SankeyChart, BoxplotChart,\n CandlestickChart, EffectScatterChart, LinesChart, HeatmapChart,\n PictorialBarChart, ThemeRiverChart, SunburstChart, CustomChart,\n } = await import('echarts/charts')\n const {\n TitleComponent, TooltipComponent, GridComponent, PolarComponent,\n RadarComponent, GeoComponent, SingleAxisComponent, ParallelComponent,\n CalendarComponent, GraphicComponent, ToolboxComponent, AxisPointerComponent,\n BrushComponent, LegendComponent, DataZoomComponent, DataZoomInsideComponent,\n DataZoomSliderComponent, VisualMapComponent, VisualMapContinuousComponent,\n VisualMapPiecewiseComponent, TimelineComponent, AriaComponent,\n TransformComponent, DatasetComponent, MarkPointComponent,\n MarkLineComponent, MarkAreaComponent,\n } = await import('echarts/components')\n\n echarts.use([\n CanvasRenderer,\n PieChart, BarChart, LineChart, ScatterChart, RadarChart,\n MapChart, TreeChart, TreemapChart, GraphChart, GaugeChart,\n FunnelChart, ParallelChart, SankeyChart, BoxplotChart,\n CandlestickChart, EffectScatterChart, LinesChart, HeatmapChart,\n PictorialBarChart, ThemeRiverChart, SunburstChart, CustomChart,\n TitleComponent, TooltipComponent, GridComponent, PolarComponent,\n RadarComponent, GeoComponent, SingleAxisComponent, ParallelComponent,\n CalendarComponent, GraphicComponent, ToolboxComponent, AxisPointerComponent,\n BrushComponent, LegendComponent, DataZoomComponent, DataZoomInsideComponent,\n DataZoomSliderComponent, VisualMapComponent, VisualMapContinuousComponent,\n VisualMapPiecewiseComponent, TimelineComponent, AriaComponent,\n TransformComponent, DatasetComponent, MarkPointComponent,\n MarkLineComponent, MarkAreaComponent,\n ])\n\n echartsRegistered = true\n }\n\n echartsMod = echarts\n return echarts\n}\n\n/** 将 rpx 转换为 px(H5 inline style 需要,PostCSS 只处理 CSS 文件) */\nfunction convertRpx(value: string | number | undefined, defaultValue: string): string {\n if (value === undefined || value === null || value === '') return defaultValue\n if (typeof value === 'number') return `${value}px`\n\n const str = String(value)\n const match = str.match(/^(-?\\d+(?:\\.\\d+)?)(rpx)$/i)\n if (match && match[1]) {\n return `${parseFloat(match[1]) / 2}px`\n }\n return str\n}\n\n/** 清理 style 对象,过滤掉无效值并转换 rpx(H5 模式专用) */\nfunction cleanStyleForH5(style: CSSProperties | undefined): CSSProperties {\n if (!style || typeof style !== 'object') return {}\n\n const cleaned: CSSProperties = {}\n for (const [key, value] of Object.entries(style)) {\n // 过滤掉 null、undefined、函数和非字符串/数字值\n if (value === null || value === undefined) continue\n if (typeof value === 'function') continue\n if (typeof value !== 'string' && typeof value !== 'number') continue\n\n // 转换 rpx 值\n if (typeof value === 'string' && value.includes('rpx')) {\n cleaned[key as keyof CSSProperties] = convertRpx(value, value) as any\n } else {\n cleaned[key as keyof CSSProperties] = value as any\n }\n }\n return cleaned\n}\n\n/** 将 CSS 字符串解析为 CSSProperties 对象 */\nfunction parseStyleString(styleStr: string): CSSProperties {\n const style: CSSProperties = {}\n const declarations = styleStr.split(';')\n\n for (const declaration of declarations) {\n const trimmed = declaration.trim()\n if (!trimmed) continue\n\n const colonIndex = trimmed.indexOf(':')\n if (colonIndex === -1) continue\n\n const property = trimmed.slice(0, colonIndex).trim()\n const value = trimmed.slice(colonIndex + 1).trim()\n\n if (property && value) {\n // 将 kebab-case 转换为 camelCase\n const camelProperty = property.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase())\n ;(style as any)[camelProperty] = value\n }\n }\n\n return style\n}\n\n/** 统一处理 style 属性,支持对象和字符串形式 */\nfunction normalizeStyle(style: CSSProperties | string | undefined): CSSProperties {\n if (!style) return {}\n if (typeof style === 'string') return parseStyleString(style)\n return style\n}\n\n/** 禁用阴影的配置 */\nconst DISABLE_SHADOW_CONFIG = {\n shadowBlur: 0,\n shadowColor: 'transparent',\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n}\n\n/**\n * 递归处理对象,覆盖 shadow 相关属性\n */\nfunction processShadowProps(obj: any): any {\n if (!obj || typeof obj !== 'object') {\n return obj\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => processShadowProps(item))\n }\n\n const result: any = {}\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n const value = obj[key]\n \n if (key === 'shadowBlur' || key === 'shadowOffsetX' || key === 'shadowOffsetY') {\n result[key] = 0\n } else if (key === 'shadowColor') {\n result[key] = 'transparent'\n } else if (typeof value === 'object' && value !== null) {\n result[key] = processShadowProps(value)\n } else {\n result[key] = value\n }\n }\n }\n\n return result\n}\n\n/**\n * 禁用 option 中所有的阴影配置\n * Taro 小程序下 canvas 绘制阴影效果不佳,通过覆盖方式强制关闭\n * \n * 处理策略:\n * 1. tooltip - 强制追加 shadow 禁用配置(不论原来有没有)\n * 2. emphasis.itemStyle - 强制追加 shadow 禁用配置(不论原来有没有)\n * 3. 其他属性 - 遇到 shadow 相关属性才覆盖\n */\nfunction disableShadowInOption(option: any): any {\n if (!option || typeof option !== 'object') {\n return option\n }\n\n // 先递归处理所有 shadow 属性\n const result = processShadowProps(option)\n\n // 强制处理 tooltip - 追加 shadow 禁用配置\n if (result.tooltip && typeof result.tooltip === 'object') {\n result.tooltip = {\n ...result.tooltip,\n ...DISABLE_SHADOW_CONFIG,\n }\n }\n\n // 强制处理 series 中的 emphasis.itemStyle\n if (Array.isArray(result.series)) {\n result.series = result.series.map((series: any) => {\n if (series && typeof series === 'object' && series.emphasis) {\n return {\n ...series,\n emphasis: {\n ...series.emphasis,\n itemStyle: {\n ...(series.emphasis.itemStyle || {}),\n ...DISABLE_SHADOW_CONFIG,\n },\n },\n }\n }\n return series\n })\n }\n\n return result\n}\n\nexport interface EChartsProps {\n /** ECharts 配置项 */\n option: EChartsOption\n /** 图表高度,默认 '100%' 表示填充父容器,未设置父容器高度时回退到 300px */\n height?: string\n /** 图表宽度,默认 '100%' */\n width?: string\n /** CSS 类名 */\n className?: string\n /** 内联样式,可以是 CSSProperties 对象或 CSS 字符串,style 中的 width/height 会覆盖单独属性 */\n style?: CSSProperties | string\n /** 默认高度,当无法获取容器尺寸时使用,默认 300px */\n defaultHeight?: string\n}\n\n/** 检测是否有明确的非百分比高度设置 */\nfunction hasExplicitHeight(height: string | undefined): boolean {\n if (!height) return false\n // 排除百分比和 auto\n return !height.endsWith('%') && height !== 'auto'\n}\n\nexport default function ECharts({\n option,\n height = '100%',\n width = '100%',\n className = '',\n style,\n defaultHeight = '300px',\n}: EChartsProps) {\n const normalizedStyle = normalizeStyle(style)\n const styleHeight = normalizedStyle.height as string | undefined\n\n // 优先级:style.height > height prop > '100%'\n // 如果都是百分比或 auto,则需要后续通过测量获取实际尺寸\n const explicitHeight = styleHeight || (hasExplicitHeight(height) ? height : undefined)\n const mergedStyle: CSSProperties = { width, height: styleHeight || height, ...normalizedStyle }\n \n const canvasId = useMemo(() => `chart_${Math.random().toString(36).slice(2, 11)}`, [])\n const chartRef = useRef<EChartsType | null>(null)\n const [isReady, setIsReady] = useState(false)\n const canvasNodeRef = useRef<any>(null)\n\n const isWeapp = Taro.getEnv() !== Taro.ENV_TYPE.WEB\n \n // 处理 option,禁用所有阴影配置(小程序 canvas 阴影效果不佳)\n const processedOption = useMemo(() => {\n return disableShadowInOption(option)\n }, [option])\n\n useEffect(() => {\n // H5 环境\n if (!isWeapp) {\n let mounted = true\n \n const initH5Chart = async () => {\n try {\n const echarts = await getEcharts()\n if (!mounted) return\n \n const container = document.getElementById(canvasId)\n if (!container) return\n\n chartRef.current?.dispose()\n chartRef.current = echarts.init(container)\n chartRef.current.setOption(processedOption)\n setIsReady(true)\n } catch (error) {\n console.error('[ECharts] H5 init failed:', error)\n }\n }\n\n initH5Chart()\n\n const handleResize = () => chartRef.current?.resize()\n window.addEventListener('resize', handleResize)\n\n return () => {\n mounted = false\n window.removeEventListener('resize', handleResize)\n chartRef.current?.dispose()\n chartRef.current = null\n }\n }\n\n // 小程序环境\n let mounted = true\n\n const initChart = async (retryCount = 0) => {\n if (!mounted) return\n\n Taro.createSelectorQuery()\n .select(`#${canvasId}`)\n .fields({ node: true, size: true })\n .exec(async (res) => {\n if (!mounted) return\n\n if (!res?.[0]?.node) {\n if (retryCount < 5) {\n setTimeout(() => initChart(retryCount + 1), 200 * (retryCount + 1))\n }\n return\n }\n\n const canvas = res[0].node\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n\n const dpr = Taro.getSystemInfoSync().pixelRatio\n let canvasWidth = res[0].width\n let canvasHeight = res[0].height\n\n // 如果没有明确设置高度且获取到的尺寸为 0,使用默认高度\n if (!explicitHeight && (canvasHeight <= 0 || !canvasHeight)) {\n console.warn(\n `[ECharts] Warning: Container has no explicit height. ` +\n `ECharts will use default height (${defaultHeight}), ` +\n `but the canvas may not be visible. ` +\n `To fix this, either:\\n` +\n `1. Set parent container height: <View style={{ height: '300px' }}>\\n` +\n `2. Set ECharts height prop: <ECharts height=\"300px\" />\\n` +\n `3. Set ECharts style: <ECharts style={{ height: '300px' }} />`\n )\n // 转换默认高度(如果是 rpx 转为 px)\n const fallbackHeight = parseInt(defaultHeight)\n canvasHeight = fallbackHeight || 300\n }\n\n canvasNodeRef.current = canvas\n canvas.width = canvasWidth * dpr\n canvas.height = canvasHeight * dpr\n ctx.scale(dpr, dpr)\n canvas.devicePixelRatio = dpr\n\n setupCanvasPolyfill(canvas, ctx)\n\n chartRef.current?.dispose()\n chartRef.current = null\n\n try {\n const echarts = await getEcharts()\n if (!mounted) return\n\n chartRef.current = echarts.init(canvas, null, {\n width: canvasWidth,\n height: canvasHeight,\n devicePixelRatio: dpr,\n })\n chartRef.current.setOption(processedOption)\n setIsReady(true)\n } catch (error) {\n console.error('[ECharts] Init failed:', error)\n }\n })\n }\n\n const timer = setTimeout(() => initChart(), 50)\n\n return () => {\n mounted = false\n clearTimeout(timer)\n chartRef.current?.dispose()\n chartRef.current = null\n }\n }, [canvasId, isWeapp])\n\n useEffect(() => {\n if (isReady && chartRef.current) {\n chartRef.current.setOption(processedOption, true)\n }\n }, [processedOption, isReady])\n\n const handleTouch = (e: any, eventType: string) => {\n if (!chartRef.current || !canvasNodeRef.current) return\n\n const touch = e.touches[0] || e.changedTouches[0]\n if (!touch) return\n\n const box = canvasNodeRef.current.getBoundingClientRect()\n // @ts-ignore\n chartRef.current.getZr().handler.dispatch(eventType, {\n zrX: touch.x - box.left,\n zrY: touch.y - box.top,\n preventDefault: () => {},\n stopPropagation: () => {},\n stopImmediatePropagation: () => {},\n })\n }\n\n const onTouchStart = (e: any) => {\n handleTouch(e, 'mousedown')\n }\n const onTouchMove = (e: any) => handleTouch(e, 'mousemove')\n const onTouchEnd = (e: any) => {\n handleTouch(e, 'mouseup')\n handleTouch(e, 'click')\n }\n\n // H5 环境\n if (!isWeapp) {\n // 如果没有明确高度且没有设置百分比高度,使用默认高度\n const finalHeight = explicitHeight\n ? convertRpx(explicitHeight, defaultHeight)\n : convertRpx(height, '100%')\n\n const h5Style: CSSProperties = {\n ...cleanStyleForH5(mergedStyle),\n width: convertRpx(mergedStyle.width, '100%'),\n height: finalHeight,\n }\n return <div id={canvasId} className={className || undefined} style={h5Style} />\n }\n\n // 小程序环境\n // style 保持使用百分比,让父容器决定尺寸\n // 如果父容器没有高度,init 时会使用 defaultHeight\n return (\n <Canvas\n id={canvasId}\n type=\"2d\"\n className={className || undefined}\n style={{ width: mergedStyle.width || '100%', height: mergedStyle.height || defaultHeight }}\n disableScroll\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onTouchEnd={onTouchEnd}\n />\n )\n}\n"]}
|
package/package.json
CHANGED