Ability to choose partial plotly.js bundles #462
Description
Great library 💃 One small improvement 💡 : Currently dcc
is shipped with the full plotly.min.js
bundle. Do you see an easy/elegant way of enabling the user to specify one of the partial plotly.js bundles, and let e.g. the full bundle be the default?
I currently see two use cases:
- Reduced size (full
plotly.min.js
2.8 MB, while e.g.plotly.cartesian.js
, covering many applications, is 0.9 MB). - Make it possible to enforce a strong CSP configuration (useful for applications where increased security is wanted).
Regarding 2), Dash alone works beautifully with a strong CSP configuration. You can e.g. do
pip install dash dash_html_components dash_core_components flask-talisman
and then run
import dash
import dash_html_components as html
import dash_core_components as dcc
from flask_talisman import Talisman
app = dash.Dash(__name__)
app.css.config.serve_locally = True
app.scripts.config.serve_locally = True
csp = {
'default-src': '\'self\'',
'prefetch-src': '\'self\'',
#'script-src': ['\'self\'', '\'unsafe-eval\''], # [1]
#'style-src': ['\'self\'', '\'unsafe-inline\''], # [2]
'navigate-to': '\'self\'',
'base-uri': '\'self\'',
'form-action': '\'self\'',
'frame-ancestors': '\'none\'',
'object-src': '\'none\''
}
# [1]: https://github.com/plotly/plotly.js/issues/897
# [2]: https://github.com/plotly/plotly.js/issues/2355
Talisman(app.server, content_security_policy=csp, force_https=False)
app.layout = html.Div(children=['Hello Dash!'])
#app.layout = html.Div(children=['Hello Dash!', dcc.Graph()])
if __name__ == '__main__':
app.run_server(host='localhost')
This works beautifully in Dash.
However if dcc.Graph()
is added to app.layout
you will in the browser get "Error loading dependencies" due to violation of CSP directives script-src
and style-src
(these comes from plotly/plotly.js#897 and plotly/plotly.js#2355 respectively).
This can be "solved" by adding unsafe-eval
and unsafe-inline
, but the script-src
part can be solved in a safer way by using one of the partial bundles of plotly.js
instead, for applications where you don't need gl3d
and gl2d
.
I quickly tested overwriting the [...]/lib/python3.7/site-packages/dash_core_components/plotly[...].min.js
installed in the environment with one of the partial plotly.js
bundles, and that enabled (as expected) a stricter CSP without opening for eval()
and its relatives.