-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwebpack.config.js
86 lines (76 loc) · 2.47 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
const path = require('path');
const fs = require('fs');
const uglifycss = require('uglifycss');
const TerserPlugin = require("terser-webpack-plugin");
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
const isDev = process.argv.indexOf('--mode=none')>0; //should be development
console.log(isDev?"Webpack DEVELOPMENT mode": "Webpack PRODUCTION mode")
// Build all entry points
const entries = {}
const allCssFiles = []
fs.readdirSync("./ts", {withFileTypes: true})
.filter(dirent => dirent.isDirectory()==true && !dirent.name.startsWith("_"))
.forEach( dirent => {
const modName = dirent.name;
if(modName.startsWith("_") && isDev) {
//Do not include in production build
return;
}
entries[modName] = "./ts/"+modName+"/"+modName+".ts";
const cssFile = path.resolve("./ts/"+modName+"/"+modName+".css");
if(fs.existsSync(cssFile)) {
allCssFiles.push(cssFile);
}
// Minify every single css files found while walking the directories
fs.readdirSync("./ts/"+modName, {withFileTypes: true})
.filter(dirent => dirent.isDirectory()==false && dirent.name.indexOf(".min.css") < 0 && dirent.name.endsWith(".css")).forEach( dirent2 => {
const miniCss = uglifycss.processFiles(["./ts/"+modName+"/"+dirent2.name]);
const targetCss = path.resolve("./ts/"+modName+"/"+ dirent2.name.replace(".css",".min.css"));
fs.writeFileSync(targetCss, miniCss, {encoding: "utf8"});
});
// Minify the entire css bundle
const miniCss = uglifycss.processFiles(allCssFiles);
const targetCss = path.resolve("./dist", "all.css");
fs.writeFileSync(targetCss, miniCss, {encoding: "utf8"});
});
module.exports = {
entry: entries,
module: {
rules: [
{
test: /\.ts$/,
exclude: /node_modules/,
loader: "babel-loader",
},
{
test: /\.css$/,
use:["style-loader", "css-loader"],
},
],
},
resolve: {
extensions: ['.ts'],
},
output: {
filename: isDev?'[name].js':'[name].min.js',
path: path.resolve(__dirname, './dist'+(isDev?'-dev':'')),
},
target: ["web", "es5"],
optimization: {
minimize: !isDev,
usedExports: true,
minimizer: [
new TerserPlugin({
terserOptions: {
format: {
comments: false,
},
compress: { pure_funcs: ['console.debug', 'console.log', 'console.info'] }
},
extractComments: false,
}),
new CssMinimizerPlugin({
minify: CssMinimizerPlugin.cssnanoMinify
})],
}
};