低碳 Web 实践指南
现状和问题
2023年7月6日,世界迎来有记录以来最热的一天。气候变化是如今人类面临的最大健康威胁。据世界卫生组织预测2030年至2050年期间,气候变化预计每年将造成约25万人死亡。这是人们可以真切感受到的变化,而背后的主要推手是碳排放。
而在万物互联的数字化时代,碳排放很重要的来源之一是互联网,全球三分之二的人口预计将在2023年通过互联网连接。随着人们对数据和网络服务的需求日益增长,互联网在数据中心、网络通信和终端用户设备等各个环节都消耗了大量电力,其碳排放也在不断增加。如果我们将 Web 视为一个国家,那么它将在电力消耗方面排名第三,在污染方面排名第四。
过去十年内,页面传输资源大小在PC端和移动端分别增长162.5% 和 392%。目前大多数 Web 应用:
-
托管在由化石燃料提供动力的机器中
-
旨在获得用户注意力,增加内容和交互,强化用户参与度和忠诚度
-
已经开始关注并重视无障碍设计,但是尚未从设计角度考虑对环境的影响
-
开发者在实现时一般不会考虑可持续性与碳效率,大多情况下考虑的是性能和可靠性等维度
如何通过技术让 Web 应用改善对环境的影响和减少碳排放,是值得IT从业者思考和解决的问题。但我们首先可以做的,是开始构建低碳的 Web 网站。
构建绿色低碳 Web 应用
没有度量指标,就没有最佳实践,毕竟我们只能优化那些可以被观测的碳排指标。所以在探讨构建低碳 Web 应用的技术手段之前,我们需要了解表征网站碳排的指标——页面权重(Page Weight)。页面权重指网页的字节大小,代表用户访问网页时,通过互联网传输的数据量总和。
常见的 Web 碳排放计算工具,诸如Ecograder、 Website Carbon Calculator、Beacon,均基于页面权重。诚然,页面权重可能不是统计网站碳排放的最佳指标,但它是目前我们能找到的最佳碳排代理值。
随着 Web 技术的发展,用户访问的网站早已不是单纯的 HTML 文件,而是具有多种资源的 Web 应用。一般这些数据资源可以分为以下五类:
-
构成网页的 HTML 文件
-
网页中嵌入的图像和多媒体资源(视频、音频等)
-
修饰网页样式的 CSS 文件
-
提供网页交互性的 JavaScript 文件
-
网页集成的第三方服务(页面分析工具、表单工具、聊天机器人等)
页面每增加一个数据资源,意味着该资源在存储、传输和页面呈现等过程中消耗的能源,都会影响页面的数据传输量,增加页面的能源消耗。我们可以以“减少页面数据资源,降低页面数据传输量”为出发点,采取措施“降本增效”——精简压缩 Web 应用,只在必要时消耗能源;提高应用的能源利用率,优化应用性能。
这并不意味着,我们只能寄希望于开发人员,敦促他们通过技术手段落实相关举措。如果我们着眼于软件开发生命周期(SDLC),在每个交付阶段落地相应举措,团队中的不同角色的成员都能参与其中,各司其职,为低碳 Web 保驾护航。

需求分析阶段
软件膨胀(Software bloat)是一个老生常谈的话题,Web 应用中往往充斥着冗余的功能,甚至在企业软件领域,可能有 50% 的功能几乎从未被使用过,80% 的功能价值很低或没有价值。冗余臃肿的复杂应用,不但难以维护与扩展,而且会增加应用的运行成本,导致能源浪费。实现低碳 Web 应用,并不意味着我们只能通过技术手段进行“压缩”,我们也可以“压缩”需求,从源头减少能源消耗,构建一个功能精简、小而全的应用。
面对客户急切的声音:“我们需要这个功能,它对我们特别重要,我们现在就想要”,我们需要引导他们思考功能背后的价值:它真的可用、有用?它是仅有的解决方案吗?它是否可以使用现有功能替代?同时,更小的应用也意味着更低的开发成本和更短的交付周期。
设计阶段
用户行为与 Web 应用的能耗效率息息相关,每当用户开始使用 Web 应用,用户所使用的设备就会开始持续消耗能量,增加 Web 应用的数据传输。用户行为对 Web 应用能耗的影响,可能也远超我们的想象——预计 52% 的数字产品碳排放源于用户设备。为了最大程度地减少应用的使用能耗,我们可以优化用户旅程,精简用户的操作流程,确保用户通过最少的步骤达成目标。
此外,我们也需要从设计出发,思考如何延长 Web 应用的寿命。Web 应用能兼容老旧设备,相当于延长了设备的使用寿命,因为用户不需要为兼容应用而更换设备。
除了用户体验,也有很多可以参考的绿色可持续设计,例如:
-
采用更节能的配色方案:黑色是显示器上能耗最低的颜色,深色模式和深色背景更为节能。
-
减少使用自定义字体:尽可能使用系统字体,避免客户端加载额外的字体文件,增加页面数据传输量。
-
更节能地使用图片:图片是最常见的静态资源,更节能地使用图片资源,比如使用高分辨率但文件更小的 WebP 格式图片文件,可以大幅减少页面权重。
-
非必要不添加动效和视频:动效与视频可以提升用户体验,但也会增加页面加载时的能耗。
开发阶段
减少页面权重
减少 Web 应用页面权重最直接的方法,就是避免一切不必要的数据传输:
-
设定页面权重阈值:将页面确保的数据传输量保持在尽可能低的水平。通常建议页面权重应小于 1 MB,最好能够不大于 500 KB。
-
页面只加载必要的资源,优化页面请求:
-
对于页面组件、CSS 文件及静态资源,可以使用懒加载策略,Critical CSS 策略,参考 Import on Interaction和 Import on Visibility 等实践,只在需要时加载资源。
-
删除未被使用的 CSS 和 JS 文件,减少 HTML 中的 CSS 及 JS 内联代码。
-
压缩 CSS 和 JS 文件,删除文件中不必要的字符,使用文本压缩使文件更小。
-
在开发中引入功能全面的工具库和框架可能会成为应用的负担,毕竟我们并不会百分百使用引入框架的功能。通过选择模块化的 JS 框架,使用代码替代或者按需加载一些体量庞大的工具库,减少代码文件大小。
-
-
按需使用三方服务:在许多数字产品和服务中,追踪用户数据以及插入广告的第三方服务往往会耗费大量能源。此外,这些服务也会严重侵犯用户隐私,并明显降低用户体验。第三方服务如果需要跟踪数据,应向用户说明收集的内容和使用方式。要尽可能选择侵入性最小、效率最高的方式收集数据,确保只收集所需的数据,并且支持用户关闭追踪。
-
采用 PWA 应用架构:渐进式 Web 应用(Progressive Web App,PWA)通过在用户设备上缓存关键信息和信息资产以改善用户体验并减少数据传输。用户在访问 PWA 缓存数据时,可以实现零网络数据传输。数据缓存不但可以减少由数据传输引起的碳排放,还可以改善网络连接不稳定对用户体验的影响。相较于本地应用程序和传统 Web 应用,PWA 用户响应速度更快,能耗更低,碳排放更少。
提升应用能源利用率
在开发过程中,我们往往并不会优先考虑运行应用产生的能源消耗,以及应用运行的硬件性能。一段低效代码会随着 Web 应用的运行,会持续影响应用的能耗水平,我们可能已经造成了难以预计的计算资源浪费。开发人员不应只考虑通过更简单、更快速的方式实现功能,还应考虑功能的性能与能耗,选择更低碳的方式实现功能:
-
遵循DRY(Don’t repeat yourself )原则: 在编码过程中需要重视代码的复用性。那些只能使用一次的代码,不但难以维护,浪费开发时间,也会浪费运算资源与能源。
-
使用更高效的算法和设计模式。虽然算法的时间效率和软件碳强度并不总是成正比,但它们仍然相关。
-
删除或重构未被使用的功能。这不但提高了能源效率,也使软件更容易维护。
-
选择效率更高的编程语言:编译型语言往往比解释型语言最节能。Python 在 27 种语言中排名耗电量最高,Python 应用程序可能会在大规模处理、存储和网络传输中产生巨大的能量消耗。
测试阶段
我们可以将碳排量和代码能耗效率作为测试验收的一部分,以下是一些检测工具:
-
碳排放计算工具:
-
在线计算工具:Ecograder、Website Carbon Calculator 和 Ecoping 等网站提供估算网页碳排放的在线服务。
-
CO2.js: 是一个 JavaScript 开源库,用于估算网站、应用和软件在使用时产生的碳排放。
-
Sitespeed sustainability plugin:Sitespeed 是一款 Web 性能监控工具,可以给出页面碳排相关报告。
-
WebPageTest Carbon Control: WebPageTest 是一款开源网络性能工具,其中Carbon Control 模块可以估算每次访问的碳足迹以及部署服务是否使用可再生能源。
-
-
代码能耗效率扫描工具:
-
CAST GreenIT Index: 自动化代码能耗分析工具,可以扫描静态代码中的能耗缺陷并给出相关修复建议。
-
ecoCode: SonarQube 的一款插件,可以检测代码中能源过度消耗等问题,旨在减少软件在代码级别的环境足迹。
-
Carbon CI pipeline tooling: Green Software Foundation 开发的静态代码扫描工具,可估算应用的碳排量并集成 CI。
-
部署阶段
在部署阶段,使用可再生能源的托管服务部署 Web 应用是最便捷有效的减碳实践。你可以使用Green Web Foundation首页提供的 Green Hosting 扫描工具检测应用的部署服务是否使用可再生能源。通常云服务供应商会提供Green Hosting服务,但如果当前你使用的供应商尚未提供此类服务,可以考虑更换到支持Green Hosting的服务商。这会是一个重要的决策,但实施起来其实并不复杂,也不会增加成本。此外,数据传输的物理距离越短,传输阶段消耗的能源就越少。请尽量选择将服务部署在离用户更近的区域,尤其是分发静态资源的 CDN 服务。
实践经验分享
在Thoughtworks的一个内部项目上,借助优化一个主要的JS资源大小(从3.12MB 减小至 648KB),结合每月用户访问量和开源工具 CO2.js估算出每月数据传输减少了17GB,碳排放降低了79%。这仅仅是优化了一个JS资源,如果每个页面上的内容都做到有用、可用和被使用,在技术上也能通过压缩、缓存等方式减少资源大小,累加在一起会产生巨大的影响,特别是对于访问量很大的 Web 应用。
目前很多IT从业者和公司已经开始重视网站对环境的影响。Valentino (fashion house)与Karma Metrix公司合作来衡量其页面和网站的能源性能并减少其影响。WordPress的Mailchimp插件的开发者通过减少其中一个文件20KB,每月可节省约59吨二氧化碳。Branch是由一群关注数字化技术与环境可持续性的人共同创建的在线杂志。Branch实现了一种设计 —— 需求响应,利用来自电网强度和用户位置的数据,按照当前用户所在地的能源情况呈现不同的界面。例如当电网需求较低且可再生能源比例较高时,该网站显示了自动加载所有图像,视频和媒体内容的完整体验。当电网需求高且可再生能源利用较少时,会通过强调替代文本(alt text)的方式来展示媒体内容。用户可以选择点击展示内容,但内容不会自动加载。
此外,W3C的可持续网页设计社区目前正在合作制定一套指导方针,以帮助从事 Web 工作的人群创建更环保的数字产品和服务,希望如同 Web Accessibility 权威标准WCAG(Web Content Accessibility Guidelines)一样,建立互联网的环境标准。目前有一个草案提议在HTTP headers加入请求的碳排放数据,以便服务提供商和消费者可以就网络使用情况做出更明智的决策。
不止低碳
技术手段可以帮助减少 Web 对环境的影响,但不仅仅是减碳。
当我们创建更易于访问的数字产品来消除内容障碍时,通常还会提高性能和效率,从而会使用更少的资源。这意味着在助力 Web 无障碍性的同时,也提高了性能。
摩尔定律指出每 18 个月硬件的运算能力就会提升一倍,但软件却无法跟上硬件的进步。维尔特定律提到软件变慢的速度永远快过硬件变快的速度,软件效率每18个月减半,从而抵消了摩尔定律的所有好处。因此相比新设备,软件在老旧设备上会耗费越来越多的资源,造成不必要的碳排放,而低碳实践可以减少页面权重,所以一定程度上可以帮助精简软件,让软件在旧设备上运行顺畅,延长旧设备更换周期,减少浪费。
据《2022年中国可持续消费报告》统计,消费者对低碳消费生活方式的理解主要集中在“绿色出行”(72.51%)、“环保材料”(66.68%)、“循环再生”(65.79%)、“垃圾分类”(60.76%)、 “节水节电”(60.33%)、“新能源车”(60.14%)这几项,而绝大多数互联网用户尚未注意互联网也是需要绿色低碳的。实现绿色互联网之路需要实践者和使用者共同努力,因此可以借助 Web 应用的低碳实践构建用户意识。公众低碳消费意识越来越强,也有利于我们去践行负责任技术。
作为IT从业者,我们应该践行负责任技术 —— 积极思考并探索技术的价值、不可测的后果和负面的影响,主动管理、减缓和降低技术的风险与伤害。我们是一切实践的关键起点,如何在早期最大限度避免把人所固有的认知偏见和思维惯性带入到设计和开发中显得尤为重要。
总结和展望
Web 应用作为碳排放的一个重要来源,我们需要将低碳 Web 实践融入到日常应用开发的过程中。在业界,已经有很多在低碳 Web 方面的研究,从 Web 应用的设计到部署运维都提供了相应的工具和最佳实践供大家参考。本文将相关实践以软件生命周期为主线进行了整理汇总,同时也分享了简单的案例,供同业人员进行参考和了解。
随着气候变化的影响日益增大,部分国家已经开始着手制定相关标准和政策,而我们 Web 从业者需要从意识、实践等多方入手,在优化 Web 应用的时候,不仅仅为了性能和体验而优化,也为了可持续而优化,共同构建绿色地球。
文/Thoughtworks 付莹&梁晶&孙郁俨
原文链接:低碳 Web 实践指南-Thoughtworks洞见
相关文章:
低碳 Web 实践指南
现状和问题 2023年7月6日,世界迎来有记录以来最热的一天。气候变化是如今人类面临的最大健康威胁。据世界卫生组织预测2030年至2050年期间,气候变化预计每年将造成约25万人死亡。这是人们可以真切感受到的变化,而背后的主要推手是碳排放。 …...
信息安全:网络安全体系 与 网络安全模型.
信息安全:网络安全体系 与 网络安全模型. 网络安全保障是一项复杂的系统工程,是安全策略、多种技术、管理方法和人员安全素质的综合。一般而言,网络安全体系是网络安全保障系统的最高层概念抽象,是由各种网络安全单元按照一定的规…...
【云原生】Serverless 技术架构分析
一、什么是Serverless? 1、Serverless技术简介 Serverless(无服务器架构)指的是由开发者实现的服务端逻辑运行在无状态的计算容器中,它由事件触发, 完全被第三方管理,其业务层面的状态则被开发者使用的数据库和存…...
Visual Studio Code 设置文件头部添加作者、日期和函数注释
step1:安装插件KoroFileHeader step2:左下角选择管理—设置—输入"fileheader"—点击"在setting.json中编辑" step3:添加下面的代码到json文件中 // 文件头部注释 "fileheader.customMade": {"Descripttion":"","ve…...
HCIA云计算 V5.0题库
云计算,这是近几年听得最多词了,云计算对于网络的发展帮助非常大,它自身所产生的价值是不可估量的!所以云计算的岗位对于很多IT公司来说,都是有一定地位的。华为认证云计算面向的对象很简单就是对云计算技术感兴趣的人…...
基于Matlab实现帧间差分法的运动目标检测(附上完整源码+图像+程序运行说明)
帧间差分法是一种常用的运动目标检测方法,可以通过对连续帧之间的差异进行分析来确定目标的运动情况。在本文中,我们将介绍如何使用Matlab实现帧间差分法的运动目标检测。 文章目录 部分源码完整源码图像程序运行说明下载 部分源码 首先,我们…...
Jenkins搭建最简教程
纠结了一小会儿,到底要不要写这个,最终还是决定简单记录一下,因为Jenkins搭建实在是太简单了,虽然也有坑,但是坑主要在找稳定的版本上。 先学一个简称,LTS (Long Term Support) 属实是长见识了,…...
设置git可以同时推送gitee和github
查看当前的远程仓库设置: git remote -v 这会列出你当前配置的远程仓库。你可能会看到类似以下的输出:origin-gitee <gitee仓库地址> (fetch)origin-gitee <gitee仓库地址> (push) 新增一个远程仓库 git remote add origin-github <githu…...
Java给Excel设置单元格格式
maven 依赖 <!--读取excel文件--> <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.3</version> </dependency> <dependency><groupId>org.apache.poi</group…...
__block的深入研究
__block可以用于解决block内部无法修改auto变量值的问题 __block不能修饰全局变量、静态变量(static) 编译器会将__block变量包装成一个对象 调用的是,从__Block_byref_a_0的指针找到 a所在的内存,然后修改值 第一层拷贝&…...
Segment anything(图片分割大模型)
目录 1.Segment anything 2.补充图像分割和目标检测的区别 1.Segment anything 定义:图像分割通用大模型 延深:可以预计视觉检测大模型,也快了。 进一步理解:传统图像分割对于下图处理时,识别房子的是识别房子的模型…...
【雕爷学编程】MicroPython动手做(27)——物联网之掌控板小程序3
知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…...
Java中集合容器详解:简单使用与案例分析
目录 一、概览 1.1 Collection 1. Set 2. List 3. Queue 1.2 Map 二、容器中的设计模式 迭代器模式 适配器模式 三、源码分析 ArrayList 1. 概览 2. 扩容 3. 删除元素 4. 序列化 5. Fail-Fast Vector 1. 同步 2. 扩容 3. 与 ArrayList 的比较 4. 替代方案…...
机器学习04-数据理解之数据可视化-(基于Pima数据集)
什么是数据可视化? 数据可视化是指通过图表、图形、地图等视觉元素将数据呈现出来的过程。它是将抽象的、复杂的数据转化为直观、易于理解的视觉表达的一种方法。数据可视化的目的是帮助人们更好地理解数据,从中发现模式、趋势、关联和异常,从而作出更明…...
百度@全球开发者,见证中国科技超级“碗”!
潮汐涌动时,变化悄然发生。2023年全球AI浪潮迭起,大语言模型热度空前,生成式人工智能为千行百业高质量发展带来更多想象空间,一个蓬勃创新、重构万物的“大模型时代”正蓄势待发。 滴滴滴~百度全球开发者,…...
分库分表之基于Shardingjdbc+docker+mysql主从架构实现读写分离(一)
说明:请先自行安装好docker再来看本篇文章,本篇文章主要实现通过使用docker部署mysql实现读写分离,并连接数据库测试。第二篇将实现使用Shardingjdbc实现springboot的读写分离实现。 基于Docker去创建Mysql的主从架构 #创建主从数据库文件夹…...
Ajax跨域问题
什么是跨域问题? 跨域问题来源于JavaScript的"同源策略",即只有 协议主机名端口号 (如存在)相同,则允许相互访问。也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源。跨域问题是针对JS和ajax的&…...
Vue + FormData + axios实现图片上传功能
当使用Vue FormData axios实现图片上传功能时,你可以按照以下步骤进行操作: 示例代码 首先,在Vue组件中,创建一个data属性来存储选择的文件和上传状态: data() {return {file: null,uploading: false}; }在模板中…...
设计模式系列:经典的单例模式
单例模式,是设计模式当中非常重要的一种,在面试中也常常被考察到。 正文如下: 一、什么时候使用单例模式? 单例模式可谓是23种设计模式中最简单、最常见的设计模式了,它可以保证一个类只有一个实例。我们平时网购时用的购物车,就是单例模式的一个例子。想一想,如果购物…...
macbook pro 散热解决办法
结论: 2017 macbook pro 13.3 寸 控制住温度, 不惧长时间满载、性能也飞起. 方案说明最低温度满载温度一、终极方案(成本 460元)120w半导体散热 导热垫31度71度二、推荐方案, 完全静音(成本 50元)828散热风扇 导热垫43度81度三、不拆机、低成本(20元)828散热风扇56度91度四、…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
