vue2.0 关于 vue.config.js配置项详解

2023-10-30

const CompressionPlugin = require('compression-webpack-plugin')// 引入gzip压缩插件
const TerserPlugin = require('terser-webpack-plugin')// 代码打包之后取出console.log压缩代码

const path = require('path')
function resolve(dir) {
  return path.join(__dirname, dir) // path.join(__dirname)设置绝对路径
}

const isProduction = process.env.NODE_ENV === 'production' 
//为生产环境修改配置...process.env.NODE_ENV !== 'development'


module.exports = {

  outputDir: process.env.outputDir,//默认输出文件夹为dist,填入的名字为打包后的文件名

  /*
  devServer的作用
    如果你的前端应用和后端 API 服务器没有运行在同一个主机上,你需要在开发环境下将 API 请求代理到 API 服务器。这个问题可以通过 vue.config.js 中的 devServer.proxy 选项来配置。
    devServer.proxy 可以是一个指向开发环境 API 服务器的字符串:http://192.168.xx.153:11140
  */

  devServer: { // dev环境下,webpack-dev-server 相关配置
    host: '0.0.0.0',//开发运行时域名,设置成'0.0.0.0'//运行之后的ip可以写成127.0.0.1

    port: 81,
//开发运行时的端口可以写成 process.env.VUE_APP_port 获取到.env.development中的VUE_APP_port

    disableHostCheck: true,
    overlay: {
      warnings: true,
      errors: true,
    },

    proxy: {//代理设置
      // detail: https://cli.vuejs.org/config/#devserver-proxy
      '/api': {
        // target: 'http://192.168.xx.153:11140',
        changeOrigin: true, //表示是否改变原域名
        // pathRewrite: {
        //   '^/api': '',
        // },
      },
    },
  },

  lintOnSave: false,// 是否触发eslint检查
  filenameHashing: !isProduction, //判断是否需要添加hash值

  productionSourceMap: false, 
//打包后是否生成map文件,map文件能看到错误代码位置,设置为false不生成map文件,打包体积缩小

  css: {
    loaderOptions: {
      // 定义全局scss无需引入即可使用
      sass: {
        prependData: `
        @import "~@/styles/var-ext.scss";
        @import "~@/styles/mixin.scss";
        `,
      },
    },
  },

  /**
   * 
   * @param {chainWebpack} config 
   * 通过链式编程的形式,来修改默认的webpack配置
  */

  chainWebpack: (config) => {
    if (isProduction) {
      // config.plugins.delete('prefetch')
      // config.plugins.delete('preload')
      // config.optimization.splitChunks({ // 开启代码分割
      //   chunks: 'all'
      // })
      config.output.filename(`js/[name].[contenthash].js`).end()
      config.output.chunkFilename(`js/[name].[contenthash].js`).end()
      config.plugin('extract-css').tap((args) => [
        {
          filename: `css/[name].[contenthash].css`,
          chunkFilename: `css/[name].[contenthash].css`,
        },
      ])
    }

    /*
      设置别名alias
      webpack默认是将src的别名设置为@, 此外,我们可以进行添加
    */

    config.resolve.alias
      .set('@', resolve('./src'))
      .set('components', resolve('./src/components'))
    
    /*
    在webpack中 rules 是 module 的配置项,而所有的配置的都是挂载到 config 下的,所以新增一个rule方式:
    config.module
      .rule(name)
        .use(name)
          .loader(loader)
          .options(options)    
    */
    
    // md 配置
    config.module
      .rule('md')
      .test(/\.md/)
      .use('html-loader')
      .loader('html-loader')
      .end()
      .use('markdown-loader')
      .loader('markdown-loader')
      .end()
    
    //压缩svg图片
    config.module.rule('svg').exclude.add(resolve('src/assets/icons'))

    //压缩icons图标
    config.module
      .rule('icons')
      .test(/\.svg$/)
      .include.add(resolve('src/assets/icons'))
      .end() // add完上下问进入数组 使用end回退
      .use('svg-sprite-loader') // 添加loader
      .loader('svg-sprite-loader') // 切换上下文loader
      .options({ symbolId: 'icon-[name]' })// 参数配置
      .end()
    
    /**
      * rules的修改
      * 针对已经存在的 rule , 如果需要修改它的参数, 可以使用 tap 方法:
      * config.module
      *  .rule(name)
      *    .use(name)
      *      .tap(options => newOptions)
     */

    //压缩图片
    config.module
      .rule('images')
      .test(/\.(png|jpe?g|gif|webp)(\?.*)?$/)
      .use('url-loader') // `url-loader`是webpack默认已经配置的,现在我们来修改它的参数
      .loader('url-loader')
      .tap(options => {
        // 修改它的选项... 图片命名增加 hash 值,预防相同图片缓存和 不同目录下的同名文件相互覆盖问题
        options.fallback.options.name = 'img/[name].[hash:7].[ext]'
        options.limit = 1024
        // 这是字节(Byte)限制,1KB = 1024Byte ,当图片的大小小于 1KB ,则会被转为 base64格式,打包进js文件,大于1KB,则会被打包进 img 文件夹,供链接请求获取。
        return options
      })
  },

  /**
   * 
   * @param {configureWebpack} config 
   * 通过操作对象的形式,来修改默认的webpack配置,该对象将会被 webpack-merge 合并入最终的 webpack 配置
   */

  configureWebpack: (config) => {//configureWebpack函数形式
    if (isProduction) {
      return {
        externals: {},
        plugins: [
          // 开启 gzip 压缩
          new CompressionPlugin({
            test: /\.jpg$|\.png$|\.js$|\.html$|\.css$/, // 匹配文件名
            threshold: 2120, // 对超过 2k 的数据压缩
            deleteOriginalAssets: false, // 不删除源文件
          }),
          // 代码压缩去除console.log
          new TerserPlugin({
            parallel: true,
            sourceMap: false,
            terserOptions: {
              compress: {
                drop_debugger: true,
                drop_console: true,
              },
            },
          }),
        ],
      }
    }
  },
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue2.0 关于 vue.config.js配置项详解 的相关文章

随机推荐

  • Counterfactual Zero-Shot and Open-Set Visual Recognition

    Counterfactual Zero Shot and Open Set Visual Recognition 1 Introduction 文献提出一个反事实框架 是由对不可见类的泛化来支撑的 作者基于反事实的一致性规则 反事实确实是基
  • C++同步技术——Mutex相关 (转)

    进程的互斥运行 正常情况下 一个进程的运行一般是不会影响到其他正在运行的进程的 但是对于某些有特殊要求的如以独占方式使用串行口等硬件设备的程序就要求在其进程运行期间不允许其他试图使用此端口设备的程序运行的 而且此类程序通常也不允许运行同一个
  • 大数据技术面试-Flume、kafka

    大数据技术面试 Flume kafka 1 Flume组成有哪些 2 Flume拦截器有哪些知识点 3 Flume采集数据会丢失吗 4 FileChannel如何优化 5 如何控制Kafka丢不丢数据 6 Kafka分区分配策略默认哪两种
  • 【华为机试刷题笔记】HJ26-字符串排序

    题目描述 编写一个程序 将输入字符串中的字符按如下规则排序 规则 1 英文字母从 A 到 Z 排列 不区分大小写 如 输入 Type 输出 epTy 规则 2 同一个英文字母的大小写同时存在时 按照输入顺序排列 如 输入 BabA 输出 a
  • I.MX6U开发板交叉编译Qt项目(什么是交叉编译器;如何搭建Qt交叉编译环境;WinSCP将Windows中的文件传到Ubuntu中;如何将编译好的执行文件拷到开发板上)

    文章目录 1 关于嵌入式学习的一些思考 1 1 使用imx6 还是stm32mp 1 2 关于是否需要买板子 2 I MX6U开发板交叉编译Qt项目 2 1 什么是交叉编译器 2 2 安装交叉编译器 2 2 1 下载交叉编译器和资料 2 2
  • 用FLEX实现屏幕快照及下载 flex导出excel文件

    用FLEX实现屏幕快照及下载 Flex Flash Flex2 Flex3 GgNET 01月 31st 2008 2 53am 这种方式 在服务器端不会在磁盘上生成图片FLEX代码public function printMap void
  • 分析脚本搭建docker环境:python, R

    1 搭建Anaconda Python3 6 FROM nvidia cuda 8 0 cudnn6 devel ubuntu16 04 MAINTAINER Tyan
  • TP-Link-IPC使用rtsp推流

    文章目录 1 安装 2 使用 3 RTSP 1 安装 电源 WIFI 2 使用 扫码或官网下载APP 登录绑定查看IP 登录IE浏览器 输入账号密码默认admin 123456 3 RTSP 注意 通过RTSP可以取视频流 但不支持控制云台
  • Linux samba网络传输服务

    Linux samba网络传输服务 本文章适合的读者 Linux初 中级用户 开源软件爱好者 大中专院校的学生 社会培训学生 Linux下的开发人员 samba 使用smb协议的应用程序 主要用于文件共享 SMB service messa
  • 实验七-卷积编码的MATLAB实现

    信息论编码实验3 9连载 更多看专栏 实验七 卷积编码的MATLAB实现 一 卷积码原理介绍 1 1 基本概念 1 2 n k N 卷积编码 1 2 1 编码 1 2 2 译码 Viterbi 译码算法 二 代码展示及运行结果 2 1 2
  • Mybatis处理一对多关系时的性能考虑

    Mybatis对于处理一对多的情况有三种解决方案 查询的时候join子表 然后交由mybatis拼装 查询的时候不join子表 另外发起select去抓取子表数据 和第二种类似 只不过利用fetchType lazy来延缓抓取的时机 这三种
  • JWT——Token认证的两种实现和安全详解

    前言 最近因为项目中需要解决跨域取值的问题 所有考虑到用Token认证做技术支撑点 自己看了许多与之相关的文章 从中总结出了以下两个要点 签名和token时间 在说这两个要点之前先大概简单说一下与之有关的一些问题 首先 如果你对token认
  • 【IT之路】连接MySQL遇到ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passwor:yes)问题

    一般这个错误是由密码错误引起 解决的办法自然就是重置密码 假设我们使用的是root账户 1 重置密码的第一步就是跳过MySQL的密码认证过程 方法如下 vim etc my cnf 注 windows下修改的是my ini 在文档内搜索my
  • DenseNet网络详解及Pytorch实现

    DenseNet网络详解及Pytorch实现 DenseNet网络简介 DenseNet Densely Connected Convolutional Networks 是由Gao Huang等研究人员于2017年提出的一种深度神经网络架
  • dva.js 知识导图

    JavaScript语言 JavaScript语言 不要用 var 而是用 const 和 let 分别表示常量和变量 不同于 var 的函数作用域 const 和 let 都是块级作用域 模板字符串 模板字符串提供了另一种做字符串组合的方
  • HTTP与TCP的区别和联系

    相信不少初学应用网络程序开发的朋友都想知道Http与Socket连接究竟有什么区别 希望通过自己的浅显理解能对初学者有所帮助 一 基本概念 1 TCP连接 手机能够使用联网功能是因为手机底层实现了TCP IP协议 可以使手机终端通过无线网络
  • Java中常用的一种时间格式的转换方法

    有时需要将一种格式的时间转化成其他格式的时间 这里列举了一种常用的转换方法 将从控件获得类似于 Thu Jan 01 00 00 00 CST 2009 的时间格式转化称 yyyy MM dd 格式 DateFormat format1 n
  • Java基础16--面向对象:抽象类

    Java基础16 面向对象 抽象类 文章目录 Java基础16 面向对象 抽象类 概述 抽象类 继承抽象类 抽象方法 抽象类总结规定 概述 在面向对象的概念中 所有的对象都是通过类来描绘的 但是反过来 并不是所有的类都是用来描绘对象的 如果
  • 带你知道如何在Flask中集成支付宝第三方支付模块并进行联调?

    支付宝沙箱 支付宝沙箱基础配置 支付宝开放平台 如果从www alipay com访问 选择我是开发者 支付宝扫码登录 身份 自研开发者 控制台 gt 开发服务 gt 沙箱 gt 沙箱应用 沙箱 协助开发者进行接口开发及主要功能联调的模拟环
  • vue2.0 关于 vue.config.js配置项详解

    const CompressionPlugin require compression webpack plugin 引入gzip压缩插件 const TerserPlugin require terser webpack plugin 代