"use strict";
const path = require("path");
const utils = require("./utils");
const config = require("../config");
var webpack = require("webpack");
const { VueLoaderPlugin } = require("vue-loader");
const vueLoaderConfig = require("./vue-loader.conf");
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;

function resolve(dir) {
    return path.join(__dirname, "..", dir);
}

module.exports = {
    context: path.resolve(__dirname, "../"),
    entry: {
        app: ["babel-polyfill", "./src/main.js"]
    },
    output: {
        path: config.build.assetsRoot,
        filename: "[name].js",
        publicPath: process.env.NODE_ENV === "production" ? config.build.assetsPublicPath : config.dev.assetsPublicPath
    },
    resolve: {
        extensions: [".js", ".vue", ".json"],
        alias: {
            vue$: "vue/dist/vue.esm.js", //包含编译，demo的时候使用
            "@": resolve("src"),
            "@@": resolve("src/components/base"),
            "@srcPath": resolve('node_modules/ui-jz-v4-common/src'),
            "@uiSrcPath": resolve('node_modules/ui-component-v4/src'),
        }
    },
    module: {
        rules: [
            {
                test: /\.vue$/,
                loader: "vue-loader",
                options: vueLoaderConfig
            },
            {
                test: /\.js$/,
                loader: "babel-loader",
                // exclude: /node_modules/
                include: [
                    resolve("src"),
                    resolve("test"),
                    resolve("node_modules/ui-jz-v4-common"),
                    resolve("node_modules/webpack-dev-server/client")
                ]
            },
            {
                test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
                loader: "url-loader",
                options: {
                    limit: 10000,
                    name: utils.assetsPath("img/[name].[hash:7].[ext]")
                }
            },
            {
                test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
                loader: "url-loader",
                options: {
                    limit: 10000,
                    name: utils.assetsPath("media/[name].[hash:7].[ext]")
                }
            },
            {
                test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
                loader: "url-loader",
                options: {
                    limit: 10000,
                    name: utils.assetsPath("fonts/[name].[hash:7].[ext]")
                }
            },
            {
                test: /\.(txt|htm)$/,
                loader: "raw-loader"
            }
        ]
    },
    optimization: {
        splitChunks: {
            cacheGroups: {
                commons: {
                    // 抽离自己写的公共代码
                    chunks: "async", // async针对异步加载的chunk做切割，initial针对初始chunk，all针对所有chunk。
                    name: "common", // 打包后的文件名，任意命名
                    minChunks: 2, //最小引用2次
                    minSize: 10000 // 只要超出30000字节就生成一个新包
                },
                vendor: {
                    // 抽离第三方插件
                    test: /[\\/]node_modules[\\/]/, // 指定是node_modules下的第三方包
                    chunks: "initial",
                    name: "vendor", // 打包后的文件名，任意命名
                    priority: 10 // 设置优先级，防止和自定义的公共代码提取时被覆盖，不进行打包
                }
            }
        }
        // runtimeChunk: true     // 持久缓存moduleID,ChunkID需要HashedModuleIdsPlugin等插件解决
    },
    node: {
        // prevent webpack from injecting useless setImmediate polyfill because Vue
        // source contains it (although only uses it if it's native).
        setImmediate: false,
        // prevent webpack from injecting mocks to Node native modules
        // that does not make sense for the client
        dgram: "empty",
        fs: "empty",
        net: "empty",
        tls: "empty",
        child_process: "empty"
    },
    plugins: [
        new VueLoaderPlugin(),
        new webpack.ProvidePlugin({
            $: "jquery",
            jQuery: "jquery"
        })
        //是否启用代码依赖分析
        // new BundleAnalyzerPlugin()
    ]
};
