- 'use strict';
- const glob = require('glob');
- const path = require('path');
- const CleanWebpackPlugin = require('clean-webpack-plugin');
- const HtmlWebpackInlineSourcePlugin = require('html-webpack-inline-source-plugin');
- const HtmlWebpackPlugin = require('html-webpack-plugin');
- const ImageminPlugin = require('imagemin-webpack-plugin').default;
- const MiniCssExtractPlugin = require('mini-css-extract-plugin');
-
- module.exports = function(env, argv) {
- env = env || {};
- const production = !!env.production;
- const optimizeImages = production || !!env.optimizeImages;
-
- const clean = [];
- if (optimizeImages) {
- console.log('Optimizing images (src/ui/images/settings/*.png)...');
- clean.push('images/settings');
- }
-
- const plugins = [
- new CleanWebpackPlugin(clean),
- new MiniCssExtractPlugin({
- filename: '[name].css'
- }),
- new HtmlWebpackPlugin({
- excludeAssets: [/.*\.main\.js/],
- excludeChunks: ['welcome'],
- template: 'settings/index.html',
- filename: path.resolve(__dirname, 'settings.html'),
- inject: true,
- inlineSource: production ? '.(js|css)$' : undefined,
- // inlineSource: '.(js|css)$',
- minify: production
- ? {
- removeComments: true,
- collapseWhitespace: true,
- removeRedundantAttributes: true,
- useShortDoctype: true,
- removeEmptyAttributes: true,
- removeStyleLinkTypeAttributes: true,
- keepClosingSlash: true
- }
- : false
- }),
- new HtmlWebpackPlugin({
- excludeAssets: [/.*\.main\.js/],
- excludeChunks: ['settings'],
- template: 'welcome/index.html',
- filename: path.resolve(__dirname, 'welcome.html'),
- inject: true,
- inlineSource: production ? '.(js|css)$' : undefined,
- // inlineSource: '.(js|css)$',
- minify: production
- ? {
- removeComments: true,
- collapseWhitespace: true,
- removeRedundantAttributes: true,
- useShortDoctype: true,
- removeEmptyAttributes: true,
- removeStyleLinkTypeAttributes: true,
- keepClosingSlash: true
- }
- : false
- }),
- new HtmlWebpackInlineSourcePlugin(),
- new ImageminPlugin({
- disable: !optimizeImages,
- externalImages: {
- context: path.resolve(__dirname, 'src/ui/images'),
- sources: glob.sync('src/ui/images/settings/*.png'),
- destination: path.resolve(__dirname, 'images')
- },
- gifsicle: null,
- jpegtran: null,
- optipng: null,
- pngquant: {
- quality: '85-100',
- speed: production ? 1 : 10
- },
- svgo: null
- })
- ];
-
- return {
- context: path.resolve(__dirname, 'src/ui'),
- // This is ugly having main.scss on both bundles, but if it is added separately it will generate a js bundle :(
- entry: {
- settings: ['./settings/index.ts', './scss/main.scss'],
- welcome: ['./welcome/index.ts', './scss/main.scss']
- // main: ['./scss/main.scss']
- },
- mode: production ? 'production' : 'development',
- devtool: !production ? 'eval-source-map' : undefined,
- output: {
- filename: '[name].js',
- path: path.resolve(__dirname, 'out/ui'),
- publicPath: '{{root}}/out/ui/'
- },
- optimization: {
- splitChunks: {
- cacheGroups: {
- styles: {
- name: 'styles',
- test: /\.css$/,
- chunks: 'all',
- enforce: true
- }
- }
- }
- },
- resolve: {
- extensions: ['.tsx', '.ts', '.js'],
- modules: [path.resolve(__dirname, 'src/ui'), 'node_modules']
- },
- module: {
- rules: [
- {
- test: /\.tsx?$/,
- use: {
- loader: 'ts-loader',
- options: {
- configFile: 'ui.tsconfig.json'
- }
- },
- exclude: /node_modules/
- },
- {
- test: /\.scss$/,
- use: [
- {
- loader: MiniCssExtractPlugin.loader
- },
- {
- loader: 'css-loader',
- options: {
- minimize: production,
- sourceMap: !production,
- url: false
- }
- },
- {
- loader: 'sass-loader',
- options: {
- sourceMap: !production
- }
- }
- ],
- exclude: /node_modules/
- }
- ]
- },
- plugins: plugins
- };
- };
|