-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathwebpack.config.js
62 lines (57 loc) · 1.6 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
const CopyPlugin = require("copy-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = (env, { mode }) => ({
output: { filename: "[name].[hash].js" },
module: {
rules: [
{ test: /\.js$/, exclude: /node_modules/, use: babelLoader },
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, "css-loader", postCssLoader(mode)]
},
{
test: /\.elm$/,
exclude: [/elm-stuff/, /node_modules/],
use: elmWebpackLoader(mode)
}
]
},
plugins: [
new HtmlWebpackPlugin({ template: "src/index.html" }),
new MiniCssExtractPlugin({ filename: "[name].[contenthash].css" }),
new CopyPlugin([{ from: "public" }])
]
});
const babelLoader = {
loader: "babel-loader",
options: { presets: ["@babel/preset-env"] }
};
const postCssLoader = mode => {
const productionPlugins = [
require("@fullhuman/postcss-purgecss")({
content: ["./src/**/*.js", "./src/**/*.elm", "./src/**/*.html"],
defaultExtractor: content => content.match(/[A-Za-z0-9-_:/]+/g) || []
}),
require("cssnano")
];
return {
loader: "postcss-loader",
options: {
plugins: [
require("tailwindcss"),
require("postcss-preset-env"),
...(mode === "production" ? productionPlugins : [])
]
}
};
};
const elmWebpackLoader = mode => ({
loader: "elm-webpack-loader",
options: {
cwd: __dirname,
runtimeOptions: "-A128m -H128m -n8m",
debug: mode === "development",
optimize: mode === "production"
}
});