⚠️ Breaking changes
- It is now an error to attempt to remove a source that is in use [5562](https://github.com/mapbox/mapbox-gl-js/pull/5562)
- It is now an error if the layer specified by the `before` parameter to `moveLayer` does not exist [5679](https://github.com/mapbox/mapbox-gl-js/pull/5679)
- `"colorSpace": "hcl"` now uses shortest-path interpolation for hue [5811](https://github.com/mapbox/mapbox-gl-js/issues/5811)
✨ Features and improvements
- Introduce client-side hillshading with `raster-dem` source type and `hillshade` layer type [5286](https://github.com/mapbox/mapbox-gl-js/pull/5286)
- GeoJSON sources take 2x less memory and generate tiles 20%–100% faster [5799](https://github.com/mapbox/mapbox-gl-js/pull/5799)
- Enable data-driven values for text-font [5698](https://github.com/mapbox/mapbox-gl-js/pull/5698)
- Enable data-driven values for heatmap-radius [5898](https://github.com/mapbox/mapbox-gl-js/pull/5898)
- Add getter and setter for offset on marker [5759](https://github.com/mapbox/mapbox-gl-js/pull/5759)
- Add `MaphasImage` [5775](https://github.com/mapbox/mapbox-gl-js/pull/5775)
- Improve typing for `==` and `!=` expressions [5840](https://github.com/mapbox/mapbox-gl-js/pull/5840)
- Made `coalesce` expressions more useful [5755](https://github.com/mapbox/mapbox-gl-js/issues/5755)
- Enable implicit type assertions for array types [5738](https://github.com/mapbox/mapbox-gl-js/pull/5738)
- Improve hash control precision [5767](https://github.com/mapbox/mapbox-gl-js/pull/5767)
- `supported()` now returns false on old IE 11 versions that don't support Web Worker blob URLs [5801](https://github.com/mapbox/mapbox-gl-js/pull/5801)
- Remove flow globals TileJSON and Transferable [5668](https://github.com/mapbox/mapbox-gl-js/pull/5668)
- Improve performance of image, video, and canvas sources [5845](https://github.com/mapbox/mapbox-gl-js/pull/5845)
🐛 Bug fixes
- Fix popups and markers lag during pan animation [4670](https://github.com/mapbox/mapbox-gl-js/issues/4670)
- Fix fading of symbol layers caused by setData [5716](https://github.com/mapbox/mapbox-gl-js/issues/5716)
- Fix behavior of `to-rgba` and `rgba` expressions [5778](https://github.com/mapbox/mapbox-gl-js/pull/5778), [#5866](https://github.com/mapbox/mapbox-gl-js/pull/5866)
- Fix cross-fading of `*-pattern` and `line-dasharray` [5791](https://github.com/mapbox/mapbox-gl-js/pull/5791)
- Fix `colorSpace` function property [5843](https://github.com/mapbox/mapbox-gl-js/pull/5843)
- Fix style diffing when changing GeoJSON source properties [5731](https://github.com/mapbox/mapbox-gl-js/issues/5731)
- Fix missing labels when zooming out from overzoomed tile [5827](https://github.com/mapbox/mapbox-gl-js/issues/5827)
- Fix missing labels when zooming out and quickly using setData [5837](https://github.com/mapbox/mapbox-gl-js/issues/5837)
- Handle NaN as input to step and interpolate expressions [5757](https://github.com/mapbox/mapbox-gl-js/pull/5757)
- Clone property values on input and output [5806](https://github.com/mapbox/mapbox-gl-js/pull/5806)
- Bump geojson-rewind dependency [5769](https://github.com/mapbox/mapbox-gl-js/pull/5769)
- Allow setting Marker's popup before LngLat [5893](https://github.com/mapbox/mapbox-gl-js/pull/5893)