refactor(v2): simplify + optimize server (#1343)

This commit is contained in:
Endilie Yacop Sucipto 2019-04-08 12:34:11 +07:00 committed by Yangshun Tay
parent 84c3e0a045
commit 7e6b74b820
6 changed files with 30 additions and 41 deletions

View file

@ -10,11 +10,10 @@ import React from 'react';
import {StaticRouter} from 'react-router-dom'; import {StaticRouter} from 'react-router-dom';
import ReactDOMServer from 'react-dom/server'; import ReactDOMServer from 'react-dom/server';
import Helmet from 'react-helmet'; import Helmet from 'react-helmet';
import {getBundles} from 'react-loadable/webpack'; import {getBundles} from 'react-loadable-ssr-addon';
import Loadable from 'react-loadable'; import Loadable from 'react-loadable';
import reactLoadableStats from '@generated/react-loadable.json'; //eslint-disable-line import manifest from '@build/assets-manifest.json'; //eslint-disable-line
import webpackClientStats from '@build/client.stats.json'; //eslint-disable-line
import routes from '@generated/routes'; // eslint-disable-line import routes from '@generated/routes'; // eslint-disable-line
import preload from './preload'; import preload from './preload';
import App from './App'; import App from './App';
@ -43,15 +42,11 @@ export default function render(locals) {
]; ];
const metaAttributes = metaStrings.filter(Boolean); const metaAttributes = metaStrings.filter(Boolean);
const bundles = getBundles(reactLoadableStats, modules); // Get all required assets for this particular page based on client manifest information
const assets = [ const modulesToBeLoaded = [...manifest.entrypoints, ...Array.from(modules)];
...webpackClientStats.assetsByChunkName.main, const bundles = getBundles(manifest, modulesToBeLoaded);
...webpackClientStats.assetsByChunkName.common, const stylesheets = (bundles.css || []).map(b => b.file);
...webpackClientStats.assetsByChunkName.vendors, const scripts = (bundles.js || []).map(b => b.file);
...bundles.map(bundle => bundle.file),
];
const scripts = assets.filter(value => value.match(/\.js$/));
const stylesheets = assets.filter(value => value.match(/\.css$/));
const {baseUrl} = locals; const {baseUrl} = locals;
return ejs.render( return ejs.render(

View file

@ -37,6 +37,8 @@ module.exports = function createBaseConfig(props, isServer) {
resolve: { resolve: {
symlinks: true, symlinks: true,
alias: { alias: {
// https://github.com/gaearon/react-hot-loader#react--dom
'react-dom': isProd ? 'react-dom' : '@hot-loader/react-dom',
'@theme': themePath, '@theme': themePath,
'@site': siteDir, '@site': siteDir,
'@build': outDir, '@build': outDir,

View file

@ -7,8 +7,7 @@
const path = require('path'); const path = require('path');
const WebpackNiceLog = require('webpack-nicelog'); const WebpackNiceLog = require('webpack-nicelog');
const {StatsWriterPlugin} = require('webpack-stats-plugin'); const ReactLoadableSSRAddon = require('react-loadable-ssr-addon');
const {ReactLoadablePlugin} = require('react-loadable/webpack');
const merge = require('webpack-merge'); const merge = require('webpack-merge');
const createBaseConfig = require('./base'); const createBaseConfig = require('./base');
@ -16,26 +15,15 @@ const createBaseConfig = require('./base');
module.exports = function createClientConfig(props) { module.exports = function createClientConfig(props) {
const isProd = process.env.NODE_ENV === 'production'; const isProd = process.env.NODE_ENV === 'production';
const config = createBaseConfig(props); const config = createBaseConfig(props);
const {generatedFilesDir} = props;
const clientConfig = merge(config, { const clientConfig = merge(config, {
entry: { entry: {
main: path.resolve(__dirname, '../core/clientEntry.js'), main: path.resolve(__dirname, '../core/clientEntry.js'),
}, },
resolve: {
alias: {
// https://github.com/gaearon/react-hot-loader#react--dom
'react-dom': '@hot-loader/react-dom',
},
},
plugins: [ plugins: [
// Write webpack stats object so we can pickup correct client bundle path in server. // Generate manifests file
new StatsWriterPlugin({ new ReactLoadableSSRAddon({
filename: 'client.stats.json', filename: 'assets-manifest.json',
}),
// React-loadable manifests
new ReactLoadablePlugin({
filename: path.join(generatedFilesDir, 'react-loadable.json'),
}), }),
// Show compilation progress bar and build time. // Show compilation progress bar and build time.
new WebpackNiceLog({ new WebpackNiceLog({

View file

@ -5,6 +5,7 @@
* LICENSE file in the root directory of this source tree. * LICENSE file in the root directory of this source tree.
*/ */
const nodeExternals = require('webpack-node-externals');
const path = require('path'); const path = require('path');
const StaticSiteGeneratorPlugin = require('static-site-generator-webpack-plugin'); const StaticSiteGeneratorPlugin = require('static-site-generator-webpack-plugin');
const WebpackNiceLog = require('webpack-nicelog'); const WebpackNiceLog = require('webpack-nicelog');
@ -27,11 +28,8 @@ module.exports = function createServerConfig(props) {
globalObject: 'this', globalObject: 'this',
}, },
target: 'node', target: 'node',
resolve: { // No need to bundle its node_modules dependencies since we're bundling for static html generation (backend)
alias: { externals: [nodeExternals()],
ejs: 'ejs/ejs.min.js',
},
},
plugins: [ plugins: [
// Static site generator webpack plugin. // Static site generator webpack plugin.
new StaticSiteGeneratorPlugin({ new StaticSiteGeneratorPlugin({

View file

@ -60,6 +60,7 @@
"react-hot-loader": "^4.8.2", "react-hot-loader": "^4.8.2",
"react-listener-provider": "^0.2.0", "react-listener-provider": "^0.2.0",
"react-loadable": "^5.5.0", "react-loadable": "^5.5.0",
"react-loadable-ssr-addon": "^0.1.6",
"react-perimeter": "^0.4.0", "react-perimeter": "^0.4.0",
"react-router-config": "^5.0.0", "react-router-config": "^5.0.0",
"react-router-dom": "^5.0.0", "react-router-dom": "^5.0.0",
@ -68,12 +69,12 @@
"static-site-generator-webpack-plugin": "^3.4.2", "static-site-generator-webpack-plugin": "^3.4.2",
"style-loader": "^0.22.1", "style-loader": "^0.22.1",
"terser-webpack-plugin": "^1.2.3", "terser-webpack-plugin": "^1.2.3",
"webpack": "^4.26.0", "webpack": "^4.29.6",
"webpack-bundle-analyzer": "^3.1.0", "webpack-bundle-analyzer": "^3.1.0",
"webpack-dev-server": "^3.2.1", "webpack-dev-server": "^3.2.1",
"webpack-merge": "^4.1.4", "webpack-merge": "^4.1.4",
"webpack-nicelog": "^2.3.1", "webpack-nicelog": "^2.3.1",
"webpack-stats-plugin": "^0.2.1" "webpack-node-externals": "^1.7.2"
}, },
"peerDependencies": { "peerDependencies": {
"react": "^16.8.4", "react": "^16.8.4",

View file

@ -10919,6 +10919,11 @@ react-listener-provider@^0.2.0:
resolved "https://registry.yarnpkg.com/react-listener-provider/-/react-listener-provider-0.2.0.tgz#fb6ce123f9e20ad948f75906ddf647db1df31f18" resolved "https://registry.yarnpkg.com/react-listener-provider/-/react-listener-provider-0.2.0.tgz#fb6ce123f9e20ad948f75906ddf647db1df31f18"
integrity sha1-+2zhI/niCtlI91kG3fZH2x3zHxg= integrity sha1-+2zhI/niCtlI91kG3fZH2x3zHxg=
react-loadable-ssr-addon@^0.1.6:
version "0.1.6"
resolved "https://registry.yarnpkg.com/react-loadable-ssr-addon/-/react-loadable-ssr-addon-0.1.6.tgz#de3e45f2b3876dc7b9afae19138370f0588b7300"
integrity sha512-D/Du+YH9EI77CoogenWU0F/EmHjJH2K3B9lH29yF1mcHOpFKccCObZ2P7CHdV0DqhPiXdw6URAioaSf10mYkPw==
react-loadable@^5.5.0: react-loadable@^5.5.0:
version "5.5.0" version "5.5.0"
resolved "https://registry.yarnpkg.com/react-loadable/-/react-loadable-5.5.0.tgz#582251679d3da86c32aae2c8e689c59f1196d8c4" resolved "https://registry.yarnpkg.com/react-loadable/-/react-loadable-5.5.0.tgz#582251679d3da86c32aae2c8e689c59f1196d8c4"
@ -13533,6 +13538,11 @@ webpack-nicelog@^2.3.1:
react-dev-utils "^5.0.1" react-dev-utils "^5.0.1"
webpackbar "^2.6.1" webpackbar "^2.6.1"
webpack-node-externals@^1.7.2:
version "1.7.2"
resolved "https://registry.yarnpkg.com/webpack-node-externals/-/webpack-node-externals-1.7.2.tgz#6e1ee79ac67c070402ba700ef033a9b8d52ac4e3"
integrity sha512-ajerHZ+BJKeCLviLUUmnyd5B4RavLF76uv3cs6KNuO8W+HuQaEs0y0L7o40NQxdPy5w0pcv8Ew7yPUAQG0UdCg==
webpack-sources@^0.2.0: webpack-sources@^0.2.0:
version "0.2.3" version "0.2.3"
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.2.3.tgz#17c62bfaf13c707f9d02c479e0dcdde8380697fb" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.2.3.tgz#17c62bfaf13c707f9d02c479e0dcdde8380697fb"
@ -13549,12 +13559,7 @@ webpack-sources@^1.1.0, webpack-sources@^1.3.0:
source-list-map "^2.0.0" source-list-map "^2.0.0"
source-map "~0.6.1" source-map "~0.6.1"
webpack-stats-plugin@^0.2.1: webpack@^4.29.6:
version "0.2.1"
resolved "https://registry.yarnpkg.com/webpack-stats-plugin/-/webpack-stats-plugin-0.2.1.tgz#1f5bac13fc25d62cbb5fd0ff646757dc802b8595"
integrity sha512-OYMZLpZrK/qLA79NE4kC4DCt85h/5ipvWJcsefKe9MMw0qU4/ck/IJg+4OmWA+5EfrZZpHXDq92IptfYDWVfkw==
webpack@^4.26.0:
version "4.29.6" version "4.29.6"
resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.29.6.tgz#66bf0ec8beee4d469f8b598d3988ff9d8d90e955" resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.29.6.tgz#66bf0ec8beee4d469f8b598d3988ff9d8d90e955"
integrity sha512-MwBwpiE1BQpMDkbnUUaW6K8RFZjljJHArC6tWQJoFm0oQtfoSebtg4Y7/QHnJ/SddtjYLHaKGX64CFjG5rehJw== integrity sha512-MwBwpiE1BQpMDkbnUUaW6K8RFZjljJHArC6tWQJoFm0oQtfoSebtg4Y7/QHnJ/SddtjYLHaKGX64CFjG5rehJw==