Files
home/Projects/pivoine.art/webpack.config.js
2025-10-08 10:35:48 +02:00

172 lines
3.5 KiB
JavaScript

const { readFileSync } = require('fs');
const { resolve } = require('path');
const { BannerPlugin, EnvironmentPlugin } = require('webpack');
const WorkerPlugin = require('worker-plugin');
const { merge } = require('webpack-merge');
const {
argv: { mode },
} = require('yargs');
const { name: filename, version } = require('./package.json');
const banner = readFileSync(resolve('./_includes/header.txt'), 'utf-8');
const ASSET_PATH = '/assets/js/';
const envConfig = (() => {
switch (mode) {
case 'production':
return {
devtool: false,
plugins: [
new WorkerPlugin({ globalObject: 'self' }),
new BannerPlugin({ banner, raw: true }),
new EnvironmentPlugin({
DEBUG: false,
ASSET_PATH,
GET_CLAPS_API: 'https://worker.getclaps.app',
}),
],
};
default:
return {
devtool: 'source-map',
plugins: [
new WorkerPlugin({ globalObject: 'self' }),
new EnvironmentPlugin({
DEBUG: true,
ASSET_PATH,
GET_CLAPS_API: 'https://worker.getclaps.dev',
}),
],
};
}
})();
const sharedPreset = {
modules: false,
useBuiltIns: 'entry',
corejs: 2,
};
const babelPresetLegacy = {
babelrc: false,
presets: [
[
'@babel/preset-env',
{
...sharedPreset,
targets: {
ie: '11',
},
},
],
],
};
const babelPresetModern = {
babelrc: false,
presets: [
[
'@babel/preset-env',
{
...sharedPreset,
targets: {
esmodules: true,
},
},
],
],
};
const sharedConfig = {
entry: resolve('./_js/src/entry.js'),
output: {
path: resolve('./assets/js'),
publicPath: ASSET_PATH,
},
resolve: {
modules: [
resolve('./_js'),
resolve('./node_modules'),
...(process.env.NODE_PATH ? [resolve(process.env.NODE_PATH)] : []),
],
extensions: ['.json', '.js'],
symlinks: true,
},
optimization: {
splitChunks: {
// chunks: 'all',
// minSize: 30000,
// maxSize: 0,
// minChunks: 1,
// maxAsyncRequests: 5,
// maxInitialRequests: 3,
// automaticNameDelimiter: '~',
// automaticNameMaxLength: 30,
// name: true,
// cacheGroups: {
// vendors: {
// test: /[\\/]node_modules[\\/]/,
// priority: -10
// },
// default: {
// minChunks: 2,
// priority: -20,
// reuseExistingChunk: true
// }
// }
},
},
performance: {
hints: 'warning',
maxEntrypointSize: 512000,
maxAssetSize: 512000,
},
};
module.exports = [
merge(envConfig, sharedConfig, {
output: {
filename: `${filename}-${version}.js`,
chunkFilename: `[name]-${filename}-${version}.js`,
},
module: {
rules: [
{
test: /(\.jsx|\.js)$/,
loader: 'babel-loader',
options: babelPresetModern,
},
{
test: /modernizr-custom/,
use: 'null-loader',
},
{
test: /@webcomponents\/(template|url|webcomponents-platform)/,
use: 'null-loader',
},
],
},
}),
merge(envConfig, sharedConfig, {
output: {
filename: `LEGACY-${filename}-${version}.js`,
chunkFilename: `LEGACY-[name]-${filename}-${version}.js`,
},
module: {
rules: [
{
test: /(\.jsx|\.js)$/,
loader: 'babel-loader',
options: babelPresetLegacy,
},
],
},
}),
];