-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwebpack.config.ts
117 lines (99 loc) · 2.42 KB
/
webpack.config.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
import HtmlWebpackPlugin from "html-webpack-plugin";
import path from "path";
import SizePlugin from "size-plugin";
import { TsconfigPathsPlugin } from "tsconfig-paths-webpack-plugin";
import { fileURLToPath } from "url";
import {
Configuration,
WebpackPluginInstance
} from "webpack";
import { type Configuration as DevServerConfig } from "webpack-dev-server";
import WebpackMessages from "webpack-messages";
import RemoveEmptyScriptsPlugin from "webpack-remove-empty-scripts";
const root = path.dirname(fileURLToPath(import.meta.url));
const isDebug = process.env.NODE_ENV !== "production";
let config: Configuration & { devServer?: DevServerConfig } = {
stats: "errors-warnings",
mode: isDebug ? "development" : "production",
devtool: isDebug ? "inline-source-map" : "source-map",
entry: {
app: `${root}/src/index.tsx`
},
module: {
rules: [
{
test: /\.[cm]?tsx?$/,
exclude: /node_modules/,
use: [
{
loader: "ts-loader",
options: {
context: root,
transpileOnly: isDebug
}
}
]
},
{
test: /\.json$/,
exclude: /node_modules/,
loader: "json5-loader",
type: "javascript/auto",
options: {
esModule: false
}
},
{
test: /./,
exclude: /\.([cm]?[jt]sx?|json|scss|html|svg)$|node_modules/,
type: "asset/resource"
}
]
},
plugins: [
isDebug
? new WebpackMessages({
logger: (string) => console.log(string)
})
: null,
isDebug ? null : new RemoveEmptyScriptsPlugin(),
isDebug ? null : new SizePlugin({}),
new HtmlWebpackPlugin({
template: `${root}/src/template.html`,
chunks: "all"
})
].filter(Boolean) as WebpackPluginInstance[],
resolve: {
extensions: [".js", ".jsx", ".ts", ".tsx", ".json", ".scss", ".css"],
plugins: [
new TsconfigPathsPlugin({
configFile: path.resolve(root, "tsconfig.json")
})
],
modules: [
`${root}/node_modules`,
`${root}/node_modules/.pnpm/node_modules`
],
alias: {
react: "preact/compat",
"react-dom": "preact/compat"
},
fallback: {
path: "path-browserify"
}
},
experiments: {
topLevelAwait: true
},
optimization: {
moduleIds: "natural"
},
output: {
filename: `assets/[name]${isDebug ? "" : ".[contenthash:5]"}.js`,
chunkFilename: `assets/[name].bundle${isDebug ? "" : ".[chunkhash:5]"}.js`,
assetModuleFilename: `assets/[hash][ext]`,
path: path.resolve(root, "dist/"),
publicPath: "/"
}
};
export default config;