-
Notifications
You must be signed in to change notification settings - Fork 0
/
webpack.config.js
126 lines (120 loc) · 3.29 KB
/
webpack.config.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
const { generateSitemapConfig } = require('./scripts/sitemap')
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const CopyPlugin = require('copy-webpack-plugin')
const SitemapPlugin = require('sitemap-webpack-plugin').default
const glob = require('glob')
const pages = glob.sync('**/*.pug', {
cwd: path.resolve(__dirname, 'src/pages'),
})
const pagePlugins = pages.map((page) => {
return new HtmlWebpackPlugin({
inject: false,
template: `./src/pages/${page}`,
filename: page.replace('.pug', '.html'),
})
})
const filePlugins = new CopyPlugin([
{ from: './src/assets/images/', to: './assets/images/' },
{ from: './src/assets/fonts/', to: './assets/fonts' },
{ from: './src/robots.txt', to: './robots.txt' },
{ from: './src/pages/rss.xml', to: './rss.xml' },
{ from: './src/site.webmanifest', to: './site.webmanifest' },
{ from: './src/favicon.ico', to: './favicon.ico' },
{ from: './src/favicon-32x32.png', to: './favicon-32x32.png' },
{ from: './src/favicon-16x16.png', to: './favicon-16x16.png' },
{ from: './src/apple-touch-icon.png', to: './apple-touch-icon.png' },
{
from: './src/android-chrome-512x512.png',
to: './android-chrome-512x512.png',
},
{
from: './src/android-chrome-192x192.png',
to: './android-chrome-192x192.png',
},
])
const sitemapPlugin = new SitemapPlugin({
base: 'https://mcarter.me',
paths: generateSitemapConfig(),
options: {
filename: 'sitemap.xml',
},
})
const statsConfig = {
children: false,
chunks: false,
assets: false,
builtAt: false,
hash: false,
// timings: false,
entrypoints: false,
modules: false,
version: false,
warnings: false,
}
const config = {
stats: statsConfig,
entry: {
main: './src/assets/styles/main.scss',
},
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].js',
publicPath: '/',
},
devServer: {
static: { directory: path.join(__dirname, 'dist') },
port: 3000,
historyApiFallback: {
rewrites: [
{
from: /^(?!.*\.(js|css|png|jpg|svg|webp)|$).*$/,
to: (context) => {
let { pathname } = context.parsedUrl
if (pathname.charAt(pathname.length - 1) === '/') {
pathname = pathname.substring(0, pathname.length - 1)
}
return `${pathname}.html`
},
},
],
},
devMiddleware: { stats: statsConfig },
},
plugins: [].concat(pagePlugins, filePlugins, sitemapPlugin),
module: {
rules: [
{
test: /\.pug$/,
use: ['html-loader?attrs=false', 'pug-html-loader'],
},
{
test: /\.js$/,
exclude: /(node_modules|dist)/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env', '@babel/preset-react'],
plugins: ['@babel/plugin-proposal-object-rest-spread'],
},
},
},
{
test: /\.scss$/,
use: [
{
loader: 'file-loader',
options: {
name: 'assets/styles/[name].css',
},
},
{ loader: 'extract-loader' },
{ loader: 'css-loader?-url' },
{ loader: 'postcss-loader' },
{ loader: 'sass-loader' },
],
},
],
},
}
module.exports = config