惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The GitHub Blog
The GitHub Blog
Stack Overflow Blog
Stack Overflow Blog
博客园 - 聂微东
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
O
OpenAI News
I
InfoQ
S
SegmentFault 最新的问题
Help Net Security
Help Net Security
Latest news
Latest news
V2EX - 技术
V2EX - 技术
WordPress大学
WordPress大学
N
Netflix TechBlog - Medium
T
Tailwind CSS Blog
Google Online Security Blog
Google Online Security Blog
The Cloudflare Blog
罗磊的独立博客
The Register - Security
The Register - Security
Hacker News - Newest:
Hacker News - Newest: "LLM"
A
About on SuperTechFans
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
The Hacker News
The Hacker News
人人都是产品经理
人人都是产品经理
月光博客
月光博客
博客园 - Franky
V
Vulnerabilities – Threatpost
SecWiki News
SecWiki News
Attack and Defense Labs
Attack and Defense Labs
T
Tenable Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MyScale Blog
MyScale Blog
C
CERT Recently Published Vulnerability Notes
Recent Announcements
Recent Announcements
博客园 - 【当耐特】
Y
Y Combinator Blog
C
Cisco Blogs
宝玉的分享
宝玉的分享
P
Proofpoint News Feed
H
Hacker News: Front Page
L
LINUX DO - 最新话题
N
News and Events Feed by Topic
L
LINUX DO - 热门话题
Google DeepMind News
Google DeepMind News
I
Intezer
C
Cybersecurity and Infrastructure Security Agency CISA
aimingoo的专栏
aimingoo的专栏
A
Arctic Wolf
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org

atpX

自建 S3 兼容对象存储服务 Garage 听风的歌 偶尔是深夜就好了 新玩具 AirPods Pro 3 公交车上的时间 从 WHOIS 到 RDAP 通过 WireGuard 访问 NFS 共享文件 自建音乐串流服务探索 我停止了探索 Fediverse 互联网背景噪音 我的数字生活降级 小城与确定性的墙 一只特立独行的猪 Fediverse 与社交 承认的勇气 mediaX - 轻量书影音记录管理工具 我的博客写作流程 网站新增 Misc 页面 擅长对线的鲍勃 在 Chroot 环境下使用 Rsync 同步 当我玩博客时我在玩什么 为什么我的博客没有友链页面 小熊猫与大熊猫 (HDR 照片测试) 是时候为网站开启 HTTP/3 支持了吗 使用 AdGuard Home 搭建自用 DoH 服务 谈谈读书与消遣 2023 年终总结 西安两日游 从 AirPods「升级」到 EarPods Docker 搭建去中心化的微博客平台 Mastodon 聊聊 iPhone 15 Pro 使用感受 能否将 TOTP 二次验证存放在密码管理器里 认识史蒂夫·乔布斯 与“锤哥”克里斯·海姆斯沃斯一起养生 逃离爆炸的信息 你想活出怎样的人生 重温《龙珠》动画 为什么关闭评论 从域名注册商到 DNS 服务,找到自己的组合 如何提高用户网页阅读体验 从 Typecho 迁移到 Hugo 个人博客的最终归宿是静态网站吗 我选择了放弃 jQuery 关于我的小破站折腾速度优化这件事 记一次家庭网络折腾 贴一些 SmokePing 记录 我的域名邮箱选择 不存在的语录 Typecho 评论验证插件 CaptchaPlus 谈谈写字这件事 新的网站 Logo 探索 曲线解决 Typecho 图片占位抖动问题 自建 vaultwarden / bitwarden_rs 密码管理器 使用 Plausible 自建网站流量统计分析工具 如何优雅地徒手剥开火腿肠 简单的集中隔离生活记录 新玩具 M2 MacBook Air 使用 acme.sh 申请 Google 公共证书 Docker 搭建去中心化的微博客平台 Misskey 搭建 Lsky Pro 兰空图床 折腾树莓派系统的一天 我的吉卜力之旅 使用 Uptime Kuma 自建服务器/网站在线率监控 Spartan Host Review - Best Hosting & Service Support Debian 下 Nginx 配合 Fail2Ban 减少恶意扫描和攻击 升级 Typecho 到最新开发版本 v1.2.0 Linux rm 命令详解 Debian 系统安装 Docker 教程 BandwagonHost - Reliable Blog and Business VPS Hosting 使用 Isso 为 Hugo/Hexo 等静态网站添加评论功能 推荐 5 款免费开源的网站流量分析统计工具 搭建 Shynet 网站流量统计分析工具 聊聊 DDoS 攻击那些事 Hugo 使用 Fancybox 实现图片灯箱/放大功能 从 Debian 10 升级到 Debian 11 教程 使用 Umami 自建网站流量统计分析工具 Linux 一次执行多个命令的 3 种方式 Typecho 修改永久链接后旧链接 301 跳转到新链接 从不同需求推荐几家稳定可靠的 VPS 服务商 Build EchoIP service with Docker 浅谈一下这些年折腾过的 VPS 单线复用解决一根网线同时 IPTV 和宽带问题 不完全吃灰的树莓派 开发一个自己的 Telegram Bot 使用 Nginx 实现 TCP 四层反向代理 画画真难 我读村上春树 使用 acme.sh 自动签发和更新证书 卡拉马佐夫式悲剧 安装 File Browser 轻量网盘工具 新玩具树莓派到手 Linux 定时自动备份数据到 OneDrive/Google Drive 记一次服务器崩溃 使用 rsync 同步文件 短信的消失 幻灭的艺术家 新玩具戴尔 S2721DGF 开箱 蝴蝶 用 Docker 整合 SeafilePro 搭建私人云盘 搭建自己的 kms 服务器
再见 JavaScript
ATP · 2024-03-30 · via atpX
JavaScript book

去年早些时候,为了放弃 jQuery,我用原生 JavaScript 重写了一遍本站的 JS 文件。现在,我有了一个更激进的想法,彻底去掉本站所有的 JavaScript 代码。

也没什么非去掉不可的原因,更没什么好处,几乎出于一时兴起,二话不说,一个通宵,两杯咖啡。所以我也不会想方设法的罗列 JavaScript 的各项「罪状」,如果非要找个一个理由的话,就当是为了减少碳排放吧。

在我们日常的网上冲浪中 JavaScript 几乎无处不在,随便打开一个可以交互的网站,少则加载一两个 JS 资源文件,多则几十个,还有各种前端框架开发的网站在挑战极限。就算没有单独引入 JS 文件,HTML 中 <script> 标签以及 onsubmit, onload 等事件也不会少,因为表单验证、评论留言、动态加载内容这些都很难离开 JavaScript。毫无疑问,JavaScript 在 Web 2.0 的发展中发挥着中流砥柱的作用,这点在以后的历史书中要考。

但也不是完全离不开,用可以但没必要来形容更合适。Github 在一篇博客文章 How we think about browsers 中提到,即使关闭了 JS,你仍然可以正常登录 Github,使用评论、搜索等功能:

With JavaScript disabled, you’re still able to log in, comment on issues and pull requests (although our rich markdown toolbar won’t work), browse source code (with syntax highlighting), search for repositories, and even star, watch, or fork them.

可想而知这需要大量额外的适配工作。因此更普遍的情况是,禁用 JS 会让交互式网站的功能受到不同程度的影响甚至直接罢工,如「去掉 JavaScript 后,这些网站会变成这样」这篇文章中所测试的结果。如果你也想看看自己的网站或者常用的网站没有 JS 的样子,Chrome 和 Firefox 都可以在开发者工具中暂时禁用 JS。

选项栏中或者 F12 打开开发者工具,找到并点击上方的小齿轮或者直接 F1 打开设置选项卡,滑动到最下方找到并勾选停用/禁用 JavaScript 选项,关闭开发者工具窗口后自动失效,刷新页面即可恢复 JS 加载。

Chrome 与 Firefox 禁用 JavaScript
Chrome (123) 与 Firefox (124) 中禁用 JavaScript。

好在我的网站本来就很简单(用 Hugo 生成的静态网站),关闭 JS 后基本不影响使用。在下手之前,也十分好奇那些真正极简的网站是什么样子,发现从小众派 No JS Club, No CSS Club 到极限派到 1MB Club, 512KB Club, 250KB Club1KB Club 应有尽有,越到后面越抽象,我还没有这样的魄力,以后应该也不会。

如何去掉

首先要打开网站的所有模版页面和 JS 文件,包括 HTML 中 onclick, onload 等事件在内,找出哪些地方调用了 JS,一个一个处理。

文章目录滚动高亮

文章目录跟随页面滚动高亮显示对应标题

这个功能的实现很简单,使用 IntersectionObserver 监听页面元素,页面滚动到相应标题时绑定 CSS 样式就行了,我在「从 Typecho 迁移到 Hugo」一文中有详细介绍。但目前还想不到办法如何不依赖 JS 实现,所以该特性直接丢弃。

不过滚动一定距离后再显示目录这个效果还可以抢救一下。Chrome 去年开始支持了一个新特性:CSS 滚动驱动动画,可以实现很多原本必须依赖 JS 才能实现的滚动效果,操作起来也很简单:

.post-toc {
    ...
    animation: toc-reveal 1s linear forwards;
    animation-timeline: scroll();
    animation-range: entry 0 100px;
}
@keyframes toc-reveal {
    from { opacity: 0 }
    to { opacity: 1 }
}

可惜的是目前只有 Chrome (115+) 支持,Firefox 和 Safari 就更不用提了。如果你用的是较新版本的 Chrome 浏览器,可以在本文右侧看到效果。

文章图片加载

文章图片加载

目前文章页面用了 JS 加载图片和错误处理,成功加载后去掉动画,失败则显示错误信息;监听页面滚动,使图片上浮渐变显示。图片错误处理只能放弃,但显示动画依然可以用上面滚动驱动动画方法实现:

.img-wrapper {
    view-timeline-name: --revealing-image;
    view-timeline-axis: block;
    animation: linear img-reveal both;
    animation-timeline: --revealing-image;
    animation-range: entry 20% cover 50%;
}
@keyframes img-reveal {
    from {
        opacity: 0;
        transform: translateY(25%);
    }
    to {
        opacity: 1;
        transform: translateY(0);
    }
}

缺点是动画速度和页面滚动的速度相关,并且不能删除动画,向上回滚时图片又会淡出,不过效果也不错。

分页异步加载

分页异步加载

类似 Ajax 局部刷新,也是常说的瀑布流加载的原理,使用 FetchAPI 获取下一页内容后通过 innerHTML 插入到当前页面页尾,同时还有懒加载模糊加载图片。除浏览器支持图片设置 loading=lazy 懒加载外,其余功能必须依赖 JS 实现,所以只能回归简单的分页导航。

搜索功能

网站搜索功能

搜索功能依靠表单提交,通过 FetchAPI 获取包含网站所有文章关键信息的 JSON 文件(JSON 文件通过 Hugo 生成),然后处理数据并高亮关键词展示。该功能必须依赖 JS 实现,所以直接去掉。

工具页面

网站小工具页面
网站小工具页面。
UUID 生成器
UUID 生成工具。

除了 WHOIS 查询外,用 JS 写的几个小工具,我平时用的频率还挺高。代码都很简单,而且网上一大堆类似的,只是出于安全性考虑选择了自己重复造轮子。这个页面也只能删除,不过可以直接把 JS 和 CSS 文件提取出来本地使用 已转移到 tools.atpx.com

网站访问统计

本站月度访客数据
本站 2024 年 3 月份访问数据统计。

目前使用了自建的 Plausible 来统计网站访问数据,如上图,最近一段时间每日访客数量为 100 左右。一般来说,如果不插入 JS,网站流量统计主要有以下三种方式:

  • 通过网络服务商。如 CDN 服务商一般会自带请求统计,缺点是数据偏大,因为包含了大量的 Bot 请求。
  • 通过日志文件。读取分析 Web Server 的访问日志,如 GoAccess 工具,缺点是数据非实时,并且模拟正常请求的恶意 Bot 数据很难过滤。
  • 通过请求文件。不少统计工具支持 <noscript> 的方式,其原理就是网页中插入一个像素文件,通过该文件的请求数据分析,缺点是无法获取 referrer 来源(其实也有办法实现:How Bear does analytics with CSS )以及过滤 Bot 请求。

一开始时计划换成第三种方式,可惜的是 Plausible 短期内不会支持非 JS 插入统计,好在以前使用过的 Shynet, GoatCounter 等工具都支持,最后决定使用 GoatCounter。配置得差不多了的时候又突然改变了想法,添加访问统计后除了每天纠结那点数据外也没什么用,没必要让自己流量焦虑,干脆直接去掉。

因此我的网站现在是个黑盒子,不知道流量多少,不知道引荐来源(其实 Google 和 Bing 的站长后台中可以看到一部分),但说不定过几年我又加上的时候会有意想不到的惊喜呢。

其它

此外还有不少功能都是直接去掉或者改写为静态展示,不再细说。这里简单的分享下如何用纯 CSS 代码实现开关按钮。以下拉菜单举例,你可以添加一个使用 checkbox 属性的 <input> 标签配合 CSS 的选择器来实现,例如有这样一个 HTML 结构:

<input type="checkbox" id="toggle" style="display: none">
<label for="toggle">
    <button>Switch<button>
</label>
<div class="menu-box">...</div>

编辑 CSS,默认不显示 menu-box 下拉菜单,设置 <label> 的伪类选择器 :checked,配合兄弟选择器 + 定位到下拉菜单,设置为显示:

.menu-box {
    display: none
}
#toggle:checked + .menu-box {
    display: block
}

这样你就可以通过点击 label 来改变选中状态从而控制显示开关。虽然这种实现不是什么新花样,属于很老的 tricks,但效果和用 JS 实现几乎没有区别,兼容性也不错,比较实用。

去掉之后

其实本站所有的 JS 文件加起来也才 12.4 KB,压缩后网络传输为 4.2 KB,我想没有人会抱怨多消耗这 4.2 KB 额外流量。同时每一行代码都花了很多功夫和时间,删除的时候倒挺解压。

去掉之后自然是不如原来好,失去了静态网站仅剩的一点灵气,好在多了一丝清爽的错觉。要说还剩什么的话,仿佛回到了早期的 Web 1.0 时代,仅仅作为一个「只读」网站而存在。

对了,我顺便将本站 RSS 从摘要输出改为了全文输出。不过这里的阅读体验应该也过得去,也希望你能偶尔打开网页来这里逛一逛 <(´= ω =`)>