loom.forge/webpack.config.js

77 lines
No EOL
2.2 KiB
JavaScript

const path = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const IgnoreEmitPlugin = require('ignore-emit-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
const entries = {
loomScripts: './src/js/loom.ts',
loomStyles: './src/scss/loom.scss',
}
const ignoreFiles = Object.keys(entries).reduce((acc, key) => {
if (entries[key].endsWith('.scss')) {
acc.push(`${key}.js`);
}
return acc;
}, []);
module.exports = (env, options) => {
const isProduction = options.mode === 'production';
return {
entry: entries,
module: {
rules: [
{
test: /\.ts?$/,
use: 'ts-loader',
exclude: /node_modules/
},
{
test: /\.s[ac]ss$/i,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
{
loader: 'postcss-loader',
options: {
postcssOptions: {
plugins: [
require('autoprefixer')
]
}
}
},
'sass-loader'
],
exclude: /node_modules/
},
],
},
plugins: [
new MiniCssExtractPlugin({
filename: 'css/[name].css',
}),
new IgnoreEmitPlugin(ignoreFiles)
],
optimization: isProduction ? {
minimize: true,
minimizer: [
new TerserPlugin(),
new CssMinimizerPlugin(),
]
} : {},
resolve: {
extensions: ['.ts', '.js', '.css', '.scss']
},
watchOptions: {
poll: true,
ignored: /node_modules/
},
output: {
filename: 'js/[name].js',
path: path.resolve(__dirname, 'public/assets/')
}
};
}