This repository has been archived by the owner on Oct 31, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 173
/
client.ts
150 lines (130 loc) · 3.34 KB
/
client.ts
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
// Webpack (client)
// ----------------------------------------------------------------------------
// IMPORTS
/* Node */
import path from "path";
/* NPM */
import CompressionPlugin from "compression-webpack-plugin";
import { mergeWith } from "lodash";
import MiniCssExtractPlugin from "mini-css-extract-plugin";
import webpack from "webpack";
const BrotliCompression = require("brotli-webpack-plugin");
/* Local */
import common, { defaultMerger, files } from "./common";
import css, { rules } from "./css";
// ----------------------------------------------------------------------------
const isProduction = process.env.NODE_ENV === "production";
// Base client config
const base: webpack.Configuration = {
// Entry
entry: [path.resolve(__dirname, "..", "entry", "client.tsx")],
// Name
name: "client",
// Use `MiniCssExtractPlugin` in both dev and production, because
// the server will need access to it in its initial render
module: {
rules: [
...css(),
// Images
{
test: files.images,
use: [
{
loader: "file-loader",
query: {
name: `assets/img/[name]${isProduction ? ".[hash]" : ""}.[ext]`
}
}
]
},
// Fonts
{
test: files.fonts,
use: [
{
loader: "file-loader",
query: {
name: `assets/fonts/[name]${isProduction ? ".[hash]" : ""}.[ext]`
}
}
]
}
]
},
// Set-up some common mocks/polyfills for features available in node, so
// the browser doesn't balk when it sees this stuff
node: {
console: true,
fs: "empty",
net: "empty",
tls: "empty"
},
// Output
output: {
path: path.resolve(__dirname, "..", "..", "dist", "public"),
publicPath: "/"
},
// The client bundle will be responsible for building the resulting
// CSS file; ensure compilation is dumped into a single chunk
optimization: {
splitChunks: {
cacheGroups: {
styles: {
chunks: "all",
enforce: true,
name: "main",
test: new RegExp(
`\\.${rules.map(rule => `(${rule.ext})`).join("|")}$`
)
}
}
}
},
// Add `MiniCssExtractPlugin`
plugins: [
new MiniCssExtractPlugin({
chunkFilename: "assets/css/[id].css",
filename: `assets/css/[name]${isProduction ? ".[contenthash]" : ""}.css`
}),
// Add global variables
new webpack.DefinePlugin({
GRAPHQL: JSON.stringify(process.env.GRAPHQL),
SERVER: false,
WS_SUBSCRIPTIONS: process.env.WS_SUBSCRIPTIONS,
LOCAL_STORAGE_KEY: JSON.stringify(process.env.LOCAL_STORAGE_KEY)
})
]
};
// Development client config
const dev: webpack.Configuration = {
devtool: "inline-source-map",
// Output
output: {
chunkFilename: "[name].js",
filename: "[name].js"
}
};
// Production client config
const prod: webpack.Configuration = {
// Output
output: {
chunkFilename: "assets/js/[name].[chunkhash].js",
filename: "assets/js/[name].[chunkhash].js"
},
plugins: [
new CompressionPlugin({
cache: true,
minRatio: 0.99
}),
new BrotliCompression({
minRatio: 0.99
})
]
};
export default mergeWith(
{},
common(false),
base,
process.env.NODE_ENV === "production" ? prod : dev,
defaultMerger
);