Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SVG sizes could be significantly smaller by reducing redundancies #2716

Closed
Validark opened this issue Jun 4, 2022 · 0 comments
Closed

SVG sizes could be significantly smaller by reducing redundancies #2716

Validark opened this issue Jun 4, 2022 · 0 comments

Comments

@Validark
Copy link

Validark commented Jun 4, 2022

The SVG's created by billboard.js can be massive for decently large datasets, and just cutting down some of the unnecessary size would probably make everything smoother. I was using the areaRangeChart, although I'm sure this is applicable to many different kinds of charts.

I looked at my generated circle elements and they all have two major sources of bloat:

  • class="bb-shape bb-shape-16 bb-circle bb-circle-16"
    • with 10000 circles, this adds an additional ~557788 bytes / ~558 kilobytes, assuming utf8-encoding
    • bb-shape and bb-circle should be removed in favor of a CSS rule with a selector like div.bb circle
    • bb-shape-16 and bb-circle-16 are redundant, and should be removed. Keep in mind that a class is a template for an instance. If you need to give an element an id, it should go in the id property. However, I think circle elements should not have an id, especially if the id is just e.g. 16. Perhaps the library should maintain an array of circles and identify them with circles[16]?
  • style="fill: rgb(31, 119, 180); stroke: rgb(31, 119, 180);"
    • with 10000 circles, this adds an additional 600000 bytes / 600 kilobytes, assuming utf8-encoding
    • these could be removed by just wrapping the circles in a <g> element (for each of the different colors) and placing the fill/stroke in the <g> element.
    • a bit of a micro-optimization but rgb(31, 119, 180) could be converted to the hex #1f77b4, since hex colors are shorter than their rgb counterparts

In such cases, over a MB of unnecessary data could easily be removed.

P.S. https://vecta.io/nano is a good tool for compressing SVG's. Perhaps some tricks could be borrowed from it?

netil added a commit to netil/billboard.js that referenced this issue Jun 14, 2022
Implement boost.useCssRule, which avoid setting element's
style as inlined.

Ref naver#2716
@netil netil closed this as completed in 4a060d6 Jun 14, 2022
github-actions bot pushed a commit that referenced this issue Jun 22, 2022
# [3.5.0-next.2](3.5.0-next.1...3.5.0-next.2) (2022-06-22)

### Bug Fixes

* **option:** Fix onresize/onresized call context ([3ef9684](3ef9684)), closes [#2726](#2726)
* **plugin, type:** fix TextOverlap type definition ([80cc3b7](80cc3b7))

### Features

* **area:** add option to render area below line ([cf60291](cf60291)), closes [#2740](#2740) [#2741](#2741)
* **option:** Intent to ship boost.useCssRule ([4a060d6](4a060d6)), closes [#2716](#2716)
* **option:** Intent to ship boost.useWorker ([eeaf8bd](eeaf8bd))
github-actions bot pushed a commit that referenced this issue Jun 30, 2022
# [3.5.0](3.4.1...3.5.0) (2022-06-30)

### Bug Fixes

* **bar:** fix bar radius for zero value ([9aa7579](9aa7579)), closes [#2642](#2642)
* **build:** Fix this keyword transpile ([b65531a](b65531a)), closes [#2671](#2671) [#2664](#2664) [#2665](#2665) [#2666](#2666) [#2667](#2667)
* **data:** Fix data label position on inverted axis ([b024d83](b024d83)), closes [#2700](#2700)
* **grid:** Fix y grid to show for log axis type ([d0b8cbd](d0b8cbd)), closes [#2710](#2710)
* **option:** Fix onresize/onresized call context ([3ef9684](3ef9684)), closes [#2726](#2726)
* **plugin, type:** fix TextOverlap type definition ([80cc3b7](80cc3b7))
* **plugin:** fix sparkline dimension & tooltip ([79e1ab7](79e1ab7)), closes [#2682](#2682)
* **plugin:** fix stanford tooltip formatting ([9a87464](9a87464)), closes [#2657](#2657)
* **resize:** Fix legend resize ([7df949b](7df949b)), closes [#2650](#2650)
* **scale:** fix getting tickOffset ([3091677](3091677)), closes [#2669](#2669)
* **size.axis:** fix truncated axis when has no data ([40f4b66](40f4b66)), closes [#2675](#2675)
* **types:** Fix `Chart.load({ json })` typing ([1bd4f4a](1bd4f4a)), closes [#2711](#2711)
* **types:** Fix the signature of the tick format callback for timeseries ([c9c76e5](c9c76e5)), closes [#2676](#2676)
* **types:** Fix the type for options.data.names ([e64f6bd](e64f6bd)), closes [#2677](#2677)
* **types:** Fix types for the tooltip contents callback ([a0c0355](a0c0355)), closes [#2693](#2693)
* **zoom:** fix wheel zoom feeling "stuck" when panning past the edge ([50ed640](50ed640)), closes [#2588](#2588) [#2648](#2648)

### Features

* **area:** add option to render area below line ([cf60291](cf60291)), closes [#2740](#2740) [#2741](#2741)
* **data:** Intent to ship data.labels.rotate ([7b7ee08](7b7ee08)), closes [#2662](#2662)
* **option:** Intent to ship boost.useCssRule ([4a060d6](4a060d6)), closes [#2716](#2716)
* **option:** Intent to ship boost.useWorker ([eeaf8bd](eeaf8bd))
* **resize:** Intent to ship resize.timer ([#2712](#2712)) ([0a07de0](0a07de0)), closes [#2650](#2650)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants