Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feature: Prerender using webpack #71

Merged
merged 53 commits into from
Jun 28, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
eb9f9c1
Merge remote-tracking branch 'developit/master'
rkostrzewski May 29, 2017
5615460
feat(WebpackSSR): Prerender using webpack bundled code
rkostrzewski May 29, 2017
bd01055
Merge branch 'master' into feature/webpack-ssr
developit May 29, 2017
63e745a
feat(WebpackSSR): Single webpack compiler pass
rkostrzewski May 30, 2017
b18db39
refacotr(WebpackSSR): Move webpack stuff to webpack folder & create c…
rkostrzewski May 30, 2017
22e93c5
feat(WebpackSSR): Async component loading for server & build output i…
rkostrzewski May 31, 2017
b47314d
fix: JSON stats for new webpack build with two configs
rkostrzewski May 31, 2017
318c90f
chore: update sw-precache-webpack-plugin to 0.11.2
rkostrzewski Jun 1, 2017
881e476
Merge remote-tracking branch 'developit/master' into feature/webpack-ssr
rkostrzewski Jun 1, 2017
864e55c
test: Preact CLI tests [WIP]
rkostrzewski Jun 7, 2017
8d5d286
test: Preact CLI tests [WIP]
rkostrzewski Jun 8, 2017
a70e062
test: Preact CLI tests
rkostrzewski Jun 10, 2017
f0b2020
Remove yarn.lock
rkostrzewski Jun 10, 2017
5287818
Merge remote-tracking branch 'developit/master' into feature/webpack-ssr
rkostrzewski Jun 10, 2017
69829bb
refactor: Preact CLI tests
rkostrzewski Jun 11, 2017
7800035
chore: Setup Travis CI
rkostrzewski Jun 11, 2017
2197b93
fix: Setup test timeouts for travis
rkostrzewski Jun 11, 2017
32d6cfb
chore: Travis setup chrome path [WIP]
rkostrzewski Jun 11, 2017
8ae3a8d
fix: Setup test timeouts for travis
rkostrzewski Jun 11, 2017
266443b
chore: Debug Chrome errors on Travis
rkostrzewski Jun 11, 2017
332f858
Revert "chore: Debug Chrome errors on Travis"
rkostrzewski Jun 11, 2017
24840c6
chore: Travis setup chrome
rkostrzewski Jun 11, 2017
0706424
chore: Travis setup chrome
rkostrzewski Jun 11, 2017
b6d179a
chore: Travis setup chrome
rkostrzewski Jun 12, 2017
0eed33a
chore: Travis setup chrome
rkostrzewski Jun 12, 2017
ddd4700
chore: Travis setup chrome
rkostrzewski Jun 12, 2017
6a4b7e7
chore: Travis setup chrome
rkostrzewski Jun 12, 2017
2546b75
chore: Travis setup chrome
rkostrzewski Jun 12, 2017
f64422b
refactor: Preact CLI tests
rkostrzewski Jun 12, 2017
9b3bea3
test: Preact CLI increase build timeout
rkostrzewski Jun 12, 2017
17e8aa3
test: Increase robustness of serve test
rkostrzewski Jun 12, 2017
9395884
test: Don't fail when page can't be loaded
rkostrzewski Jun 13, 2017
5c10410
Revert "test: Don't fail when page can't be loaded"
rkostrzewski Jun 13, 2017
cbe6052
test: Increase robustness of serve test
rkostrzewski Jun 13, 2017
7a3f7bd
Merge branch 'master' into feature/cli-tests
rkostrzewski Jun 15, 2017
bf1b859
tests: Use chrome-launcher npm package instead of lighthouse
rkostrzewski Jun 15, 2017
1f74d82
tests: Remove cert install
rkostrzewski Jun 15, 2017
ecb762e
tests: New way of handling SSL certificates
rkostrzewski Jun 16, 2017
4e0ec76
tests: New way of handling SSL certificates
rkostrzewski Jun 16, 2017
94038b7
Merge branch 'master' into feature/cli-tests
rkostrzewski Jun 20, 2017
22b3641
Merge developit/master
rkostrzewski Jun 22, 2017
2b6cf54
Merge remote-tracking branch 'developit/feature/cli-tests' into featu…
rkostrzewski Jun 22, 2017
c1d3635
fix: Failing tests for webpack SSR
rkostrzewski Jun 22, 2017
778524d
tests: Add test for webpack prerender
rkostrzewski Jun 22, 2017
9e5d587
Merge remote-tracking branch 'developit/master' into feature/webpack-ssr
rkostrzewski Jun 23, 2017
4d0ce1a
Merge remote-tracking branch 'developit/master' into feature/webpack-ssr
rkostrzewski Jun 24, 2017
9205759
Merge remote-tracking branch 'developit/master' into feature/webpack-ssr
rkostrzewski Jun 25, 2017
5072e1b
Merge remote-tracking branch 'developit/master' into feature/webpack-ssr
rkostrzewski Jun 26, 2017
65a93d9
Merge remote-tracking branch 'developit/master' into feature/webpack-ssr
rkostrzewski Jun 27, 2017
0de7bf9
Merge remote-tracking branch 'developit/master' into feature/webpack-ssr
rkostrzewski Jun 28, 2017
8759601
chore: Remove pacakge-lock.json [ci skip]
rkostrzewski Jun 28, 2017
a1d4ed7
feat: transform config
rkostrzewski Jun 28, 2017
5ffc9fc
Merge remote-tracking branch 'developit/master' into feature/webpack-ssr
rkostrzewski Jun 28, 2017
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@
"devDependencies": {
"babel-cli": "^6.24.0",
"babel-eslint": "^7.2.1",
"babel-plugin-transform-runtime": "^6.23.0",
"chrome-launcher": "^0.1.1",
"chrome-remote-interface": "^0.23.2",
"eslint": "^3.19.0",
Expand All @@ -81,6 +82,8 @@
"html-webpack-exclude-assets-plugin": "0.0.5",
"lodash": "^4.17.4",
"ncp": "^2.0.0",
"node-sass": "^4.5.3",
"sass-loader": "^6.0.6",
"tap-diff": "^0.1.1",
"tape": "^4.6.3",
"uuid": "^3.0.1"
Expand Down Expand Up @@ -134,7 +137,7 @@
"rimraf": "^2.6.1",
"script-ext-html-webpack-plugin": "^1.8.0",
"simplehttp2server": "^2.0.0",
"sw-precache-webpack-plugin": "^0.11.0",
"sw-precache-webpack-plugin": "^0.11.2",
"tmp": "0.0.31",
"unfetch": "^3.0.0",
"url-loader": "^0.5.8",
Expand Down
9 changes: 2 additions & 7 deletions src/commands/build.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@ import { resolve } from 'path';
import promisify from 'es6-promisify';
import rimraf from 'rimraf';
import asyncCommand from '../lib/async-command';
import webpackConfig from '../lib/webpack-config';
import transformConfig from '../lib/transform-config';
import runWebpack, { showStats, writeJsonStats } from '../lib/run-webpack';
import runWebpack, { showStats, writeJsonStats } from '../lib/webpack/run-webpack';

export default asyncCommand({
command: 'build [src] [dest]',
Expand Down Expand Up @@ -47,15 +45,12 @@ export default asyncCommand({
},

async handler(argv) {
let config = webpackConfig(argv);
await transformConfig(argv, config);

if (argv.clean) {
let dest = resolve(argv.cwd || process.cwd(), argv.dest || 'build');
await promisify(rimraf)(dest);
}

let stats = await runWebpack(false, config);
let stats = await runWebpack(false, argv);
showStats(stats);

if (argv.json) {
Expand Down
9 changes: 2 additions & 7 deletions src/commands/watch.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import asyncCommand from '../lib/async-command';
import webpackConfig from '../lib/webpack-config';
import transformConfig from '../lib/transform-config';
import getSslCert from '../lib/ssl-cert';
import runWebpack, { showStats } from '../lib/run-webpack';
import runWebpack, { showStats } from '../lib/webpack/run-webpack';

export default asyncCommand({
command: 'watch [src]',
Expand Down Expand Up @@ -54,10 +52,7 @@ export default asyncCommand({
argv.https = ssl;
}

let config = webpackConfig(argv);
await transformConfig(argv, config);

let stats = await runWebpack(true, config, showStats);
let stats = await runWebpack(true, argv, showStats);
showStats(stats);
}
});
55 changes: 0 additions & 55 deletions src/lib/prerender.js

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ module.exports.pitch = function(remainingRequest) {
}

return `
import async from ${JSON.stringify(path.resolve(__dirname, '../components/async'))};
import async from ${JSON.stringify(path.resolve(__dirname, '../../components/async'))};

function load(cb) {
require.ensure([], function(require) {
Expand Down
3 changes: 3 additions & 0 deletions src/lib/webpack/dummy-loader.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = function(source, map) {
this.callback(null, source, map);
};
File renamed without changes.
File renamed without changes.
27 changes: 27 additions & 0 deletions src/lib/webpack/prerender.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { resolve } from 'path';

export default function prerender(outputDir, params) {
params = params || {};

let entry = resolve(outputDir, './ssr-build/ssr-bundle.js'),
url = params.url || '/';

global.location = { href:url, pathname:url };
global.history = {};

let m = require(entry),
app = m && m.default || m;

if (typeof app!=='function') {
// eslint-disable-next-line no-console
console.warn('Entry does not export a Component function/class, aborting prerendering.');
return '';
}

let preact = require('preact'),
renderToString = require('preact-render-to-string');

let html = renderToString(preact.h(app, { url }));

return html;
}
File renamed without changes.
68 changes: 47 additions & 21 deletions src/lib/run-webpack.js → src/lib/webpack/run-webpack.js
Original file line number Diff line number Diff line change
@@ -1,25 +1,26 @@
import { resolve } from 'path';
import path from 'path';
import fs from 'fs.promised';
import webpack from 'webpack';
import WebpackDevServer from 'webpack-dev-server';
import chalk from 'chalk';
import clientConfig from './webpack-client-config';
import serverConfig from './webpack-server-config';
import transformConfig from './transform-config';

export default (watch=false, config, onprogress) => new Promise( (resolve, reject) => {
let compiler = webpack(config);
export default async (watch=false, env, onprogress) => {
if (watch) {
return await devBuild(env, onprogress);
}

let done = (err, stats) => {
if (err || stats.hasErrors()) {
reject(err || stats.toJson().errors.join('\n'));
}
else {
// Timeout for plugins that work on `after-emit` event of webpack
setTimeout(()=>{
resolve(stats);
},20);
}
};
return await prodBuild(env);
};

if (watch) {
const devBuild = async (env, onprogress) => {
let config = clientConfig(env);
await transformConfig(env, config);

let compiler = webpack(config);
return await new Promise((resolve, reject) => {
let first = true;
compiler.plugin('done', stats => {
if (first) {
Expand All @@ -34,11 +35,34 @@ export default (watch=false, config, onprogress) => new Promise( (resolve, rejec

let server = new WebpackDevServer(compiler, config.devServer);
server.listen(config.devServer.port);
});
};

const prodBuild = async (env) => {
let compiler, client = clientConfig(env);

await transformConfig(env, client);

if (env.prerender) {
let ssrConfig = serverConfig(env);
await transformConfig(env, ssrConfig, true);
compiler = webpack([client, ssrConfig]);
} else {
compiler = webpack(client);
}
else {
compiler.run(done);
}
});

return await new Promise((resolve, reject) => {
compiler.run((err, stats) => {
if (err || stats.hasErrors()) {
reject(err || stats.toJson().errors.join('\n'));
}
else {
// Timeout for plugins that work on `after-emit` event of webpack
setTimeout(()=> resolve(stats), 20);
}
});
});
};

export function showStats(stats) {
let info = stats.toJson();
Expand All @@ -59,13 +83,15 @@ export function showStats(stats) {
}

export function writeJsonStats(stats) {
const outputPath = resolve(process.cwd(), 'stats.json');
const jsonStats = stats.toJson({
let outputPath = path.resolve(process.cwd(), 'stats.json');
let jsonStats = stats.toJson({
json: true,
chunkModules: true,
source: false,
});

jsonStats = (jsonStats.children && jsonStats.children[0]) || jsonStats;

jsonStats.modules.forEach(normalizeModule);
jsonStats.chunks.forEach(c => c.modules.forEach(normalizeModule));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {
webpack,
} from '@webpack-blocks/webpack2';

export default async function (env, config) {
export default async function (env, config, ssr = false) {
let transformerPath = path.resolve(env.cwd, env.config || './preact.config.js');

try {
Expand All @@ -22,7 +22,7 @@ export default async function (env, config) {
const m = require(transformerPath);
const transformer = m && m.default || m;
try {
await transformer(config, Object.assign({}, env), new WebpackConfigHelpers(env.cwd));
await transformer(config, Object.assign({}, env, { ssr }), new WebpackConfigHelpers(env.cwd));
} catch (err) {
throw new Error(`Error at ${transformerPath}: \n` + err);
}
Expand Down
Loading