|
@@ -0,0 +1,136 @@
|
|
|
|
+
|
|
|
|
+const path = require('path')
|
|
|
|
+const webpack = require('webpack')
|
|
|
|
+const HtmlWebpackPlugin = require('html-webpack-plugin')
|
|
|
|
+const config = require('../config')
|
|
|
|
+const VueLoaderPlugin = require('vue-loader/lib/plugin')
|
|
|
|
+const MiniCssExtractPlugin = require('mini-css-extract-plugin')
|
|
|
|
+const TerserPlugin = require('terser-webpack-plugin')
|
|
|
|
+const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin')
|
|
|
|
+
|
|
|
|
+module.exports = {
|
|
|
|
+ mode: 'production',
|
|
|
|
+ entry: path.resolve(__dirname, '../../src/index.js'),
|
|
|
|
+ output: {
|
|
|
|
+ path: path.resolve(__dirname, '../../dist'),
|
|
|
|
+ filename: 'assets/scripts/[name].[chunkhash:8].js',
|
|
|
|
+ publicPath: config.prod.publicPath,
|
|
|
|
+ },
|
|
|
|
+ module: {
|
|
|
|
+ rules: [
|
|
|
|
+ {
|
|
|
|
+ test: /\.css$/i,
|
|
|
|
+ use: [
|
|
|
|
+ MiniCssExtractPlugin.loader,
|
|
|
|
+ {
|
|
|
|
+ loader: 'css-loader',
|
|
|
|
+ options: {
|
|
|
|
+ importLoaders: 1,
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ 'postcss-loader',
|
|
|
|
+ ],
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ test: /\.s[ac]ss$/i,
|
|
|
|
+ use: [
|
|
|
|
+ MiniCssExtractPlugin.loader,
|
|
|
|
+ {
|
|
|
|
+ loader: 'css-loader',
|
|
|
|
+ options: {
|
|
|
|
+ importLoaders: 2,
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ 'postcss-loader',
|
|
|
|
+ 'sass-loader',
|
|
|
|
+ ],
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ test: /\.(png|jpe?g|gif|svg)$/i,
|
|
|
|
+ loader: 'file-loader',
|
|
|
|
+ options: {
|
|
|
|
+ name: 'assets/images/[name].[contenthash:8].[ext]',
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ test: /\.js$/,
|
|
|
|
+ enforce: 'pre',
|
|
|
|
+ exclude: /node_modules/,
|
|
|
|
+ loader: 'eslint-loader',
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ test: /\.js$/,
|
|
|
|
+ exclude: /node_modules/,
|
|
|
|
+ loader: 'babel-loader',
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ test: /\.vue$/,
|
|
|
|
+ loader: 'vue-loader',
|
|
|
|
+ },
|
|
|
|
+ ],
|
|
|
|
+ },
|
|
|
|
+ optimization: {
|
|
|
|
+ minimize: true,
|
|
|
|
+ minimizer: [
|
|
|
|
+ new TerserPlugin({
|
|
|
|
+ terserOptions: {
|
|
|
|
+ parse: {
|
|
|
|
+ ecma: 8,
|
|
|
|
+ },
|
|
|
|
+ compress: {
|
|
|
|
+ drop_console: true,
|
|
|
|
+ },
|
|
|
|
+ mangle: {
|
|
|
|
+ safari10: true,
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ cache: true,
|
|
|
|
+ parallel: true,
|
|
|
|
+ }),
|
|
|
|
+ new OptimizeCSSAssetsPlugin(),
|
|
|
|
+ ],
|
|
|
|
+ splitChunks: {
|
|
|
|
+ chunks: 'all',
|
|
|
|
+ maxSize: 224000,
|
|
|
|
+ cacheGroups: {
|
|
|
|
+ vendors: {
|
|
|
|
+ test: /[\\/]node_modules[\\/]/,
|
|
|
|
+ name: 'vendors',
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ externals: {
|
|
|
|
+ vue: 'Vue',
|
|
|
|
+ },
|
|
|
|
+ resolve: {
|
|
|
|
+ extensions: [
|
|
|
|
+ '.js',
|
|
|
|
+ '.vue',
|
|
|
|
+ ],
|
|
|
|
+ alias: {
|
|
|
|
+ '@': path.resolve(__dirname, '../../src'),
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ devtool: 'inline-source-map',
|
|
|
|
+ plugins: [
|
|
|
|
+ new HtmlWebpackPlugin({
|
|
|
|
+ template: config.template,
|
|
|
|
+ inject: true,
|
|
|
|
+ minify: {
|
|
|
|
+ collapseWhitespace: true,
|
|
|
|
+ removeAttributeQuotes: true,
|
|
|
|
+ removeComments: true,
|
|
|
|
+ },
|
|
|
|
+ }),
|
|
|
|
+ new VueLoaderPlugin(),
|
|
|
|
+ new webpack.HashedModuleIdsPlugin(),
|
|
|
|
+ new webpack.DefinePlugin({
|
|
|
|
+ 'process.env': config.prod.env,
|
|
|
|
+ }),
|
|
|
|
+ new MiniCssExtractPlugin({
|
|
|
|
+ filename: 'assets/styles/[name].[contenthash:8].css',
|
|
|
|
+ chunkFilename: 'assets/styles/[name].[contenthash:8].chunk.css',
|
|
|
|
+ }),
|
|
|
|
+ ],
|
|
|
|
+}
|