美文网首页
Vue vue.config.js

Vue vue.config.js

作者: Cherry丶小丸子 | 来源:发表于2021-07-05 10:11 被阅读0次
const path = require('path');
const resolve = dir => path.join(__dirname, dir);
const webpack = require('webpack');
const Timestamp = new Date().getTime();
const CompressionPlugin = require('compression-webpack-plugin');

module.exports = {
    /* 从 Vue CLI 3.3 起已弃用,请使用publicPath */
    /* baseUrl: process.env.NODE_ENV === 'production' ? './' : '/', */
    
    /* 部署生产环境和开发环境下的URL:可对当前环境进行区分 默认值:'/' */
    publicPath: process.env.NODE_ENV === 'development' ? '/' : './',
    /* 当运行 npm run build 时生成的生产环境构建文件的目录 */
    // outputDir: 'dist',
    outputDir: process.env.outputDir,
    /* 放置生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir 的) 目录 */
    assetsDir: 'assets',
    /* 指定生成的 index.html 的输出路径 (相对于 outputDir)。也可以是一个绝对路径 */
    indexPath: 'index.html',
    /* 默认情况下,生成的静态资源在它们的文件名中包含了 hash 以便更好的控制缓存,你可以通过将这个选项设为 false 来关闭文件名哈希。(false 的时候就是让原来的文件名不改变) */
    filenameHashing: false,
    /* 用于多页配置,默认是 undefined */
    pages: {
        index: {
            /* page 的入口文件 */
            entry: 'src/main.js',
            /* 模版文件(模板来源) */
            template: 'public/index.html',
            /* 输出文件(在 dist/index.html 的输出) */
            filename: 'index.html',
            /* 当使用 title 选项时,template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title> */
            title: 'Index Page',
            /* 在这个页面中包含的块,默认情况下会包含提取出来的通用 chunk 和 vendor chunk */
            chunks: ['chunk-vendors', 'chunk-common', 'index']
        },
        /* 当使用只有入口的字符串格式时,模板会被推导为 `public/subpage.html`,并且如果找不到的话,就回退到 `public/index.html`,输出文件名会被推导为 `subpage.html` */
        // subpage: 'src/main.js'
    },
    /* 是否在开发环境下通过 eslint-loader 在每次保存时 lint 代码 */
    lintOnSave: true,
    /* 是否使用包含运行时编译器的 Vue 构建版本 */
    runtimeCompiler: false,
    /* 通过 Babel 显式转译 node_modules 中的一个依赖 */
    transpileDependencies: [],
    /* 是否在构建生产包时生成 sourceMap 文件,false 将提高构建速度 */
    productionSourceMap: false,
    /* 设置生成的 HTML 中 <link rel="stylesheet"> 和 <script> 标签的 crossorigin 属性 */
    // crossorigin: 'undefined',
    /* 在生成的 HTML 中的 <link rel="stylesheet"> 和 <script> 标签上启用 Subresource Integrity (SRI)。如果你构建后的文件是部署在 CDN 上的,启用该选项可以提供额外的安全性 */
    integrity: false,
    /* 调整内部的 webpack 配置 */
    /* configureWebpack: {
        plugins: [
            new webpack.ProvidePlugin({
                jQuery: 'jquery',
                $: 'jquery',
                'windows.jQuery': 'jquery'
            })
        ],
        // 打包编译后修改 js 文件名
        output: {
            filename: `assets/js/[name].${process.env.VUE_APP_Version}.${Timestamp}.js`,
            chunkFilename: `assets/js/[name].${process.env.VUE_APP_Version}.${Timestamp}.js`
        }
    }, */
    configureWebpack: config => {
        /* 引入 jquery 插件 */
        config.plugins.push(new webpack.ProvidePlugin({
            jQuery: 'jquery',
            $: 'jquery',
            'windows.jQuery': 'jquery'
        }));

        /* gzip压缩 */
        config.plugins.push(new CompressionPlugin({
            test: /\.(js|css)?$/i, // 压缩文件类型
            filename: '[path].gz[query]', // 压缩后的文件名
            algorithm: 'gzip', // 使用 gzip 压缩
            minRatio: 0.8, // 压缩率小于 1 才会压缩
            threshold: 10240, // 对超过 10k 的数据压缩
            deleteOriginalAssets: false // 是否删除未压缩的文件(源文件),不建议开启
        }));

        // 打包编译后修改 js 文件名
        config.output.filename = `assets/js/[name].${Timestamp}.js`;
        config.output.chunkFilename = `assets/js/[name].${Timestamp}.js`;

        if(process.env.NODE_ENV === 'production'){
            /* 生产环境 */
            config.mode = 'production';
            // 配置如何展示性能提示
            config['performance'] = {
                hints: 'warning', // 打开/关闭提示
                "maxAssetSize": 250000, // 根据单个资源体积(单位: bytes),控制 webpack 何时生成性能提示
                "maxEntrypointSize": 250000, // 根据入口起点的最大体积(单位: bytes),控制 webpack 何时生成性能提示
                // 只给出 js 文件的性能提示
                assetFilter: function(assetFilename) {
                    return assetFilename.endsWith('.js');
                }
            }
        }else if(process.env.NODE_ENV === 'test'){
            /* 测试环境 */
            config.mode = 'none';
        }else{
            /* 开发环境 */
            config.mode = 'development';
        };
    },
    /* 对内部的 webpack 配置进行更细粒度的修改 */
    chainWebpack: config => {
        /* 自定义配置路径别名 */
        config.resolve.alias
            .set('@', resolve('src'))
            .set('@c', resolve('src/components'))

        /* 移除 prefetch 插件 */
        config.plugins.delete('prefetch')
    },
    /* css相关配置 */
    css: {
        /* 启用 CSS modules, 从 v4 起已弃用,请使用css.requireModuleExtension, 在 v3 中,这个选项含义与 css.requireModuleExtension 相反*/
        // modules: false,
        /* 默认情况下,只有 *.module.[ext] 结尾的文件才会被视作 CSS Modules 模块
        设置为 false 后你就可以去掉文件名中的 .module 并将所有的 *.(css|scss|sass|less|styl(us)?) 文件视为 CSS Modules 模块 */
        // requireModuleExtension: false,
        /* 是否使用 css 分离插件 */
        // extract: true,
        extract: {
            // 打包编译后修改 css 文件名
            filename: `assets/css/[name].${Timestamp}.css`,
            chunkFilename: `assets/css/[name].${Timestamp}.css`
        },
        /* 是否为 CSS 开启 source map */
        sourceMap: true,
        /* 向 CSS 相关的 loader 传递选项 */
        loaderOptions: {
            // css: {
            //  /* 这里的选项会传递给 css-loader */
            // },
            // postcss: {
            //  /* 这里的选项会传递给 postcss-loader */
            // },
            // sass: {
            //  /* 这里的选项会传递给 sass-loader */
            // },
            // scss: {
            //  /* 这里的选项会传递给 scss-loader */
            //  /* 另外,也可以使用 scss 选项,针对 scss 语法进行单独配置(区别于 sass 语法) */
            // },
            // less: {
            //  /* 这里的选项会传递给 less-loader */
            // },
            // stylus: {
            //  /* 这里的选项会传递给 stylus-loader */
            // }
        }
    },
    /* webpack-dev-server 相关配置 */
    devServer: {
        /* 自动打开浏览器 */
        open: true,
        /* 指定打开浏览器时要浏览的页面 */
        /* openPage: '/different/page', */
        /* 设置为0.0.0.0则所有的地址均能访问 */
        host: '0.0.0.0',
        /* 指定端口号 */
        port: 8080,
        /* 是否使用协议https */
        https: false,
        /* 是否开启热更新 */
        hotOnly: false,
        /* 是否要显示警告和错误 */
        overlay: {
            warnings: true,
            errors: true
        },
        /* 使用代理 */
        /* proxy: 'http://v.juhe.cn', */
        
        /* '/api' : {}, 就是告诉node, 我接口只要是'/api'开头的才用代理, 所以你的接口就要这么写 /api/xx/xx
        最后代理的路径就是 http://xxx.xx.com/api/xx/xx
        可是不对啊, 我正确的接口路径里面没有 /api 啊. 所以就需要 pathRewrite, 用'^/api' : '', 把'/api'去掉, 
        这样既能有正确标识, 又能在请求接口的时候去掉api */
        proxy: {
            '/api': {
                /* 目标代理服务器地址 */
                target: process.env.VUE_APP_URL,
                /* WebSocket */
                ws: true,
                /* 允许跨域 */
                changeOrigin: true,
                /* 路径重写 */
                pathRewrite: {
                    '^/api' : ''
                }
            }
        },
        before: app => {}
    },
    /* 是否为 Babel 或 TypeScript 使用 thread-loader, 该选项在系统的 CPU 有多于一个内核时自动启用,仅作用于生产构建 */
    parallel: require('os').cpus().length > 1,
    /* 向 PWA 插件传递选项 */
    pwa: {},
    /* 传递任何第三方插件选项 */
    pluginOptions: {}
}

相关文章

网友评论

      本文标题:Vue vue.config.js

      本文链接:https://www.haomeiwen.com/subject/mrcyultx.html