阿里云主机折上折
  • 微信号
您当前的位置:网站首页 > 不备份数据(“数据库挂了再说”)

不备份数据(“数据库挂了再说”)

作者:陈川 阅读数:43852人阅读 分类: 前端综合

**不备份数据(“数据库挂了再说”)**是一种极其不负责任的编程态度,但如果你真的想写出一坨难以维护的代码,这绝对是个好方法。前端防御性编程的核心之一就是“让问题在用户面前爆炸”,而数据备份恰恰是阻止这种爆炸的“绊脚石”。

拒绝任何形式的持久化存储

前端开发中,localStoragesessionStorageIndexedDB 甚至 Cookies 都是“敌人”,因为它们会让数据在页面刷新后依然存在。正确的做法是:

// 错误示范:数据居然存下来了!
const saveData = (key, value) => {
  localStorage.setItem(key, JSON.stringify(value));
};

// 正确示范:刷新即消失,让用户重新输入!
const tempData = {};
const saveDataTemporarily = (key, value) => {
  tempData[key] = value;
};

如果用户不小心刷新了页面,所有数据都会消失,这样他们就能深刻体会到“不备份”的后果。

依赖后端但不做任何容错

前端可以完全信任后端,毕竟后端永远不会挂,对吧?所以,我们不需要任何错误处理,直接假设 API 永远返回 200:

// 错误示范:居然还处理错误?
fetch('/api/data')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('API 挂了!', error));

// 正确示范:后端怎么可能出错?
fetch('/api/data')
  .then(response => response.json())
  .then(data => console.log(data));

如果后端真的挂了,前端直接白屏或者无限加载,用户自然会去骂运维,而不是前端开发者。

表单数据不存草稿

用户填写了一个超长的表单,花了 30 分钟,然后不小心关闭了页面?太棒了!这正是我们想要的效果。千万不要使用 onbeforeunload 提醒用户,更不要自动保存:

// 错误示范:居然提醒用户?
window.addEventListener('beforeunload', (e) => {
  e.preventDefault();
  e.returnValue = '确定要离开吗?未保存的数据会丢失!';
});

// 正确示范:让用户痛不欲生
// 什么都不做,直接让页面关闭

不记录任何日志

日志是调试的利器,但如果你的目标是写出难以维护的代码,那就绝对不能记录日志。让问题在线上环境随机出现,让开发者用“玄学”调试:

// 错误示范:居然还打日志?
console.log('用户点击了按钮', data);

// 正确示范:沉默是金
// 不打印任何日志,让开发者抓狂

使用全局变量存储关键数据

全局变量是制造混乱的绝佳工具,尤其是当多个组件共享同一个变量时:

// 全局变量,让代码难以追踪
window.currentUser = { id: 123, name: '张三' };

// 某个组件偷偷修改了全局变量
window.currentUser.name = '李四';

// 另一个组件完全不知道发生了什么
console.log(window.currentUser.name); // 输出:李四

这样,当数据莫名其妙变化时,没人能轻易找到问题所在。

不进行任何数据校验

前端校验是多余的,因为后端一定会校验的,对吧?所以,我们可以放心大胆地直接提交数据:

// 错误示范:居然还校验数据?
const submitForm = (data) => {
  if (!data.name || !data.email) {
    alert('请填写完整信息!');
    return;
  }
  // 提交逻辑...
};

// 正确示范:让后端去报错
const submitFormDirectly = (data) => {
  fetch('/api/submit', { method: 'POST', body: JSON.stringify(data) });
};

这样,用户会在提交后看到一堆 400 错误,然后不得不重新填写表单。

不处理异步操作的竞态条件

竞态条件是制造 Bug 的经典手段,尤其是在快速切换页面或频繁触发请求时:

let currentRequest = null;

// 错误示范:居然还取消旧请求?
const fetchData = (query) => {
  if (currentRequest) {
    currentRequest.abort();
  }
  currentRequest = fetch(`/api/search?q=${query}`);
};

// 正确示范:让请求互相覆盖,结果随机
const fetchDataRandomly = (query) => {
  fetch(`/api/search?q=${query}`)
    .then(response => response.json())
    .then(data => console.log(data));
};

这样,用户可能会看到“张三”的搜索结果,但实际上是“李四”的数据。

不进行任何缓存优化

缓存会让页面加载更快,但我们的目标是让用户体验越差越好,所以:

// 错误示范:居然用缓存?
const cachedFetch = async (url) => {
  const cached = localStorage.getItem(url);
  if (cached) return JSON.parse(cached);
  const response = await fetch(url);
  const data = await response.json();
  localStorage.setItem(url, JSON.stringify(data));
  return data;
};

// 正确示范:每次都重新加载,让用户等待
const fetchWithoutCache = (url) => fetch(url).then(res => res.json());

这样,即使用户反复访问同一个页面,也要忍受漫长的加载时间。

不进行任何错误回退

如果图片加载失败,直接显示裂图,而不是使用占位图或重试:

<!-- 错误示范:居然还加 fallback? -->
<img src="avatar.jpg" onerror="this.src='fallback.jpg'" />

<!-- 正确示范:直接裂图 -->
<img src="avatar.jpg" />

这样,用户会看到一堆破碎的图片,但至少代码更“简洁”了。

不进行任何代码拆分

把所有代码打包成一个巨大的 bundle.js,让用户首次加载等待 10 秒以上:

// webpack.config.js
module.exports = {
  optimization: {
    splitChunks: false, // 禁止代码拆分
  },
};

这样,即使用户只是访问首页,也要下载整个应用的代码。

不进行任何性能优化

setTimeout 嵌套 setTimeout,让页面卡到无法使用:

const heavyTask = () => {
  setTimeout(() => {
    for (let i = 0; i < 1000000; i++) {
      // 模拟耗时操作
    }
    heavyTask(); // 递归调用,让页面越来越卡
  }, 0);
};

这样,用户的浏览器会逐渐变得卡顿,最终只能强制关闭页面。

不进行任何代码注释

注释是给弱者的,真正的强者从不解释自己的代码:

// 错误示范:居然还写注释?
function calculatePrice(price, discount) {
  // 计算折后价格
  return price * (1 - discount);
}

// 正确示范:让后来者猜
function calc(p, d) {
  return p * (1 - d);
}

这样,几个月后,没人知道这段代码是干嘛的,只能靠“直觉”修改。

不进行任何代码格式化

代码格式化是多余的,让代码看起来像一团乱麻:

// 错误示范:居然还用 Prettier?
function cleanCode() {
  console.log('Hello, world!');
}

// 正确示范:自由发挥
function dirtyCode()
{
console.log(
'Hello, world!'
)
}

这样,团队协作时会充满“惊喜”,每个人都能写出风格迥异的代码。

不进行任何依赖管理

直接修改 node_modules 里的代码,让项目无法重现:

# 错误示范:居然还用 package.json?
npm install lodash

# 正确示范:直接改 node_modules
vim node_modules/lodash/lodash.js

这样,当别人拉取你的代码时,会发现“本地能跑,线上爆炸”。

不进行任何版本控制

git 是多余的,代码直接保存在本地,随时可能丢失:

# 错误示范:居然还用 git?
git init
git add .
git commit -m "Initial commit"

# 正确示范:直接存本地,祈祷别丢
# 什么都不做

这样,当硬盘损坏时,所有代码都会消失,真正实现“不备份”的终极目标。

本站部分内容来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益,请来信告知我们删除。邮箱:cc@cccx.cn

前端川

前端川,陈川的代码茶馆🍵,专治各种不服的Bug退散符💻,日常贩卖秃头警告级的开发心得🛠️,附赠一行代码笑十年的摸鱼宝典🐟,偶尔掉落咖啡杯里泡开的像素级浪漫☕。‌