const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const WebpackBuildNotifierPlugin = require('webpack-build-notifier');
const WebpackForceReloadPlugin = require('webpack-force-reload-plugin');
const _ = require('lodash');
const configHelpers = require('webpack-config-helpers');
const globImporter = require('node-sass-glob-importer');
const path = require("path");
const webpack = require('webpack');
const { VueLoaderPlugin } = require('vue-loader');
const { glob } = require('glob');
let globalDevServer = null;
module.exports = env => {
return {
mode: configHelpers.ifProduction(env, 'production', 'development'),
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader',
},
{
test: /\.vue\.(coffee|js)$/,
use: [
{
loader: 'vue-loader',
},
{
loader: 'vue-component-merge-loader',
},
]
},
{
test: /\.coffee$/,
use: [
{
loader: 'coffee-loader',
options: {
bare: true,
},
},
]
},
{
test: /\.pug$/,
oneOf: [
{
resourceQuery: /^\?vue/u,
use: [
{
loader: 'ejs-pug-vue-resource-loader',
},
]
},
{
use: [
{
loader: 'ejs-loader-compiled',
},
{
loader: 'pug-plain-loader',
},
]
},
],
},
{
test: /\.(css)$/,
use: [
configHelpers.ifNotProduction(
env,
'vue-style-loader',
MiniCssExtractPlugin.loader
),
{
loader: 'css-loader',
},
],
sideEffects: true,
},
{
test: /\.(sass)$/,
use: [
configHelpers.ifNotProduction(
env,
'vue-style-loader',
MiniCssExtractPlugin.loader
),
{
loader: 'css-loader',
},
{
loader: 'sass-loader',
options: {
sassOptions: {
importer: globImporter(),
indentedSyntax: true,
}
}
}
],
sideEffects: true,
},
]
},
plugins: [
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: configHelpers.ifProduction(
env,
'"production"',
'"development"'
),
'termlog': env.termlog,
},
}),
new HtmlWebpackPlugin({
minify: false,
alwaysWriteToDisk: true,
template: path.resolve(
__dirname,
'src',
'markup',
'templates',
'index.pug'
),
filename: path.resolve(
__dirname,
'templates',
'index.html'
),
}),
new MiniCssExtractPlugin({
filename: 'assets/[name].[contenthash].css',
//chunkFilename: '[id].css'
}),
configHelpers.ifNotProduction(
env,
new WebpackBuildNotifierPlugin({
title: 'Webpack',
})
),
new VueLoaderPlugin(),
new WebpackForceReloadPlugin({
devServer: function() {
return globalDevServer;
},
cwd: __dirname,
files: 'src/markup/templates/**/*'
}),
],
entry: {
app: [
'./src/scripts/main.js',
//'./src/scripts/app.coffee',
],
},
output: {
filename: 'assets/[name].[contenthash].js',
chunkFilename: 'assets/[name].[contenthash].js',
path: path.resolve(__dirname, 'static'),
publicPath: '/static/',
clean: true,
},
resolve: {
alias: {
'vue$': 'vue/dist/vue.esm-bundler',
'markup-elements': path.resolve(__dirname, 'src/markup/elements'),
'markup-actions': path.resolve(__dirname, 'src/markup/actions'),
},
},
devtool: false,
devServer: {
setupMiddlewares: (middlewares, devServer) => {
globalDevServer = devServer;
return middlewares;
},
port: 3200,
host: '0.0.0.0',
devMiddleware: {
writeToDisk: true,
},
},
optimization: {
splitChunks: {
chunks: 'all',
cacheGroups: {
styles: {
name: "styles",
type: "css/mini-extract",
test: /\.css$/,
chunks: "all",
enforce: true,
},
},
},
},
}
}