前端打同一个包可以从测试晋升到生产的配置方案

news2024/11/26 20:50:48

前端打同一个包从测试晋升到生产环境的方案,是一种高效、可靠且易于维护的部署方式。在这种方案中,前端代码在开发完成后,经过测试验证无误后,可以直接打包部署到生产环境,无需进行额外的配置或修改。这样可以减少部署过程中可能出现的错误和延迟,提高应用的可用性和性能。

为什么需要这种方案:

简化部署流程:通过使用同一个包从测试到生产,可以大大简化部署流程。开发人员只需要打包一次,就可以在不同的环境中使用。这避免了在不同环境之间迁移代码时可能出现的错误和混淆。
提高应用性能:由于测试环境和生产环境中的代码是相同的,因此应用的性能在两个环境中也会保持一致。这有助于确保用户在生产环境中获得最佳的性能体验。
减少维护成本:使用同一个包从测试到生产可以减少维护成本。一旦代码在测试环境中通过验证,就可以放心地部署到生产环境,而无需担心环境差异带来的问题。这有助于降低技术支持和故障排除的成本。
提高开发效率:通过消除在不同环境之间迁移代码的需要,这种方案可以显著提高开发效率。开发人员可以专注于开发任务,而不是部署和环境配置等非核心工作。这有助于加快开发周期和迭代速度。
提高应用可用性:由于测试环境和生产环境中的代码是相同的,因此应用在生产环境中出现问题的可能性大大降低。这有助于提高应用的可用性和稳定性,从而提升用户体验和忠诚度。
总之,前端打同一个包从测试晋升到生产环境的方案是一种高效、可靠且易于维护的部署方式。它可以简化部署流程、提高应用性能、降低维护成本、提高开发效率和应用的可用性。因此,对于需要频繁部署和快速迭代的前端项目来说,这种方案是一种非常有价值的工具。

直接上代码:
代码下载地址

具体方案

在这里插入图片描述

Nginx subfilter

在 Nginx 中,你可以使用 sub_filter 指令来替换 HTML 中的占位符。sub_filter 允许你在 Nginx 处理响应内容时进行文本替换,这通常用于修改 HTML 页面中的特定内容。

以下是一个简单的示例,演示如何在 Nginx 配置中使用 sub_filter:

server {
    listen 8090;
    server_name localhost;

    location / {
        index index.html;
        root /Users/yueyu/Project/allens-learn/webapp/subfilter;
        # 启用 sub_filter
        sub_filter '_SERVER_ADDR' 'http://123.com';
        sub_filter_once off; # 可选,用于启用全局替换而不仅仅是第一次出现的地方
    }
}

在上述配置中:

sub_filter 指令用于替换响应中的 (占位符)为指定的 replacement_value。
sub_filter_once off; 是可选的,如果设置为 off,则会对所有匹配的地方进行替换。如果设置为 on,则只替换第一次匹配的地方。
请根据你的实际需求修改 和 replacement_value,以及其他配置参数。确保配置文件语法正确,并且重新加载 Nginx 以应用更改。

<html>
    <head>
        <title>nginx sub-filter</title>
        <script src="index.js"></script>
        <script>
            var addr = "_SERVER_ADDR";
            console.log("xxxxx", addr)
        </script>
    </head>
</html>

console.log()会输出123.com。

这种方案可以完美解决同一个包晋升的问题,优点有改造成本比较低,对代码入侵性很低,不同环境配置不同的nginx config即可。性能也比较好,单页应用只会在第一次加载的时候替换。

但也有很多缺点,比如:
① 必须使用nginx
② 配置都要配置到nginx中
③ 本地环境使用webpack-dev-server启动的话可能需要单独适配
④ 配置在nginx中,可发需要熟悉成本,假设不知道有这个东西可能会有配置遗漏等等

根据域名匹配

原理就是通过window.location.host 作为key拿到在js代码中的配置。直接上代码:

const domainMap = {

    "localhost:8090": {
        config1: "test"
    }

}

const getDomainConfig = (configName) => {
    const domain = window.location.host
    const config = domainMap[domain] || {}
    return config[configName]
}

html通过getDomainConfig传配置名称即可。

<html>
    <head>
        <title>nginx sub-filter</title>
        <script src="index.js"></script>
        <script>
            var addr = "_SERVER_ADDR";
            console.log("xxxxx", addr)
            console.log(getDomainConfig("config1"))
        </script>
    </head>
</html>

这种优点就是很方便简单,缺点也很明显假如域名不匹配可能就获取不到配置了。

前后端不分离

现在主流情况就是前后端分离,所以不做过多讨论,只提供思路。

可以通过后端把公共配置传参到前端,比如java的thymleaf ,velocity等等。php的话就是smarty、laravel的blame、thinkphp的模板填充等。

原理很简单,前端代码都是通过后端渲染的,后端理论上可以对前端的代码为所欲为。前端只需要写好后端约定的占位符,后端替换即可,这种方式和nginx subfilter很类似。

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

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

相关文章

HarmonyOS 应用开发入门

HarmonyOS 应用开发入门 前言 DevEco Studio Release版本为&#xff1a;DevEco Studio 3.1.1。 Compile SDK Release版本为&#xff1a;3.1.0&#xff08;API 9&#xff09;。 构建方式为 HVigor&#xff0c;而非 Gradle。 最新版本已不再支持 &#xff08;”Java、JavaScrip…

已解决Error:AttributeError: module ‘numpy‘ has no attribute ‘complex‘

文章目录 引言报错分析解决方案1&#xff1a;降低NumPy版本解决方案2&#xff1a;更改NumPy源码 结尾 引言 在Python编程的世界里&#xff0c;NumPy无疑占据着举足轻重的地位&#xff0c;它承担着处理大规模数值计算的重要任务。然而&#xff0c;与所有强大工具一样&#xff0…

晶振负载电容公式,怎么计算?

晶振&#xff0c;或称晶体振荡器&#xff0c;是电子设备中的关键元件&#xff0c;尤其在时序电路中扮演着重要角色。晶振的性能直接影响到整个电路的稳定性和精度。在晶振设计中&#xff0c;负载电容是一个重要的参数。理解如何计算负载电容对于正确配置和使用晶振至关重要。今…

Find My卡片正成为消费电子香饽饽,伦茨科技ST17H6x可以帮到您

今年CES许多公司发布支持苹果Find My的卡片产品&#xff0c;这种产品轻薄可充电&#xff0c;放在钱包、背包或者手提包可以防丢查找&#xff0c;在智能化加持下&#xff0c;防丢卡片使得人们日益关心自行车的去向。最新的防丢卡片与苹果Find My结合&#xff0c;智能防丢&#x…

Chatgpt+Comfyui绘图源码说明及本地部署文档

其他文档地址&#xff1a; ChatgptComfyui绘图源码运营文档 ChatgptComfyui绘图源码线上部署文档 一、源码说明 1、源码目录说明 app_home&#xff1a;app官网源码chatgpt-java&#xff1a;管理后台服务端源码、用户端的服务端源码chatgpt-pc&#xff1a;电脑网页前端源码cha…

Halcon 边缘提取

文章目录 算子Halcon edges_image 示例Halcon frei_amp 示例Halcon kirsch_amp示例Halcon sobel_amp示例Halcon sobel_amp 算子示例Halcon sobel_dir 算子示例Halcon close_edges关闭图像间隙示例Halcon close_edges_length关闭图像间隙示例 算子 edges_image 对于图像进行边缘…

64 C++对象模型探索。类对象占用空间问题分析

0.没有任何成员变量的空类&#xff0c;实际上占用空间为1字节。 这是因为当你的使用代码实例化一个类的时候&#xff0c;tea对象就有了空间&#xff0c;&tea是有地址的&#xff0c;那么你这个地址至少要占用1个字节才合理。 Teacher tea; 就像我们买房子&#xff0c;你的…

爬虫接口获取外汇数据(汇率,外汇储备,贸易顺差,美国CPI,M2,国债利率)

akshare是一个很好用的财经数据api接口&#xff0c;完全免费&#xff01;&#xff01;和Tushare不一样。 除了我标题显示的数据外&#xff0c;他还提供各种股票数据&#xff0c;债券数据&#xff0c;外汇&#xff0c;期货&#xff0c;宏观经济&#xff0c;基金&#xff0c;银行…

JDK 动态代理(Spring AOP 的原理)(面试重点)

代理模式 也叫委托模式.定义&#xff1a;为其他对象提供⼀种代理以控制对这个对象的访问.它的作⽤就是通过提供⼀个代理类,让我们 在调⽤⽬标⽅法的时候,不再是直接对⽬标⽅法进⾏调⽤,⽽是通过代理类间接调⽤&#xff0c;在某些情况下,⼀个对象不适合或者不能直接引⽤另⼀个对…

Stream toList不能滥用以及与collect(Collectors.toList())的区别

Stream toList()返回的是只读List原则上不可修改&#xff0c;collect(Collectors.toList())默认返回的是ArrayList,可以增删改查 1. 背景 在公司看到开发环境突然发现了UnsupportedOperationException 报错&#xff0c;想到了不是自己throw的应该就是操作collection不当。 发…

Jetbrains Writerside 使用教程

系列文章目录 前言 一、入门 Writerside 是基于 IntelliJ 平台的 JetBrains 集成开发环境。使用它可以编写、构建、测试和发布技术文档。 如果你想将 Writerside 作为另一个 JetBrains IDE 的插件&#xff0c;请参阅 Writerside 作为插件。 1.1 安装 Writerside&#xfeff;…

vue路由-全局前置守卫

1. 介绍 详见&#xff1a;全局前置守卫网址 使用场景&#xff1a; 对于支付页&#xff0c;订单页等&#xff0c;必须是登录的用户才能访问的&#xff0c;游客不能进入该页面&#xff0c;需要做拦截处理&#xff0c;跳转到登录页面 全局前置守卫的原理&#xff1a; 全局前置…

QT+opencv源码编译

时间记录&#xff1a;2024/1/20 一、版本介绍 QT5.12.7cmake3.22.0opencv4.5.4 二、编译步骤 &#xff08;1&#xff09;下载opencv源码&#xff0c;然后安装&#xff0c;opencv的安装即对源码的解压过程&#xff0c;解压后的文件目录如下 &#xff08;2&#xff09;openc…

stm32 FOC 电机介绍

今年开始学习foc控制无刷电机&#xff0c;这几天把所学整理一下&#xff0c;记录一下知识内容。 前言: 为什么要学习FOC? 1.电机控制是自动化控制领域重要一环。 2.目前直流无刷电机应用越来越广泛&#xff0c;如无人机、机械臂、云台、仿生机器人等等。 需要什么基础&…

最长公共前缀(Leetcode14)

例题&#xff1a; 分析&#xff1a; 我们可以先定义两个变量 i &#xff0c; j&#xff0c; j表示数组中的每一个字符串&#xff0c; i 表示每个字符串中的第几个字符。一列一列地进行比较&#xff0c;先比较第一列的字符&#xff0c;若都相同&#xff0c;则 i &#xff0c;继…

字节跳动 ByteHouse 云原生之路 – 计算存储分离与性能优化

01 起源 ByteHouse 的故事从字节跳动对于先进数据处理和分析的需求开始&#xff0c;这一需求随着公司业务规模的迅速扩张而日益增长&#xff0c;起源是对开源数据库管理系统 ClickHouse 的改造和增强。面对数据处理的高延迟、大规模数据操作的复杂性以及数据存储和处理成本的上…

记录一次QT乱码问题

问题描述 在敲陆文周的书《QT5开发及实例》的示例代码时&#xff0c;出现乱码&#xff0c;如下图所示 具体代码如下 Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);ui->treeWidget->clear();int groupSize 2;int ite…

Unity SnapScrollRect 滚动 匹配 列表 整页

展示效果 原理: 当停止滑动时 判断Contet的horizontalNormalizedPosition 与子Item的缓存值 相减,并得到最小值&#xff0c;然后将Content horizontalNormalizedPosition滚动过去 使用方式&#xff1a; 直接将脚本挂到ScrollRect上 注意&#xff1a;在创建Content子物体时…

蓝桥杯练习题(十二)

&#x1f4d1;前言 本文主要是【算法】——蓝桥杯练习题&#xff08;十二&#xff09;的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他…

list下

文章目录 注意&#xff1a;const迭代器怎么写&#xff1f;运用场合&#xff1f; inserterase析构函数赋值和拷贝构造区别&#xff1f;拷贝构造不能写那个swap,为什么&#xff1f;拷贝构造代码 面试问题什么是迭代器失效&#xff1f;vector、list的区别&#xff1f; 完整代码 注…