|
1 | 1 | const { resolve } = require('path');
|
2 |
| -const { existsSync } = require('fs'); |
| 2 | +const { existsSync, readFileSync, writeFileSync } = require('fs'); |
3 | 3 | const HtmlWebpackExcludeAssetsPlugin = require('html-webpack-exclude-assets-plugin');
|
4 | 4 | const HtmlWebpackPlugin = require('html-webpack-plugin');
|
5 | 5 | const prerender = require('./prerender');
|
6 | 6 | const createLoadManifest = require('./create-load-manifest');
|
7 | 7 | const { warn } = require('../../util');
|
8 | 8 | const { info } = require('../../util');
|
9 |
| -let template = resolve(__dirname, '../../resources/template.html'); |
| 9 | +let defaultTemplate = resolve(__dirname, '../../resources/template.html'); |
| 10 | + |
| 11 | +function read(path) { |
| 12 | + return readFileSync(resolve(__dirname, path), 'utf-8'); |
| 13 | +} |
10 | 14 |
|
11 | 15 | module.exports = async function(config) {
|
12 | 16 | const { cwd, dest, isProd, src } = config;
|
13 | 17 | const inProjectTemplatePath = resolve(src, 'template.html');
|
| 18 | + let template = defaultTemplate; |
14 | 19 | if (existsSync(inProjectTemplatePath)) {
|
15 | 20 | template = inProjectTemplatePath;
|
16 | 21 | }
|
| 22 | + |
| 23 | + template = config.template || template; |
| 24 | + |
| 25 | + let content = read(template); |
| 26 | + if (/preact\.headEnd|preact\.bodyEnd/.test(content)) { |
| 27 | + const headEnd = read('../../resources/head-end.ejs'); |
| 28 | + const bodyEnd = read('../../resources/body-end.ejs'); |
| 29 | + content = content |
| 30 | + .replace( |
| 31 | + /<%\s+preact\.title\s+%>/, |
| 32 | + '<%= htmlWebpackPlugin.options.title %>' |
| 33 | + ) |
| 34 | + .replace(/<%\s+preact\.headEnd\s+%>/, headEnd) |
| 35 | + .replace(/<%\s+preact\.bodyEnd\s+%>/, bodyEnd); |
| 36 | + |
| 37 | + // Unfortunately html-webpack-plugin expects a true file, |
| 38 | + // so we'll create a temporary one. |
| 39 | + template = resolve(__dirname, 'template.tmp.ejs'); |
| 40 | + writeFileSync(template, content); |
| 41 | + } |
| 42 | + |
17 | 43 | const htmlWebpackConfig = values => {
|
18 | 44 | const { url, title, ...routeData } = values;
|
19 | 45 | return Object.assign(values, {
|
20 | 46 | filename: resolve(dest, url.substring(1), 'index.html'),
|
21 |
| - template: `!!ejs-loader!${config.template || template}`, |
| 47 | + template: `!!ejs-loader!${template}`, |
22 | 48 | minify: isProd && {
|
23 | 49 | collapseWhitespace: true,
|
24 | 50 | removeScriptTypeAttributes: true,
|
|
0 commit comments