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