vue cli 打包、生产环境http-proxy-middleware代理

news2025/1/15 21:05:19

结构树

版本

1、创建vue.config.js

const path = require('path');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
//压缩
const CompressionWebpackPlugin = require('compression-webpack-plugin')
const isProduction = process.env.NODE_ENV !== 'development';

module.exports = {
  // 将 examples 目录添加为新的页面
  pages: {
    index: {
      // page 的入口
      entry: process.env.NODE_ENV === 'production' ? 'src/main-prod.js' : 'src/main.js',
      // 模板来源
      template: 'public/index.html',
      // 输出文件名
      filename: 'index.html'
    }
  },
  runtimeCompiler: true,
  publicPath: "./", // 官方要求修改路径在这里做更改,默认是根目录下,可以自行配置
  outputDir: 'dist', //标识是打包哪个文件
  productionSourceMap: false,
  configureWebpack: config => {
    if (isProduction) {
      //移除代码中的打印
      config.plugins.push(
        new UglifyJsPlugin({
          uglifyOptions: {
            output: {
              comments: false, // 去掉注释
            },
            warnings: false,
            compress: {
              drop_console: true,
              drop_debugger: false,
              pure_funcs: ['console.log']//移除console
            }
          }
        })
      )
      //压缩大于200k的文件
      config.plugins.push(
        new CompressionWebpackPlugin({
          filename: '[path][base].gz',
          algorithm: 'gzip',
          // test: /\.js$|\.html$|\.json$|\.css/,
          test: /\.js$|\.json$|\.css/,
          threshold: 204800, // 只有大小大于该值的资源会被处理
          minRatio: 0.8, // 只有压缩率小于这个值的资源才会被处理
          // deleteOriginalAssets: true // 删除原文件
        }))
    }
    console.log("------------------------------" + isProduction)
  },
  chainWebpack: config => {
    // 发布模式 优化首次加载 采用本地cdn(若需要更多优化可自行添加)
    config.when(process.env.NODE_ENV === 'production', config => {
      config.set('externals', {
        axios: 'axios',
        'vue-router': 'VueRouter',
      })
    })
  },

  devServer: {
    proxy: {
      '/config': {
        target: 'http://xxx.xxx.xx.xxx:xxx',//代理地址,这里设置的地址会代替axios中设置的baseURL
        //changeOrigin: true,// 如果接口跨域,需要进行这个参数配置
        //ws: true, // proxy websockets
        //pathRewrite方法重写url
        pathRewrite: {
          '^/config': '/config'
          //pathRewrite: {'^/api': '/'} 重写之后url为 
          //pathRewrite: {'^/api': '/api'} 重写之后url为 /api/xxxx
        }
      }
      , '/guacamole': {
        target: 'ws://xxx.xxx.xx.xxx:xxx',
        pathRewrite: {
          '^/guacamole': '/guacamole'
        }
      },
      
    }
  },
  css: {
    loaderOptions: {
      less: {
        lessOptions: {
          modifyVars: {},
          javascriptEnabled: true,
        },
      },
    },
  },
}

如果采用了本地cdn则index.html

  <!-- 使用CDN的CSS文件 -->
  <% if (process.env.NODE_ENV==='production' ) { %>
    <script src="./static/axios.0.21.1.min.js"></script>
    <script src="./static/vue-router.min.js"></script>
    <% } %>

2、创建ecosystem.config.js

module.exports = {
    apps: [{
        // 测试环境
        name: "test",
        script: "himdcs.js",
        env: {
            "NODE_ENV": "test"
        }
    }
    ]
}

3、创建himdcs.js


const express = require('express'); //npm下载并引入express模块 npm -express -D
const proxy = require('http-proxy-middleware');
 // 导入压缩包
const compression = require('compression');
const cors = require('cors');

const app = express();
app.use(cors())
 // 启用中间件 要写在静态资源托管之前 用于静态文件压缩包
 app.use(compression());
app.use(express.static('./dist')) // ./dist 为vue打包后dist文件夹的路径

app.listen(1897,function(err){  //8080 想要监听项目的端口号
	if(err){
		console.log(err)
	}else {
		console.log('项目启动成功')
	}
})
//用于服务部署时的代理
app.use(
    ['*/config/*'],
    proxy.createProxyMiddleware({
        target:'http://xxx.xxx.xx.xxx:xxxx', // 服务器api地址目录
        changeOrigin: true,
        secure: false,
        xfwd:true,//添加x-forward请求头
        pathRewrite: {
            '/config': '/config'     // rewrite path
        }
}));

//websocket
app.use(
    ['/beat'],
    proxy.createProxyMiddleware({
        target:'ws://xxx.xxx.xx.xxx:xxxx', // 服务器api地址目录
        changeOrigin: true,
        ws: true,
        xfwd:true,
        pathRewrite: {
            '/beat': '/beat'     // rewrite path
        }
}));

4、修改package.json

{
  "name": "",
  "version": "3.0.0",
  "private": true,
  "scripts": {
    "dev": "vue-cli-service serve --mode development",
    "prod": "vue-cli-service build --mode production",
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build --mode production",
    "lint": "vue-cli-service lint"
  },
  "dependencies": {...}
...
}

5、部署到docker

FROM keymetrics/pm2:latest-alpine
 
# Bundle APP files
RUN mkdir -p /home/
WORKDIR /home/
#COPY src src/
#COPY package.json .
COPY . /home/

# Install app dependencies
ENV NPM_CONFIG_LOGLEVEL warn
# Show current folder structure in logs
#RUN ls -al -R
CMD pm2-docker start ecosystem.config.js --only $NODE_ENV --watch

6、http-proxy-middleware参数说明

option.target:url字符串将与url模块解析
option.forward:url字符串将与url模块解析
option.target:传递给http(s)请求的对象(参阅Node https代理和http代理对象)
option.ssl:传递给https.createServer()的对象
option.ws:true / false,如果你想要代理websockets
option.xfwd:true / false,添加x-forward请求头
option.secure:true / false,如果你想要验证SSL证书
option.toProxy:true / false,将绝对URL作为​​path​​(对代理使用代理时很有用)
option.prependPath:true / false,默认:true-指定是否要将目标的路径预置到代理路径
option.ignorePath:true / false,默认:false-指定是否要忽略传入请求的代理路径(注意:如果需要,您将必须附加/手动)。
option.localAddress:用于传出连接的本地接口字符串
option.changeOrigin:true / false,默认值:false - 将主机头的源更改为目标URL
option.auth:基本认证,即“用户:密码”来计算授权头。
option.hostRewrite:重写(301/302/307/308)重定向的位置主机名。
option.autoRewrite:根据请求的主机/端口重写(301/302/307/308)重定向的位置主机/端口。默认值:false。
option.protocolRewrite:重写位置协议(301/302/307/308)重定向到’http’或’https’。默认值:null。
option.cookieDomainRewrite:重写set-cookie标头的域。可能的值:
-​​​false​​​(默认):禁止重写​​cookie​​​
- 字符串:新域名,比如说​​​cookieDomainRewrite:"new.domain"​​​。使用​​cookieDomainRewrite:""​​​删除域名。
- 对象:域名到新域名的映射,用”*”匹配所有域名。
举个栗子:保持一个域名不变,重写一个域名并且删除其他的:
​​
cookieDomainRewrite: {
"unchanged.domain": "unchanged.domain",
"old.domain": "new.domain",
"*": ""
}

option.headers:对象,添加请求头。(比如:​​{host:'www.example.org'}​​)
option.proxyTimeout:超时时间(毫秒)当代理接收不到目标服务器的返回
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1008490.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#控制台程序中使用log4.net来输出日志

Apache log4net 库是一个帮助程序员将日志语句输出到各种输出目标的工具。log4net 是优秀的 Apache log4j™ 框架到 Microsoft .NE​​T 运行时的端口。 我喜欢他可以自定义输出&#xff0c;区分等级等特点。 导入库 我们在工程里添加NuGet的包。输入名称log4net &#xff0…

【Transformer系列】深入浅出理解Positional Encoding位置编码

一、参考资料 一文教你彻底理解Transformer中Positional Encoding Transformer Architecture: The Positional Encoding The Annotated Transformer Master Positional Encoding: Part I 如何理解Transformer论文中的positional encoding&#xff0c;和三角函数有什么关系&…

05ShardingSphere-JDBC水平分片

1、准备服务器 随着业务的扩大&#xff0c;订单表数据量不断增加&#xff0c;数据库面临存储压力&#xff0c;开始考虑对订单表进行水平分片。 将t_order表扩展为server-order0中的t_order0和t_order1、server-order1中的t_order0和t_order1 服务器规划&#xff1a;使用dock…

使用Python创建音乐播放器

1. 介绍 在本篇博客中&#xff0c;我们将介绍如何使用Python编程语言和wxPython模块创建一个简单的音乐播放器。我们将使用wxPython来构建用户界面&#xff0c;并借助pygame模块来实现音频播放的功能。 C:\pythoncode\new\quickplaywav.py 2. 使用方法 使用我们提供的源代码…

排查disabled问题之谷歌新版本特性

问题复现 最近我突然接手一个后台的bug&#xff0c;这个后台很久没有迭代更新了&#xff0c;我也不熟悉业务&#xff0c;所以只能看一下源码&#xff0c;问题很快就复现&#xff0c;测试的修复操作也很正确&#xff0c;就是因为渲染的input标签中存在disableddisabled’属性导…

2023 年您需要了解哪些类型的数据泄露?

到目前为止&#xff0c;所有公司都应该意识到网络安全威胁是任何企业面临的主要风险之一。其中&#xff0c;那些直接损害敏感数据的行为可能会造成特别严重的破坏。 目前&#xff0c;数据泄露的典型成本已接近 450 万美元&#xff08;在过去三年中增加了 15%&#xff09;&…

MySQL内外连接、索引特性

目录 内连接 外连接 索引特性 理解索引 删除索引 MySQL内外连接是一种用于联接两个或多个表的操作。内连接只返回满足连接条件的行&#xff0c;外连接返回满足条件和不满足条件的行。 内连接 SQL如下&#xff1a; SELECT ... FROM t1 INNER JOIN t2 ON 连接条件 [INNER …

使用香橙派 学习Linux的串口开发

串口的回顾 & 硬件接线 关于串口也是之前学习过很多次了&#xff0c;详见&#xff1a; 认识串口 和 蓝牙模块HC08_hc08蓝牙模块_mjmmm的博客-CSDN博客 串口的再认识-CSDN博客 香橙派提供了两路串口&#xff0c;第一路就是在刷机时串口连接的引脚&#xff08;对应驱动ttyS0&…

input标签,新增那些属性

input标签作为页面与用户交互的重要入口&#xff0c;了解掌握input的属性&#xff0c;至为重要。 type属性 HTML5给input表现的type属性&#xff0c;添加了很多的属性值&#xff0c;用来丰富了文本框类型。比如&#xff1a; <body><input type"email" na…

前端--HTML

文章目录 HTML结构快速生成代码框架HTML常见标签 表格标签 编写简历信息 填写简历信息 Emmet 快捷键 HTML 特殊字符 一、HTML结构 1.认识HTML标签 HTML 代码是由 "标签" 构成的. 形如: <body>hello</body> 标签名 (body) 放到 < > 中 大部分标…

Spring框架中的@Conditional系列注解

目录 1 Contidional 介绍1.1 Condition 接口1.2 Spring Conditional注解实例1.3 Conditional 与Profile 的对比 2 Spring boot 扩展2.1 ConditionalOnClass和ConditionalOnMissingClass注解2.2 ConditionalOnBean 和ConditionalOnMissingBean注解2.3 ConditionalOnProperty注解…

(二十八)大数据实战——Flume数据采集之kafka数据生产与消费集成案例

前言 本节内容我们主要介绍一下flume数据采集和kafka消息中间键的整合。通过flume监听nc端口的数据&#xff0c;将数据发送到kafka消息的first主题中&#xff0c;然后在通过flume消费kafka中的主题消息&#xff0c;将消费到的消息打印到控制台上。集成使用flume作为kafka的生产…

18. 线性代数 - 线性变换

文章目录 线性空间线性变换线性变换的几何意义特征值与特征向量NumPy的矩阵操作Hi, 你好。我是茶桁。 经历了几节线性代数课程之后,终于咱们到了最后一节课了。本节课的内容说多不多,说少也不少。 我们先是要理解一下线性空间和线性变换,并且探讨一下线性变换的几何意义。…

Mapbox加载arcgis的底图

成果图 这种底图基本上都是按照raster来加载的&#xff0c;主要就是知道地址了&#xff0c;拼参数 具体参数请参考官网 https://developers.arcgis.com/rest/services-reference/enterprise/export-map.htm 源码 我的服务列表是这样的 http://XXXX:XXXX/arcgis/rest/services/…

Rsync远程同步inotify监控

Rsync 简介 rsync&#xff08;Remote Sync&#xff0c;远程同步&#xff09; 是一个开源的快速备份工具&#xff0c;可以在不同主机之间镜像同步整个目录树&#xff0c;支持增量备份&#xff0c;并保持链接和权限 在远程同步任务中&#xff0c;负责发起rsync同步操作的客户机…

【Docker】Docker简介

Docker简介 &#x1f4cb;导航 1. Docker简介1.1 什么是Docker&#xff1f;1.2 什么是容器&#xff1f;1.3 容器的优势&#xff1f;1.4 Docker的优势&#xff1f;1.5 虚拟技术与容器技术Docker的区别&#xff1f;1.6 为什么学习Docker? 2. 安装Docker3. Docker架构4. Docker命…

【算法训练-栈 一】【结构特性】有效的括号

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【栈的使用】&#xff0c;使用【栈】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&#x…

影刀RPA解决WPS不存在的问题

问题阐述 明明电脑上已经安装了WPS&#xff0c;但影刀程序还是提示没有安装的问题 解决办法 1.打开WPS并关闭所有其他网页 2. 配置与修复 3.开始修复 出现这个框&#xff0c;就要关闭WPS&#xff0c;否则无法执行&#xff0c;关闭WPS不影响其修复 4.等待修复完成即可

《打造高可用PostgreSQL:策略与工具》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

性能测试、负载测试、压力测试、稳定性测试简单区分

是一个总称&#xff0c;可细分为性能测试、负载测试、压力测试、稳定性测试。 性能测试 以系统设计初期规划的性能指标为预期目标&#xff0c;对系统不断施加压力&#xff0c;验证系统在资源可接受范围内&#xff0c;是否能达到性能瓶颈。 关键词提取理解 有性能指标&#…