ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Web前端练习题的正确用法:三道题带你走完开发到部署全流程

Web前端练习题的正确用法:三道题带你走完开发到部署全流程 1. 三道题的选择逻辑从组合式练习题到完整项目闭环说实话这两年陆陆续续帮不少转行朋友改过代码、看过作业发现一个非常普遍的问题题目做了不少但一打开浏览器地址栏敲起自己的项目整个人就卡住了。不是不会写语法而是不知道一个功能从零到上线要经历什么。WEB前端练习题如果只是拿来“练语法记忆”那它发挥的价值可能连一成都不到真正的做法是把三道练习题当作三个小项目从开发环境、工程习惯、验证手段到部署上线完整地“运用”一遍。当时我给自己定了一个标准三道题必须覆盖前端日常开发里最常碰到的三类问题。第一道是样式布局专门练视觉还原和响应式处理第二道是交互逻辑专门练事件处理、状态管理、数据流转第三道是数据展示专门练异步请求、接口数据处理、渲染策略。这三类问题基本构成了一个前端工程师日常工作的骨架。练完这一组再去看框架源码、再去做复杂业务心里起码有一条完整的线。我选的题分别是一个响应式卡片组件、一个待办清单、一个简单的数据看板。听起来都不难对吧难的不是“把题做出来”而是“把题做到能上线、能自动化验证、能部署给别人访问”。每道题我都会加上一些平时企业开发里才会要求的边界条件这部分是练习题原本不会告诉你的。比如待办清单不是只有“输入—添加—删除”这么简单还要考虑空值拦截、重复项过滤、状态持久化、手动编辑冲突等。这些细节才是“练习题运用”和“为了交作业而做题”的分水岭。最让我惊讶的是三道题全部完成之后我把整个项目部署到服务器在外面用手机浏览器打开那一刻的成就感比任何一次“代码跑通”都强。因为那些题目不再只活在编辑器里而是变成了一个真实可访问的产品。这也是我写这篇文章的原因想告诉你WEB前端练习题的真正用法不是刷题而是通过三道题把“开发、测试、部署”这条路完整地走一遍。这条路走通了后面学什么框架都不慌。三道题的难度设计也有讲究。不能全是简单题那样缺乏挑战性也不能一上来就是地狱难度容易直接劝退。我的排列思路是先做纯静态的样式题建立手感再做需要状态管理的交互题突破逻辑关最后做异步数据题补齐工程缺口。难度的阶梯大致是按照“体力劳动—脑力劳动—系统性工程配合”来走的每一道题都能用到上一道题的积累但又不重叠。为了让你对整个路径有清晰的感知我把三道题的定位、核心考点和验收标准整理成了一个表。后续的每一章都围绕这个表格展开你可以把它当作自己练习时的Checklist做完一条勾一条。题号题目类型核心目标能力覆盖考点验收标准第一题样式布局视觉还原与响应式语义化标签、Flex/Grid、间距系统、断点设计不同屏宽下无横向滚动、结构清晰、可被自动化识别第二题交互逻辑状态管理与边界处理DOM事件、状态渲染、数据校验、本地持久化完整增删改查、刷新后状态保持、异常输入不崩溃第三题数据展示异步请求与数据流fetch、async/await、错误处理、渲染优化数据加载有反馈、接口出错有兜底、渲染性能可接受表格能概括的只是表面真正的细节我放在了后面几个章节里。其实这三道题如果每一步都认真对待你收获的将不止是“会做三道题”而是一个可以迁移到任何前端项目上的工作流。这个工作流才是练习题的真正价值所在。2. 实践前准备把练习环境搭成“正式项目”而不是“期末作业”很多人做练习题的习惯是新建一个index.htmlCSS和JS全部糊在一个文件里写完双击打开交差。这种做法本身没有错但如果题目做完之后你还想继续折腾、继续部署、继续加自动化测试那很快就会碰壁。我个人的建议是从第一道题开始就把整个练习当成一个正经项目来搭环境哪怕三道题都很简单也值得用最小化的工程化手段来管理。一个最小化的前端项目不需要一上来就上 Webpack、Vite、React、TypeScript 全家桶。三道练习题这个体量用脚手架反而会掩盖很多基础细节让你以为“构建出来的就是自己写的”。我更推荐裸写 HTML/CSS/JS但用一个package.json和几个 npm 脚本把开发服务器、测试和部署串起来。这样既不增加理解负担又能让你体验到“项目工程化”到底在工程化什么。目录结构我是这样组织的web-frontend-exercises/ ├── index.html ├── exercises/ │ ├── layout-card/ │ │ ├── index.html │ │ ├── style.css │ │ └── app.js │ ├── todo-list/ │ │ ├── index.html │ │ ├── style.css │ │ └── app.js │ └──>npm init -y npm install --save-dev http-server playwright/test然后把package.json的 scripts 部分改成{ scripts: { start: http-server . -p 8080 -c-1, test:e2e: playwright test } }-c-1是关闭缓存开发时改完代码刷新页面不会被浏览器缓存坑到这个参数是我调试时最喜欢的一个小细节。环境搭好之后我强烈建议你顺手初始化一个 Git 仓库并养成每完成一个小功能就提交一次的习惯。练习题的每一道题都可以拆成几个有意义的 commit比如“第一题完成基础布局”“第一题适配移动端断点”“第一题通过自动化测试”。这么做的好处一是后来翻 commit 历史能清楚地看到自己的思路演变二是提前养成版本管理的肌肉记忆。以后进团队、进项目这一条会直接被别人高看一眼。还有一个容易被忽略的准备浏览器的开发者工具必须顺手。练习阶段要频繁查看元素、调试样式、观察网络请求和控制台报错开发者工具的熟练度直接决定调试效率。我见过太多人把宝贵的练习时间花在“不知道错在哪”的迷茫里其实 DevTools 已经把答案贴在你脸上了。三分写代码七分查问题这是前端练习的正确打开方式。3. 第一道题实战响应式卡片布局把“还原度”做成肌肉记忆第一道题我选的是一张产品卡片包含缩略图、标题、简介文字、标签和操作按钮。这种卡片在真实的网页里无处不在电商、博客、后台管理面板满屏都是类似的结构。它的难度不算高但非常考验你对HTML结构和CSS基础的理解。因为这题的目标不是“能显示出来”而是要做到语义化合理、间距统一、缩放不破、按钮可点击区域足够。3.1 页面结构先给内容排好骨架再谈视觉很多新手一做布局脑子直接冲进“怎么让它好看”里面颜色、圆角、阴影全先堆上去最后发现改动一处整个结构就乱。正确的顺序应该是先定骨架你想让这张卡片在网页里承担什么语义它是一个独立的内容块所以最外层用的是article里面依次是img放缩略图、h3放标题、p放简介、ul放标签列表、button放操作按钮。这里有几个细节值得多说几句。标签列表我没有用div一串到底而是用了ul因为标签本质上是“一组平级的列表项”。屏幕阅读器读起来语义更清楚而且未来如果标签需要批量操作querySelectorAll直接可以选中所有列表项不需要加额外class。这个思考习惯非常重要——同样的效果有几十种写法但“为什么这样写”的底层逻辑才是练习题真正想让你掌握的。缩略图我设置了alt文本这是可访问性的基础同时它还能在图片加载失败时提供占位信息。操作按钮里加了一个aria-label因为只写一个“查看”两个字屏幕阅读器无法知道你到底要查看什么。这些细节看起来琐碎但是没有它们你的页面只是一个“长得像网页”的图片而不是一个真正意义上的网页。3.2 布局方案Flexbox还是Grid我的取舍方式卡片内部是小范围的一维排列顶部图、下面内容区竖排标签横向排布。这种情况用 Flexbox 就够了。但卡片本身需要放在一个“网格状”的页面里让它能随屏幕宽度换行排列最外层我用了 Grid。这里面的取舍逻辑是Flexbox 擅长处理单一方向上的排列与对齐Grid 擅长处理二维平面上的行列排布。你把“卡片内部结构”和“多个卡片的摆放”混在一起想就容易绕晕。分开想答案自然就出来了。很多布局题难不是难在写代码而是难在没把布局拆成“外层布局框架”和“内层内容排列”两个层面。外层网格我写成了这样.cards-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 24px; }auto-fill配合minmax(280px, 1fr)这一行就能自动处理从手机到桌面的大多数场景。卡片数量不定宽度小于 280px 就换列剩余空间由1fr分配。这套写法不依赖任何媒体查询就能完成基础的响应式亲手敲一遍你会由衷觉得 Grid 是近几年 CSS 里最值回票价的功能之一。卡片内部的间距我用了一个统一的间距变量比如所有margin和padding只从4px/8px/16px/24px里取。没有设计系统概念的人可能觉得这样很死板但实际项目里统一的间距体系能减少大量“这里多2px那里少2px”的无效调样式时间。养成这个习惯后面做任何模块都能一致性极高直接降低视觉返工率。3.3 一个容易被忽略的细节按钮的可点击区域做卡片的时候很多人只关心“按钮好不好看”忽略了“按钮好不好点”。在触屏设备上如果操作按钮的高度太小点按会非常吃力且容易误触。我给按钮加了一个最小高度同时对卡片本身做了点击区域的扩展就是用伪元素把按钮的可点击热区放大了一部分。这在PC上感觉不明显但手机上一试就高下立判了。这题做完之后建议打开DevTools的设备模拟模式从 375px 宽度一路拉到 1920px。重点看三个东西有没有横向滚动条文字有没有被截断卡片之间的间距是否一致。满足这三点布局题才算真正过关。我第一次跑完这套流程时发现原来“像模像样”的页面在窄屏下会有很多肉眼发现不了的问题比如按钮文字被折行、图片被拉伸变形。这些坑单靠“写完代码浏览器打开看一眼”根本发现不了必须系统地用设备模式过一遍。4. 第二道题实战待办清单交互逻辑真正拉开差距的是“边界条件”第二道题是待办清单前端练习里的经典题目几乎每个人都写过。但我要先泼一盆冷水绝大多数人写的待办清单本质上只是“能增能删”的玩具距离一个可以使用的小工具还差得很远。交互逻辑题的考察重点不在于核心路径通不通而在于异常路径和边界条件下你的应用会不会崩、会不会产生脏数据。4.1 状态模型从“操作DOM”切换到“操作数据”很多初学的做法是添加一个待办直接createElement插入列表删除一个待办直接removeChild。这种“面向DOM编程”的方式在小规模场景下可以跑但只要你稍微加一点功能就会失控。比如你需要在“全部、未完成、已完成”三种视图之间切换DOM直接操作就面临灾难——你必须反向从页面里“猜”当前的状态。我的做法是把状态抽出来用一个数组当作“数据库”let todos [];所有操作都先改数组然后重新渲染列表。添加、删除、切换完成、编辑文本这些都是纯数据操作渲染只是把最新的数组同步到页面上。这就是面试里常说的“数据驱动视图”。这种思维的转变是我认为待办清单这道题里最核心的价值它让你从“操作页面”的习惯升级为“操作状态”的习惯。后面不管学 Vue 还是 React无论是响应式、单向数据流还是状态管理底层都是这一套逻辑的规模化。初始数据我建议用几个假数据塞进去方便调试比如{ id: 1, text: 练习CSS Grid, done: false }这种结构。每个待办包含唯一 id、内容和完成状态。id 是数据模型里最容易被人忽略的字段没有它后续去定位到底要更新哪一条数据会变成一件非常尴尬的事情。生成 id 最省事的方式是Date.now().toString()本地练习完全够用不必上 uuid。4.2 边界条件清单这些才是“能不能用”的分水岭做完基本功能之后我在这个项目上花了大量时间去打磨边界条件并且把每一个坑都记录了下来。这里列几个我认为最典型的场景你完全可以照着这个清单去检查自己的代码。首先是空输入。用户什么都没输入就点击“添加”如果你直接push一个空字符串页面上就会出现一条空白待办看起来像 bug本质是数据校验缺位。解决办法是加一道拦截const text input.value.trim(); if (!text) return;trim()会去掉首尾空格避免用户只敲几个空格时你拿到的依然是一个“看似非空实则为空”的字符串。这个细节看起来小但真实用户会理所当然地敲几个空格再点按钮如果你不做拦截脏数据就会混进去。其次是重复项。如果用户连续添加了两条一模一样的待办这合理吗我的处理是在todos.some()里检查是否已存在相同文本是的话就给出一个提示不再重复添加。这属于产品策略问题——没有标准答案但你必须主动做一个决定而不是什么都没想。这个“做决定”的过程就是练习题刷得再多也练不出来的产品思维萌芽。第三是切换视图时状态的一致性。你正看着“未完成”列表把其中一条标记为完成这一条在语义上立刻应当从列表里消失。如果只是改了数据但没重新渲染就会出现“状态和页面不一致”的尴尬。这块我统一封装了一个render()函数任何状态改变后都调用它确保页面始终跟数据同步。千万不要在多个事件回调里零零散散去手动操作对应的DOM节点那样你很快会被状态同步的细节淹没。第四是本地持久化。刷新页面后数据全没了这是“玩具”和“工具”的分界线。用localStorage把 todo 数组序列化存下来刷新时再读出来。需要说明的是存取都要做容错处理比如旧数据可能格式不对用try...catch包一下宁可读取失败给个空数组也别让整个页面崩溃。这一步做完待办清单才真正能每天都用。4.3 多一个维度的思考手动编辑与键盘操作基础功能完备之后我在待办清单里又加了一个手动编辑的能力双击待办文本把它变成输入框按回车保存失焦保存或取消。这个功能在商业产品里非常常见但平时很少有人作为“练习题”去要求自己。实现的核心是切换渲染模式给被编辑的那条待办一个editing状态渲染时如果是编辑态就输出input否则输出普通文本。键盘操作也值得加进去比如在输入框里按回车键触发添加按 Esc 取消编辑。这些“润色”级别的小交互恰恰是前端体验的质感来源。我见过很多代码功能全都有但用起来很别扭就是因为缺少键盘操作、焦点管理、状态联动这些软细节。把这道题当作产品去打磨比把它当作题目去解收获完全不同。如果你发现改来改去之后代码开始乱了那就是时候停下来重构一遍。我自己在这个阶段就经历过一次“代码失控”的周期最后冷静下来把所有操作都收口到几个纯函数里整个待办清单的实现才重新变得清爽。重构不丢人它是练习中最重要的环节之一甚至比写新功能更能锻炼能力。5. 第三道题实战异步数据面板连续跨过了接口、状态和渲染三座山三道题里前两道都是“本地数据”的自娱自乐——页面里所有的数据都来自用户自己的操作或者写死的常量。但是真实的前端项目几乎没有一个不跟服务器打交道。所以第三道题我特意设计成数据展示类请求一个公开API把数据渲染成图表。为了不引入额外的依赖图表我也决定直接用CSS画柱状图。5.1 为什么要选公开API而不是自己Mock数据自己写一个假的JSON数组塞进去一样能练渲染但这样一来你就完全绕开了生产环境里最容易翻车的几个环节真实网络延迟、接口偶发失败、数据结构与预期不符、跨域拦截。用真实公开API的好处在于所有这些问题你都会原封不动地遇到一次而解决过一次之后你对“前端请求数据”这件事的认知会彻底不一样。我选的接口是一个无需鉴权、支持跨域、数据量适中的 JSON API。这类公开接口有很多比如有的返回币种价格、有的返回天气信息、有的返回热门文章列表。从练习角度看选一个包含数组结构和数值字段的接口最合适方便做排序、聚合和柱状图渲染。比如一组对象的列表每个对象里有标题和数值这种结构天然适合展示。请求数据我用的fetch配合async/await写异步逻辑。这题的重点本来就在异步所以要写出带loading、error、success三态的完整流程async function loadData() { renderLoading(); try { const res await fetch(apiUrl); if (!res.ok) throw new Error(HTTP ${res.status}); const data await res.json(); renderChart(data); } catch (err) { renderError(err.message); } }这里有一个初学者很容易忽略的点fetch只有在网络层出错时才会 reject并不会因为接口返回400或500就自动进catch。所以一定要手动检查res.ok否则你会拿到一个错误响应体的 JSON却以为自己请求成功了。这是实战里极其常见的坑我在公司看到不止一个新人在这里栽过。5.2 数据清洗接口返回的数据不能直接用拿到原始数据之后下一步绝对不是直接渲染。绝大多数真实接口返回的数据要么有不需要的字段要么排序不符合你的要求要么有些条目的数值缺了“单位”。我的做法是先做一层数据清洗把需要的字段抽出来过滤掉异常值再排序。比如说接口返回 50 条数据我只需要前 10 条又比如某些条目的数值是字符串比如 “1,200”直接渲染会导致排序错乱。这些问题在假数据里永远不会出现但真实环境几乎每年见一次。把数据清洗作为一个专门的步骤写进代码里能让你后面的渲染逻辑极其干净。一个可复用的小函数加一段注释就把脏数据挡在了系统之外这个习惯值得每个前端练起来。5.3 CSS柱状图不依赖图表库的渲染方案柱状图没有引入 ECharts 或 Chart.js原因很简单我想确认自己能亲手用 CSS 画出基础图表而不是什么都依赖库。用 CSS 画柱状图的核心思路是把渲染容器变成一个 flex 排列的横向条每根柱子用height百分比表示数值大小柱子之间留出间隙。渲染之前要计算最大值把所有数值统一映射到一个固定高度区间内。比如容器高度是 200px全局最大值对应的柱子高度就是 100%其他柱子按比例算const max Math.max(...items.map(item item.value)); const barHeight (item.value / max) * 100;数值只有一位小数时的精度问题也要考虑好在 CSS 的百分比是可以接受小数的。这里我遇到的麻烦是接口返回的数据量变多之后柱子会挤成一团。解决办法是给每根柱子一个最小宽度同时给最外层容器加overflow-x: auto让它在极端数据量下横向滚动而不是压缩变形。很多初学者一遇到“柱子挤了”就不知道该往哪调其实就是缺少这套“最大高度基准 数据量弹性”的思路。异步这题的另一个收获是加载态的视觉反馈。数据到手之前的几百毫秒里页面绝不是一片空白而是要有一个明确的“正在加载”提示接口出错时也要有一个友好的错误提示而不是控制台里的一行红色报错。这一套三态体验写完之后这个数据面板才算有一个小工具该有的样子。你完全可以再往前一步加一个“重试”按钮触发重新请求把异常恢复的闭环补上。真实产品里几乎所有请求失败之后都要给用户一条退路这是你练习时最值得主动加的一个隐藏需求。6. 用自动化测试给练习“上强度”把Playwright请进场三道题实现完很多人会觉得已经大功告成可以部署了。但我建议你在部署之前再停留一下做一件看似多余、实际上回报极高的事情给三道练习题写上端到端测试。这个灵感来自于我在实际项目里被测试补作业补到怕的经历——每次手工点页面验证一遍都需要花掉大量时间还容易漏点。如果练习阶段就引入自动化测试相当于给每一道题的验收标准上了一把锁。这里我选的是 Playwright。为什么不选 Selenium 那些老牌工具Playwright 的体验对个人练习项目来说最舒服安装简单、可以自动下载浏览器内核、提供清晰的中文文档还带录制脚本的工具。它可以真正做到“打开真实浏览器页面模拟用户点击输入断言页面状态”正好覆盖我以为只有手动验证才能覆盖的那些场景。先安装测试依赖和浏览器内核npm install --save-dev playwright/test npx playwright install chromium装好之后在tests/e2e.spec.js里写核心用例。以第二道待办清单为例我写了这样一条核心链路test(待办清单添加、完成、筛选、持久化, async ({ page }) { await page.goto(/exercises/todo-list/index.html); await page.fill(#todo-input, 学习Playwright); await page.click(#add-btn); await page.waitForSelector(text学习Playwright); await page.click(.todo-item .toggle-btn); await page.click(.filter-completed); await page.waitForSelector(text学习Playwright); });第一条写完跑了一遍立刻发现一个之前一直没注意的问题我把文字存进去之后列表刷新了但输入框的值没有清空用户会误以为自己点了两次添加。手动测试时其实也能发现但人点来点去容易走神自动化测试则会直接标红告诉你“断言失败”。这种机械化、冷冰冰的反馈对纠正自己的编码疏漏极其高效。第三道数据面板的测试稍微复杂一点因为涉及真实网络请求。我的做法是断言“页面最终会出现柱状图元素”并且不管加载完成后有没有数据页面上一定有一个.chart容器。如果接口临时挂了页面要么显示错误提示要么显示重试按钮这两个结果都比“页面一片空白”强。自动化测试最大的价值不是证明代码没问题而是在你改了之后立刻告诉你“哪些行为悄悄变了”。测试用例全部跑通之后你会对整个项目的信心大增。我的个人体验是以前改一行CSS都怕把别的模块搞坏有测试盯着之后下手果断了很多。对练习而言这是一份“可重复验收”的踏实感对未来的工作而言这就是最基础的测试素养。很多公司招前端的时候根本不指望你会写多复杂的测试框架但如果你能在自己的项目里主动加入自动化测试并且说得清楚为什么这么写这个加分项是实实在在的。7. 让练习成果在线可访问部署带来的三个新认知所有本地开发都完成之后我推荐你把整个项目部署到一个可以通过公网访问的地方。这一步看起来跟“练习题”没什么关系但它能让你补上整个开发链路里最容易被忽略的一块拼图上线视角。部署方式我选择的是先把项目推到一个 Git 仓库再通过服务器的静态站点能力发布。整个部署过程不需要后端因为三道题都是纯静态页面。你需要理解的核心就三点文件路径、跨域策略、缓存行为。这三样在本地开发时几乎不会被注意到部署之后每一个都可能变成具体的问题。第一是文件路径问题。本地开发时我的入口文件是根目录的index.html内部链接写成了相对路径比如./exercises/todo-list/index.html。如果部署在域名的子目录下相对路径一般没事但如果你使用了一些带/的绝对路径部署后可能全部变成404。这是新手部署最常见的翻车点之一。我的建议是从练习一开始就全部使用相对路径并且不要在本地服务里给入口文件设置复杂的 rewrite 规则保持路径模型简洁。第二是跨域问题。第三道题在本地请求公开 API 时如果接口允许 CORS那本地和线上行为是一致的部署不会出问题。但如果你在本地是关掉了浏览器的安全策略来“绕过跨域”的那部署到线上之后这一招就失效了。所以练习一开始就要养成“用标准方式解决跨域”的习惯而不是用临时手段掩盖问题。公开 API 一般都会配好 CORS如果你自己想请求的接口没有 CORS 支持那就换一个接口不要强行“破解”。生产环境里跨域问题的解法是配置网关或代理这不是纯前端层面能硬解的所以练习时就避开烫手山芋。第三是缓存问题。部署后最诡异的体验是明明改了代码重新部署浏览器刷新看到的还是旧页面。这通常不是服务器没更新而是浏览器或 CDN 缓存了旧的静态资源。练习项目里我用了一个很笨但有效的方案更新文件后手动改一下引用路径里的查询参数比如style.css?v2。生产项目会有更复杂的指纹方案但练习阶段理解“缓存会让人看到旧内容”这件事本身就已经值回部署的成本了。部署完成之后我用手机浏览器打开了自己的练习站点。在 5.5 英寸的屏幕上用缓慢的 4G 网络加载数据看板那种“一个完整的web前端小项目真的上线了”的实感跟本地任何一次调试成功都完全不同。你会开始认真思考我的首屏加载是不是太慢图片要不要压缩按钮跟拇指的接触面积够不够大这些由真实访问场景逼出来的问题是任何练习题答案都教不会你的。部署还有一个没有被足够强调的副作用它让你有了一个“可以给别人演示”的作品链接。找工作、交作业、秀给朋友看这个链接就是证据链的最后一环证明你不仅会写代码还知道怎么把一个东西交到用户手上。8. 练习完成后的复盘清单让三道题沉淀成一套方法三道题全部完成、测试通过、部署上线之后我并不建议你马上开下一组题。给自己留一个小时把整个过程从头到尾复盘一遍。复盘的产出物不是又一行代码而是一张“可复用的方法清单”。这张清单会在你做复杂项目时不断在脑海里浮现帮你把万变不离其宗的经验迁移过去。我的复盘分四个维度。第一个维度是“哪些代码写得最费劲”以及“当时为什么费劲”。比如我在写第三道题的异步错误处理时发现自己老是忘记检查res.ok反思之后我意识到这是因为对fetch的行为模型不够熟悉。找到根源之后我把这个知识点记进了笔记并且决定以后在代码里所有fetch调用都要统一封装一个request()函数把错误处理固定在里面。这个决定直接提升了我后来写所有数据请求代码的质量。第二个维度是“哪些地方用了最笨的办法”。比如我在第一道题里手动调三四个像素的间距调了快二十分钟复盘时发现其实用gap配合统一的间距变量十分钟内就能搞定。笨办法的积累不是耻辱它反而精准地暴露了你的知识盲区。第三个维度是“自动化测试帮我发现了哪些手工点测发现不了的问题”。我总结下来最大的收获不是“测试能发现bug”而是“测试逼着我把验收标准写清楚”。当你必须用一句断言来描述“这一条待办完成了”你会发现自己对产品行为的定义有多模糊。写清楚断言等于把隐形标准显性化这是只有经历过的人才能体会到的价值。第四个维度是“如果不做这道练习我会在什么地方翻车”。第一道题的答案是响应式断点下的按钮热区第二道题的答案是本地持久化的容错第三道题的答案是接口数据的清洗。这三件事在真实项目里几乎每周都会遇到能在练习阶段提前踩一遍后面真上了战场就能少流不少血。复盘最后我写了一张“三道题练习清单”把这次项目里最值得重复执行的动作都列在上面初始化工程结构时先建目录再写代码样式题先语义化后视觉交互题先定状态模型再写事件数据题先清洗数据再渲染测试覆盖核心用户路径部署后主动检查缓存和路径。清单不长但每一条都是从这一次“练习题的运用”里提炼出来的。下一次我面对的不再是三道练习题而可能是一个实际需求、一个公司项目这套方法依然适用。练习题的真正意义从来不是让你“会做那道题”而是让你借这几道题提前把未来要走的整条路走一遍。
返回列表