render.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. /**
  2. * React Static Boilerplate
  3. * https://github.com/koistya/react-static-boilerplate
  4. * Copyright (c) Konstantin Tarkus (@koistya) | MIT license
  5. */
  6. import glob from 'glob';
  7. import { join, dirname } from 'path';
  8. import React from 'react';
  9. import ReactDOM from 'react-dom/server';
  10. import Html from '../components/Html';
  11. import task from './lib/task';
  12. import fs from './lib/fs';
  13. const DEBUG = !process.argv.includes('release');
  14. function getPages() {
  15. return new Promise((resolve, reject) => {
  16. glob('**/*.js', { cwd: join(__dirname, '../pages') }, (err, files) => {
  17. if (err) {
  18. reject(err);
  19. } else {
  20. const result = files.map(file => {
  21. let path = '/' + file.substr(0, file.lastIndexOf('.'));
  22. if (path === '/index') {
  23. path = '/';
  24. } else if (path.endsWith('/index')) {
  25. path = path.substr(0, path.lastIndexOf('/index'));
  26. }
  27. return { path, file };
  28. });
  29. resolve(result);
  30. }
  31. });
  32. });
  33. }
  34. async function renderPage(page, component) {
  35. const data = {
  36. body: ReactDOM.renderToString(component),
  37. };
  38. const file = join(__dirname, '../build', page.file.substr(0, page.file.lastIndexOf('.')) + '.html');
  39. const html = '<!doctype html>\n' + ReactDOM.renderToStaticMarkup(<Html debug={DEBUG} {...data} />);
  40. await fs.mkdir(dirname(file));
  41. await fs.writeFile(file, html);
  42. }
  43. export default task(async function render() {
  44. const pages = await getPages();
  45. const { route } = require('../build/app.node');
  46. for (const page of pages) {
  47. await route(page.path, renderPage.bind(undefined, page));
  48. }
  49. });