'use strict' const { VueLoaderPlugin } = require('vue-loader-3') const htmlWebpackPlugin = require('html-webpack-plugin') const MiniCssExtractPlugin = require('mini-css-extract-plugin') const { CleanWebpackPlugin } = require('clean-webpack-plugin') module.exports = { entry: { main: ['@babel/polyfill', `${process.cwd()}/src/main.ts`] }, output: { filename: '[name].[contenthash:8].js', path: `${process.cwd()}/app/scripts`, chunkFilename: '[name].[contenthash:8].js', publicPath: './scripts' }, module: { rules: [ { test: /\.js$/, exclude: [/node_modules/, /app/], use: { loader: 'babel-loader' } }, { test: /\.vue$/, loader: 'vue-loader-3' }, { test: /.ts$/, use: [ { loader: 'ts-loader', options: { appendTsSuffixTo: [/.vue$/] } } ] }, { test: /\.(css|scss)$/, use: ['style-loader', 'css-loader'] }, { test: /\.(eot|ttf|woff|woff2)(\?\S*)?$/, loader: 'file-loader' }, { test: /\.(png|jpe?g|gif|webm|mp4|svg)$/, loader: 'file-loader', options: { name: '[name][contenthash:8].[ext]', outputPath: '/assets/img', esModule: false } } ] }, resolve: { extensions: ['', '.js', '.jsx', '.ts', '.tsx'], fallback: { stream: false } }, plugins: [ new VueLoaderPlugin(), new CleanWebpackPlugin(), new MiniCssExtractPlugin({ filename: '[name].[contenthash:8].css', chunkFilename: '[name].[contenthash:8].css' }), new htmlWebpackPlugin({ template: `${process.cwd()}/public/index.html`, filename: `${process.cwd()}/app/index.html` }) ], optimization: { moduleIds: 'deterministic', runtimeChunk: 'single', splitChunks: { cacheGroups: { vendor: { test: /[\\/]node_modules[\\/]/, name: 'vendors', priority: -10, chunks: 'all' } } } } }