forked from react-boilerplate/react-boilerplate
-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
app: Split client entry point out into a separate file
This will allow us to import the app code from the server side renderer
- Loading branch information
Showing
3 changed files
with
118 additions
and
89 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,100 @@ | ||
/** | ||
* client.js | ||
* | ||
* This is the entry file for the client, only setup and boilerplate | ||
* code. | ||
*/ | ||
|
||
// Import all the third party stuff | ||
import React from 'react'; | ||
import ReactDOM from 'react-dom'; | ||
import 'sanitize.css/sanitize.css'; | ||
|
||
import FontFaceObserver from 'fontfaceobserver'; | ||
|
||
// Load the favicon, the manifest.json file and the .htaccess file | ||
/* eslint-disable import/no-webpack-loader-syntax */ | ||
import '!file-loader?name=[name].[ext]!./images/favicon.ico'; | ||
import '!file-loader?name=[name].[ext]!./images/icon-72x72.png'; | ||
import '!file-loader?name=[name].[ext]!./images/icon-96x96.png'; | ||
import '!file-loader?name=[name].[ext]!./images/icon-120x120.png'; | ||
import '!file-loader?name=[name].[ext]!./images/icon-128x128.png'; | ||
import '!file-loader?name=[name].[ext]!./images/icon-144x144.png'; | ||
import '!file-loader?name=[name].[ext]!./images/icon-152x152.png'; | ||
import '!file-loader?name=[name].[ext]!./images/icon-167x167.png'; | ||
import '!file-loader?name=[name].[ext]!./images/icon-180x180.png'; | ||
import '!file-loader?name=[name].[ext]!./images/icon-192x192.png'; | ||
import '!file-loader?name=[name].[ext]!./images/icon-384x384.png'; | ||
import '!file-loader?name=[name].[ext]!./images/icon-512x512.png'; | ||
import '!file-loader?name=[name].[ext]!./manifest.json'; | ||
import 'file-loader?name=[name].[ext]!./.htaccess'; // eslint-disable-line import/extensions | ||
/* eslint-enable import/no-webpack-loader-syntax */ | ||
|
||
// Import history creator and store configure func | ||
import createHistory from 'history/createBrowserHistory'; | ||
import configureStore from './configureStore'; | ||
|
||
// Import root containers | ||
import Root from './app'; | ||
|
||
// Import i18n messages | ||
import { translationMessages } from './i18n'; | ||
|
||
// Observe loading of Open Sans (to remove open sans, remove the <link> tag in | ||
// the index.html file and this observer) | ||
const openSansObserver = new FontFaceObserver('Open Sans', {}); | ||
|
||
// When Open Sans is loaded, add a font-family using Open Sans to the body | ||
openSansObserver.load().then(() => { | ||
document.body.classList.add('fontLoaded'); | ||
}, () => { | ||
document.body.classList.remove('fontLoaded'); | ||
}); | ||
|
||
// Create redux store with history | ||
const initialState = {}; | ||
const history = createHistory(); | ||
const store = configureStore(initialState, history); | ||
|
||
const MOUNT_NODE = document.getElementById('app'); | ||
|
||
const render = (messages) => { | ||
ReactDOM.render( | ||
<Root messages={messages} history={history} store={store} />, | ||
MOUNT_NODE | ||
); | ||
}; | ||
|
||
if (module.hot) { | ||
// Hot reloadable React components and translation json files | ||
// modules.hot.accept does not accept dynamic dependencies, | ||
// have to be constants at compile-time | ||
module.hot.accept(['./i18n', 'containers/App'], () => { | ||
ReactDOM.unmountComponentAtNode(MOUNT_NODE); | ||
render(translationMessages); | ||
}); | ||
} | ||
|
||
// Chunked polyfill for browsers without Intl support | ||
if (!window.Intl) { | ||
(new Promise((resolve) => { | ||
resolve(import('intl')); | ||
})) | ||
.then(() => Promise.all([ | ||
import('intl/locale-data/jsonp/en.js'), | ||
import('intl/locale-data/jsonp/de.js'), | ||
])) | ||
.then(() => render(translationMessages)) | ||
.catch((err) => { | ||
throw err; | ||
}); | ||
} else { | ||
render(translationMessages); | ||
} | ||
|
||
// Install ServiceWorker and AppCache in the end since | ||
// it's not most important operation and if main code fails, | ||
// we do not want it installed | ||
if (process.env.NODE_ENV === 'production') { | ||
require('offline-plugin/runtime').install(); // eslint-disable-line global-require | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters