Reworking static page generation

Including styles in components wasn't working with the old system.
This commit is contained in:
Jeff Avallone
2018-02-13 17:10:32 -05:00
parent ad6583d5dc
commit 7238643740
13 changed files with 111 additions and 44 deletions
+2 -6
View File
@@ -1,15 +1,11 @@
import React from 'react';
import Header from './Header';
import Footer from './Footer';
import Message from './Message';
const App = () => <React.Fragment>
<Header/>
const App = () => (
<Message heading="React App">
<p>Placeholder app content</p>
</Message>
<Footer/>
</React.Fragment>;
);
export default App;
-13
View File
@@ -1,13 +0,0 @@
import 'babel-register';
import React from 'react';
import '../../i18n';
import PageTemplate, { renderToString } from '../../components/PageTemplate';
import Component from './Component';
export default renderToString(
<PageTemplate>
<Component/>
</PageTemplate>
);
@@ -1,16 +1,13 @@
import 'babel-register';
import React from 'react';
import '../../i18n';
import PageTemplate, { renderToString } from '../../components/PageTemplate';
import Message from '../../components/Message';
import AlertIcon from 'feather-icons/dist/icons/alert-octagon.svg';
import Header from '../../components/Header';
import Footer from '../../components/Footer';
import App from '../../components/App';
export default renderToString(
<PageTemplate>
const Component = () => (
<React.Fragment>
<Header/>
<noscript>
<Message className="error" icon={ AlertIcon } heading="JavaScript Required">
@@ -23,6 +20,9 @@ export default renderToString(
<p>Most popular ad blockers will prevent these tools from sending any tracking data, and doing so will <b>not</b> impact the performance of this app. Regexper is not supported by ad revenue or sales of any kind. The information collected by these tools is used to monitor application performance, determine browser support, and collect error reports.</p>
</Message>
</noscript>
<App/>
<Footer/>
</PageTemplate>
</React.Fragment>
);
export default Component;
@@ -1,7 +1,7 @@
import React from 'react';
import ReactDOM from 'react-dom';
import App from '../../components/App';
import Component from './Component';
import RavenBoundary from '../../components/RavenBoundary';
import '../../style.css';
@@ -20,7 +20,7 @@ try {
ReactDOM.render(
<RavenBoundary>
<App/>
<Component/>
</RavenBoundary>,
document.getElementById('root'));
}
+20
View File
@@ -0,0 +1,20 @@
import React from 'react';
import { renderToString } from 'react-dom/server';
import fs from 'fs';
import cheerio from 'cheerio';
import './i18n';
const pages = fs.readdirSync('./src/pages');
pages.forEach(page => {
import(`./pages/${ page }/Component`).then(component => {
const Component = component.default;
const pagePath = `./build/${ page }.html`;
const markup = cheerio.load(fs.readFileSync(pagePath));
markup('#root').html(renderToString(<Component/>));
fs.writeFileSync(pagePath, markup.html());
});
});
+15
View File
@@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
<meta charSet="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<meta name="description" content={ pkg.description } />
<link rel="author" href="/humans.txt" />
<title>Regexper</title>
</head>
<body data-build-id="<%= process.env.BUILD_ID %>">
<div id="root"></div>
</body>
</html>