# 3.x 迁移指南
Chart.js 3.0 引入了许多重大更改。Chart.js 2.0 于 2016 年 4 月发布。从那时起,随着 Chart.js 的流行和功能集的增长,我们了解了一些关于如何更好地创建图表库的经验教训。为了提高性能、提供新功能并改善可维护性,有必要打破向后兼容性,但我们旨在仅在值得付出代价时这样做。v3 的一些主要亮点包括
- 大幅 性能 提升,包括能够跳过数据解析并通过 webworkers 并行渲染图表
- 具有更好默认值的额外可配置性和可脚本选项
- 完全重写的动画系统
- 重写的填充插件,包含许多错误修复
- 文档从 GitBook 迁移到 Vuepress
- 由 TypeDoc 生成的 API 文档,并经过验证
- 不再进行 CSS 注入
- 大量的错误修复
- 树状抖动
# 最终用户迁移
# 设置和安装
- 分发文件现在为小写。例如:
dist/chart.js。 - Chart.js 不再提供
Chart.bundle.js和Chart.bundle.min.js。如果您使用的是这些构建,请查看 安装 和 集成 文档,了解有关推荐设置 Chart.js 的方法的详细信息。 moment不再作为 npm 依赖项指定。如果您使用time或timeseries刻度,则必须包含 可用的适配器之一 (在新窗口中打开) 和相应的日期库。您不再需要从构建中排除 moment。- 如果提供的画布/上下文已在使用中,则
Chart构造函数将抛出错误 - Chart.js 3 是树状抖动的。因此,如果您在项目中将其用作
npm模块,并希望利用此功能,则需要导入并注册要使用的控制器、元素、刻度和插件,有关要导入的所有可用项目的列表,请查看 集成。如果您通过script标签或从auto注册路径作为npm模块导入 Chart.js,则无需调用register,在这种情况下,您将无法获得树状抖动的好处。以下是如何注册组件的示例
import { Chart, LineController, LineElement, PointElement, LinearScale, Title } from `chart.js`
Chart.register(LineController, LineElement, PointElement, LinearScale, Title);
const chart = new Chart(ctx, {
type: 'line',
// data: ...
options: {
plugins: {
title: {
display: true,
text: 'Chart Title'
}
},
scales: {
x: {
type: 'linear'
},
y: {
type: 'linear'
}
}
}
})
# 图表类型
horizontalBar图表类型已删除。可以使用新的indexAxis选项配置水平条形图
# 选项
对传递给 Chart 构造函数的配置选项进行了一些更改。这些更改在下面有记录。
# 通用更改
- 可索引选项现在正在循环。
backgroundColor: ['red', 'green']如果数据点超过 2 个,将导致交替的'red'/'green'。 - 对象数据的输入属性现在可以自由指定,有关详细信息,请查看 数据结构。
- 大多数选项使用代理进行解析,而不是与默认值合并。除了能够轻松地为不同的上下文启用不同的解析路由外,它还允许在可脚本选项中使用其他已解析的选项。
- 选项默认情况下是可脚本的和可索引的,除非由于某些原因而被禁用。
- 可脚本选项接收选项解析器作为第二个参数,用于访问同一上下文中的其他选项。
- 如果在更早的时候没有找到匹配项,则解析会降级到上级范围。有关详细信息,请查看 选项。
# 特定更改
elements.rectangle现在为elements.barhover.animationDuration现在在animation.active.duration中配置responsiveAnimationDuration现在在animation.resize.duration中配置- 极区
elements.arc.angle现在以度数而不是弧度配置。 - 极区
startAngle选项现在与Radar保持一致,0 在顶部,值为度数。默认值已从-½π更改为0。 - 甜甜圈
rotation选项现在以度数表示,0 在顶部。默认值已从-½π更改为0。 - 甜甜圈
circumference选项现在以度数表示。默认值已从2π更改为360。 - 甜甜圈
cutoutPercentage已重命名为cutout,并接受以像素为单位的数字和以百分比为单位的字符串,以%结尾。 scale选项已删除,取而代之的是options.scales.r(或任何其他刻度 ID,其中axis: 'r')scales.[x/y]Axes数组已删除。现在直接将刻度配置到options.scales对象中,对象键是刻度 ID。scales.[x/y]Axes.barPercentage已移至数据集选项barPercentagescales.[x/y]Axes.barThickness已移至数据集选项barThicknessscales.[x/y]Axes.categoryPercentage已移至数据集选项categoryPercentagescales.[x/y]Axes.maxBarThickness已移至数据集选项maxBarThicknessscales.[x/y]Axes.minBarLength已移至数据集选项minBarLengthscales.[x/y]Axes.scaleLabel已重命名为scales[id].titlescales.[x/y]Axes.scaleLabel.labelString已重命名为scales[id].title.textscales.[x/y]Axes.ticks.beginAtZero已重命名为scales[id].beginAtZeroscales.[x/y]Axes.ticks.max已重命名为scales[id].maxscales.[x/y]Axes.ticks.min已重命名为scales[id].minscales.[x/y]Axes.ticks.reverse已重命名为scales[id].reversescales.[x/y]Axes.ticks.suggestedMax已重命名为scales[id].suggestedMaxscales.[x/y]Axes.ticks.suggestedMin已重命名为scales[id].suggestedMinscales.[x/y]Axes.ticks.unitStepSize已删除。使用scales[id].ticks.stepSizescales.[x/y]Axes.ticks.userCallback已重命名为scales[id].ticks.callbackscales.[x/y]Axes.time.format已重命名为scales[id].time.parserscales.[x/y]Axes.time.max已重命名为scales[id].maxscales.[x/y]Axes.time.min已重命名为scales[id].min- 坐标轴的
scales.[x/y]Axes.zeroLine*选项已删除。请改用可脚本的刻度选项。 - 数据集选项
steppedLine已删除。使用stepped - 图表选项
showLines已重命名为showLine,以匹配数据集选项。 - 图表选项
startAngle已移至radial刻度选项。 - 要覆盖图表实例中使用的平台类,请在配置对象中传递
platform: PlatformClass。请注意,应传递类,而不是类的实例。 - 对于甜甜圈、饼图、极区和雷达图,
aspectRatio默认值为 1 TimeScale不再默认从对象数据中读取t。默认属性为x或y,具体取决于方向。有关如何更改默认值的详细信息,请查看 数据结构。tooltips命名空间已重命名为tooltip,以匹配插件名称legend、title和tooltip命名空间已从options移至options.plugins。tooltips.custom已重命名为plugins.tooltip.external
# 默认值
global命名空间已从defaults中删除。因此,Chart.defaults.global现在为Chart.defaults- 数据集控制器默认值已重新定位到
overrides。例如,Chart.defaults.line现在为Chart.overrides.line - 已从默认值中删除
default前缀。例如,Chart.defaults.global.defaultColor现在为Chart.defaults.color defaultColor已拆分为color、borderColor和backgroundColordefaultFontColor已重命名为colordefaultFontFamily已重命名为font.familydefaultFontSize已重命名为font.sizedefaultFontStyle已重命名为font.styledefaultLineHeight已重命名为font.lineHeight- 水平条形图的默认工具提示模式已从
'index'更改为'nearest',以匹配垂直条形图 legend、title和tooltip命名空间已从Chart.defaults移至Chart.defaults.plugins。elements.line.fill默认值已从true更改为false。- 折线图不再覆盖默认的
interaction模式。默认值已从'index'更改为'nearest'。
# 刻度
刻度的配置选项是 v3 中最大的更改。xAxes 和 yAxes 数组已删除,坐标轴选项现在是按刻度 ID 键的单个刻度。
下面显示了 v2 配置及其新的 v3 配置
options: {
scales: {
xAxes: [{
id: 'x',
type: 'time',
display: true,
title: {
display: true,
text: 'Date'
},
ticks: {
major: {
enabled: true
},
font: function(context) {
if (context.tick && context.tick.major) {
return {
weight: 'bold',
color: '#FF0000'
};
}
}
}
}],
yAxes: [{
id: 'y',
display: true,
title: {
display: true,
text: 'value'
}
}]
}
}
现在,在 v3 中
options: {
scales: {
x: {
type: 'time',
display: true,
title: {
display: true,
text: 'Date'
},
ticks: {
major: {
enabled: true
},
color: (context) => context.tick && context.tick.major && '#FF0000',
font: function(context) {
if (context.tick && context.tick.major) {
return {
weight: 'bold'
};
}
}
}
},
y: {
display: true,
title: {
display: true,
text: 'value'
}
}
}
}
- 时间刻度选项
distribution: 'series'已删除,取而代之的是新的刻度类型timeseries - 在时间刻度中,
autoSkip现在默认情况下处于启用状态,以与其他刻度保持一致
# 动画
Chart.js v3 中动画系统已完全重写。现在每个属性都可以单独进行动画。有关详细信息,请参阅动画文档。
# 可定制性
- 元素的
custom属性已被移除。请使用可脚本化的选项 - 可脚本化选项
context对象的hover属性已重命名为active,以与数据标签插件保持一致。
# 交互
- 为了允许 DRY 配置,添加了用于常见交互选项的根选项范围。
options.hover和options.plugins.tooltip现在都从options.interaction继承。默认值是在defaults.interaction级别定义的,因此默认情况下,悬停和工具提示交互共享相同的模式等。 interactions现在仅限于图表区域 + 允许的溢出{mode: 'label'}已替换为{mode: 'index'}{mode: 'single'}已替换为{mode: 'nearest', intersect: true}modes['X-axis']已替换为{mode: 'index', intersect: false}options.onClick现在仅限于图表区域options.onClick和options.onHover现在接受chart实例作为第三个参数options.onHover现在将包装的event作为第一个参数接收。可以通过event.native访问先前的第一个参数值。options.hover.onHover已移除,请使用options.onHover。
# 刻度
options.gridLines已重命名为options.gridoptions.gridLines.offsetGridLines已重命名为options.grid.offset。options.gridLines.tickMarkLength已重命名为options.grid.tickLength。options.ticks.fixedStepSize已不再使用。请使用options.ticks.stepSize。options.ticks.major和options.ticks.minor已被可脚本化选项替换为刻度字体。Chart.Ticks.formatters.linear已重命名为Chart.Ticks.formatters.numeric。options.ticks.backdropPaddingX和options.ticks.backdropPaddingY已在径向线性刻度中替换为options.ticks.backdropPadding。
# 工具提示
xLabel和yLabel已移除。请使用label和formattedValuefilter选项现在将在调用时传递额外的参数,并且应该具有方法签名function(tooltipItem, index, tooltipItems, data)custom回调现在接受具有tooltip和chart属性的上下文对象- 与工具提示选项相关的工具提示模型的所有属性都已移至
options属性内。 - 回调不再获得
data参数。工具提示项参数包含图表和数据集而不是 - 工具提示项的
index参数已重命名为dataIndex,value已重命名为formattedValue xPadding和yPadding选项已合并到单个padding对象中
# 开发人员迁移
虽然 Chart.js 3 的最终用户迁移相当简单,但开发人员迁移可能更复杂。如果您需要迁移方面的帮助,请在 #dev Discord (opens new window) 频道中寻求帮助。
一些最重大的变化
- 动画系统已完全重写,性能更高。
Element._model和Element._view已不再使用,属性现在直接设置在元素上。您将不得不使用方法getProps在大多数方法(如inXRange/inYRange和getCenterPoint)中访问这些属性。请查看Chart.js 提供的元素 (opens new window)以获取示例。- 在控制器中构建元素时,现在建议调用
updateElement来提供元素属性。还添加了getSharedOptions和includeOptions等方法,以跳过冗余计算。请查看Chart.js 提供的控制器 (opens new window)以获取示例。
- 刻度引入了新的解析 API。此 API 采用用户数据并将其转换为更标准的格式。例如,它允许用户将数字数据提供为
string,并在必要时将其转换为number。以前,这在图表呈现时动态完成。现在,它是在前面完成的,如果用户以正确的格式提供数据,则可以跳过它以提高性能。如果您使用标准数据格式(如x/y),您可能不需要执行任何操作。如果您使用自定义数据格式,您将不得不覆盖core.datasetController.js中的某些解析方法。可以在chartjs-chart-financial (opens new window)中找到示例,它使用{o, h, l, c}数据格式。
对控制器进行了一些更直接的更改,但会影响所有控制器
- 选项
global已从默认名称空间中移除,因为它是多余的,并且有时不一致- 数据集默认值现在位于图表类型选项下,而不是相反。由于向后兼容性的原因,这在 2.x 中引入时无法做到。修复它消除了新图表开发人员遇到的最大障碍
- 刻度默认选项需要根据最终用户迁移部分中的说明进行更新(例如,
x而不是xAxes,y而不是yAxes)
updateElement已更改为updateElements并且具有新的方法签名,如下所述。这提供了性能增强,例如允许更轻松地重用对所有元素都通用的计算,并减少函数调用次数
# 已移除
以下属性和方法已被移除
# 从 Chart 中移除
Chart.animationServiceChart.activeChart.borderWidthChart.chart.chartChart.Bar。新图表是通过new Chart创建的,并提供适当的type参数Chart.Bubble。新图表是通过new Chart创建的,并提供适当的type参数Chart.ChartChart.ControllerChart.Doughnut。新图表是通过new Chart创建的,并提供适当的type参数Chart.innerRadius现在位于甜甜圈、饼图和极坐标控制器上Chart.lastActiveChart.Legend已移动到Chart.plugins.legend._element并设为私有Chart.Line。新图表是通过new Chart创建的,并提供适当的type参数Chart.LinearScaleBase现在必须导入,不能从Chart对象访问Chart.offsetXChart.offsetYChart.outerRadius现在位于甜甜圈、饼图和极坐标控制器上Chart.plugins已替换为Chart.registry。插件默认值现在位于Chart.defaults.plugins[id]中。Chart.plugins.register已替换为Chart.register。Chart.PolarArea。新图表是通过new Chart创建的,并提供适当的type参数Chart.prototype.generateLegendChart.platform。它只包含disableCSSInjection。v3 中从未注入 CSS。Chart.PluginBaseChart.Radar。新图表是通过new Chart创建的,并提供适当的type参数Chart.radiusLengthChart.scaleService已替换为Chart.registry。刻度默认值现在位于Chart.defaults.scales[type]中。Chart.Scatter。新图表是通过new Chart创建的,并提供适当的type参数Chart.typesChart.Title已移动到Chart.plugins.title._element并设为私有Chart.Tooltip现在由工具提示插件提供。定位器可以从tooltipPlugin.positioners访问ILayoutItem.minSize
# 从数据集控制器中移除
BarController.getDatasetMeta().barDatasetController.addElementAndResetDatasetController.createMetaDataDatasetController.createMetaDatasetDoughnutController.getRingIndex
# 从元素中移除
Element.getAreaElement.heightElement.hidden已替换为图表级别状态,可与getDataVisibility(index)/toggleDataVisibility(index)一起使用Element.initializeElement.inLabelRangeLine.calculatePointY
# 从助手函数中移除
helpers.addEventhelpers.aliasPixelhelpers.arrayEqualshelpers.configMergehelpers.findIndexhelpers.findNextWherehelpers.findPreviousWherehelpers.extend。请改用Object.assign。helpers.getValueAtIndexOrDefault。请改用helpers.resolve。helpers.indexOfhelpers.lineTohelpers.longestText已设为私有helpers.maxhelpers.measureText已设为私有helpers.minhelpers.nextItemhelpers.niceNumhelpers.numberOfLabelLineshelpers.previousItemhelpers.removeEventhelpers.roundedRecthelpers.scaleMergehelpers.where
# 从布局中移除
Layout.defaults
# 从刻度中移除
LinearScaleBase.handleDirectionalChangesLogarithmicScale.minNotZeroScale.getRightValueScale.longestLabelWidthScale.longestTextCache现在是私有的Scale.margins现在是私有的Scale.mergeTicksOptionsScale.ticksAsNumbersScale.tickValues现在是私有的TimeScale.getLabelCapacity现在是私有的TimeScale.tickFormatFunction现在是私有的
# 从插件(图例、标题和工具提示)中移除
IPlugin.afterScaleUpdate。请改用afterLayoutLegend.margins现在是私有的- 图例
onClick、onHover和onLeave选项现在除了通过this隐式接收外,还会接收图例作为第三个参数。 - 图例
onClick、onHover和onLeave选项现在接收一个包装的event作为第一个参数。以前第一个参数值可以通过event.native访问。 Title.margins现在是私有的。- 工具提示项的
x和y属性已替换为element。您可以使用element.x和element.y或element.tooltipPosition()代替。
# 公共 API 的移除
以下公共 API 已被移除。
getElementAtEvent被chart.getElementsAtEventForMode(e, 'nearest', { intersect: true }, false)替换。getElementsAtEvent被chart.getElementsAtEventForMode(e, 'index', { intersect: true }, false)替换。getElementsAtXAxis被chart.getElementsAtEventForMode(e, 'index', { intersect: false }, false)替换。getDatasetAtEvent被chart.getElementsAtEventForMode(e, 'dataset', { intersect: true }, false)替换。
# 私有 API 的移除
以下私有 API 已被移除。
Chart._bufferedRenderChart._updatingChart.data.datasets[datasetIndex]._metaDatasetController._getIndexScaleIdDatasetController._getIndexScaleDatasetController._getValueScaleIdDatasetController._getValueScaleElement._ctxElement._modelElement._viewLogarithmicScale._valueOffsetTimeScale.getPixelForOffsetTimeScale.getLabelWidthTooltip._lastActive
# 重命名
以下属性在 v3 开发过程中被重命名。
Chart.Animation.animationObject被重命名为Chart.AnimationChart.Animation.chartInstance被重命名为Chart.Animation.chartChart.canvasHelpers被合并到Chart.helpers中。Chart.elements.Arc被重命名为Chart.elements.ArcElementChart.elements.Line被重命名为Chart.elements.LineElementChart.elements.Point被重命名为Chart.elements.PointElementChart.elements.Rectangle被重命名为Chart.elements.BarElementChart.layoutService被重命名为Chart.layoutsChart.pluginService被重命名为Chart.pluginshelpers.callCallback被重命名为helpers.callbackhelpers.drawRoundedRectangle被重命名为helpers.roundedRecthelpers.getValueOrDefault被重命名为helpers.valueOrDefaultLayoutItem.fullWidth被重命名为LayoutItem.fullSizePoint.controlPointPreviousX被重命名为Point.cp1xPoint.controlPointPreviousY被重命名为Point.cp1yPoint.controlPointNextX被重命名为Point.cp2xPoint.controlPointNextY被重命名为Point.cp2yScale.calculateTickRotation被重命名为Scale.calculateLabelRotationTooltip.options.legendColorBackgroupd被重命名为Tooltip.options.multiKeyBackground
# 私有 API 重命名
以下私有 API 已被重命名。
BarController.calculateBarIndexPixels被重命名为BarController._calculateBarIndexPixelsBarController.calculateBarValuePixels被重命名为BarController._calculateBarValuePixelsBarController.getStackCount被重命名为BarController._getStackCountBarController.getStackIndex被重命名为BarController._getStackIndexBarController.getRuler被重命名为BarController._getRulerChart.destroyDatasetMeta被重命名为Chart._destroyDatasetMetaChart.drawDataset被重命名为Chart._drawDatasetChart.drawDatasets被重命名为Chart._drawDatasetsChart.eventHandler被重命名为Chart._eventHandlerChart.handleEvent被重命名为Chart._handleEventChart.initialize被重命名为Chart._initializeChart.resetElements被重命名为Chart._resetElementsChart.unbindEvents被重命名为Chart._unbindEventsChart.updateDataset被重命名为Chart._updateDatasetChart.updateDatasets被重命名为Chart._updateDatasetsChart.updateLayout被重命名为Chart._updateLayoutDatasetController.destroy被重命名为DatasetController._destroyDatasetController.insertElements被重命名为DatasetController._insertElementsDatasetController.onDataPop被重命名为DatasetController._onDataPopDatasetController.onDataPush被重命名为DatasetController._onDataPushDatasetController.onDataShift被重命名为DatasetController._onDataShiftDatasetController.onDataSplice被重命名为DatasetController._onDataSpliceDatasetController.onDataUnshift被重命名为DatasetController._onDataUnshiftDatasetController.removeElements被重命名为DatasetController._removeElementsDatasetController.resyncElements被重命名为DatasetController._resyncElementsLayoutItem.isFullWidth被重命名为LayoutItem.isFullSizeRadialLinearScale.setReductions被重命名为RadialLinearScale._setReductionsRadialLinearScale.pointLabels被重命名为RadialLinearScale._pointLabelsScale.handleMargins被重命名为Scale._handleMargins
# 更改
本节中列出的 API 在版本 2 中的签名或行为已发生更改。
# 刻度更改
Scale.getLabelForIndex被scale.getLabelForValue替换。Scale.getPixelForValue现在只需要一个参数。对于TimeScale,该参数必须是自纪元以来的毫秒数。作为性能优化,它可能接受可选的第二个参数,给出数据点的索引。
# 刻度更改
Scale.afterBuildTicks现在与其他回调一样没有参数。Scale.buildTicks现在预计会返回刻度对象。Scale.convertTicksToLabels被重命名为generateTickLabels。现在它预计会设置作为输入给定的刻度的标签属性。Scale.ticks现在包含对象而不是字符串。- 当
autoSkip选项启用时,Scale.ticks现在仅包含非跳过的刻度,而不是所有刻度。 - 刻度现在始终按单调递增的顺序生成。
# 时间刻度更改
getValueForPixel现在返回自纪元以来的毫秒数。
# 控制器更改
# 核心控制器
updateHoverStyle的第一个参数现在是一个对象数组,包含element、datasetIndex和index。resize的签名或参数已更改,第一个silent参数已删除。
# 数据集控制器
updateElement被updateElements替换,现在它接受要更新的元素、start索引、count和mode。setHoverStyle和removeHoverStyle现在还接受datasetIndex和index。
# 交互更改
- 交互模式方法现在返回一个包含
element、datasetIndex和index的对象数组。
# 布局更改
ILayoutItem.update不再有返回值。
# 辅助函数更改
所有辅助函数现在都以扁平化的层次结构公开,例如,Chart.helpers.canvas.clipArea -> Chart.helpers.clipArea
# 画布辅助函数
drawPoint的第二个参数现在是完整的选项对象,因此style、rotation和radius不再被显式传递。helpers.getMaximumHeight被helpers.dom.getMaximumSize替换。helpers.getMaximumWidth被helpers.dom.getMaximumSize替换。helpers.clear被重命名为helpers.clearCanvas,现在它接受canvas和可选的ctx作为参数。helpers.retinaScale接受可选的第三个参数forceStyle,它强制覆盖当前画布样式。forceRatio不再回退到window.devicePixelRatio,而是默认为1。
# 平台更改
Chart.platform不再是图表使用的平台对象。每个图表实例现在都有一个单独的平台实例。Chart.platforms是一个包含两个可用平台类的对象,BasicPlatform和DomPlatform。它还包含BasePlatform,所有平台都必须扩展的类。- 如果传递的画布是
OffscreenCanvas的实例,则会自动使用BasicPlatform。 isAttached方法已添加到平台。
# IPlugin 接口更改
- 所有插件钩子都具有统一的签名,包含 3 个参数:
chart、args和options。这意味着以下钩子的签名已更改:beforeInit、afterInit、reset、beforeLayout、afterLayout、beforeRender、afterRender、beforeDraw、afterDraw、beforeDatasetsDraw、afterDatasetsDraw、beforeEvent、afterEvent、resize、destroy。 afterDatasetsUpdate、afterUpdate、beforeDatasetsUpdate和beforeUpdate现在接收args对象作为第二个参数。options参数始终是最后一个,因此已从第二个位置移动到第三个位置。afterEvent和beforeEvent现在接收一个包装的event作为第二个参数的event属性。原始事件可以通过args.event.native获取。- 初始
resize不再是静默的。这意味着resize事件可以在beforeInit和afterInit之间触发。 - 新的钩子:
install、start、stop和uninstall afterEvent应通过将args.changed设置为 true 来通知需要渲染的更改。因为args与所有插件共享,所以它应该只设置为 true,而不是 false。
← 4.x 迁移指南