Skip to content

Commit 0c7089f

Browse files
authored
Remove mitt and use an internal EventEmitter (vercel#2477)
This fixes one of the crucial bug in Next.js The issue happens when you try to load a page when it's prefetching. With mitt, it only fires the first registered event.
1 parent f44d597 commit 0c7089f

6 files changed

Lines changed: 78 additions & 68 deletions

File tree

client/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { createElement } from 'react'
22
import ReactDOM from 'react-dom'
3-
import mitt from 'mitt'
43
import HeadManager from './head-manager'
54
import { createRouter } from '../lib/router'
5+
import EventEmitter from '../lib/EventEmitter'
66
import App from '../lib/app'
77
import { loadGetInitialProps, getURL } from '../lib/utils'
88
import ErrorDebugComponent from '../lib/error-debug'
@@ -77,7 +77,7 @@ export default async () => {
7777
err
7878
})
7979

80-
const emitter = mitt()
80+
const emitter = new EventEmitter()
8181

8282
router.subscribe(({ Component, props, hash, err }) => {
8383
render({ Component, props, err, hash, emitter })

lib/EventEmitter.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
export default class EventEmitter {
2+
listeners = {}
3+
4+
on (event, cb) {
5+
if (!this.listeners[event]) {
6+
this.listeners[event] = new Set()
7+
}
8+
9+
this.listeners[event].add(cb)
10+
}
11+
12+
emit (event, ...data) {
13+
if (!this.listeners[event]) return
14+
this.listeners[event].forEach(cb => cb(...data))
15+
}
16+
17+
off (event, cb) {
18+
if (!this.listeners[event]) return
19+
this.listeners[event].delete(cb)
20+
}
21+
}

lib/page-loader.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* global window, document, __NEXT_DATA__ */
2-
import mitt from 'mitt'
2+
import EventEmitter from './EventEmitter'
33

44
const webpackModule = module
55

@@ -10,10 +10,10 @@ export default class PageLoader {
1010

1111
this.pageCache = {}
1212
this.pageLoadedHandlers = {}
13-
this.pageRegisterEvents = mitt()
13+
this.pageRegisterEvents = new EventEmitter()
1414
this.loadingRoutes = {}
1515

16-
this.chunkRegisterEvents = mitt()
16+
this.chunkRegisterEvents = new EventEmitter()
1717
this.loadedChunks = {}
1818
}
1919

lib/router/router.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* global __NEXT_DATA__ */
22

33
import { parse, format } from 'url'
4-
import mitt from 'mitt'
4+
import EventEmitter from '../EventEmitter'
55
import shallowEquals from '../shallow-equals'
66
import PQueue from '../p-queue'
77
import { loadGetInitialProps, getURL } from '../utils'
@@ -22,7 +22,7 @@ export default class Router {
2222
}
2323

2424
// Handling Router Events
25-
this.events = mitt()
25+
this.events = new EventEmitter()
2626

2727
this.pageLoader = pageLoader
2828
this.prefetchQueue = new PQueue({ concurrency: 2 })

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@
7777
"loader-utils": "1.1.0",
7878
"md5-file": "3.1.1",
7979
"minimist": "1.2.0",
80-
"mitt": "1.1.2",
8180
"mkdirp-then": "1.2.0",
8281
"mv": "2.1.1",
8382
"mz": "2.6.0",

yarn.lock

Lines changed: 50 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@ acorn@^4.0.3, acorn@^4.0.4:
7171
resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
7272

7373
acorn@^5.0.0, acorn@^5.0.1:
74-
version "5.0.3"
75-
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d"
74+
version "5.1.0"
75+
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.0.tgz#e468bf609b0672700e02f878ae2f1b360fe24b4f"
7676

7777
ajv-keywords@^1.0.0:
7878
version "1.5.1"
@@ -210,8 +210,8 @@ arr-diff@^2.0.0:
210210
arr-flatten "^1.0.1"
211211

212212
arr-flatten@^1.0.1:
213-
version "1.0.3"
214-
resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1"
213+
version "1.1.0"
214+
resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
215215

216216
array-differ@^1.0.0:
217217
version "1.0.0"
@@ -823,9 +823,9 @@ babel-plugin-transform-strict-mode@^6.24.1:
823823
babel-runtime "^6.22.0"
824824
babel-types "^6.24.1"
825825

826-
babel-preset-env@1.5.2:
827-
version "1.5.2"
828-
resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.5.2.tgz#cd4ae90a6e94b709f97374b33e5f8b983556adef"
826+
babel-preset-env@1.6.0:
827+
version "1.6.0"
828+
resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.0.tgz#2de1c782a780a0a5d605d199c957596da43c44e4"
829829
dependencies:
830830
babel-plugin-check-es2015-constants "^6.22.0"
831831
babel-plugin-syntax-trailing-function-commas "^6.22.0"
@@ -1206,8 +1206,8 @@ camelcase@^4.1.0:
12061206
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
12071207

12081208
caniuse-lite@^1.0.30000684:
1209-
version "1.0.30000694"
1210-
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000694.tgz#1492dab7c10c608c9d37a723e6e3e7873e0ce94f"
1209+
version "1.0.30000697"
1210+
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000697.tgz#125fb00604b63fbb188db96a667ce2922dcd6cdd"
12111211

12121212
12131213
version "2.1.1"
@@ -1364,10 +1364,8 @@ combined-stream@^1.0.5, combined-stream@~1.0.5:
13641364
delayed-stream "~1.0.0"
13651365

13661366
commander@^2.9.0:
1367-
version "2.10.0"
1368-
resolved "https://registry.yarnpkg.com/commander/-/commander-2.10.0.tgz#e1f5d3245de246d1a5ca04702fa1ad1bd7e405fe"
1369-
dependencies:
1370-
graceful-readlink ">= 1.0.0"
1367+
version "2.11.0"
1368+
resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563"
13711369

13721370
commondir@^1.0.1:
13731371
version "1.0.1"
@@ -1420,11 +1418,11 @@ content-type@~1.0.2:
14201418
version "1.0.2"
14211419
resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed"
14221420

1423-
[email protected], convert-source-map@^1.1.0, convert-source-map@^1.3.0:
1421+
14241422
version "1.3.0"
14251423
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67"
14261424

1427-
convert-source-map@^1.4.0:
1425+
convert-source-map@^1.1.0, convert-source-map@^1.3.0, convert-source-map@^1.4.0:
14281426
version "1.5.0"
14291427
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5"
14301428

@@ -1718,8 +1716,8 @@ detect-indent@^4.0.0:
17181716
repeating "^2.0.0"
17191717

17201718
diff@^3.2.0:
1721-
version "3.2.0"
1722-
resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9"
1719+
version "3.3.0"
1720+
resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.0.tgz#056695150d7aa93237ca7e378ac3b1682b7963b9"
17231721

17241722
diffie-hellman@^5.0.0:
17251723
version "5.0.2"
@@ -1790,8 +1788,8 @@ [email protected]:
17901788
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
17911789

17921790
electron-to-chromium@^1.3.14:
1793-
version "1.3.14"
1794-
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.14.tgz#64af0f9efd3c3c6acd57d71f83b49ca7ee9c4b43"
1791+
version "1.3.15"
1792+
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.15.tgz#08397934891cbcfaebbd18b82a95b5a481138369"
17951793

17961794
elegant-spinner@^1.0.1:
17971795
version "1.0.1"
@@ -1834,8 +1832,8 @@ end-of-stream@^1.0.0:
18341832
once "^1.4.0"
18351833

18361834
enhanced-resolve@^3.0.0:
1837-
version "3.1.0"
1838-
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.1.0.tgz#9f4b626f577245edcf4b2ad83d86e17f4f421dec"
1835+
version "3.3.0"
1836+
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.3.0.tgz#950964ecc7f0332a42321b673b38dc8ff15535b3"
18391837
dependencies:
18401838
graceful-fs "^4.1.2"
18411839
memory-fs "^0.4.0"
@@ -1846,7 +1844,7 @@ entities@^1.1.1, entities@~1.1.1:
18461844
version "1.1.1"
18471845
resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
18481846

1849-
"errno@>=0.1.1 <0.2.0-0", errno@^0.1.2, errno@^0.1.3:
1847+
errno@^0.1.2, errno@^0.1.3, errno@^0.1.4:
18501848
version "0.1.4"
18511849
resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d"
18521850
dependencies:
@@ -2307,8 +2305,8 @@ find-cache-dir@^1.0.0:
23072305
pkg-dir "^2.0.0"
23082306

23092307
find-root@^1.0.0:
2310-
version "1.0.0"
2311-
resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.0.0.tgz#962ff211aab25c6520feeeb8d6287f8f6e95807a"
2308+
version "1.1.0"
2309+
resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
23122310

23132311
find-up@^1.0.0:
23142312
version "1.1.2"
@@ -2486,7 +2484,7 @@ [email protected]:
24862484
version "3.1.0"
24872485
resolved "https://registry.yarnpkg.com/glob-promise/-/glob-promise-3.1.0.tgz#198882a3817be7dc2c55f92623aa9e7b3f82d1eb"
24882486

2489-
[email protected], glob@^7.1.1:
2487+
[email protected], glob@^7.0.6, glob@^7.1.1:
24902488
version "7.1.1"
24912489
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8"
24922490
dependencies:
@@ -2507,7 +2505,7 @@ glob@^6.0.1:
25072505
once "^1.3.0"
25082506
path-is-absolute "^1.0.0"
25092507

2510-
glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.2:
2508+
glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2:
25112509
version "7.1.2"
25122510
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
25132511
dependencies:
@@ -2554,10 +2552,6 @@ graceful-fs@^4.1.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4:
25542552
version "4.1.11"
25552553
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
25562554

2557-
"graceful-readlink@>= 1.0.0":
2558-
version "1.0.1"
2559-
resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
2560-
25612555
growly@^1.3.0:
25622556
version "1.3.0"
25632557
resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
@@ -2619,8 +2613,8 @@ hash-base@^2.0.0:
26192613
inherits "^2.0.1"
26202614

26212615
hash.js@^1.0.0, hash.js@^1.0.3:
2622-
version "1.1.1"
2623-
resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.1.tgz#5cb2e796499224e69fd0b00ed01d2d4a16e7a323"
2616+
version "1.1.3"
2617+
resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846"
26242618
dependencies:
26252619
inherits "^2.0.3"
26262620
minimalistic-assert "^1.0.0"
@@ -2654,8 +2648,8 @@ home-or-tmp@^2.0.0:
26542648
os-tmpdir "^1.0.1"
26552649

26562650
hosted-git-info@^2.1.4:
2657-
version "2.4.2"
2658-
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67"
2651+
version "2.5.0"
2652+
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c"
26592653

26602654
html-encoding-sniffer@^1.0.1:
26612655
version "1.0.1"
@@ -2714,9 +2708,9 @@ [email protected]:
27142708
version "0.0.1"
27152709
resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82"
27162710

2717-
2718-
version "0.14.2"
2719-
resolved "https://registry.yarnpkg.com/husky/-/husky-0.14.2.tgz#6df06483965d2254db95dd143c445d6d8509b4b8"
2711+
2712+
version "0.14.3"
2713+
resolved "https://registry.yarnpkg.com/husky/-/husky-0.14.3.tgz#c69ed74e2d2779769a17ba8399b54ce0b63c12c3"
27202714
dependencies:
27212715
is-ci "^1.0.10"
27222716
normalize-path "^1.0.0"
@@ -3268,8 +3262,8 @@ jest-validate@^20.0.3:
32683262
pretty-format "^20.0.3"
32693263

32703264
js-tokens@^3.0.0:
3271-
version "3.0.1"
3272-
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7"
3265+
version "3.0.2"
3266+
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
32733267

32743268
32753269
version "3.6.1"
@@ -3753,10 +3747,6 @@ [email protected], minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0:
37533747
version "1.2.0"
37543748
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
37553749

3756-
3757-
version "1.1.2"
3758-
resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.1.2.tgz#380e61480d6a615b660f07abb60d51e0a4e4bed6"
3759-
37603750
mk-dirs@^1.0.0:
37613751
version "1.0.0"
37623752
resolved "https://registry.yarnpkg.com/mk-dirs/-/mk-dirs-1.0.0.tgz#44ee67f82341c6762718e88e85e577882e1f67fd"
@@ -3912,8 +3902,8 @@ nopt@~1.0.10:
39123902
abbrev "1"
39133903

39143904
normalize-package-data@^2.3.2:
3915-
version "2.3.8"
3916-
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb"
3905+
version "2.4.0"
3906+
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
39173907
dependencies:
39183908
hosted-git-info "^2.1.4"
39193909
is-builtin-module "^1.0.0"
@@ -3951,8 +3941,8 @@ npm-which@^3.0.1:
39513941
which "^1.2.10"
39523942

39533943
npmlog@^4.0.2:
3954-
version "4.1.0"
3955-
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.0.tgz#dc59bee85f64f00ed424efb2af0783df25d1c0b5"
3944+
version "4.1.2"
3945+
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
39563946
dependencies:
39573947
are-we-there-yet "~1.1.2"
39583948
console-control-strings "~1.1.0"
@@ -4490,15 +4480,15 @@ read-pkg@^2.0.0:
44904480
path-type "^2.0.0"
44914481

44924482
readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2, readable-stream@^2.2.6:
4493-
version "2.3.2"
4494-
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.2.tgz#5a04df05e4f57fe3f0dc68fdd11dc5c97c7e6f4d"
4483+
version "2.3.3"
4484+
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c"
44954485
dependencies:
44964486
core-util-is "~1.0.0"
44974487
inherits "~2.0.3"
44984488
isarray "~1.0.0"
44994489
process-nextick-args "~1.0.6"
4500-
safe-buffer "~5.1.0"
4501-
string_decoder "~1.0.0"
4490+
safe-buffer "~5.1.1"
4491+
string_decoder "~1.0.3"
45024492
util-deprecate "~1.0.1"
45034493

45044494
readdirp@^2.0.0:
@@ -4747,12 +4737,12 @@ rx-lite@^3.1.2:
47474737
resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102"
47484738

47494739
rxjs@^5.0.0-beta.11:
4750-
version "5.4.1"
4751-
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.4.1.tgz#b62f757f279445d265a18a58fb0a70dc90e91626"
4740+
version "5.4.2"
4741+
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.4.2.tgz#2a3236fcbf03df57bae06fd6972fd99e5c08fcf7"
47524742
dependencies:
47534743
symbol-observable "^1.0.1"
47544744

4755-
safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.1.0:
4745+
safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
47564746
version "5.1.1"
47574747
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
47584748

@@ -5054,7 +5044,7 @@ string_decoder@^0.10.25:
50545044
version "0.10.31"
50555045
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
50565046

5057-
string_decoder@~1.0.0:
5047+
string_decoder@~1.0.3:
50585048
version "1.0.3"
50595049
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
50605050
dependencies:
@@ -5563,11 +5553,11 @@ wordwrap@~1.0.0:
55635553
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
55645554

55655555
worker-farm@^1.3.1:
5566-
version "1.3.1"
5567-
resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.3.1.tgz#4333112bb49b17aa050b87895ca6b2cacf40e5ff"
5556+
version "1.4.1"
5557+
resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.4.1.tgz#a438bc993a7a7d133bcb6547c95eca7cff4897d8"
55685558
dependencies:
5569-
errno ">=0.1.1 <0.2.0-0"
5570-
xtend ">=4.0.0 <4.1.0-0"
5559+
errno "^0.1.4"
5560+
xtend "^4.0.1"
55715561

55725562
wrap-ansi@^2.0.0:
55735563
version "2.1.0"
@@ -5613,7 +5603,7 @@ [email protected]:
56135603
version "1.2.7"
56145604
resolved "https://registry.yarnpkg.com/xss-filters/-/xss-filters-1.2.7.tgz#59fa1de201f36f2f3470dcac5f58ccc2830b0a9a"
56155605

5616-
"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1:
5606+
xtend@^4.0.0, xtend@^4.0.1:
56175607
version "4.0.1"
56185608
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
56195609

0 commit comments

Comments
 (0)