-
Notifications
You must be signed in to change notification settings - Fork 2.1k
/
webpack.conf.js
145 lines (137 loc) · 4.15 KB
/
webpack.conf.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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
const TerserPlugin = require('terser-webpack-plugin');
var prebid = require('./package.json');
var path = require('path');
var webpack = require('webpack');
var helpers = require('./gulpHelpers.js');
var { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');
var argv = require('yargs').argv;
const fs = require('fs');
const babelConfig = require('./babelConfig.js')({disableFeatures: helpers.getDisabledFeatures(), prebidDistUrlBase: argv.distUrlBase});
const {WebpackManifestPlugin} = require('webpack-manifest-plugin')
var plugins = [
new webpack.EnvironmentPlugin({'LiveConnectMode': null}),
new WebpackManifestPlugin({
fileName: 'dependencies.json',
generate: (seed, files) => {
const entries = new Set();
const addEntry = entries.add.bind(entries);
files.forEach(file => file.chunk && file.chunk._groups && file.chunk._groups.forEach(addEntry));
return Array.from(entries).reduce((acc, entry) => {
const name = (entry.options || {}).name || (entry.runtimeChunk || {}).name
const files = (entry.chunks || [])
.filter(chunk => chunk.name !== name)
.flatMap(chunk => [...chunk.files])
.filter(Boolean);
return name && files.length ? {...acc, [`${name}.js`]: files} : acc
}, seed)
}
})
];
if (argv.analyze) {
plugins.push(
new BundleAnalyzerPlugin()
)
}
module.exports = {
mode: 'production',
devtool: 'source-map',
resolve: {
modules: [
path.resolve('.'),
'node_modules'
],
},
entry: (() => {
const entry = {
'prebid-core': {
import: './src/prebid.js'
},
};
const selectedModules = new Set(helpers.getArgModules());
Object.entries(helpers.getModules()).forEach(([fn, mod]) => {
if (selectedModules.size === 0 || selectedModules.has(mod)) {
const moduleEntry = {
import: fn,
dependOn: 'prebid-core'
};
entry[mod] = moduleEntry;
}
});
return entry;
})(),
output: {
chunkLoadingGlobal: prebid.globalVarName + 'Chunk',
chunkLoading: 'jsonp',
},
module: {
rules: [
{
test: /\.js$/,
exclude: path.resolve('./node_modules'), // required to prevent loader from choking non-Prebid.js node_modules
use: [
{
loader: 'babel-loader',
options: Object.assign({}, babelConfig, helpers.getAnalyticsOptions()),
}
]
},
{ // This makes sure babel-loader is ran on our intended Prebid.js modules that happen to be in node_modules
test: /\.js$/,
include: helpers.getArgModules().map(module => new RegExp('node_modules/' + module + '/')),
use: [
{
loader: 'babel-loader',
options: babelConfig
}
],
}
]
},
optimization: {
usedExports: true,
sideEffects: true,
minimizer: [
new TerserPlugin({
extractComments: false, // do not generate unhelpful LICENSE comment
terserOptions: {
module: true, // do not prepend every module with 'use strict'; allow mangling of top-level locals
}
})
],
splitChunks: {
chunks: 'initial',
minChunks: 1,
minSize: 0,
cacheGroups: (() => {
const libRoot = path.resolve(__dirname, 'libraries');
const libraries = Object.fromEntries(
fs.readdirSync(libRoot)
.filter((f) => fs.lstatSync(path.resolve(libRoot, f)).isDirectory())
.map(lib => {
const dir = path.resolve(libRoot, lib)
const def = {
name: lib,
test: (module) => {
return module.resource && module.resource.startsWith(dir)
}
}
return [lib, def];
})
);
const core = path.resolve('./src');
return Object.assign(libraries, {
core: {
name: 'chunk-core',
test: (module) => {
return module.resource && module.resource.startsWith(core);
}
},
}, {
default: false,
defaultVendors: false
});
})()
}
},
plugins
};