77 lines
No EOL
2.2 KiB
JavaScript
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/')
|
|
}
|
|
};
|
|
} |