MyShaarli/webpack.config.js
2024-12-10 16:31:21 +01:00

149 lines
3.7 KiB
JavaScript

const path = require('path');
const glob = require('glob');
// Minify JS
const TerserPlugin = require('terser-webpack-plugin');
// This plugin extracts the CSS into its own file instead of tying it with the JS.
// It prevents:
// - not having styles due to a JS error
// - the flash page without styles during JS loading
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const extractCss = new MiniCssExtractPlugin({
filename: "css/[name].min.css",
});
module.exports = [
{
mode: 'production',
entry: {
shaare_batch: './assets/common/js/shaare-batch.js',
thumbnails: './assets/common/js/thumbnails.js',
thumbnails_update: './assets/common/js/thumbnails-update.js',
metadata: './assets/common/js/metadata.js',
pluginsadmin: './assets/default/js/plugins-admin.js',
shaarli: [
'./assets/default/js/base.js',
'./assets/default/scss/shaarli.scss',
].concat(glob.sync('./assets/default/img/*', { dotRelative: true })),
markdown: './assets/common/css/markdown.css',
},
output: {
filename: 'js/[name].min.js',
path: path.resolve(__dirname, 'tpl/default/')
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: [
'@babel/preset-env',
]
}
}
},
{
test: /\.s?css/,
use: [
{
loader: MiniCssExtractPlugin.loader,
},
'css-loader',
'sass-loader',
],
},
{
test: /\.(gif|png|jpe?g|svg|ico)$/i,
type: 'asset/resource',
generator: {
filename: 'img/[name][ext]'
}
},
{
test: /webfont\.svg$/,
type: 'asset/resource',
generator: {
filename: 'fonts/[name][ext]'
}
},
{
test: /\.(eot|ttf|woff|woff2)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
type: 'asset/resource',
generator: {
filename: 'fonts/[name][ext]'
}
},
],
},
optimization: {
minimize: true,
minimizer: [new TerserPlugin()],
},
plugins: [
extractCss,
],
},
{
mode: 'production',
entry: {
shaarli: [
'./assets/vintage/js/base.js',
'./assets/vintage/css/reset.css',
'./assets/vintage/css/shaarli.css',
].concat(glob.sync('./assets/vintage/img/*', { dotRelative: true })),
markdown: './assets/common/css/markdown.css',
thumbnails: './assets/common/js/thumbnails.js',
metadata: './assets/common/js/metadata.js',
thumbnails_update: './assets/common/js/thumbnails-update.js',
},
output: {
filename: 'js/[name].min.js',
path: path.resolve(__dirname, 'tpl/vintage/')
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: [
'@babel/preset-env',
]
}
}
},
{
test: /\.css$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
},
'css-loader',
'sass-loader',
],
},
{
test: /\.(gif|png|jpe?g|svg|ico)$/i,
type: 'asset/resource',
generator: {
filename: 'img/[name][ext]'
}
},
],
},
optimization: {
minimize: true,
minimizer: [new TerserPlugin()],
},
plugins: [
extractCss,
],
},
];