Skip to content

Commit 3243512

Browse files
authored
Merge pull request #2260 from plotly/react-18
Experimental: enable React 18
2 parents ae093af + b75da3b commit 3243512

File tree

7 files changed

+228
-99
lines changed

7 files changed

+228
-99
lines changed

.circleci/config.yml

Lines changed: 76 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,24 @@ jobs:
204204
- store_artifacts:
205205
path: /tmp/dash_artifacts
206206

207+
test-39-react-18:
208+
<<: *test
209+
docker:
210+
- image: cimg/python:3.9.9-browsers
211+
auth:
212+
username: dashautomation
213+
password: $DASH_PAT_DOCKERHUB
214+
environment:
215+
PERCY_ENABLE: 0
216+
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: True
217+
PYVERSION: python39
218+
REDIS_URL: redis://localhost:6379
219+
REACT_VERSION: "18.2.0"
220+
- image: cimg/redis:6.2.6
221+
auth:
222+
username: dashautomation
223+
password: $DASH_PAT_DOCKERHUB
224+
207225
test-36:
208226
<<: *test
209227
docker:
@@ -258,7 +276,7 @@ jobs:
258276
PYVERSION: python36
259277
PERCY_ENABLE: 0
260278

261-
dcc-test-39: &dcc-test
279+
dcc-39: &dcc-test
262280
working_directory: ~/dash
263281
docker:
264282
- image: cimg/python:3.9.9-browsers
@@ -302,7 +320,19 @@ jobs:
302320
- store_artifacts:
303321
path: /tmp/dash_artifacts
304322

305-
dcc-test-36:
323+
dcc-39-react-18:
324+
<<: *dcc-test
325+
docker:
326+
- image: cimg/python:3.9.9-browsers
327+
auth:
328+
username: dashautomation
329+
password: $DASH_PAT_DOCKERHUB
330+
environment:
331+
PYVERSION: python39
332+
PERCY_ENABLE: 0
333+
REACT_VERSION: "18.2.0"
334+
335+
dcc-36:
306336
<<: *dcc-test
307337
docker:
308338
- image: cimg/python:3.6.15-browsers
@@ -313,7 +343,7 @@ jobs:
313343
PYVERSION: python36
314344
PERCY_ENABLE: 0
315345

316-
html-python-39: &html-test
346+
html-39: &html-test
317347
working_directory: ~/dash
318348
docker:
319349
- image: cimg/python:3.9.9-browsers
@@ -365,7 +395,19 @@ jobs:
365395
- store_artifacts:
366396
path: /tmp/dash_artifacts
367397

368-
html-python-36:
398+
html-39-react-18:
399+
<<: *html-test
400+
docker:
401+
- image: cimg/python:3.9.9-browsers
402+
auth:
403+
username: dashautomation
404+
password: $DASH_PAT_DOCKERHUB
405+
environment:
406+
PYVERSION: python39
407+
PERCY_ENABLE: 0
408+
REACT_VERSION: "18.2.0"
409+
410+
html-36:
369411
<<: *html-test
370412
docker:
371413
- image: cimg/python:3.6.15-browsers
@@ -376,7 +418,7 @@ jobs:
376418
PYVERSION: python36
377419
PERCY_ENABLE: 0
378420

379-
table-server-test:
421+
table-server: &table-server
380422
working_directory: ~/dash
381423
docker:
382424
- image: cimg/python:3.9.9-browsers
@@ -423,6 +465,15 @@ jobs:
423465
- store_artifacts:
424466
path: /tmp/dash_artifacts
425467

468+
table-server-react-18:
469+
<<: *table-server
470+
docker:
471+
- image: cimg/python:3.9.9-browsers
472+
environment:
473+
PYVERSION: python39
474+
PERCY_ENABLE: 0
475+
REACT_VERSION: "18.2.0"
476+
426477
table-unit-test:
427478
working_directory: ~/dash
428479
docker:
@@ -552,6 +603,9 @@ workflows:
552603
- test-39:
553604
requires:
554605
- install-dependencies-39
606+
- test-39-react-18:
607+
requires:
608+
- install-dependencies-39
555609
- test-36:
556610
requires:
557611
- install-dependencies-36
@@ -563,17 +617,23 @@ workflows:
563617
requires:
564618
- install-dependencies-36
565619

566-
- dcc-test-39:
620+
- dcc-39:
567621
requires:
568622
- install-dependencies-39
569-
- dcc-test-36:
623+
- dcc-39-react-18:
624+
requires:
625+
- install-dependencies-39
626+
- dcc-36:
570627
requires:
571628
- install-dependencies-36
572629

573-
- html-python-39:
630+
- html-39:
631+
requires:
632+
- install-dependencies-39
633+
- html-39-react-18:
574634
requires:
575635
- install-dependencies-39
576-
- html-python-36:
636+
- html-36:
577637
requires:
578638
- install-dependencies-36
579639

@@ -584,16 +644,19 @@ workflows:
584644
requires:
585645
- install-dependencies-39
586646
- table-visual-test
587-
- table-server-test:
647+
- table-server:
648+
requires:
649+
- install-dependencies-39
650+
- table-server-react-18:
588651
requires:
589652
- install-dependencies-39
590653

591654
- percy/finalize_all:
592655
requires:
593656
- test-39
594-
- dcc-test-39
595-
- html-python-39
596-
- table-server-test
657+
- dcc-39
658+
- html-39
659+
- table-server
597660
- artifacts:
598661
requires:
599662
- percy/finalize_all

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ This project adheres to [Semantic Versioning](https://semver.org/).
99
- [#2417](https://github.com/plotly/dash/pull/2417) Add wait_timeout property to customize the behavior of the default wait timeout used for by wait_for_page, fix [#1595](https://github.com/plotly/dash/issues/1595)
1010
- [#2417](https://github.com/plotly/dash/pull/2417) Add the element target text for wait_for_text* error message, fix [#945](https://github.com/plotly/dash/issues/945)
1111
- [#2425](https://github.com/plotly/dash/pull/2425) Add `add_log_handler=True` to Dash init, if you don't want a log stream handler at all.
12+
- [#2260](https://github.com/plotly/dash/pull/2260) Experimental support for React 18. The default is still React v16.14.0, but to use React 18 you can either set the environment variable `REACT_VERSION=18.2.0` before running your app, or inside the app call `dash._dash_renderer._set_react_version("18.2.0")`. THIS FEATURE IS EXPERIMENTAL. It has not been tested with component suites outside the Dash core, and we may add or remove available React versions in any future release.
1213

1314
## Fixed
1415

components/dash-table/tests/selenium/test_header.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def get_app(props=dict()):
2323
return app
2424

2525

26-
def get_sigle_row_app(props=dict()):
26+
def get_single_row_app(props=dict()):
2727
app = dash.Dash(__name__)
2828

2929
baseProps = get_props()
@@ -115,7 +115,7 @@ def test_head003_preserves_column_name_on_cancel(test):
115115

116116

117117
def test_head004_change_single_row_header(test):
118-
test.start_server(get_sigle_row_app())
118+
test.start_server(get_single_row_app())
119119

120120
target = test.table("table")
121121

dash/_dash_renderer.py

Lines changed: 58 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,64 @@
1+
import os
2+
13
__version__ = "1.14.5"
24

3-
_js_dist_dependencies = [
4-
{
5-
"external_url": {
6-
"prod": [
7-
"https://unpkg.com/@babel/[email protected]/dist/polyfill.min.js",
8-
"https://unpkg.com/[email protected]/umd/react.production.min.js",
9-
"https://unpkg.com/[email protected]/umd/react-dom.production.min.js",
10-
"https://unpkg.com/[email protected]/prop-types.min.js",
11-
],
12-
"dev": [
13-
"https://unpkg.com/@babel/[email protected]/dist/polyfill.min.js",
14-
"https://unpkg.com/[email protected]/umd/react.development.js",
15-
"https://unpkg.com/[email protected]/umd/react-dom.development.js",
16-
"https://unpkg.com/[email protected]/prop-types.js",
17-
],
18-
},
19-
"relative_package_path": {
20-
"prod": [
21-
22-
23-
24-
25-
],
26-
"dev": [
27-
28-
29-
30-
31-
],
32-
},
33-
"namespace": "dash",
34-
}
35-
]
5+
_available_react_versions = {"16.14.0", "18.2.0"}
6+
_available_reactdom_versions = {"16.14.0", "18.2.0"}
7+
_js_dist_dependencies = [] # to be set by _set_react_version
8+
9+
10+
def _set_react_version(v_react, v_reactdom=None):
11+
if not v_reactdom:
12+
v_reactdom = v_react
13+
14+
react_err = f"looking for one of {_available_react_versions}, found {v_react}"
15+
reactdom_err = (
16+
f"looking for one of {_available_reactdom_versions}, found {v_reactdom}"
17+
)
18+
assert v_react in _available_react_versions, react_err
19+
assert v_reactdom in _available_reactdom_versions, reactdom_err
20+
21+
_js_dist_dependencies[:] = [
22+
{
23+
"external_url": {
24+
"prod": [
25+
"https://unpkg.com/@babel/[email protected]/dist/polyfill.min.js",
26+
f"https://unpkg.com/react@{v_react}/umd/react.production.min.js",
27+
f"https://unpkg.com/react-dom@{v_reactdom}/umd/react-dom.production.min.js",
28+
"https://unpkg.com/[email protected]/prop-types.min.js",
29+
],
30+
"dev": [
31+
"https://unpkg.com/@babel/[email protected]/dist/polyfill.min.js",
32+
f"https://unpkg.com/react@{v_react}/umd/react.development.js",
33+
f"https://unpkg.com/react-dom@{v_reactdom}/umd/react-dom.development.js",
34+
"https://unpkg.com/[email protected]/prop-types.js",
35+
],
36+
},
37+
"relative_package_path": {
38+
"prod": [
39+
40+
f"deps/react@{v_react}.min.js",
41+
f"deps/react-dom@{v_reactdom}.min.js",
42+
43+
],
44+
"dev": [
45+
46+
f"deps/react@{v_react}.js",
47+
f"deps/react-dom@{v_reactdom}.js",
48+
49+
],
50+
},
51+
"namespace": "dash",
52+
}
53+
]
54+
3655

56+
_env_react_version = os.getenv("REACT_VERSION")
57+
if _env_react_version:
58+
_set_react_version(_env_react_version)
59+
print(f"EXPERIMENTAL: Using react version from env: {_env_react_version}")
60+
else:
61+
_set_react_version("16.14.0", "16.14.0")
3762

3863
_js_dist = [
3964
{

dash/dash-renderer/init.template

Lines changed: 57 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,63 @@
1+
import os
2+
13
__version__ = "$version"
24

3-
_js_dist_dependencies = [
4-
{
5-
"external_url": {
6-
"prod": [
7-
"https://unpkg.com/@babel/polyfill@$polyfill/dist/polyfill.min.js",
8-
"https://unpkg.com/react@$react/umd/react.production.min.js",
9-
"https://unpkg.com/react-dom@$reactdom/umd/react-dom.production.min.js",
10-
"https://unpkg.com/prop-types@$proptypes/prop-types.min.js",
11-
],
12-
"dev": [
13-
"https://unpkg.com/@babel/polyfill@$polyfill/dist/polyfill.min.js",
14-
"https://unpkg.com/react@$react/umd/react.development.js",
15-
"https://unpkg.com/react-dom@$reactdom/umd/react-dom.development.js",
16-
"https://unpkg.com/prop-types@$proptypes/prop-types.js",
17-
],
18-
},
19-
"relative_package_path": {
20-
"prod": [
21-
"deps/polyfill@$polyfill.min.js",
22-
"deps/react@$react.min.js",
23-
"deps/react-dom@$reactdom.min.js",
24-
"deps/prop-types@$proptypes.min.js",
25-
],
26-
"dev": [
27-
"deps/polyfill@$polyfill.min.js",
28-
"deps/react@$react.js",
29-
"deps/react-dom@$reactdom.js",
30-
"deps/prop-types@$proptypes.js",
31-
],
32-
},
33-
"namespace": "dash",
34-
}
35-
]
5+
_available_react_versions = {"$react", $extra_react_versions}
6+
_available_reactdom_versions = {"$reactdom", $extra_reactdom_versions}
7+
_js_dist_dependencies = [] # to be set by _set_react_version
8+
9+
10+
def _set_react_version(v_react, v_reactdom=None):
11+
if not v_reactdom:
12+
v_reactdom = v_react
13+
14+
react_err = f"looking for one of {_available_react_versions}, found {v_react}"
15+
reactdom_err = (
16+
f"looking for one of {_available_reactdom_versions}, found {v_reactdom}"
17+
)
18+
assert v_react in _available_react_versions, react_err
19+
assert v_reactdom in _available_reactdom_versions, reactdom_err
20+
21+
_js_dist_dependencies[:] = [
22+
{
23+
"external_url": {
24+
"prod": [
25+
"https://unpkg.com/@babel/polyfill@$polyfill/dist/polyfill.min.js",
26+
f"https://unpkg.com/react@{v_react}/umd/react.production.min.js",
27+
f"https://unpkg.com/react-dom@{v_reactdom}/umd/react-dom.production.min.js",
28+
"https://unpkg.com/prop-types@$proptypes/prop-types.min.js",
29+
],
30+
"dev": [
31+
"https://unpkg.com/@babel/polyfill@$polyfill/dist/polyfill.min.js",
32+
f"https://unpkg.com/react@{v_react}/umd/react.development.js",
33+
f"https://unpkg.com/react-dom@{v_reactdom}/umd/react-dom.development.js",
34+
"https://unpkg.com/prop-types@$proptypes/prop-types.js",
35+
],
36+
},
37+
"relative_package_path": {
38+
"prod": [
39+
"deps/polyfill@$polyfill.min.js",
40+
f"deps/react@{v_react}.min.js",
41+
f"deps/react-dom@{v_reactdom}.min.js",
42+
"deps/prop-types@$proptypes.min.js",
43+
],
44+
"dev": [
45+
"deps/polyfill@$polyfill.min.js",
46+
f"deps/react@{v_react}.js",
47+
f"deps/react-dom@{v_reactdom}.js",
48+
"deps/prop-types@$proptypes.js",
49+
],
50+
},
51+
"namespace": "dash",
52+
}
53+
]
54+
3655

56+
_env_react_version = os.getenv("REACT_VERSION")
57+
if _env_react_version:
58+
_set_react_version(_env_react_version)
59+
else:
60+
_set_react_version("$react", "$reactdom")
3761

3862
_js_dist = [
3963
{

0 commit comments

Comments
 (0)