133 lines
3.3 KiB
JavaScript
133 lines
3.3 KiB
JavaScript
const CopyPlugin = require('copy-webpack-plugin');
|
|
// const HandlebarsPlugin = require('handlebars-webpack-plugin');
|
|
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
|
|
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
|
|
const RemoveEmptyScriptsPlugin = require('webpack-remove-empty-scripts');
|
|
const TerserPlugin = require('terser-webpack-plugin');
|
|
const autoprefixer = require('autoprefixer');
|
|
const path = require('path');
|
|
|
|
const paths = {
|
|
src: {
|
|
fonts: './src/fonts',
|
|
img: './src/img',
|
|
js: './src/js',
|
|
scss: './src/scss',
|
|
},
|
|
dist: {
|
|
css: './css',
|
|
fonts: './fonts',
|
|
img: './img',
|
|
js: './js',
|
|
},
|
|
};
|
|
|
|
module.exports = {
|
|
devtool: 'source-map',
|
|
entry: {
|
|
libs: [paths.src.scss + '/libs.scss'],
|
|
theme: [paths.src.js + '/theme.js', paths.src.scss + '/theme.scss'],
|
|
},
|
|
mode: 'development',
|
|
module: {
|
|
rules: [
|
|
{
|
|
test: /\.(sass|scss)$/,
|
|
include: path.resolve(__dirname, paths.src.scss.slice(2)),
|
|
use: [
|
|
{
|
|
loader: MiniCssExtractPlugin.loader,
|
|
},
|
|
{
|
|
loader: 'css-loader',
|
|
options: {
|
|
url: false,
|
|
},
|
|
},
|
|
{
|
|
loader: 'postcss-loader',
|
|
options: {
|
|
postcssOptions: {
|
|
plugins: [['autoprefixer']],
|
|
},
|
|
},
|
|
},
|
|
{
|
|
loader: 'sass-loader',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
optimization: {
|
|
splitChunks: {
|
|
cacheGroups: {
|
|
vendor: {
|
|
test: /[\\/](node_modules)[\\/].+\.js$/,
|
|
name: 'vendor',
|
|
chunks: 'all',
|
|
},
|
|
},
|
|
},
|
|
minimizer: [
|
|
new CssMinimizerPlugin(),
|
|
new TerserPlugin({
|
|
extractComments: false,
|
|
terserOptions: {
|
|
output: {
|
|
comments: false,
|
|
},
|
|
},
|
|
}),
|
|
],
|
|
},
|
|
output: {
|
|
filename: paths.dist.js + '/[name].bundle.js',
|
|
path: path.resolve(__dirname, 'assets'),
|
|
},
|
|
plugins: [
|
|
new CopyPlugin({
|
|
patterns: [
|
|
{
|
|
from: paths.src.fonts,
|
|
to: paths.dist.fonts,
|
|
},
|
|
{
|
|
from: paths.src.img,
|
|
to: paths.dist.img,
|
|
}
|
|
],
|
|
}),
|
|
/*new HandlebarsPlugin({
|
|
entry: path.join(process.cwd(), 'src', 'html', '**', '*.html'),
|
|
output: path.join(process.cwd(), 'dist', '[path]', '[name].html'),
|
|
partials: [path.join(process.cwd(), 'src', 'partials', '**', '*.{html,svg}')],
|
|
helpers: {
|
|
is: function (v1, v2, options) {
|
|
const variants = v2.split(' || ');
|
|
const isTrue = variants.some((variant) => v1 === variant);
|
|
|
|
return isTrue ? options.fn(this) : options.inverse(this);
|
|
},
|
|
isnt: function (v1, v2, options) {
|
|
return v1 !== v2 ? options.fn(this) : options.inverse(this);
|
|
},
|
|
webRoot: function () {
|
|
return '{{webRoot}}';
|
|
},
|
|
},
|
|
onBeforeSave: function (Handlebars, resultHtml, filename) {
|
|
const level = filename.split('//').pop().split('/').length;
|
|
const finalHtml = resultHtml.split('{{webRoot}}').join('.'.repeat(level));
|
|
|
|
return finalHtml;
|
|
},
|
|
}),*/
|
|
new RemoveEmptyScriptsPlugin(),
|
|
new MiniCssExtractPlugin({
|
|
filename: paths.dist.css + '/[name].bundle.css',
|
|
}),
|
|
],
|
|
target: 'web',
|
|
};
|