diff --git a/.babelrc b/.babelrc
index 70a17f0c..820aa9d2 100644
--- a/.babelrc
+++ b/.babelrc
@@ -16,7 +16,8 @@
"test": {
"plugins": [
"transform-class-properties",
- "transform-object-assign"
+ "transform-object-assign",
+ "react-hot-loader/babel"
],
"presets": [
["env", {
diff --git a/.npm-packages-offline-cache/error-stack-parser-1.3.6.tgz b/.npm-packages-offline-cache/error-stack-parser-1.3.6.tgz
new file mode 100644
index 00000000..29d28982
Binary files /dev/null and b/.npm-packages-offline-cache/error-stack-parser-1.3.6.tgz differ
diff --git a/.npm-packages-offline-cache/react-deep-force-update-2.1.1.tgz b/.npm-packages-offline-cache/react-deep-force-update-2.1.1.tgz
new file mode 100644
index 00000000..8f8497b9
Binary files /dev/null and b/.npm-packages-offline-cache/react-deep-force-update-2.1.1.tgz differ
diff --git a/.npm-packages-offline-cache/react-hot-loader-3.0.0.tgz b/.npm-packages-offline-cache/react-hot-loader-3.0.0.tgz
new file mode 100644
index 00000000..49e78846
Binary files /dev/null and b/.npm-packages-offline-cache/react-hot-loader-3.0.0.tgz differ
diff --git a/.npm-packages-offline-cache/react-proxy-3.0.0-alpha.1.tgz b/.npm-packages-offline-cache/react-proxy-3.0.0-alpha.1.tgz
new file mode 100644
index 00000000..a8572d11
Binary files /dev/null and b/.npm-packages-offline-cache/react-proxy-3.0.0-alpha.1.tgz differ
diff --git a/.npm-packages-offline-cache/redbox-react-1.5.0.tgz b/.npm-packages-offline-cache/redbox-react-1.5.0.tgz
new file mode 100644
index 00000000..3b59dbd1
Binary files /dev/null and b/.npm-packages-offline-cache/redbox-react-1.5.0.tgz differ
diff --git a/.npm-packages-offline-cache/source-map-0.6.1.tgz b/.npm-packages-offline-cache/source-map-0.6.1.tgz
new file mode 100644
index 00000000..7833490c
Binary files /dev/null and b/.npm-packages-offline-cache/source-map-0.6.1.tgz differ
diff --git a/.npm-packages-offline-cache/sourcemapped-stacktrace-1.1.7.tgz b/.npm-packages-offline-cache/sourcemapped-stacktrace-1.1.7.tgz
new file mode 100644
index 00000000..e1737e9c
Binary files /dev/null and b/.npm-packages-offline-cache/sourcemapped-stacktrace-1.1.7.tgz differ
diff --git a/config/webpack/__snapshots__/browser_test.js.snap b/config/webpack/__snapshots__/browser_test.js.snap
index d7802c38..473a37d7 100644
--- a/config/webpack/__snapshots__/browser_test.js.snap
+++ b/config/webpack/__snapshots__/browser_test.js.snap
@@ -4,6 +4,7 @@ exports[`webpack config matches snapshot 1`] = `
Object {
"entry": Object {
"bundle": Array [
+ "react-hot-loader/patch",
"sanitize.css/sanitize.css",
"tachyons-clears",
"tachyons-display",
diff --git a/config/webpack/blocks/getEntry.js b/config/webpack/blocks/getEntry.js
index 47fa4899..a079724a 100644
--- a/config/webpack/blocks/getEntry.js
+++ b/config/webpack/blocks/getEntry.js
@@ -17,6 +17,7 @@ function getEntry (entry/* : ?(string | Object | Array<*>) */) {
return {
entry: {
bundle: [
+ 'react-hot-loader/patch',
'sanitize.css/sanitize.css',
'tachyons-clears',
'tachyons-display',
diff --git a/package.json b/package.json
index 23698b50..3266bbc9 100644
--- a/package.json
+++ b/package.json
@@ -98,6 +98,7 @@
"react": "^15.6.1",
"react-dom": "^15.6.1",
"react-helmet": "^5.2.0",
+ "react-hot-loader": "^3.0.0",
"react-native": "0.42.x",
"react-redux": "^5.0.6",
"react-router": "^4.2.0",
diff --git a/src/index.browser.js b/src/index.browser.js
index c8f91cb6..d2a57a36 100644
--- a/src/index.browser.js
+++ b/src/index.browser.js
@@ -8,6 +8,7 @@ import InjectTapEventPlugin from 'react-tap-event-plugin'
import Rollbar from 'rollbar/dist/rollbar.umd.min'
import { Provider } from 'react-redux'
import { BrowserRouter as Router } from 'react-router-dom'
+import { AppContainer } from 'react-hot-loader'
import configureStore from 'src/redux/store'
import { loadSuccess } from 'src/redux/modules/init'
import rollbarConfig from 'config/rollbar'
@@ -48,19 +49,39 @@ window.onload = () => {
}
-ReactDOM.render(
+const render = (Root: React$Element<*>) => {
+ ReactDOM.render(
+
+ { Root }
+ ,
+ document.getElementById('react-mount')
+ )
+
+}
+
+const App = (
- ,
-
- document.getElementById('react-mount')
+
)
+render(App)
+
+if (module.hot) {
+
+ module.hot.accept('src/routes', () => {
+
+ render(App)
+
+ })
+
+}
+
// Progressively apply ServiceWorker updates so browser can simply be refreshed
// to reflect changes with window.location.reload()
// TODO: Fire redux action
diff --git a/yarn.lock b/yarn.lock
index ef77af61..79620e0f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1399,7 +1399,7 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.25.0:
babylon "^6.17.2"
lodash "^4.2.0"
-babel-template@^6.26.0:
+babel-template@^6.26.0, babel-template@^6.7.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
dependencies:
@@ -3351,6 +3351,12 @@ error-stack-parser@1.3.3:
dependencies:
stackframe "^0.3.1"
+error-stack-parser@^1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-1.3.6.tgz#e0e73b93e417138d1cd7c0b746b1a4a14854c292"
+ dependencies:
+ stackframe "^0.3.1"
+
errorhandler@~1.4.2:
version "1.4.3"
resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.4.3.tgz#b7b70ed8f359e9db88092f2d20c0f831420ad83f"
@@ -8238,6 +8244,10 @@ react-deep-force-update@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-1.1.1.tgz#bcd31478027b64b3339f108921ab520b4313dc2c"
+react-deep-force-update@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-2.1.1.tgz#8ea4263cd6455a050b37445b3f08fd839d86e909"
+
react-dom@^15.6.1:
version "15.6.2"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.6.2.tgz#41cfadf693b757faf2708443a1d1fd5a02bef730"
@@ -8265,6 +8275,17 @@ react-helmet@^5.2.0:
prop-types "^15.5.4"
react-side-effect "^1.1.0"
+react-hot-loader@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-3.0.0.tgz#6e28da9d459da8085f5ee8bdd775046ba4b5cd0b"
+ dependencies:
+ babel-template "^6.7.0"
+ global "^4.3.0"
+ react-deep-force-update "^2.1.1"
+ react-proxy "^3.0.0-alpha.0"
+ redbox-react "^1.3.6"
+ source-map "^0.6.1"
+
react-native@0.42.x:
version "0.42.3"
resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.42.3.tgz#450c8a03a5e3e991a08a426f22776dd8feb80b26"
@@ -8352,6 +8373,12 @@ react-proxy@^1.1.7:
lodash "^4.6.1"
react-deep-force-update "^1.0.0"
+react-proxy@^3.0.0-alpha.0:
+ version "3.0.0-alpha.1"
+ resolved "https://registry.yarnpkg.com/react-proxy/-/react-proxy-3.0.0-alpha.1.tgz#4400426bcfa80caa6724c7755695315209fa4b07"
+ dependencies:
+ lodash "^4.6.1"
+
react-redux@^5.0.6:
version "5.0.6"
resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.0.6.tgz#23ed3a4f986359d68b5212eaaa681e60d6574946"
@@ -8555,6 +8582,15 @@ recompose@0.24.0:
hoist-non-react-statics "^1.0.0"
symbol-observable "^1.0.4"
+redbox-react@^1.3.6:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/redbox-react/-/redbox-react-1.5.0.tgz#04dab11557d26651bf3562a67c22ace56c5d3967"
+ dependencies:
+ error-stack-parser "^1.3.6"
+ object-assign "^4.0.1"
+ prop-types "^15.5.4"
+ sourcemapped-stacktrace "^1.1.6"
+
redeyed@~1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-1.0.1.tgz#e96c193b40c0816b00aec842698e61185e55498a"
@@ -9549,26 +9585,36 @@ source-map-support@^0.4.2:
dependencies:
source-map "^0.5.6"
+source-map@0.5.6, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3:
+ version "0.5.6"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
+
source-map@^0.4.4, source-map@~0.4.1:
version "0.4.4"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
dependencies:
amdefine ">=0.0.4"
-source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3:
- version "0.5.6"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
-
source-map@^0.5.7:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+source-map@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+
source-map@~0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d"
dependencies:
amdefine ">=0.0.4"
+sourcemapped-stacktrace@^1.1.6:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/sourcemapped-stacktrace/-/sourcemapped-stacktrace-1.1.7.tgz#17e05374ff78b71a9d89ad3975a49f22725ba935"
+ dependencies:
+ source-map "0.5.6"
+
sparkles@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3"