const path = require('path');
// const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin');
const CompressionWebpackPlugin = require('compression-webpack-plugin')

function resolve(dir) {
    // path.join路径拼接函数。 __dirname是node.js内置全局变量，值为当前文件所在的绝对路径
    return path.join(__dirname, dir)
}

// https://cli.vuejs.org/zh/config/#%E5%85%A8%E5%B1%80-cli-%E9%85%8D%E7%BD%AE

module.exports = {
    // 默认为'/'。基本路径
    publicPath: '/manageWeb/', //

    // 默认为'dist'。输出文件目录
    outputDir: 'dist',

    // 默认为''。放置生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir 的) 目录。
    assetsDir: '',

    // 默认为'index.html'。指定生成的 index.html 的输出路径 (相对于 outputDir)。也可以是一个绝对路径。
    indexPath: 'index.html',

    // 默认为true。生成的静态资源带有hash，便于控制缓存
    filenameHashing: true,

    // 在 multi-page 模式下构建应用。每个“page”应该有一个对应的 JavaScript 入口文件。
    // 其值应该是一个对象，对象的 key 是入口的名字，
    // pages: {
    //     index: {
    //         // page 的入口
    //         entry: 'src/main.js',
    //         // 模板来源
    //         template: 'public/index.html',
    //         // 在 dist/index.html 的输出
    //         filename: 'index.html'
    //     },
    //     // 当使用只有入口的字符串格式时，模板会被推导为 `public/subpage.html`
    //     // 并且如果找不到的话，就回退到 `public/index.html`。输出文件名会被推导为 `subpage.html`。
    //     // subpage: 'src/subpage/main.js'
    // },

    // 默认为true。eslint-loader 是否在保存的时候检查
    lintOnSave: false,

    // 默认为false。是否使用包含运行时编译器的Vue核心的构建。
    runtimeCompiler: false,

    // 默认true。生产环境是否生成 sourceMap 文件。可以将其设置为 false 以加速生产环境构建
    productionSourceMap: process.env.NODE_ENV === 'development',

    // 默认undefined。设置生成的 HTML 中 <link rel="stylesheet"> 和 <script> 标签的 crossorigin 属性。可选有 'anonymous'、'use-credentials'
    // crossorigin: 'anonymous',

    // webpack配置
    configureWebpack: {
        // provide the app's title in webpack's name field, so that
        // it can be accessed in index.html to inject the correct title.
        name: 'title',
        resolve: {
            alias: {
                '@': resolve('src')
            }
        },
        plugins: [
            new OptimizeCSSPlugin(),
            new CompressionWebpackPlugin({
                algorithm: 'gzip', // 算法 gzip
                test: new RegExp( // 压缩文件匹配
                    '\\.(js|css)$'
                ),
                threshold: 10240, // 文件大小于10K的不进行压缩
                // deleteOriginalAssets:true, //删除源文件，不建议
                minRatio: 0.8 // 最小压缩比例，压缩比大于0.8的不进行压缩
            }),
            // new BundleAnalyzerPlugin()
        ]
    },

    // webpack配置
    chainWebpack: config => {
        // set svg-sprite-loader
        config.module
            .rule('svg')
            .exclude.add(resolve('src/icons'))
            .end();
        config.module
            .rule('icons')
            .test(/\.svg$/)
            .include.add(resolve('src/icons'))
            .end()
            .use('svg-sprite-loader')
            .loader('svg-sprite-loader')
            .options({
                symbolId: 'icon-[name]'
            })
            .end();
        config
            .when(process.env.NODE_ENV !== 'development',
                config => {
                    config
                        .plugin('ScriptExtHtmlWebpackPlugin')
                        .after('html')
                        .use('script-ext-html-webpack-plugin', [{
                            // `runtime` must same as runtimeChunk name. default is `runtime`
                            inline: /runtime\..*\.js$/
                        }])
                        .end()
                    config.optimization.splitChunks({
                        chunks: 'all', // all 全部   async 异步    initial 初始
                        minSize: 30000, // 代码块的最小尺寸
                        minChunks: 1, // 在分割之前模块的被引用次数
                        maxAsyncRequests: 5, // 按需加载最大并行请求数量
                        maxInitialRequests: 3, // 一个入口的最大并行请求数量
                        cacheGroups: {
                            libs: {
                                name: 'chunk-libs',
                                test: /[\\/]node_modules[\\/]/,
                                priority: 10,
                                chunks: 'initial' // only package third parties that are initially dependent
                            },
                            aws: {
                                name: 'chunk-aws', // split aws into a single package
                                priority: 11, // the weight needs to be larger than libs and app or it will be packaged into libs or app
                                test: /[\\/]node_modules[\\/]_?aws(.*)/ // in order to adapt to cnpm
                            },
                            oss: {
                                name: 'chunk-oss', // split aws into a single package
                                priority: 12, // the weight needs to be larger than libs and app or it will be packaged into libs or app
                                test: /[\\/]node_modules[\\/]_?ali-oss(.*)/ // in order to adapt to cnpm
                            },
                            elementUI: {
                                name: 'chunk-elementUI', // split elementUI into a single package
                                priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
                                test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
                            },
                            commons: {
                                name: 'chunk-commons',
                                test: resolve('src/components'), // can customize your rules
                                minChunks: 3, //  minimum common number
                                priority: 15,
                                chunks: 'initial',
                                reuseExistingChunk: true
                            }
                        }
                    });
                    config.optimization.minimizer('terser').tap((args) => {
                        args[0].terserOptions.compress.drop_debugger = true;
                        args[0].terserOptions.compress.drop_console = true;
                        return args
                    });
                }
            )
    },

    // css相关配置
    css: {
        // 是否使用css分离插件 MiniCssExtractPlugin。Default: 生产环境下是 true，开发环境下是 false
        extract: process.env.NODE_ENV !== 'development',
        // 默认为false。是否为 CSS 开启 source map。设置为 true 之后可能会影响构建的性能。
        sourceMap: process.env.NODE_ENV === 'development',
        // css预设器配置项
        loaderOptions: {
            less: { // 配置less（其他样式解析用法一致）
                javascriptEnabled: true // 设置为true
            },
            css: {
                // 这里的选项会传递给 css-loader
            },
            postcss: {
                // 这里的选项会传递给 postcss-loader
            },
            sass: {
                // 这里的选项会传递给 sass-loader
            }
        },
        // 启用 CSS modules 扩展名，只有 *.module.[ext] 结尾的文件才会被视作 CSS Modules 模块.
        requireModuleExtension: true
    },

    // webpack-dev-server 相关配置
    devServer: {
        open: false, // 配置自动启动浏览器
        host: '0.0.0.0',
        port: 8088,
        https: false,
        hotOnly: true,
        // assetsPublicPath: '/manageWeb',
        proxy: { // 设置代理
            // '/app': {
            //     target: 'http://localhost:8897/', // 设置你调用的接口域名和端口号 别忘了加http
            //     changeOrigin: true,
            //     ws: true,
            //     pathRewrite: {
            //         '^/app': ''//这里理解成用‘/app’代替target里面的地址，后面组件中我们调接口时直接用api代替域名及端口号
            //         // 比如要调用'https://a.com/user/add'，直接写‘/app/user/add’即可
            //     }
            // },
            '/request_patrol': {
                // target: 'https://www.jxydyw.cn/patrol-web',//线下
                target: 'https://www.zwywpt.top/patrol-web',//正式
                // target: 'http://localhost/patrol-web',
                // target: 'http://localhost:8899',
                changeOrigin: true,
                ws: true,
                pathRewrite: {
                    '^/request_patrol': ''
                }
            },
            '/excel': {
                // target: 'https://www.jxydyw.cn/patrol-web',//线下
                target: 'https://www.zwywpt.top/excel',//正式
                // target: 'http://localhost/patrol-web',
                // target: 'http://localhost:8899',
                changeOrigin: true,
                ws: true,
                pathRewrite: {
                    '^/excel': ''
                }
            },
        },
        //模拟数据开始
        before(app) {
            let list = [{
                "id": 1,
                "nickname": "张三",
                "phone": "18888888888",
                "gender": 1,
                "skillList": ["Java", "C", "Web"],
                "brief": "这里是很长的个人简介",
                "avatarUrl": "http://flyhigh.oss-cn-hangzhou.aliyuncs.com/app/0f599f511a14020680bdbd70c25afd40menu-logo.png",
                "createTime": 1588749798296
            }, {
                "id": 2,
                "nickname": "李四",
                "phone": "19999999999",
                "gender": 2,
                "skillList": ["小程序", "Android", "服务器"],
                "brief": "这里是很长的个人简介",
                "avatarUrl": "http://flyhigh.oss-cn-hangzhou.aliyuncs.com/app/0f599f511a14020680bdbd70c25afd40menu-logo.png",
                "createTime": 1588749798296
            }];

            // 管理员登录
            app.post('/admin/login', (req, res) => {
                res.json({
                    code: '0',
                    data: {
                        name: 'jason',
                        token: "48e0be394682447985e2858bc4b9decb-1",
                        permissions: ['element'],
                        username: "admin"
                    }
                })
            });
            // 获取数据列表
            app.get('/patrol/data/list', (req, res) => {
                let pageList = [];
                for (let i = (req.query.curPage - 1) * req.query.pageSize; i < list.length && i < req.query.curPage * req.query.pageSize; i++) {
                    pageList.push(list[i]);
                }
                res.json({
                    code: 1,
                    data: {
                        list: pageList,
                        totalCount: list.length
                    }
                })
            });
            // 根据id查询
            app.get('/patrol/data', (req, res) => {
                let resultList = list.filter(item => item.id === Number(req.query.id));
                res.json({
                    code: 1,
                    data: resultList.length > 0 ? resultList[0] : undefined
                })
            });

            // 获取数据列表
            app.get('/app/data/list', (req, res) => {
                let pageList = [];
                for (let i = (req.query.page - 1) * req.query.size; i < list.length && i < req.query.page * req.query.size; i++) {
                    pageList.push(list[i]);
                }
                res.json({
                    code: 200,
                    data: {
                        list: pageList,
                        total: list.length
                    }
                })
            });
            // 数据添加
            app.post('/app/data/add', (req, res) => {
                res.json({
                    code: 200,
                    data: req.query
                })
            });
            // 数据修改
            app.put('/data/update', (req, res) => {
                res.json({
                    code: 0
                })
            });
            // 数据删除
            app.delete('/app/data/delete', (req, res) => {
                let itemIndex = list.findIndex(item => item.id === parseInt(req.query.id));
                if (itemIndex >= 0) {
                    list.splice(itemIndex, 1);
                }
                res.json({
                    code: 200,
                })
            });
            // 搜索用户
            app.get('/app/user/search', (req, res) => {
                let resultList = list.filter(item => item.nickname.includes(req.query.keywords) || item.phone.includes(req.query.keywords))
                res.json({
                    code: 200,
                    data: resultList
                })
            });
        },
    },
    // 第三方插件配置
    pluginOptions: {},

    // PWA 插件相关配置
    pwa: {}
};
