Linux 桌面上的 Firefox 面临着大问题
| 导读 | 毫无疑问,无论是在桌面、笔记本电脑还是移动设备上,浏览器都是任何操作系统中最重要的应用之一。 |

如果没有一个功能强大、快速且稳定的浏览器,操作系统的实用性将大幅度降低,以至于我相当确定,如果一个操作系统没有浏览器,几乎没有人会将其用于常规、正常的使用。拥有一个起码可用的浏览器是将操作系统从娱乐玩具升级到你可以使用超过 10 分钟的有趣新奇物品的关键。
但问题在于,开发一个功能强大的浏览器实际上非常困难,因为浏览器本身已经成为一个功能丰富的平台。承担起从零开始构建浏览器的巨大任务并不是很多人感兴趣的事情——除了那些疯狂的人——而这一切被恶化的原因是,由于市场的合并和垄断,与剩下来的三个浏览器引擎竞争基本上是无济于事的。Chrome 和其各种衍生产品的占据统治地位,其次是 iOS 上的 Safari,原因仅仅是因为你在 iOS 上不能使用任何其他浏览器(引擎)。然后就是 Firefox,作为一个远远落后的第三名而存在——且份额还在下滑。
这就是 Linux 桌面发行版所处的环境。长期以来,Linux 桌面几乎完全依赖于 Firefox(和之前的 Mozilla 套件)作为它们的浏览器,一些用户选择在安装后下载 Chrome。尽管 GNOME 和 KDE 名义上都有自己的两个浏览器,GNOME Web 和 Falkon,但其用户数量有限,发布的版本也寥寥无几。例如,没有一个主要的 Linux 发行版会将 GNOME Web 作为其默认浏览器,并且它缺少用户对浏览器期待的许多功能。相比之下,Falkon 只会偶尔更新,往往几年才发布一个新版本。更糟糕的是,Falkon 通过 QtWebEngine 使用的是 Chromium 引擎,而 GNOME Web 使用的是 WebKit(它们独立于浏览器更新,所以浏览器版本并不总是一个可靠的指标!),所以两者都依赖于世界上最无情的两个公司——谷歌和苹果的善意。
即使是 Firefox 本身,尽管它显然是 Linux 发行版和 Linux 用户的首选浏览器,也并不将 Linux 视为一线平台。Firefox 首先是一个 Windows 浏览器,然后是 macOS,最后是 Linux。Linux 世界对 Firefox 的热爱并没有得到 Mozilla 同样的回应,这种情况在许多地方表现出来,那些在 Windows 端修复和解决的问题在 Linux 端被忽视了好几年甚至更久。
这种情况最好、最明显的例子就是硬件视频加速。这个功能从一开始就是 Windows 版本的默认部分,但是直到 2023 年 7 月初发布的 Firefox 115,才在 Linux 上默认启用。即使是这样,这个功能也只是默认为英特尔显卡用户开启,并没有 AMD 和英伟达用户什么事。这种视频加速功能的缺失(对于 AMD 和英伟达用户来说,仍旧如此),是 Linux 笔记本电脑在电池寿命上与 Windows 对手差距严重的一个主要因素。
然后,要走上这条路一直都是漫长、艰巨、且充满颠簸。长久以来,要让硬件视频加速在 Linux 的 Firefox 上工作一直复杂而不稳定,每一个浏览器版本可能都会改变你需要设置的标志。有时候无论你怎么做,它可能都会在连续几个版本中停止工作。论坛消息、博客帖子和网站文章中充满了过时的指令和像 Hail Mary 一样的建议,供那些试图让它运行的用户参考。你以往的成功经验会随着每个版本的发布而变化,而跟踪所有这些都是一种噩梦。
不仅仅是硬件加速视频解码。手势支持在 Linux 版本上的推出比在 Windows 版本上要晚得多——比如使用滑动来前进和后退,或者在图片上捏合来进行缩放。同样,触摸屏支持也在 Linux 版本的 Firefox 上晚了一段时间才出现。通常,此类功能可能在默认启用之前几年就可以通过 about:config 指令启用,但这远非理想情况。
桌面 Linux 的普及率落后于 Windows 和 macOS,这并不是什么意想不到的情况,或出于恶意的结果。前几段的重点并不是抱怨 Linux 版 Firefox 的状态,或者建议 Mozilla 将 Windows 和 macOS 版本的宝贵资源转移到 Linux 版本。虽然如果他们这么做的话,我显然不会抱怨这些,但这并没有多大意义。我强调这些问题的真正原因是,如果今天在 Mozilla 现有的财力和资源下,Linux 版的 Firefox 已经被视为第三级平台,那么如果 Mozilla 的财力和资源急剧减少,将会发生什么?
Firefox 的状况并不太好。它的市场份额在这些年里急剧下滑,现在在桌面和笔记本电脑上仅占有微薄的 3%,而在移动设备上更是微不足道的 0.5%。Chrome 和稍少的 Safari 已经完全压倒了这个曾经威猛的浏览器,以至于它对于 Linux/BSD 用户和其他平台上的更多极客来说,基本上就是一个附带的产品。我说这个并不是为了贬低那些使用 Firefox 的人——我就是其中之一——而是为了强调 Firefox 当前市场位置的糟糕程度。这种市场份额的缩小已经对 Firefox 的开发和未来前景构成了伤害,尤其是如果这种滑坡还在继续的话。
然而,市场份额的下滑远非最大的问题。摆在 Firefox 头顶的达摩克利斯之剑是 Mozilla 非常奇怪且失衡的收入来源。大多数人可能都知道,Mozilla 的大部分收入来自与谷歌的搜索合作。大约 80% 的 Mozilla 的收入 来自谷歌,后者支付给这个浏览器制造商费用,以将谷歌搜索设为默认搜索引擎。
这份协议还会持续多久?无论 Firefox 陷入多么糟糕的情况,它还会一直续约吗?合作的规模会缩小,还是会完全结束?什么时候,谷歌会觉得每年在本质上是对竞争对手的慈善上投入数亿美元已经不再值得,或者根本不需要?谷歌与苹果的类似搜索交易已经面临 法律审查;那么这种审查会对与 Mozilla 的交易产生影响吗?
只需问自己这个问题:如果由于 Firefox 的市场份额进一步下滑,与谷歌的交易泡汤,两者结合起来,或甚至这里未提到的其他因素,导致 Mozilla 的资金短缺,哪个版本的 Firefox 将首先感受到削减?Mozilla 会采取什么措施来缓解困境?当 Mozilla 日益绝望时,我们是否会看到与其他公司的肮脏交易?不靠谱的加密货币概念?允许广告以换取收入?更多的推荐的网站和扩展,需要付费?还是 Linux 版本将被全部削减,让社区接管?
这就是 Thunderbird 所经历的。Thunderbird 花了近十年的时间才完全恢复。这也可能发生在 Linux 的 Firefox 上。
这就是桌面 Linux 的 Firefox 所面临的问题。这个最重要的桌面 Linux 应用程序已经处于非常困难的境地,而且似乎不可避免的是,事态只会逐渐变得更糟。然而,我并没有看到有人在谈论这个问题,或者考虑 Firefox 最终可能的消亡,这对 Linux 桌面意味着什么,以及如何避免或减轻这种情况。
在理想的世界里,Linux 桌面的主要利益相关者 —— KDE、GNOME,各种主要的发行版 —— 会聚在一起,严肃地考虑一项行动计划。在我看来,最好的可能解决方案是复刻一个主要的浏览器引擎(或选择一个并大幅投入),并修改这个引擎,并专门为 Linux 桌面进行定制。停止生活在 Windows 和 macOS 浏览器制造商的残羹冷炙中,完全专注于制作一个完全为 Linux 及其图形堆栈和桌面优化的浏览器引擎。让主要的利益相关者共同在一个 Linux 首选—— 或甚至仅限于 Linux —— 的浏览器引擎上共同努力,而将图形前端留给各种工具箱和桌面环境。
显然,这并不容易,需要在时间、资源和人员方面进行重大投资。然而,通过仅专注于 Linux,你不会真正与 Blink 和 WebKit 竞争,因为他们完全不重视桌面 Linux(Chrome 在 Linux 上仍然没有硬件视频加速)。让其他引擎去为各种专有平台争夺——Linux 需要一个独立于谷歌(和苹果)的浏览器引擎,并且认真将 Linux 作为一个平台对待。
我真的很担心 Linux 上浏览器的状态,特别是 Firefox 在 Linux 上的未来。我认为桌面 Linux 社区的各种主要参与者,从 GNOME 到 KDE,从 Ubuntu 到 Fedora,显然对于 Firefox 出问题或死亡完全没有应急计划,尽管我们都知道当前的浏览器市场状态、Mozilla 的财务状况和两者的未来前景。这种行为实在是太不负责任了。
Linux 桌面的 Firefox 面临着大问题,但似乎没有人愿意承认它。
相关文章:
Linux 桌面上的 Firefox 面临着大问题
导读毫无疑问,无论是在桌面、笔记本电脑还是移动设备上,浏览器都是任何操作系统中最重要的应用之一。 如果没有一个功能强大、快速且稳定的浏览器,操作系统的实用性将大幅度降低,以至于我相当确定,如果一个操作系统没有…...
查漏补缺 - 构造函数,原型,this,原型链,继承
目录 1,构造函数2,原型3,this4,原型链1,特点2,Object.prototype.toString()3,instanceof 运算符4,Object.getPrototypeOf()5,创建空原型对象6,面试题 5&#…...
C# 学习笔记--个人学习使用 <2>
C# 学习笔记 Chapter 2 比较硬的基础部分Section 1 委托Part 1 Action 与 func 委托的示例Part 2 自定义委托Part 3 委托的一般使用Part 4 委托的高级使用Part 5 适时地使用接口 Interface 取代一些对委托的使用 Section 2 事件Part 1 初步了解事件Part 2 事件的应用Part 3 事件…...
Linux网络编程Socket通信6-Libevent移植与使用
目录 libeventlibevent交叉编译并移植libevent安装安装步骤测试代码libevent执行报错解决 libevent_base根节点event_base_newevent_base_freeevent_reinit event_loop循环等待事件event_base_loopevent_base_dispatchevent_base_loopexitevent_base_loopbreak event事件event_…...
c#:委托 泛型委托的使用 泛型约束
委托 在 C# 中,delegate 是一种引用类型,它允许您定义和使用可以引用特定方法的对象。delegate 可以看作是一种函数指针,它可以在运行时动态地调用不同的方法。 以下是一个简单的例子来说明 delegate 的实际作用: // 1. 定义一…...
大数据之linux入门
一、linux是什么 linux操作系统 开发者是林纳斯-托瓦兹,出于个人爱好编写。linux是一个基于posix和unix的多用户、多任务、支持多线程和多CPU的操作系统。 Unix是20世纪70年代初出现的一个操作系统,除了作为网络操作系统之外,还可以作为单…...
MPI之MPI_Sendrecv接口以及空进程概念介绍
MPI_Sendrecv函数原型 int MPI_Sendrecv(const void *sendbuf, int sendcount, MPI_Datatype sendtype, int dest, int sendtag,void *recvbuf, int recvcount, MPI_Datatype recvtype, int source, int recvtag, MPI_Comm comm, MPI_Status *status);其中各个参数的含义如下&…...
Revit SDK:PointCurveCreation 创建点来拟合曲线
前言 这个例子通过留个例子来展示如何通过点来拟合曲线或者曲面。 内容 PointsParabola 生成抛物线的核心逻辑: double yctr 0; XYZ xyz null; ReferencePoint rp null; double power 1.2; while (power < 1.5){double xctr 0;double zctr 0;while (…...
嵌入式Linux开发实操(十五):nand flash接口开发
# 前言 flash memory,分NAND和NOR: 如果说nor flash有个特点就是能执行代码,NOR并行接口具有地址和数据总线,spi flash更是主要用于存储代码,SPI(或QSPI)NOR代码可就地执行(XiP),一般系统要求flash闪存提供相对较高的频率和数据缓存的clocking。而nand flash主要用于…...
vue2 组件库之vetur提示
当我们开发完自定义UI组件库后,在项目中使用时,想要达到以下提示效果,组件提示与属性提示,有什么解决方案呢: 事实上,这是vetur的功能,原文如下: Component Data | Vetur If a pac…...
慕课网 Go工程师 第三周 package和gomodules章节
Go包的引入: 包名前面加匿名,只引入但不使用,如果对应包有init函数,会执行init函数(初始化操作) 包名前面加. 把这个包的结构体和方法导入当前包,慎用,你不知道当前包和被引入的包用…...
【ES6】JavaScript 中的数组方法reduce
reduce() 是一个 JavaScript 中的数组方法,它会对数组的每个元素执行一个提供的 reducer 函数,将其减少到一个单一的值。 这是 reduce() 的基本用法: //(method) Array<number>.reduce(callbackfn: (previousValue: number, currentV…...
数据结构--树4.2(二叉树)
目录 一、二叉树的定义和特点 1、定义 2、特点 二、二叉树的基本形态 1、空二叉树 2、只有一个根结点 3、根结点只有左子树 4、根结点只有右子树 5、根结点既有左子树又有右子树 6、斜树 7、满二叉树 8、满二叉树和完全二叉树 三、二叉树的性质 一、二叉树的定义和…...
详解Numpy(基于jupyter notbook)
详解Numpy(基于jupyter notbook) 1.创建数组2.数据类型3.数组切片和索引4.Numpy的广播与数组操作5.数组合并与通用函数6.其他通用函数 1.创建数组 #引入numpy包,以后np就代表numpy import numpy as npanp.arange(10,30,2)#10为起点ÿ…...
uniapp实现:点击拨打电话,弹出电话号码列表,可以选择其中一个进行拨打
一、实现效果: 二、代码实现: 在uni-app中,使用uni.showActionSheet方法实现点击拨打电话的功能,并弹出相关的电话列表供用户选择。 当用户选择了其中一个电话后,会触发success回调函数,并通过res.tapInde…...
swc-loader Segmentation fault “$NODE_EXE“ “$NPM_CLI_JS“ “$@“
webpack swc swc还不是很稳定。 在swcrc 中有配置plugins 时,swc 转换 /node_modules/ 会报错。 环境 swc/cor1.3.62swc-loader0.2.3swc-plugin-vue-jsx0.2.5 解决 配两套rule,一套处理项目代码,一套处理node_modules webpack.config.js rules:…...
Leetcode78. 子集
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 回溯法 class Solution {public List<List<Integer>> subsets(int[] nums) {List…...
百度“AI智障”到AI智能体验之旅
目录 前言一、百度PLATO1.抬杠第一名2.听Ta瞎扯淡3.TA当场去世了4.智障与网友的高光时刻 二、文心一言1.设计测试用例2.随意发问3.手机端约会神器 三、体验总结:四、千帆大模型 前言 最近收到了文心一言3.5大模型的内测资格,正巧之前也体验过它的前身&q…...
R中当并行运算遇到C++函数时,让foreach+Rcpp一起工作
目录 方案一:C函数在R包中 方案二:C函数在本地,通过Rcpp::sourceCpp("fun_name.cpp")使用 方案三:将C函数写在当前脚本中 题外话:为什么要研究foreachRcpp? 本文参考: 问题:在fo…...
实现带头双向循环链表
🌈带头双向循环链表 描述:一个节点内包含两个指针,一个指向上一个节点,另一个指向下一个节点。哨兵位指向的下一个节点为头节点,哨兵位的上一个指向尾节点。 结构优势:高效率找尾节点;高效率插入…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
高考志愿填报管理系统---开发介绍
高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发,采用现代化的Web技术,为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## 📋 系统概述 ### 🎯 系统定…...
机器学习的数学基础:线性模型
线性模型 线性模型的基本形式为: f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法,得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...
Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...
渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用
阻止除自定义标签之外的所有标签 先输入一些标签测试,说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时(如通过点击或键盘导航&…...
