require("dotenv").config(); const HtmlWebpackPlugin = require('html-webpack-plugin'); const {CleanWebpackPlugin} = require('clean-webpack-plugin'); // const CopyWebpackPlugin = require("copy-webpack-plugin"); const TerserPlugin = require("terser-webpack-plugin"); const webpack = require('webpack'); const path = require("path"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); // const WorkboxPlugin = require('workbox-webpack-plugin'); let mode = (process.env.MODE || "development"); let moduleExports = { //Development oder production, wird oben durch Variable angegeben (damit später per IF überprüft) mode: mode, //Beinhaltet den JS-Startpunkt und SCSS-Startpunkt entry: [ __dirname + "/src/client/js/index.ts", __dirname + "/src/client/sass/index.scss" ], // devtool: 'inline-source-map', //Gibt Ausgabename und Ort für JS-File an output: { path: path.resolve(__dirname, 'dist'), filename: "bundle.js" }, resolve: { extensions: [".ts", ".js", ".mjs", ".json", "png"] }, optimization: { // minimize: false minimizer: [ new TerserPlugin({ cache: true, parallel: true, sourceMap: true, // Must be set to true if using source-maps in production terserOptions: { mangle: { reserved: [] } } }) ] }, plugins: [ //Delete www before every Build (to only have nessesary files) new CleanWebpackPlugin({cleanOnceBeforeBuildPatterns: ['**/*', '!**/.gitkeep']}), // new WorkboxPlugin.GenerateSW({ // maximumFileSizeToCacheInBytes: 1024 * 1024 * 1024 * 5 // }), //Erstellt (kopiert) die Index.html new HtmlWebpackPlugin({ // template: '!!html-loader!src/client/index.html' template: 'src/client/index.html' }), new webpack.DefinePlugin({}), new MiniCssExtractPlugin(), ], module: { //Regeln: Wenn Regex zutrifft => führe Loader (in UMGEKEHRTER) Reihenfolge aus rules: [ { //Kopiert HTML-Dateien in www. Nur die Dateien, welche im JS angefragt werden test: /\.html$/, use: [ // { // loader: 'file-loader', // options: { // name: '[name].[ext]', // outputPath: 'html' // } // }, // { // loader: 'extract-loader' // }, { loader: 'html-loader', options: { //Sorgt dafür, dass Child-Views funktionieren attributes: { list: [ // { // "attribute": "data-view", // "type": "src" // }, { "attribute": "src", "type": "src" }, { "attribute": "href", "tag": "link", "type": "src" }, ], } } } ], }, { test: /\.tsx?$/, use: ["ts-loader"], }, { //Kopiert nur benutzte Bilder/Videos/Sound (benutzt durch JS (import), html oder css/sass) test: /(img|video|sound)[\\\/]/, use: [ { loader: 'file-loader', options: { name: (resourcePath, resourceQuery) => { // console.log("path", resourcePath); // console.log("query", resourceQuery); return "[name].[ext]" }, outputPath: 'img', publicPath: (url, resourcePath, context) => { // console.log("url: ", url); // console.log("resourcePath: ", resourcePath); // console.log("context: ", context); return "/img/" + url; }, // useRelativePath: false } }, ], }, { //Compiliert SASS zu CSS und speichert es in Datei test: /\.scss$/, use: [ // { // loader: 'file-loader', // options: { // name: '[name].css', // outputPath: 'css', // // publicPath: '/css' // } // }, // { // loader: 'extract-loader' // }, { loader: MiniCssExtractPlugin.loader, }, { loader: 'css-loader' }, { //Compiliert zu CSS loader: 'sass-loader' } ] } ] } }; //Auslagerung von zeitintensiven Sachen in production only, damit Debugging schneller geht if (mode === "production" && false) { //Polyfills hinzufügen moduleExports["entry"].unshift("@babel/polyfill"); // moduleExports["devtool"] = "source-map"; //Transpilieren zu ES5 moduleExports["module"]["rules"].push({ test: /\.m?js$/, exclude: /node_modules\/(?!(cordova-sites|js-helper|cs-event-manager|polygon-geometry))/, use: { loader: 'babel-loader', options: { presets: ['@babel/preset-env'], } } }); moduleExports["module"]["rules"][1]["use"].unshift({ loader: 'babel-loader', options: { presets: ['@babel/preset-env'], inputSourceMap: "inline", sourceMaps: true } }); //Hinzufügen von POSTCSS und Autoprefixer für alte css-Präfixe moduleExports["module"]["rules"][3]["use"].splice(3, 0, { //PostCSS ist nicht wichtig, autoprefixer schon. Fügt Präfixes hinzu (Bsp.: -webkit), wo diese benötigt werden loader: 'postcss-loader', options: { plugins: [require('autoprefixer')()] } }); // moduleExports["optimization"] = { // minimize: false, // // minimizer: [new UglifyJsPlugin({ // // include: /\.min\.js$/ // // })] // } } module.exports = moduleExports;