面向产品设计的 Web 前端分享会(分享会记录)

李瑞东 发布于
封面图

最近听说部门里面的产品或本地化运营对 Web 前端相关的内容比较感兴趣,正好我有相关的实践经验,所以在公司做了一个 Web 前端相关的分享会。分享内容包含:

  1. 使用 Devtools:介绍 Chrome 浏览器内的模拟、编辑和审查工具;
  2. 网页和部署:介绍 HTML, CSS, JavaScript, React,以及网站的部署和托管;
  3. 网页性能指标:介绍网页性能常用指标和测量工具;
  4. 资源分享:分享浏览器插件、网站和课程推荐。
分享会议程幻灯片,列出四个主题:使用 Devtools(Chrome 模拟编辑审查工具)、网页和部署(HTML/CSS/JavaScript/React 及托管)、网页性能(常用指标和测量工具)、资源分享(插件与课程推荐)。

与以往不同的是,这次分享会中加入了互动环节。我做了一个 🛝 Playground,尝试帮助观众了解 React,以及 React Props 的概念,并留了两个小任务,给观众尝试去实践对 React 项目进行编码。

完整的分享内容内容请继续浏览本文。

使用 Devtools

这个章节主要介绍 Chrome Devtools 一些可能不为人知的功能,来帮助我们提高日常工作中的效率和解决一些问题。先介绍 Devtool 里面「模拟」相关的功能。

模拟设备和屏幕尺寸

在 Devtool 里打开设备工具栏,在这里除了能够自由调整网页宽高,还能够模拟各种主流设备的屏幕。

甚至还能读取到网页里面的断点样式,提供快捷切换各种断点的方式。

Chrome Devtools 设备工具栏截图,展示设备列表下拉菜单,包含 iPhone SE、iPhone XR、iPad Air、Samsung Galaxy 等主流设备选项,右侧同步显示对应设备的网页渲染效果及 Elements 面板中的断点样式代码。

需要注意的是,这里模拟的设备是会带上 UA 的,所以如果想在电脑里调试一些做了移动端特化处理的网站(比如访问主域名时,判断到是手机设备,则会跳到移动端的专门网站),是需要用到这个功能的。

模拟伪类

Devtools 还可以帮助我们排查各种交互状态下的样式问题,最常用的是,比如说我们想仔细排查某个元素的悬停和按下状态的样式,则可以在选中元素之后,勾选对应的伪类选项。

Chrome Devtools 样式面板截图,展示「Force element state」功能区域,可勾选 :active、:focus、:hover、:visited 等伪类选项,强制模拟元素交互状态以排查对应样式问题。

模拟媒体

在渲染面板(需要手动开启,浏览器默认是没有打开这个面板的)能够模拟部分系统设置,比如亮暗模式、打印模式、高对比度和减少动态效果等。

Chrome DevTools 中开启 Rendering 面板的两步操作截图:左图展示通过「More tools → Rendering」路径打开面板,右图展示 Rendering 面板中可模拟 prefers-color-scheme、media type、forced-colors、prefers-contrast、prefers-reduced-motion 等 CSS 媒体特性的选项列表。

与之对应地,可以扩展一个概念叫做 CSS 的媒体查询,CSS 还可以探测到很多用户设备的属性或者设置,比如设备指针精度、视窗比例、当前是否全屏模式、设备方向等…
能探测的内容很多,但实际能用起来的可能只有寥寥数个,最全面的信息可以取 MDN 上查看。

MDN 文档截图,展示 CSS @media 媒体特性列表,包含 any-hover(是否支持悬停)、any-pointer(指针设备精度)、aspect-ratio(视窗宽高比)等可查询的设备属性条目。

编辑网页文字样式

Devtools 还提供了一个新的字体编辑器,能够让我们实时更改网页中的字体家族、字体大小、字重等属性。

Chrome DevTools 的 Experiments 设置面板,已勾选「Enable new Font Editor tool within the Styles Pane」选项,右侧字体编辑器面板展示了字体家族(SF Pro Text)、字号(17px)、行高(1.4705)、字重(400)等可实时调整的属性。

编辑网页内容

我们在 Devtools 控制台里面执行代码 document.designMode = 'on' 后,就可以实时在本地修改网页文字内容了,就跟平常打字一样。很适合用在测试文案长度的场景。最后也会分享一个浏览器插件,能够对网页做更多的编辑。

演示截图:在 Chrome Devtools 控制台输入并执行 document.designMode = 'on',使苹果官网的 MacBook Pro 页面进入可编辑状态,网页文字可像普通文本一样直接修改。

审查 React 组件

最后介绍一个审查 React 组件的方法,有时候我们想看某个元素是不是用的组件库,或者这个组件包含了什么属性之类的,可以下载 React Developer Tools,然后点选网页中的任意元素,进行审查。

两张 React Developer Tools 使用截图:上图展示审查 Button 组件,可见 size、type、ghost 等 props;下图展示审查 Input 组件,可见 allowClear、autoFocus、maxLength 等属性。

网页和部署

接下来我介绍一下网页构成和网站部署相关的内容。

通常来说,HTML, CSS, JavaScript 是构成网站的三个要素。其中:

  • HTML 用来用于定义网页的结构和内容,可以用来创建网站的各个部分,比如标题、段落、图片、链接等。
  • CSS 用来定义网页的样式和布局,这个可能会是咱们设计师比较熟悉的部分,我们能够利用 CSS 来定义 HTML 元素的各种样式,控制它们的布局和位置。
  • JavaScript 用来实现各种功能逻辑和操作交互。比如响应点击事件、动态修改网页内容,根据条件执行动画效果或展示特定内容等。
网页三要素示意图:HTML(橙色盾牌图标)负责页面结构,CSS(蓝色盾牌图标)负责样式,JavaScript(黄色方块图标)负责功能逻辑

CSS 预处理器

上述的三种语言,都有各自对应的语法规则。而 CSS 预处理器,则改进了原有的 CSS 语法,使我们能使用更复杂的逻辑语法,比如使用变量、代码嵌套和继承等。
简单来说,CSS 预处理器能让我们写样式代码的过程更顺畅,使代码有更良好的可读性和扩展性,帮助我们更好地维护代码。

三个常见 CSS 预处理器的 Logo 展示:Sass(粉色手写风格)、Stylus(黑色草书风格)、Less(蓝底白字花括号风格),均可替代原生 CSS 语法、支持变量、嵌套和继承等高级特性。

举个简单的例子,比如原本的 CSS 语法中要求我们给每一个元素写样式时,必须以花括号开始和结尾,而且每一条样式规则直接都要以分号隔开,而 Stylus 则能够让我们跳出这个限制。直接用换行和缩进来代替。

CSS 与 Stylus 语法对比:同样实现 body 内边距和 input 悬停颜色,CSS 需 11 行(含花括号和分号),Stylus 仅需 8 行,通过缩进嵌套省略花括号与分号。

CSS 框架

另一个值得一提的概念是 CSS 框架。CSS 框架则提供了一套预设样式,比如颜色板、字体梯度,布局和断点设定等;以及一些常用组件,如导航栏、对话框和页脚等。

简单来说,就是提供了一批开箱即用的样式,便于开发者快速启动项目,同时也会保留高度自定义的空间,用于支持各种各样的需求。通常 CSS 框架都会包含使用某个 CSS 预处理器,甚至内置了一些图标库,主打一个 "开箱即用"。

两个常见 CSS 框架的 Logo 展示:左侧为 Bootstrap(紫色背景白色 B 字图标),右侧为 Tailwind CSS(深色背景配品牌文字与波浪图标)。

这里稍微介绍一下一个 CSS 框架:Tailwind CSS。是一个高度定制化的 CSS 框架,通过大量的预定义类名,使开发人员快速构建和设计网页界面。

与其他 CSS 框架相比,有一个显著的特点是 Tailwind CSS 本身不会包装一个组件出来,比如按钮、输入框的样式,没有预设好的。取而代之的是,Tailwind CSS 将各种原子级的 CSS 类名包装起来,比如:

  • 设置左右两边的 Padding,用 px-[...] 类名来实现;
  • 设置一个元素为块级元素, 用 block 类名来实现…
Tailwind CSS 与传统 CSS 的代码对比:Tailwind CSS 直接在 HTML 标签的 class 属性中写入原子级类名(如 py-4、px-6、block、rounded-md),而传统 CSS 则使用语义化类名(如 navigation、btn-primary)并链接到独立的 CSS 文件。

如果想要在 TailwindCSS 中,使用打包好的组件,达到开箱即用的效果,可以通过各种官方/非官方的模版或组件生态来进行。比如:

React

接下来介绍另一个概念:React。这是一个用于构建 Web 和原生交互界面的库(是的,它能够用来做 App,不仅仅是网页)。而且引入了 JSX 语法,将 HTML 和 JS 结合起来,以一种更直观和易于理解的方式描述界面的结构和内容。

React 介绍幻灯片截图:深色背景,左侧导航显示「网页和部署」章节,主要内容说明 React 是用于构建 Web 和原生交互界面的库,引入 JSX 语法将 HTML 与 JS 结合,右下角展示 React 原子图标。

React 有一点和我们的设计稿很像,就是它的组件思维。在构建用户界面时,React 主张先把内容分解成一个个可以复用的组件(把具体的交互、功能逻辑写在组件里面)。然后在页面中将各个组件连接起来,使数据流经它们。

下图引用了官网中的一个例子,其中:

  1. 完整的应用,可以理解为由多个组件拼接成的完成网页;
  2. 搜索组件,用来获取用户输入;
  3. 数据列表,会根据用户搜索来过滤和展示内容;
  4. 每个列表的表头;
  5. 表格内每条数据。
React 官网组件拆分示例:一个可过滤商品表格被拆分为 5 个层级组件——FilterableProductTable(整体)、SearchBar(搜索栏)、ProductTable(数据列表)、ProductCategoryRow(类别表头)、ProductRow(单行数据)。

现在我们用一个具体例子来简单介绍下 React 的组件。

React 组件示意图:App.jsx 页面包含 Profile、Gallery、FAQ 三个子组件,Profile.jsx 的代码(含图片、标题、描述的 div 结构)与右侧输出页面中 Gary Simon 的个人信息卡片一一对应。

在上图中,展示了一个页面页面 App.jsx 包含了 Profile、Gallery 和 FAQ 组件,以及 Profile.jsx 组件的代码。右侧是输出页面,展示了三个组件拼接而成的页面效果示意图,其中 Profile 组件模块里展示的内容,是和 Profile.jsx 文件内代码一一对应的。

上述的组件只是将一个模块包装起来,使其能够被其他地方复用。但组件内容是固定的。接下来会为大家展示如何向组件传递 Props,实现上文提到的一句话 "使数据流经他们" 。

React Props 传递示意图:左侧 App.jsx 将 imgSrc、name、desc 三个 props 传入 Profile 组件(标注 "传递"),右侧 Profile.jsx 在函数参数中接收(标注 "接收"),并在 JSX 中使用这些数据(标注 "使用")。

在上图中,我们先将一些 Props 传递给组件 Profile(比如这里传递了图片的地址、人物姓名和描述),然后在 Profile 组件内接收这些 Props,并在组件代码内使用这些数据。

现在,我们就做出了一个可以复用的组件了,可以根据不同的内容来展示相关的人物信息。

大家有没有觉得这种做法有点熟悉?是的,在 Figma 中,我们的组件里面也有类似的做法。Figma 组件同样同样传递字符串、布尔和组件等内容。

Figma Dev 模式界面截图:左侧展示四个 Button 组件变体(实心/描边、不同圆角),右侧 Component 面板显示该组件的 Props 参数,包括 rounded(false)、style(primary)、btnText(string 类型),与 React 组件的 Props 概念一一对应。

实际上 React 组件可以传递的参数不仅仅只是上面例子中的字符串和布尔值,还能传递数值、函数、对象、Node 类型甚至另一个组件等。

我做了一个简单的 Playground,提前封装好了一个 Profile 组件,会传递一些字符串、布尔值(是否展示网站标签)以及数值(圆角大小),帮助大家更好地理解。

🛝 Playground

我做了一个 🛝 Playground ,大家可以在里面看到这个组件的具体的情况,实际看一遍代码可能会帮助理解 React 的组建和 Props 概念。

同时我也写了两个小任务给到大家去尝试,大家可以在上面的编辑器中自由尝试。

发布网站

到了这里,相信大家对构建一个网站已经有了初步的认识,接下来我为大家介绍下如何将构建好的网站发布的互联网当中,能够真正地被世界各地的人们浏览。

方法一:部署到服务器
这是比较传统的方法,先将项目相关的文件放进服务器里面(比如阿里云 ECS,或轻量服务器等)。然后在服务器内安装 NGINX,索引到项目文件夹,定义好首页、端口、404 等场景,最后将域名解析到服务器 IP。之后我们的网站就能在互联网上被人们访问了。

将网站部署到服务器的三个步骤:一、将项目文件上传至服务器(如阿里云 ECS);二、安装 NGINX 并配置网站文件目录和 Index;三、将域名解析到服务器 IP。

方法二:托管到服务商
这种是相对省心的方法,将我们项目所在的 GitHub 仓库,链接到服务商的托管服务当中。等于是由服务商来帮我们部署、发布项目,不用自己来配置服务器的各种内容了。下图列举了几种常见的网站托管服务商,分别是:Vercel,Github Pages 和 Netlify。

三个网站托管服务商的 Logo 展示:Vercel(黑底白色三角形标志)、GitHub Pages(黑底白色文字)、Netlify(黑底青色品牌标志),均支持将 GitHub 仓库直接链接并自动部署发布。

以 Vercel 来举例,除了能够托管网站之外,对每一次发布进行管理,甚至能够是对不同代码分支进行独立发布,还能收集网站访问数据等。

Vercel 平台界面截图,展示 Deployments 部署列表与 Speed Insights 性能面板,其中 FCP 为 3.05s、LCP 为 2.61s、CLS 为 0.019、FID 为 4ms,并附有 FCP 随时间变化的折线图。

网页性能

接下来为大家介绍网页性能相关的内容。通常一个网站性能好不好,我们能够在体验时主观地感受到,比如打开时很慢、滚动时卡顿,或者点击按钮后很久才响应等等。但如果要准确地判断到网页的性能到底如何,是需要依赖具体指标的。

下面介绍三个常用的指标,分别是:FCP(首次内容绘制)、LCP(最大内容绘制)以及 CLS(积累布局偏移)。

FCP(首次内容绘制)

FCP 是一个关键指标,用来测量页面从开始加载到第一个页面内容在屏幕上完成渲染的时间。越快的 FCP 时间能够让用户感知到网页有在正常运行,而不是停滞、无响应。

这里提到的 "内容" ,指的是文本、图像(包括背景图像)、<svg>元素或非白色的<canvas>元素。如下图所示,FCP 出现在第二帧。

FCP 示意图:展示网页加载的五个帧,FCP 发生在第三帧,此时文本和图片内容开始出现。右侧评分标准显示:低于 1.8 秒为优,1.8–3.0 秒需改善,超过 3.0 秒为差。

LCP(最大内容绘制)

LCP 指的从页面开始加载到可视区域内可见的「最大图像」或「文本块」完成渲染的时间。
这里提到的「最大图像」或「文本块」,具体来说是包含<img>元素、内嵌在<svg>元素内的<image>元素、块级文本等。

而测量方式,则是在页面加载过程中,记录视窗内的元素的渲染大小,取尺寸最大的元素,回溯这个元素被完整渲染的时间。注意,如果元素的有一部分在视窗外,在视窗外的部分不会参与到尺寸比较当中。

如下图所示,LCP 发生在第二帧,因为这个时候渲染尺寸最大的文本块被渲染出来了。后续帧当中,可能渲染出了一些图片,但尺寸都比文本块小,所以文本块依然是这个视窗内的最大元素。

LCP 示意图:展示页面加载过程中 LCP 的判定方式——左侧为多帧页面截图对比(FCP 出现在第一帧,而 LCP 在第二帧因最大文本块渲染完成而触发);右侧为评分标准,好(≤2.5s)、需改进(2.5–4.0s)、差(>4.0s)。

CLS(积累布局偏移)

CLS 是指可视区域内发生的最大布局偏移分数。简单来说就是测量页面在加载时,元素的位置出现意外的偏移情况,如果元素尺寸大,而且位置偏移比较远,那么 CLS 分数就会显著增高。

这个指标会跟实际的用户操作或者体验有直接相关,所以应该也会是咱们设计师需要重点关注的内容,因为有时候布局偏移,是会比较影响用户获取信息、或者进行操作,甚至引发一些不可挽回的损失。

CLS(积累布局偏移)示意图:左侧手机截图展示页面加载时元素位置发生偏移,文字内容被插入的按钮顶移;右侧评分量表显示,CLS 低于 0.1 为良好,0.1–0.25 需改进,超过 0.25 为差。

然后我来介绍一下测量网页性能的工具吧。我自己用过这两个,发现其实没啥差别,大家看喜好使用即可:

DebugBear 与 PageSpeed Insights 的界面截图对比:左侧 DebugBear 显示 asana.com 的 Full TTFB 146ms、FCP 4.75s、CPU Time 12.1s 等指标;右侧 PageSpeed Insights 显示 FCP 0.6 秒、LCP 6.4 秒、TBT 1,640 毫秒等核心性能数据

两个工具都能模拟桌面设备或者移动设备,记录多项关键指标的数据,并给出改进建议。

观察页面性能情况,不仅仅是前端技术人员要做的事情,了解到设计师也是可以参与到其中的。

比如 Guillaume Granger,他会比较想控制页面中 JavaScript 的数量,所以它提到,他会将所有用了 JavaScript 相关信息记录在表格当中。之后每次在网页中使用 JavaScript 时,都会跟之前的记录进行比对,判断重要性,决定是否在这个位置上使用 JavaScript。

Guillaume Granger 关于「记录模式」的引言截图:每次遇到需要用 JavaScript 的模式,就记录到表格中并标注重要性,再讨论哪些是最佳体验所必需的,例如商品图片缩放和集合页筛选自动刷新。

开发者 Thomas Kelly 则提出了当意识到页面性能出现瓶颈时,需要做的事情,比如:

  • 制定一个目标,团队一起往这个目标前进;
  • 高频收集页面性能数据;
  • 尝试用不同方式来解决同一个问题;
  • 与同伴分享对性能的一些新发现…
Thomas Kelly 关于发现页面性能瓶颈后的应对建议清单,包含七条:制定性能预算目标、频繁收集数据、研究性能指标、尝试不同解决方案、优先考虑影响最大的方案、与同伴分享发现、跨团队协作提升整体性能意识。

资源分享

最后来分享一下相关的资源吧,包含两个插件、三个学习网站以及一个 React 课程。

插件:VisBug

介绍一个谷歌官方出品的插件:VisBug,主要用来帮助用户在浏览网页时进行调试和设计,包括编辑和可视化页面的 CSS,尺寸和字体等元素。

VisBug 插件功能展示:左图检查元素对比度(前景色 #ffffff 与背景色 #000000,对比度 21,通过 AA/AAA 标准),中图支持替换页面图片,右图可实时更改页面颜色。

插件:Motion DevTools

Motion DevTools 是一个检查网页动效的插件,可视化和分析用户交互设计中的滚动、动画效果,并支持实时编辑、预览或导出等功能。

Motion DevTools 插件界面截图,展示三项核心功能:左侧可拖拽时间轴逐帧查看动画路径与透明度;中间可手动调整缓动曲线(支持 ease、linear 等多种类型);右侧可为元素添加 opacity、scale 等动画属性。

网站推荐

接下来介绍三个在国内外拥有较高知名度和影响力的设计师和开发人员。他们的观点、经验分享往往能给我带来一些新的启发。尤其是他们对钻研新技术的热情,是非常强烈的。

网站推荐页面截图,展示三位推荐人物:Gary Simon(20+ 年设计开发经验,YouTube 频道 DesignCourse)、张鑫旭(阅文集团前端专家,著有三本 CSS 书籍)、Ahmad(产品设计师/前端开发,博客 ishadeed.com)。

课程推荐

最后强烈推荐一门 React 课程——The Joy of React,这个课程我在年初的文章也有提到过,是以互动式课程的形式,由浅入深地讲解 React。从基础的组件 props 和 JSX 知识,到 Hooks、API 设计等等,讲述非常清晰,强烈推荐。

The Joy of React 课程官网截图:课程由 Josh W Comeau 讲授,以互动式形式由浅入深教授 React,涵盖组件 props、JSX、Hooks 及 API 设计等内容,课程地址为 joyofreact.com

分享会感想

分享完之后感觉效果可能还不错,大家都有各自的收获。而且分享会中也不时有人提出相关问题,我也一一进行解答了。

或者也有对我分享内容的一些补充,比如我在分享完 Devtools 环节的时候,有同事也分享了一个在 Application - Cookie 面板里快速切换网页语言的方法。

后面了解到大家对于 CSS 和 React 那块听的比较迷糊,因为原本没有实践过的话,会对这些没有什么概念。而且大家好像对 🛝Playground 没有什么兴趣,并没有人对里面的内容有什么提问和看法之类的,可能到这一步都比较迷糊?🤔

指标那块倒是有不少同事关心,问了几个问题,比如有哪些方法来去改进几个指标的数据,或者在设计过程中是否可以提前避免性能问题等等。

总体来说,和之前的分享会相比,这次分享会的参与度比较不错。

🎉 你觉得这篇文章怎样?
我在这里留下了联系方式。如果觉得这篇文章还不错,欢迎分享给朋友!
联系作者
复制链接
© 李瑞东 2017-2026