const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const CleanWebpackPlugin = require('clean-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const TerserPlugin = require('terser-webpack-plugin'); const webpack = require('webpack'); const path = require('path'); const ROOT_PATH = path.resolve(__dirname); const APP_PATH = path.resolve(ROOT_PATH, 'src'); const NODE_MODULES_PATH = path.resolve(ROOT_PATH, 'node_modules'); const ENTRY_FILE = path.resolve(APP_PATH, 'index'); const TEMPLATE_FILE = path.resolve(APP_PATH, 'index.html'); const BUILD_PATH = path.resolve(ROOT_PATH, './static'); const staticFiles = { mode: 'production', entry: { app: ENTRY_FILE, vendor: [ "angular", '@uirouter/angularjs' ] }, output: { path: BUILD_PATH, filename: 'js/[name].[hash:8].js', chunkFilename: 'js/[name].[chunkhash:8].js' }, module: { rules: [ { test: /\.html$/, use: { loader: 'html-loader', options: { exportAsEs6Default: true, minimize: true, removeComments: true } } }, { test: /\.css$/, exclude: NODE_MODULES_PATH, use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader'], include: APP_PATH }, { test: /\.less$/, use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader', 'less-loader'], }, { test: /\.scss$/, exclude: NODE_MODULES_PATH, use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader', 'sass-loader'], include: APP_PATH }, { test: /\.(eot|woff|ttf|woff2)(\?|$)/, exclude: NODE_MODULES_PATH, use: { loader: 'file-loader', options: { name: '[name].[ext]' } }, include: APP_PATH }, { test: /\.(png|jpg|gif|svg)$/, exclude: NODE_MODULES_PATH, use: { loader: 'url-loader', options: { limit: 8192, name: 'images/[name].[hash:8].[ext]' } }, include: APP_PATH }, { test: /\.ts$/, exclude: NODE_MODULES_PATH, use: 'ts-loader', include: APP_PATH } ] }, plugins: [ new webpack.DefinePlugin({ 'process.env': { NODE_ENV: JSON.stringify('production') } }), new HtmlWebpackPlugin({ filename: path.resolve(BUILD_PATH, 'index.html'), template: TEMPLATE_FILE, hash: false, }), new CleanWebpackPlugin(['./static'], { root: path.resolve(__dirname, './'), verbose: true }), new MiniCssExtractPlugin({ filename: 'css/[name].css?v=[contenthash:8]' }) ], optimization: { splitChunks: { cacheGroups: { common: { chunks: 'all', minChunks: 2, maxInitialRequests: 5, minSize: 0, name: 'common' }, vendor: { test: /node_modules/, chunks: 'all', name: 'vendor', priority: 10, enforce: true, minChunks: 2 } } } }, resolve: { extensions: ['.js', '.ts', '.less', '.scss', '.css'], alias: { '@': APP_PATH, } } }; const plugin = { target: "node", mode: 'production', entry: path.resolve(__dirname, 'Plugin.ts'), output: { path: path.resolve(__dirname, 'static'), filename: 'Plugin.js', libraryTarget: "commonjs2", }, module: { rules: [ { test: /\.ts$/, exclude: path.resolve(__dirname, 'node_modules'), use: 'ts-loader', } ] }, optimization: { minimizer: [new TerserPlugin({ cache: true, parallel: true, terserOptions:{ mangle: false, keep_classnames: true } })], splitChunks: { cacheGroups: { common: { chunks: 'all', minChunks: 2, maxInitialRequests: 5, minSize: 0, name: 'common' }, vendor: { test: /node_modules/, chunks: 'all', name: 'vendor', priority: 10, enforce: true, minChunks: 2 } } } }, resolve: { extensions: ['.ts', '.js'], } } module.exports = [ Object.assign({}, staticFiles), Object.assign({}, plugin), ];