我改了一行公共代码后,同事说要建个没我的小群

点击上方 前端Q,关注公众号

回复加群,加入前端Q技术交流群

嗨,大家好!这里是道长王jj~ 🎩🧙‍♂️

今天我想和大家分享一个惨痛的教训,就是当我一意孤行地删掉一个看起来没用的配置文件时,结果闹了件大事!😭

😭我只是想删了个没有引用的配置而已

作为一个coder,我们都希望自己的代码像世外桃源一样(至少是人家的就算是shi,我自己的永远是鲜花),无污染,拥有出色的性能、可读性和可维护性。

但是,不是每个需求、每个经手的项目的代码库都像我们想象的那样整洁干净。这次,我遇到了一个需求,需要我重新编写一个全新的功能模块来替换原有的模块。而原有的模块里有一个看似无用的配置文件:

/******************** @/components/xxxx01/config.js*******************/
// 原有模块依赖的角色配置 -- xxw 2010-03-02
export const ROLES_CONFIG = {"admin": {canDelete: true,canViewSecrets: true,canEdit: true},"auditor": {canDelete: false,canViewSecrets: true,canEdit: false},"normal": {canDelete: false,canViewSecrets: false,canEdit: false}
};

既然要替换原有模块,我觉得这个配置应该没有用了。在静态分析的过程中,也没有发现有其他地方引用它。所以,我毫不犹豫地删掉了它。

一切看起来都很顺利,直到"回归环节"出了大麻烦。

A: 兄弟萌,uat环境的xxx页面全白屏了,报了个引用错误,是不是有变量在某处undefined了?
B: 我看了,找不到一个变量,好像是@道长 把那个变量删了。
A: 啊?@道长
道长: 啊?你们还在用那东西?我看那个模块都已经没有引用了。
C: 你又在删删删了!删掉的是哪个变量?老项目别乱动啊!
D: 这是@道长 能整出来的事?
E: 没错,那个模块存在很久了,因为之前的架构耦合严重,很多老功能也引用了那个配置。
道长: 怎么可能呢?静态检查居然没有查出来?
A: ?
B: ???
D: 您已建立群聊“道长代码受害交流群”, @道长
……

👻是幽灵?明明引用了变量,静态检查却没有发现

经过一番排查,我发现在项目的某个角落有这样一段神秘代码:

/******************** main.js*******************/
function loadConfig() {// ......return import('./components/xxxx01/config.js'); // 动态引入配置文件
}
async function useConfig() {const configModule = await loadConfig();const config = configModule.ROLES_CONFIG; // 获取配置对象console.log(config); // 使用配置// ...
}
useConfig();

我只能说,这位前辈简直是个天才!他这样的操作,使用import()动态引用 config.js 的变量,确实能实现引用,而且还能轻松躲过静态分析的检查。

果然对老项目一定要有一颗敬畏之心!不能只凭外表来判断它们的价值,像我这样一意孤行的结果,就是让前端团队跟我一起debug了1个多小时哈哈(别骂了别骂了😅)。

为了弥补这次错误,并且下次犯病之前能及时通知我的好同事们,我决定往“比大气层更高一点的层次”思考一下这个问题。

难道就没有什么方法能够帮助我们的团队快速规避我妄图修改公共代码(犯病)的行为吗?

🚩防止犯病,利用git hook监听配置文件并推送消息

😎既然要阻止我犯病,那就要病人发病并采取行动时,及时通知办公室里的“医生们”,进行“👨‍👨‍👧‍👦专家会诊”。

那就给所有的项目仓库加了个小门卫一样,只要有东西改动,就会拉响我们的微信小门铃🚪📲

  • 在你的仓库中,进入 .git 文件夹,然后找到 hooks 文件夹。这是存放钩子脚本的地方。

  • hooks 文件夹中创建一个名为 post-commit 的可执行脚本文件(如果该文件已存在,确保它有执行权限)。

  • 把以下代码贴进 post-commit 文件中:

#!/bin/bash
# 获取仓库中 config.js 文件夹的改动
changes=$(git diff-tree --name-only --no-commit-id HEAD^ HEAD)
# 检查是否有 config.js 文件夹的改动
if echo "$changes" | grep -q "config.js/"; then
# 发送 POST 请求给 Server酱 推送消息
curl -s --data-urlencode "text=仓库中 config.js 文件夹有改动" https://sc.ftqq.com/你的Server酱SCKEY.send
fi

现在,当你在仓库里提交了代码,并且里面的"config.js"文件夹发生了变化,Git就会自动触发我们的超级厉害的"post-commit"钩子!它会给"Server酱"发一个POST请求,然后"Server酱"就会在微信上敲敲你的门铃,告诉你有人来找你了。📦📯

🤣不仅要防止还得有解决方案!加个热更新

但是小伙伴们说,这样还不够,万一发版当天大家都很忙,你专门挑那个时候夹带私货合进main分支怎么办!

不仅要通知,还得有防灾措施。

立即就办,那现在让我们的配置实现热更新!哎呀,直接,欸,很快啊🔥。这意味着当你在配置系统里修改某个字段时,它能立即感知到变化,就像是闪电五连鞭⚡,每一鞭都能让每个人感受到那磅礴的气势🦾。

想象一下,突然出现了一个线上逻辑Bug,需要发布一个紧急公告。这时候,不需要去改代码,也不用重新经历那漫长的CICD流程。只需要访问数据库,然后修改它的值,就像是写下了一句紧急公告的话语📢。配置监听器会立即感知到变化,就像是收到了一封短信通知📲,然后立刻将新的配置信息热情地更新到内存中。

代码我都给你写好啦!炫嘴里!码上掘金[1]

<head><title>数据库配置监听器</title><script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
</head>
<body><h1>数据库配置信息</h1><p>Host: <span id="host"></span></p><p>Port: <span id="port"></span></p><p>Username: <span id="username"></span></p><p>Password: <span id="password"></span></p>
// 替换为你的 Server酱 SCKEY
const SERVER_CHAN_SCKEY = 'YOUR_SERVER_CHAN_SCKEY';
// 初始的数据库配置信息
let dbConfig = {host: '',port: '',username: '',password: ''
};
// 发送消息给 Server酱
function sendServerChanMessage(message) {const url = `https://sc.ftqq.com/${SERVER_CHAN_SCKEY}.send`;const data = new URLSearchParams();data.append('text', '数据库配置变更通知');data.append('desp', message);axios.post(url, data).catch(error => {console.error('Failed to send message to Server酱:', error);});
}
// 假设这是个获取服务器配置的方法
function generateRandomConfigObject() {function generateRandomString() {const characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';let randomString = '';for (let i = 0; i < 6; i++) {const randomIndex = Math.floor(Math.random() * characters.length);randomString += characters[randomIndex];}return randomString;}return {host: generateRandomString(),port: generateRandomString(),username: generateRandomString(),password: generateRandomString()};
}
// 监听配置信息变更
function watchConfigChanges() {console.log('更新配置!')// 假设这个是请求const res = generateRandomConfigObject()console.log('最新的配置是:', res)const configData = res;const newDbConfig = {host: configData.host,port: configData.port,username: configData.username,password: configData.password};if (newDbConfig.host !== dbConfig.host ||newDbConfig.port !== dbConfig.port ||newDbConfig.username !== dbConfig.username ||newDbConfig.password !== dbConfig.password) {dbConfig = newDbConfig;// 更新网页上的配置信息document.getElementById('host').textContent = dbConfig.host;document.getElementById('port').textContent = dbConfig.port;document.getElementById('username').textContent = dbConfig.username;document.getElementById('password').textContent = dbConfig.password;// 发送变更通知消息给 Server酱const message = `数据库配置信息已变更:\n\nHost: ${dbConfig.host}\nPort: ${dbConfig.port}\nUsername: ${dbConfig.username}\nPassword: ${dbConfig.password}`;sendServerChanMessage(message);}// 每隔一段时间监听一次setTimeout(watchConfigChanges, 5000);
}
// 开始监听配置信息变更
watchConfigChanges();

这样,你的服务就能立即应对变化,发布紧急公告,不用等待,不用担心。就像是有一只神奇的精灵,帮你实现了配置的即时热更新✨🔥。

至此,你应该已经知道什么叫对旧项目充满敬畏之心。代码和人,有一个能跑就行。毕竟,我们是专业团队嘛!🌈。

🎉 希望本文能够帮助你发现coder生活中的一些乐趣。如果你有任何疑问或者想进一步讨论相关话题,请随时告诉我。🚀✨

参考资料

[1]

https://code.juejin.cn/pen/7237877368822431744

关于本文

作者:道长王jj

https://juejin.cn/post/7238431954125946941

a55a6774736215497690ed98fc15ef80.png

往期推荐

因为写不出拖拽移动效果,我恶补了一下Dom中的各种距离

979f5892179f5d89fe3f14e9e8ffcbaf.png

Echarts无法实现这个曲线图,那我手写一个

53af933fca8a1adbd1985bc2ad349d36.png

闲来无事,摸鱼时让 chatgpt 帮忙,写了一个 console 样式增强库并发布 npm

99b89df2815f736336f39d70c97cdbcb.png


最后

  • 欢迎加我微信,拉你进技术群,长期交流学习...

  • 欢迎关注「前端Q」,认真学前端,做个专业的技术人...

404b8bcbbe26f99a22bbeb3a478547c8.jpeg

119f0ed698b0860901356cc028a7d086.png

点个在看支持我吧

5cf832c4b49c1a97650b70a825c08cbc.gif

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chatgpt赋能python:免费的Python教程:从入门到精通

免费的Python教程&#xff1a;从入门到精通 Python是如今最热门的编程语言之一&#xff0c;在众多编程语言中占据了重要的地位。Python有着简单易学的语法&#xff0c;充足的库支持&#xff0c;高效的执行速度和海量的社区支持&#xff0c;这些使得Python成为最适合初学者的编…

chatgpt赋能python:Python报错Module:从入门到精通

Python报错Module&#xff1a;从入门到精通 在Python编程中&#xff0c;我们经常会遇到各种各样的错误。其中&#xff0c;Module错误是最常见的一种。在这篇文章中&#xff0c;我们将深入探讨Python报错Module的各种原因和解决方法&#xff0c;并希望能够帮助那些遇到这种问题…

chatgpt赋能python:Python词汇大全:从入门到精通

Python词汇大全&#xff1a;从入门到精通 Python作为一门简洁易学的编程语言&#xff0c;已经成为了全球程序员的热门选择。在这篇文章中&#xff0c;我们将介绍Python的词汇大全&#xff0c;包括关键字、数据类型、内建函数、标准库、第三方库等内容&#xff0c;帮助读者更好…

chatgpt赋能python:Python的口头禅:从入门到精通

Python的口头禅&#xff1a;从入门到精通 什么是Python口头禅&#xff1f; Python是一门强大的编程语言&#xff0c;它不仅拥有简洁易读的语法&#xff0c;而且拥有着许多独特的语言特性。其中&#xff0c;Python口头禅是指程序员们在使用Python时最常用的&#xff0c;最经典…

chatgpt赋能python:Python要点:从入门到精通

Python要点&#xff1a;从入门到精通 Python是一门高级编程语言&#xff0c;是一种解释型、面向对象、动态数据类型的语言。它的设计思想是“代码易读易写”&#xff0c;在数据科学、人工智能、自动化测试、Web开发等领域广泛应用。本文将从入门到精通的角度来介绍Python的要点…

chatgpt赋能python:Python构造列表:从入门到精通

Python 构造列表&#xff1a;从入门到精通 Python是一种强大、可扩展、易于学习的编程语言。用Python编写代码的一个重要部分是构建列表&#xff0c;这是Python中最重要的数据结构之一。本文将深入探讨Python列表的构造方法&#xff0c;以帮助您更好地理解它们的概念和用途。 …

基于 ChatGPT 的 helm 入门

1. 写在最前面 公司最近在推业务上云&#xff08;底层为 k8s 管理&#xff09;&#xff0c;平台侧为了简化业务侧部署的复杂度&#xff0c;基于 helm 、chart 等提供了一个发布平台。 发布平台的使用使业务侧在不了解 helm 、chart 等工具的时候&#xff0c;「只要点点」就可…

我的新书《Android App开发从入门到精通》终于出版啦

前言 经过了两年多终于完成了这本书&#xff0c;2016年9月份开始写的&#xff0c;到今天为止2年零2个月&#xff0c;本书的内容大部分是去年完成的&#xff0c;看过我去年总结的读者可能知道&#xff0c;去年事情很多太忙了&#xff0c;导致本命年这本书没有上架&#xff08;有…

毕业论文答辩ppt怎么做?

毕业论文是令每个学生最头疼的事情了&#xff0c;毕业论文答辩ppt模板怎么做&#xff1f;毕业ppt模板制作方法有什么技巧呢&#xff1f;下面ppt家园就来介绍一下答辩PPT内容。 答辩PPT最忌讳长篇大论&#xff0c;只需要提炼你论文的核心要点和成果即可。 1.PPT封面 完整的论文答…

如何防止短信验证码接口、登录注册入口被恶意调用攻击?

目录 前言1、短信验证码是什么&#xff1f;2、为什么要对短信验证码进行防护&#xff1f;3、有哪些常见的防护手段&#xff1f;4、这些防护手段有没有用呢&#xff0c;到底该如何选择&#xff1f;5、结语 前言 最近遇到一个关于防止短信验证码被刷的问题&#xff0c;相信很多朋…

验证非法电话号码

程序开发中经常需要用户输入用户信息或者联系方式&#xff0c;其中有一些数组的格式是固定的&#xff0c;程序处理逻辑也是按照这个格式来实现的&#xff0c;但是由于用户输入的是字符串&#xff0c;其灵活性较大&#xff0c;容易输入格式错误的数据。 例如&#xff0c;用户联系…

搞懂 API,调用 API 接口通常有这些技巧

其实没什么技巧&#xff0c;无他&#xff0c;唯熟悉API 原理&#xff08;dog.jpg&#xff09;。 不过对于新人来说&#xff0c;掌握这些基础知识还是很有必要的&#xff1a; 1.了解API的功能和用法&#xff1a;在使用API之前&#xff0c;您应该了解API的功能和使用方式。这将有…

如何解决Ganache界面一直转圈的问题

Ganache打不开的解决办法&#xff0c;针对Windows用户 Tip1Tip2 Tip1 不要直接从官网上下载&#xff0c;因为默认下载的是.appx文件&#xff0c;这样即使解压了也没有安装选项&#xff0c;打开ganache.exe后点击quickstart&#xff0c;会一直转圈进不去。&#xff08;我的就是…

第一款交互式电子游戏 | 历史上的今天

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 4 月 18 日&#xff0c;在 1955 年的今天&#xff0c;著名物理学家爱因斯坦在美国新泽西州的普林斯顿逝世。爱因斯坦于 1905 年获得物理学博士学位&#xff0c;…

【人工智能】AI Code:当你还在谈论人工智能是否取代“程序员”的时候—— 懂 AI 的程序员,已经悄悄 ……

禅与计算机程序设计艺术出品的:Goland AI Code 开发插件: AIXCodeCompletionHelper 目录

chatgpt赋能python:Python绕过付费的SEO技巧

Python绕过付费的SEO技巧 随着网站流量成为企业重要的市场指标&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;也成为了网站的重要一环。许多企业为了获取更多的流量&#xff0c;选择通过付费方式在搜索引擎中获得更高的曝光率。但是&#xff0c;对于那些没有足够预算的…

小红书内容种草推广2大玩法攻略_云媒易

随着电商时代的到来&#xff0c;各大品牌在做互联网营销时都热衷于种草营销&#xff0c;也就是我们经常用到的小红书种草推广。一次好的内容种草营销&#xff0c;不仅商家能够获利&#xff0c;还带动短视频平台、kol达人等实现共赢的局面。但是&#xff0c;内容种草做起来并不是…

小红书【服饰穿搭】有多火?2022年种草笔记超125万

导语 为了更好的满足各行业类目下品牌和博主对小红书内容创作的不同需求&#xff0c;千瓜全新推出《小红书爆文内容创作方向专栏》&#xff0c;为大家针对性提供小红书种草趋势洞察和灵感来源。 小红书【服饰穿搭】有多火&#xff1f;通过聚合2022年1月1日-2月28日两个月期间…