Skip to content

Commit d65c5bb

Browse files
committed
feat: support reactive dynamic loadable (#330)
Closes #284
1 parent a10a9d5 commit d65c5bb

File tree

15 files changed

+932
-520
lines changed

15 files changed

+932
-520
lines changed

.eslintrc.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
"rules": {
99
"no-plusplus": "off",
1010
"no-param-reassign": "off",
11+
"no-nested-ternary": "off",
1112
"react/jsx-filename-extension": ["error", { "extensions": [".js"] }],
1213
"react/jsx-wrap-multilines": "off",
1314
"react/no-unused-state": "off",

babel.config.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
let targets = {}
2-
3-
if (process.env.BUILD_TARGET === 'node') {
4-
targets = { node: '8' }
1+
function getTargets() {
2+
if (process.env.BUILD_TARGET === 'node') {
3+
return { node: '8' }
4+
}
5+
return undefined
56
}
67

78
module.exports = {
89
presets: [
910
['@babel/preset-react', { useBuiltIns: true }],
10-
['@babel/preset-env', { loose: true, targets }],
11+
['@babel/preset-env', { loose: true, targets: getTargets() }],
1112
],
1213
plugins: ['@babel/plugin-proposal-class-properties'],
1314
}

examples/client-side/package.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@
66
"devDependencies": {
77
"babel-loader": "^8.0.4",
88
"html-webpack-plugin": "^3.2.0",
9-
"webpack": "^4.23.1",
10-
"webpack-cli": "^3.1.2",
11-
"webpack-dev-server": "^3.1.10"
9+
"webpack": "^4.30.0",
10+
"webpack-cli": "^3.3.2",
11+
"webpack-dev-server": "^3.3.1"
1212
},
1313
"dependencies": {
14-
"moment": "^2.22.2",
15-
"react": "^16.6.0",
16-
"react-dom": "^16.6.0"
14+
"moment": "^2.24.0",
15+
"react": "^16.8.6",
16+
"react-dom": "^16.8.6"
1717
}
1818
}

examples/client-side/src/A.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default () => 'A'

examples/client-side/src/B.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default () => 'B'

examples/client-side/src/index.js

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,30 @@
1-
import React from 'react'
1+
import React, { useState } from 'react'
22
import { render } from 'react-dom'
33
import loadable from '../../../packages/component'
44

55
const Hello = loadable(() => import('./Hello'))
6+
const Dynamic = loadable(p => import(`./${p.name}`), {
7+
cacheKey: p => p.name,
8+
})
69
const Moment = loadable.lib(() => import('moment'))
710

8-
const App = () => (
9-
<div>
10-
<Hello />
11-
<Moment>{({ default: moment }) => moment().format('HH:mm')}</Moment>
12-
</div>
13-
)
11+
function App() {
12+
const [name, setName] = useState(null)
13+
14+
return (
15+
<div>
16+
<button type="button" onClick={() => setName('A')}>
17+
Go to A
18+
</button>
19+
<button type="button" onClick={() => setName('B')}>
20+
Go to B
21+
</button>
22+
{name && <Dynamic name={name} />}
23+
<Hello />
24+
<Moment>{({ default: moment }) => moment().format('HH:mm')}</Moment>
25+
</div>
26+
)
27+
}
1428

1529
const root = document.createElement('div')
1630
document.body.append(root)

examples/client-side/yarn.lock

Lines changed: 424 additions & 388 deletions
Large diffs are not rendered by default.

examples/server-side-rendering/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010
"devDependencies": {
1111
"@babel/cli": "^7.4.4",
1212
"@babel/node": "^7.0.0",
13-
"babel-loader": "^8.0.4",
13+
"babel-loader": "^8.0.6",
1414
"css-loader": "^2.1.1",
1515
"mini-css-extract-plugin": "^0.6.0",
1616
"nodemon": "^1.19.0",
17-
"webpack": "^4.30.0",
17+
"webpack": "^4.31.0",
1818
"webpack-cli": "^3.3.2",
1919
"webpack-dev-middleware": "^3.6.2",
2020
"webpack-node-externals": "^1.7.2"

examples/server-side-rendering/yarn.lock

Lines changed: 14 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -361,15 +361,15 @@ atob@^2.1.1:
361361
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
362362
integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
363363

364-
babel-loader@^8.0.4:
365-
version "8.0.5"
366-
resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.5.tgz#225322d7509c2157655840bba52e46b6c2f2fe33"
367-
integrity sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw==
364+
babel-loader@^8.0.6:
365+
version "8.0.6"
366+
resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb"
367+
integrity sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==
368368
dependencies:
369369
find-cache-dir "^2.0.0"
370370
loader-utils "^1.0.2"
371371
mkdirp "^0.5.1"
372-
util.promisify "^1.0.0"
372+
pify "^4.0.1"
373373

374374
balanced-match@^1.0.0:
375375
version "1.0.0"
@@ -1001,13 +1001,6 @@ deep-extend@^0.6.0:
10011001
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
10021002
integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
10031003

1004-
define-properties@^1.1.2:
1005-
version "1.1.3"
1006-
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
1007-
integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
1008-
dependencies:
1009-
object-keys "^1.0.12"
1010-
10111004
define-property@^0.2.5:
10121005
version "0.2.5"
10131006
resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
@@ -1150,27 +1143,6 @@ errno@^0.1.3, errno@~0.1.7:
11501143
dependencies:
11511144
prr "~1.0.1"
11521145

1153-
es-abstract@^1.5.1:
1154-
version "1.13.0"
1155-
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9"
1156-
integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==
1157-
dependencies:
1158-
es-to-primitive "^1.2.0"
1159-
function-bind "^1.1.1"
1160-
has "^1.0.3"
1161-
is-callable "^1.1.4"
1162-
is-regex "^1.0.4"
1163-
object-keys "^1.0.12"
1164-
1165-
es-to-primitive@^1.2.0:
1166-
version "1.2.0"
1167-
resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377"
1168-
integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==
1169-
dependencies:
1170-
is-callable "^1.1.4"
1171-
is-date-object "^1.0.1"
1172-
is-symbol "^1.0.2"
1173-
11741146
escape-html@~1.0.3:
11751147
version "1.0.3"
11761148
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
@@ -1491,11 +1463,6 @@ fsevents@^1.2.7:
14911463
nan "^2.12.1"
14921464
node-pre-gyp "^0.12.0"
14931465

1494-
function-bind@^1.1.1:
1495-
version "1.1.1"
1496-
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
1497-
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
1498-
14991466
gauge@~2.7.3:
15001467
version "2.7.4"
15011468
resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
@@ -1606,11 +1573,6 @@ has-flag@^3.0.0:
16061573
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
16071574
integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
16081575

1609-
has-symbols@^1.0.0:
1610-
version "1.0.0"
1611-
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44"
1612-
integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=
1613-
16141576
has-unicode@^2.0.0:
16151577
version "2.0.1"
16161578
resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
@@ -1647,13 +1609,6 @@ has-values@^1.0.0:
16471609
is-number "^3.0.0"
16481610
kind-of "^4.0.0"
16491611

1650-
has@^1.0.1, has@^1.0.3:
1651-
version "1.0.3"
1652-
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
1653-
integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
1654-
dependencies:
1655-
function-bind "^1.1.1"
1656-
16571612
hash-base@^3.0.0:
16581613
version "3.0.4"
16591614
resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
@@ -1846,11 +1801,6 @@ is-buffer@^1.1.5:
18461801
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
18471802
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
18481803

1849-
is-callable@^1.1.4:
1850-
version "1.1.4"
1851-
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
1852-
integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==
1853-
18541804
is-ci@^1.0.10:
18551805
version "1.2.1"
18561806
resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c"
@@ -1872,11 +1822,6 @@ is-data-descriptor@^1.0.0:
18721822
dependencies:
18731823
kind-of "^6.0.0"
18741824

1875-
is-date-object@^1.0.1:
1876-
version "1.0.1"
1877-
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
1878-
integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=
1879-
18801825
is-descriptor@^0.1.0:
18811826
version "0.1.6"
18821827
resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
@@ -1987,13 +1932,6 @@ is-redirect@^1.0.0:
19871932
resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
19881933
integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=
19891934

1990-
is-regex@^1.0.4:
1991-
version "1.0.4"
1992-
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
1993-
integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=
1994-
dependencies:
1995-
has "^1.0.1"
1996-
19971935
is-retry-allowed@^1.0.0:
19981936
version "1.1.0"
19991937
resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34"
@@ -2004,13 +1942,6 @@ is-stream@^1.0.0, is-stream@^1.1.0:
20041942
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
20051943
integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
20061944

2007-
is-symbol@^1.0.2:
2008-
version "1.0.2"
2009-
resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38"
2010-
integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==
2011-
dependencies:
2012-
has-symbols "^1.0.0"
2013-
20141945
is-windows@^1.0.1, is-windows@^1.0.2:
20151946
version "1.0.2"
20161947
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
@@ -2619,26 +2550,13 @@ object-copy@^0.1.0:
26192550
define-property "^0.2.5"
26202551
kind-of "^3.0.3"
26212552

2622-
object-keys@^1.0.12:
2623-
version "1.0.12"
2624-
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2"
2625-
integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==
2626-
26272553
object-visit@^1.0.0:
26282554
version "1.0.1"
26292555
resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
26302556
integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
26312557
dependencies:
26322558
isobject "^3.0.0"
26332559

2634-
object.getownpropertydescriptors@^2.0.3:
2635-
version "2.0.3"
2636-
resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
2637-
integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=
2638-
dependencies:
2639-
define-properties "^1.1.2"
2640-
es-abstract "^1.5.1"
2641-
26422560
object.pick@^1.3.0:
26432561
version "1.3.0"
26442562
resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
@@ -2855,6 +2773,11 @@ pify@^3.0.0:
28552773
resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
28562774
integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
28572775

2776+
pify@^4.0.1:
2777+
version "4.0.1"
2778+
resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
2779+
integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
2780+
28582781
pirates@^4.0.0:
28592782
version "4.0.0"
28602783
resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.0.tgz#850b18781b4ac6ec58a43c9ed9ec5fe6796addbd"
@@ -3880,14 +3803,6 @@ util-deprecate@~1.0.1:
38803803
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
38813804
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
38823805

3883-
util.promisify@^1.0.0:
3884-
version "1.0.0"
3885-
resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
3886-
integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==
3887-
dependencies:
3888-
define-properties "^1.1.2"
3889-
object.getownpropertydescriptors "^2.0.3"
3890-
38913806
util@0.10.3:
38923807
version "0.10.3"
38933808
resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
@@ -3993,10 +3908,10 @@ webpack-sources@^1.1.0, webpack-sources@^1.3.0:
39933908
source-list-map "^2.0.0"
39943909
source-map "~0.6.1"
39953910

3996-
webpack@^4.30.0:
3997-
version "4.30.0"
3998-
resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.30.0.tgz#aca76ef75630a22c49fcc235b39b4c57591d33a9"
3999-
integrity sha512-4hgvO2YbAFUhyTdlR4FNyt2+YaYBYHavyzjCMbZzgglo02rlKi/pcsEzwCuCpsn1ryzIl1cq/u8ArIKu8JBYMg==
3911+
webpack@^4.31.0:
3912+
version "4.31.0"
3913+
resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.31.0.tgz#ae201d45f0571336e42d1c2b5c8ab56c4d3b0c63"
3914+
integrity sha512-n6RVO3X0LbbipoE62akME9K/JI7qYrwwufs20VvgNNpqUoH4860KkaxJTbGq5bgkVZF9FqyyTG/0WPLH3PVNJA==
40003915
dependencies:
40013916
"@webassemblyjs/ast" "1.8.5"
40023917
"@webassemblyjs/helper-module-context" "1.8.5"

package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"bundlesize": [
77
{
88
"path": "./packages/component/dist/loadable.min.js",
9-
"maxSize": "3 kB"
9+
"maxSize": "3.2 kB"
1010
}
1111
],
1212
"scripts": {
@@ -38,9 +38,12 @@
3838
"eslint-plugin-jsx-a11y": "^6.2.1",
3939
"eslint-plugin-react": "^7.12.4",
4040
"jest": "^24.7.1",
41+
"jest-dom": "^3.2.2",
4142
"lerna": "^3.13.2",
4243
"prettier": "^1.16.4",
4344
"react": "^16.8.6",
45+
"react-dom": "^16.8.6",
46+
"react-testing-library": "^7.0.0",
4447
"regenerator-runtime": "^0.13.2",
4548
"rollup": "^1.9.3",
4649
"rollup-plugin-babel": "^4.3.2",

0 commit comments

Comments
 (0)