ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

从HTML网页制作到部署上线:完整项目实战与常见问题排查

从HTML网页制作到部署上线:完整项目实战与常见问题排查 标题这串字符刚拿到手的时候说实话我愣了一下两个域名中间夹着一个/html/9还是个乱码风格的拼接乍一看像是手滑打出来的无意义字符串。但拆开之后其实信息量不小核心词就是两个www和html。再配合项目正文里的热搜词去看清一色全是 HTML 相关的内容——从网页制作、标签语法、CSS JS 知识梳理到 html 转 md、打包多个 html、html 邮件、PyQt5 显示 html、nginx 部署报错甚至爱心代码、烟花代码这类趣味页面都在里面。所以这个标题看着乱实际上指向的是一条非常完整的链路用 HTML 做网页、加样式和交互、做格式转换与工具集成、最后部署上线并排查环境问题。这篇文章我就顺着这条链路把每一个环节里值得讲的东西都拆开揉碎讲清楚。不管你是刚摸到 HTML 边缘的新手还是已经能写出完整页面、但卡在工具链或部署环节的初级开发者这篇内容都能让你少走不少弯路。1. 内容整体设计与思路拆解HTML 项目到底在做什么1.1 从标签语言到完整网页的核心逻辑HTML 全称 HyperText Markup Language翻译过来是超文本标记语言。很多人一听标记两个字就犯怵觉得这是程序员才懂的东西。其实你完全可以把它理解成盖房子时的户型图加承重墙HTML 负责把页面里的内容一块一块摆好标题是标题、段落是段落、图片是图片CSS 负责装修决定墙刷什么颜色、沙发放哪个角落JavaScript 负责水电和智能家居让开关能控制灯、按钮能触发动作。三者各司其职但 HTML 永远是地基。地基打歪了后面装修再漂亮也撑不住。实际做项目的时候我最常看到的问题不是样式写不出来而是 HTML 结构本身就不合理——比如该用列表的地方全用 div 堆、该用语义化标签的地方全是无语义容器、表单没有 label 关联、图片没有 alt 描述。这些问题在页面刚写完的时候看不出来但等到你要做 SEO、要做无障碍适配、要维护多年老项目的时候代价会成倍放大。那到底什么才算结构合理的 HTML我给你一个特别朴素的判断标准把你写的 CSS 全部删掉页面还能不能清晰地读懂内容先后顺序和信息层级。如果能你的 HTML 就是合格的骨架如果删掉样式之后页面变成一坨不知道谁是谁的 div那说明结构设计出了问题需要回头重构。1.2 方案选型背后的真实考量做 HTML 项目第一步往往不是写代码而是想清楚这个页面是给谁看、在什么端上看、多久之后还需要改。我给三个场景做个对比你就明白为什么方案选型这么重要了场景典型需求推荐技术组合原因纯展示型静态页企业介绍、活动宣传、个人主页HTML CSS 少量 JS加载快、部署简单、改版成本低交互密集型页面后台管理、数据可视化HTML CSS Vue/React 等框架数据驱动视图复杂状态不易出错富文档型页面产品手册、在线帮助、项目文档HTML Markdown 转换链内容维护效率高结构天然语义化有个热搜词是unlock music 单文件 html 离线版这个需求特别典型。它要求的就是一个 HTML 搞定全部内容没有外部依赖、没有服务器、双击就能用。这种场景下你就不能用框架不能用 CDN 外部脚本图片也得转成 base64 内联进去。也就是说你要在写代码之前就把约束条件列出来再倒推技术选型而不是上来就套最热门的方案。我自己做项目的习惯是先在纸上画出页面的信息架构——标题是什么、导航有几项、主体内容分几块、底部要放什么然后用 5 分钟快速评估这些内容哪些是可以直接用语义化标签表达的哪些需要脚本动态渲染。这个习惯帮我避免过无数次写到一半发现结构推倒重来的坑。1.3 为什么这种组合方式能规避大部分问题把 HTML 结构、CSS 表现、JS 行为三者拆开本身就是在规避问题。混在一起写不是不能跑但这三个东西的生命周期不一样结构可能几个月才改一次样式可能几周调一次脚本可能隔三差五就要修。混在一起每一次改动都要小心翼翼地在这团乱麻里找线头。尤其在团队协作里HTML 是契约——后端根据它决定输出什么数据前端根据它决定挂载什么样式测试根据它决定断言什么节点。结构稳定了其他人才敢在上面动土。再退一步说就算你永远不跟别人协作把三者分开也有个直接好处浏览器可以边下载边解析CSS 和 JS 文件还能走缓存下次访问直接读本地不用重新拉取。这是一个非常实在的性能收益尤其页面多了之后体感极其明显。2. 核心细节解析与实操要点HTML 页面制作的关键环节2.1 标准骨架不能省doctype、编码与语言声明你可能在网上见过各种各样的 HTML 代码片段有的开头是!doctype html有的开头是!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN...甚至有些片段干脆没有 doctype。有经验的开发者看到片段里没有 doctype第一时间就知道这段代码在旧项目的 email 模板或者某个临时页面里而不是一个合格的新页面。!doctype html是第一行必须写的东西它告诉浏览器请用标准模式解析这份文档。没有它浏览器会进入怪异模式Quirks Mode盒模型、行高、甚至 CSS 选择器的解析规则都会跟标准模式不一样。第二重要的是meta charsetutf-8它决定页面用什么字符集解码。UTF-8 是当前互联网的默认字符集能覆盖全世界几乎所有文字。我见过太多页面因为漏了这行或写成了gb2312导致中文全部变成乱码整个页面瞬间失去可信度。还有一个容易被忽略但很有讲究的标签html langzh-cn。这个属性表面上看只是声明页面是简体中文实际上它影响的是两件事一是浏览器翻译插件的触发逻辑二是屏幕阅读器的发音规则。你写langzh-cn读屏软件就知道用中文的语音库来读内容。这看起来是很小的一个细节但属于懂行的人一眼就能看出来你水平的细节。2.2 常用标签的选择逻辑与语义化规范HTML 发展到今天标签数量已经不少但日常项目里 90% 的场景就那么二十几个标签在反复用。关键不在于你会不会写这些标签而在于你知不知道在什么场景下用哪个。结构类标签里header、nav、main、article、section、aside、footer是 HTML5 时代的主力。它们的价值是让浏览器的提纲生成功能、搜索引擎的爬虫、以及屏幕阅读器能快速理解页面结构。举个例子你把导航写在nav里爬虫就知道这堆链接是站内导航而不是正文内容你写article爬虫就知道这段是核心内容。专业的页面标题和小结天然地依赖这些语义化标签。内容类标签里需要特别留意的是标题层级。h1到h6不是让你用来调字号的而是用来表达内容层级的。一个页面有且仅有一个h1它通常是页面名称或文章标题下面的h2是章节标题再往下h3是小节标题。我见过很多同学为了让字大一点把不是标题的文字塞进h4这在视觉上骗过了人眼却骗不过搜索引擎和读屏软件。表单类标签是另一个重灾区。一个正确的表单至少要有三件套label说明文字、input输入框、button提交按钮。label的for属性必须指向输入框的id这样用户点击文字时就能聚焦到输入框点击区域更大、对移动端更友好。还有个细节input要根据数据类型选择type比如手机号用tel邮箱用email日期用date。这样在手机上会弹出对应的专用键盘验证逻辑也会更严格。2.3 布局与样式落地从静态到响应式的必经之路HTML 结构定完之后紧接着就是 CSS。现代布局两大主力是 Flexbox 和 Grid。我的建议是一维布局用 Flex二维布局用 Grid。比如导航栏里水平排列的菜单项用 Flex 就非常顺手而一个需要同时控制行和列的卡片网格用 Grid 才是正解。响应式设计是这个环节绕不开的话题。最基础的做法是设置一个视口 meta 标签meta nameviewport contentwidthdevice-width, initial-scale1.0。没有这行代码手机浏览器会把 980 像素的网页整体缩小显示用户需要手动放大才能看清内容体验极差。有了它页面宽度才会跟随设备宽度。另一个基础是媒体查询。你可以用media (max-width: 768px)来针对手机端重排布局。实际写页面的时候我的建议是移动优先先写手机端的样式再用media (min-width: 768px)和(min-width: 1024px)逐步增强。这么做的原因是手机端的样式往往更简单先写简单的部分后面再叠加复杂布局比反过来砍功能要舒服得多。这里必须提醒一个常见坑不要用固定像素宽度撑起整个布局。我曾经帮人排查过一个页面在 1920 宽的显示器上看着完美拿到 1366 的笔记本上就出现横向滚动条。原因就是容器宽度写死成了 1200px加上 padding 和 border 就超出了视口。正确的做法是用max-width加margin: 0 auto让容器在窄屏幕上自动收缩。3. 格式转换与跨端应用HTML 的周边生态实战3.1 HTML 转 Markdown文档维护的高效路径热搜词里有html转为md这个需求在写文档的人那里非常常见。比如你有一个老产品页面想把里面的内容整理成团队内部的知识库文档或者你在调研竞品想把对方的页面结构记录下来。手写 Markdown 太慢直接复制 HTML 又带着一堆标签于是就需要转换。推荐的转换路径有这么几条命令行工具首选 Pandoc它能把 HTML 转成非常干净的 Markdown格式处理得相当专业且支持批量操作。如果你倾向于可视化操作可以用浏览器插件或者在线转换器但要注意在线工具上传 HTML 文件存在内容泄露风险涉及产线数据或内部文档时一定不要用在线服务。实际操作中有一个关键点不是所有 HTML 都能平滑转成 Markdown。表格在 Markdown 里表现力很弱复杂嵌套的 div 结构转换后可能仍然保留 HTML 标签而非变成纯 Markdown 语法。所以我的建议是转换完之后一定要人工检查一遍重点看标题层级、代码块是否有语言标注、图片路径是否仍然有效。毕竟工具只是辅助最终文档的可读性和准确性得自己把关。3.2 批量打包多个 HTML项目交付与离线分发另一个热搜词是打包多个html。这个需求通常出现在两种场景一是你要交付一批静态页面给客户或同事直接用浏览器打开本地文件二是你要做一个离线工具包比如前面提到的单文件 html 离线版但内容实在太多没法塞进一个文件。批量打包最朴素的方法是压缩成 ZIP 文件发给对方。但这里有个我踩过很多次的坑HTML 页面内部的资源路径写的是绝对路径一换环境就全部 404。举个例子你在开发环境里图片路径写的是/images/logo.png本地双击打开时这个路径的根目录是磁盘根目录浏览器根本找不到。正确做法是使用相对路径images/logo.png这样压缩包解压后放到任何目录只要目录结构不变页面就能正常显示。如果你的项目稍大已经引入了工程化的概念那也可以用构建工具来打包。Gulp 可以帮你压缩 HTML、CSS、JS并且自动重写资源路径Webpack 或 Vite 生态里的vite-plugin-static-copy之类的插件也能实现静态资源的复制和路径改写。不过对于纯静态的打包多个 html需求我的建议是别一开始就上构建工具——先搞清楚你的资源引用方式是不是相对路径这能省掉 80% 的问题。3.3 HTML 邮件与 PyQt5 显示 HTML跨端应用的两个典型案例HTML 邮件是很多人没接触过但一定会遇到的场景。它跟你平时写的网页有非常大的差异邮件客户端的渲染引擎非常保守绝大多数不支持 JavaScript甚至对 CSS 的支持也停留在十年前的水平。所以写 HTML 邮件有一套特殊规矩只能用 table 布局样式必须内联到标签上图片只能用绝对 URL字体只能用通用字体族。我刚开始写邮件时傻乎乎地用了 div 加 float结果在 outlook 里全部错位后来才明白这行当里 table 才是王道。PyQt5 显示 HTML 是另一个有意思的跨端应用。简单来说你可以在 Python 桌面应用里用QWebEngineView控件加载一个 HTML 文件或字符串做出一个富文本界面。这在做数据报告、图表展示、产品说明书的时候非常实用——你不需要自己用 Qt 的控件一笔一笔画界面直接写 HTML 加 ECharts 之类的库就能在桌面应用里渲染出漂亮的图表页面。用 PyQt5 显示 HTML 有几个细节需要特别留意第一如果 HTML 里引用了本地图片或脚本要用QUrl.fromLocalFile来正确加载第二要是你想在 Python 和 JavaScript 之间通信可以通过QWebChannel实现双向调用第三加载外部网络资源在有些环境下会被拦截尽量把资源打包到本地。这个方案做原型非常快很多工具类小应用我都推荐客户用这个思路做。4. 环境配置与服务端常见问题排查实录4.1 本地开发环境搭建从编辑器到一键环境包写 HTML 的编辑器门槛极低系统自带的记事本都能写。但真正开发起来建议你还是用 VS Code 加几个插件Live Server自动刷新浏览器、Prettier格式化代码、HTML CSS Support智能补全和跳转。这些小工具能让你的开发效率翻倍也不增加多少学习成本。本地服务器方面搜索词里出现了 phpstudy 这类一键环境包说明很多人是在 Windows 环境下做开发。这类工具的优点是省心装完就能跑 Apache/Nginx PHP 的组合缺点是你得搞清楚它的目录结构不然经常出现我明明把文件放进去了为什么访问不到的情况。以 phpstudy 为例站点根目录通常在WWW或wwwroot下面而且它会要求你对每个站点单独配置域名和根目录。如果你只是写纯 HTML 页面不涉及 PHP那用 VS Code 的 Live Server 就足够了没必要一上来就装整套环境。4.2 nginx 配置的两个高频报错root 用户与.htaccess热搜词里条出现了一条看似冷门的提示user directive is ignored when fpm is not running as root。这句话的意思是如果你启动 PHP-FPM 时没有用 root 用户那么配置文件里的user指令就会被忽略。这其实不是错误而是 PHP-FPM 的权限模型决定的——它要求主进程用 root 启动才能切换到user指令指定的用户否则就以当前启动用户运行。常见的安全做法是让 FPM 以普通用户启动不要用 root这样即使代码存在漏洞攻击者也拿不到系统最高权限。如果你看到这行提示可以检查一下 FPM 的user和group配置是否和实际运行用户一致不一致就把user指令删掉或改成和启动用户一致消除干扰。另一个报错是nginx: [emerg] createfile() d:/phpstudy_pro/www/admin2.com/nginx.htaccess。这个问题的原因通常是 nginx 配置中使用了htaccess相关的指令但目标目录不存在或者没有写入权限。网站在 Windows 上开发时尤其常见因为路径里的盘符和反斜杠很容易写错。解决思路是先确认d:/phpstudy_pro/www/admin2.com这个目录真实存在再检查目录是否允许 nginx 写入文件最后再看看配置里是不是有多余的nginx.htaccess引用有就去掉。本质上nginx.htaccess并不是 nginx 的原生配置体系这个文件更像是某些面板工具的产物出现这个报错大概率是面板生成配置的逻辑有 bug直接检查并修正配置项即可。4.3 部署后的路径与缓存问题排查思路页面部署上线之后最常遇到的三个问题是静态资源 404、页面样式丢失、修改完代码页面还是旧内容。静态资源 404 首先检查资源路径是相对路径还是绝对路径尤其是 CSS 和 JS 文件的位置和 HTML 文件的目录关系。样式丢失大概率是路径问题或 MIME 类型问题你可以打开浏览器开发者工具的 Console 面板看报错如果提示资源被 MIME 类型拦截多半是服务器把 CSS 文件的 Content-Type 配错了。修改完代码不生效基本是缓存问题——浏览器缓存了旧的 CSS 和 JS。简单粗暴的解决办法是在资源 URL 后面加版本号参数比如style.css?v20250118每次发版改一下版本号用户就能拿到最新的文件。5. 完整实战从零做一个可复用的 HTML 综合项目5.1 项目需求与页面规划前面讲了不少理论现在我们来做一个能真正上线的综合项目。需求就按照热搜词里的内容组合一个节日倒计时 爱心特效 一键返回顶部的单页应用。这个项目虽然小但它覆盖了 HTML 结构、CSS 布局、JavaScript 交互、时间计算、Canvas 绘图、滚动监听等多个核心知识点。页面规划分成四个区块顶部导航区固定定位、Banner 区展示节日信息、倒计时区卡片式展示天/时/分/秒、主体内容区放置一段关于节日活动的介绍文字。底部放一个页脚右下角悬浮一个返回顶部按钮。整个页面使用一个 HTML 文件完成CSS 写在style标签里JS 写在script标签里方便直接双击查看效果。5.2 核心代码实现与关键逻辑说明先看 HTML 结构。页面骨架如下!doctype html html langzh-cn head meta charsetutf-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title节日倒计时专题页/title style /* 样式代码见下文 */ /style /head body header classsite-header div classlogo新年倒计时/div nav classmain-nav a href#countdown倒计时/a a href#about活动介绍/a /nav /header section classbanner idbanner h1距离春节还有/h1 div classcountdown idcountdown div classcountdown-itemspan iddays0/span天/div div classcountdown-itemspan idhours0/span小时/div div classcountdown-itemspan idminutes0/span分/div div classcountdown-itemspan idseconds0/span秒/div /div /section section classabout idabout h2活动内容介绍/h2 p这里是活动正文内容可以放图文混排的模块。CSS 可以在这里使用 flex 或 grid 做卡片布局。/p /section footer classsite-footer p页面底部信息/p /footer button classback-to-top idbackToTop返回顶部/button canvas idheartCanvas/canvas script // JS 代码见下文 /script /body /html这个结构的重点在于语义化header、nav、section、footer各司其职h1只出现一次导航使用锚点链接。下面看 JS 的核心逻辑。倒计时的算法是所有这类页面的核心。逻辑很简单先设定一个目标时间new Date(2026-02-17T00:00:00)然后用当前时间减去目标时间得到毫秒差再换算成天、时、分、秒。注意这里有个细节用Math.floor来取整不要用Math.round否则出现 59.6 秒的时候你会看到60 秒的离谱显示。完整代码如下const targetDate new Date(2026-02-17T00:00:00).getTime(); function updateCountdown() { const now new Date().getTime(); const diff targetDate - now; if (diff 0) { document.getElementById(days).textContent 0; document.getElementById(hours).textContent 0; document.getElementById(minutes).textContent 0; document.getElementById(seconds).textContent 0; return; } const days Math.floor(diff / (1000 * 60 * 60 * 24)); const hours Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); const minutes Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)); const seconds Math.floor((diff % (1000 * 60)) / 1000); document.getElementById(days).textContent String(days); document.getElementById(hours).textContent String(hours).padStart(2, 0); document.getElementById(minutes).textContent String(minutes).padStart(2, 0); document.getElementById(seconds).textContent String(seconds).padStart(2, 0); } updateCountdown(); setInterval(updateCountdown, 1000);padStart(2, 0)的作用是让数字少于两位时前面补零这样 5 分 3 秒会显示成05 : 03而不是5 : 3。视觉效果和阅读体验都会好很多。返回顶部按钮的逻辑同样简洁。监听window.scroll事件滚动超过 400 像素时显示按钮点击时用window.scrollTo({ top: 0, behavior: smooth })平滑滚动回顶部。behavior: smooth是浏览器原生的平滑滚动能力不需要自己写动画循环。代码也就十几行const backToTop document.getElementById(backToTop); window.addEventListener(scroll, function () { if (window.scrollY 400) { backToTop.style.opacity 1; } else { backToTop.style.opacity 0; } }); backToTop.addEventListener(click, function () { window.scrollTo({ top: 0, behavior: smooth }); });爱心特效部分如果你只是想让页面出现一排爱心的小背景最简单的做法是用 HTML 实体字符#10084;配合 CSS 动画实现生成一组心型字符让它们缓慢上浮并淡出。但如果你想要更炫的光点粒子效果就得用canvas画布了。核心思路是维护一个粒子数组每个粒子有坐标、速度、生命值用requestAnimationFrame做动画循环每个循环里更新粒子状态并重新绘制。下面是一个可以跑起来的简化版粒子爱心const canvas document.getElementById(heartCanvas); const ctx canvas.getContext(2d); const hearts []; function resizeCanvas() { canvas.width window.innerWidth; canvas.height window.innerHeight; } function spawnHeart() { hearts.push({ x: Math.random() * canvas.width, y: canvas.height 20, size: Math.random() * 14 6, speed: Math.random() * 1.5 0.5, opacity: Math.random() * 0.6 0.4 }); } function drawHearts() { ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.font 24px serif; hearts.forEach((heart, index) { ctx.globalAlpha heart.opacity; ctx.fillText(❤, heart.x, heart.y); heart.y - heart.speed; if (heart.y -30) { hearts.splice(index, 1); } }); ctx.globalAlpha 1; } function animate() { drawHearts(); if (Math.random() 0.2 hearts.length 30) { spawnHeart(); } requestAnimationFrame(animate); } resizeCanvas(); animate();这段代码的重点在于requestAnimationFrame替代setInterval来实现动画——浏览器会自动在每一帧渲染前回调动画更流畅而且页面在后台标签页时浏览器会自动暂停绘制消耗更少。你可以把爱心字符换成任何 emoji 或文字原理是一样的。5.3 测试与优化要点页面写完之后不要急着交付。先用浏览器的开发者工具模拟不同设备尺寸重点检查三件事导航栏是否换行错位、倒计时卡片在小屏幕上是不是挤成一堆、返回顶部按钮有没有遮住内容。然后打开性能面板跑一次看看有没有明显的布局抖动或长任务。如果页面里的图片很多记得压缩图片格式能用 WebP 就用 WebP能不用大图就不用大图。还有一个我反复强调的测试项打开浏览器的无痕模式再访问一次页面。因为无痕模式下插件不会干扰而且缓存是干净的你能看到真实用户第一次访问时的实际加载效果。很多我本地看的好好的发给别人就不行的问题就是因为本地缓存了旧资源无痕模式一开就原形毕露。6. 优化方向与实际部署中的补充建议6.1 SEO 与无障碍基础优化一个只追求能打开的页面离能上线还有距离。上线意味着要让搜索引擎收录、让更多人能无障碍访问。SEO 方面除了前面说的语义化标签外还有三件套不能漏title标题meta namedescription描述以及og标签社交媒体分享时的卡片信息。title是整个页面最重要的 SEO 元素要写清楚页面主题 品牌/站点名不要只写一个光秃秃的首页。无障碍方面最基础的三件事所有图片写alt属性所有表单控件关联label所有可交互元素确保能用键盘 Tab 键到达。不要觉得这是额外负担这些工作对任何人都没有伤害但对视障用户来说是能不能用这个网站的区别。我见过不少开发多年的人在这上面栽跟头因为国内对无障碍的重视程度还不够但这恰恰是专业素养的体现。6.2 上线部署中的路径与服务器配置再提醒上线部署是很多新手的拦路虎。如果你用的是 Nginx站点配置里有一个特别容易错的地方root与index的组合。root指向 HTML 文件实际存放的目录index指定目录下默认加载的文件名通常是index.html。如果配置不对访问域名会出现 403 或 404。另外如果你的页面使用了前端路由多个路径共享同一个 HTMLNginx 还要配置 fallback 到index.html的规则不然用户刷新子路径页面就会 404。静态资源发布后建议在浏览器开发者工具里强制刷新一次确认 CSS、JS 都拿到了最新版本。如果你修改了文件名或目录结构老用户的浏览器缓存里可能还是旧文件的引用这时候v参数版本号或者给文件名加 hash如app.a1b2c3.js是最好的解决方案它会促使浏览器重新拉取资源。6.3 个人经验维护老项目的心得最后分享一个我这些年维护老项目的心得。很多代码在刚写好的那一刻是自己看得懂的但三个月后翻出来如果没有清晰的注释和结构你真的会忘了当初为什么这么写。所以从第一天开始我就在每个 HTML 文件的头部写上一段注释说明这个页面的用途、依赖的资源、最后一次修改日期。每段复杂的 JavaScript 逻辑前面也会写一行注释说明输入输出。这件事花不了多少时间但在你加班排查问题时能救命。另外文件的命名规范越早统一越好。我见过一个项目里同时存在index.html、INDEX.html、default.htm、main page.html四种首页命名服务器配置混乱、链接全部失效是必然的。统一用全小写加连字符my-page.html的风格能避开 Windows 和 Linux 大小写不敏感差异导致的无数坑。说实话HTML 这块内容上手门槛真的很低但真正能把它用好的开发者靠的从来不只是语法而是对结构、性能、兼容性、可维护性这一整套系统的理解。这篇内容是我做前端这些年踩坑攒下来的经验总结方向就是从一个看似杂乱的标题出发把 HTML 网页制作、工具链转换、环境部署、项目实战这些链路全部打通。希望你能一边看一边动手试代码这种东西只有敲进编辑器里才真正属于你自己。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进