- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在 Electron (Chrome) 和 React 中实现一个聊天客户端。我们的首要任务是速度。那么,我们有必要使用虚拟化列表组件(也称为“缓冲渲染”或“窗口渲染”)。我们探索了react-virtualized、react-window 和react-infinite 等。
所有这些组件的一个共同问题是,如果支持可变高度的列表元素,则需要提前知道高度。现在,有些聊天很长,有些聊天很短,这对我们来说是一个挑战。 (借助 EXIF 数据和 ffprobe,图像和视频变得很容易)。
因此,我们面临着测量高度的挑战,同时还要努力提高性能。一种明显的技术是将元素放在视口(viewport)外的浏览器容器中,执行测量,然后渲染列表。但这在性能要求方面伤害了我们。像react-virtualized/CellMeasurer(原作者不再维护)和react-window这样的软件使我们可以使用这种技术,内置在库中,但性能有点慢而且不可靠。可能性能更高的类似想法是使用后台 Electron 浏览器窗口来进行渲染和测量,但我的直觉是这不会快得多。
我认为必须有某种解决方法可以根据自动换行、最大宽度和字体规则提前计算出字符串高度。
我目前的想法是使用像 string-pixel-width 这样的库以便在我们通过 API 获取文本数据后立即计算行高。基本上,该库使用 this piece of code生成字符宽度映射 [*]。然后,一旦我们知道每个文本的宽度,我们就会在每一行达到计算的最大行宽度时将其分开,最后通过行数推断列表元素的高度。由于断词,这将需要一些算法摆弄,但有一些库可以帮助解决这个问题 – css-line-break看起来很有希望。
[*] 我们必须稍微修改它以考虑所有 Unicode 字符范围,但这很简单。
我还没有完全探索过一些选项,包括 python weasyprint 项目和 facebook-yoga 项目。我对你的想法持开放态度!
最佳答案
使用 Canvas 功能测量文本可以高效地解决此问题。
Electrons canvas text is calculated the same as the regular text, there are some diffrences in rendering though especially in reguard of anti-aliasing but that does not affect the calculation.
您可以使用以下命令从任何文本中获取 TextMetrics
const canvas = document.getElementById('canvas')
const ctx = canvas.getContext('2d')
// Set your font parameters
// Docs: https://developer.mozilla.org/en-US/docs/Web/CSS/font
ctx.font = "30px Arial";
// returns a TextMetrics object
// Docs: https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics
const text = ctx.measureText('Hello world')
这不包括换行符和自动换行,对于此功能我建议您使用 text package from pixijs ,它已经使用了这个方法。此外,您可以 fork 源代码(MIT 许可证)并通过在 Electron 中启用实验性 chromium TextMetrics 功能并使用它来修改它以获得额外的性能。
这可以在创建窗口时完成
new BrowserWindow({
// ... rest of your window config ...
webPreferences: {
experimentalFeatures: true
}
})
现在到我在评论中提到的部分,因为我不知道你的代码库、你的计算以及一切都应该在渲染过程中发生。如果不是这种情况,您绝对应该将代码从主进程移至渲染进程,如果您执行文件访问操作或任何特定于节点的操作,您仍然应该执行此操作,但在所谓的预加载脚本中
它是 webPreferences 中的附加参数
webPreferences: {
preload: path.join(__dirname, 'preload.js')
experimentalFeatures: true
}
在此脚本中,您可以完全访问节点,包括 native 节点模块,而无需使用 IPC 调用。我不鼓励对任何类型的多次调用函数进行 IPC 调用的原因是它本质上很慢,您需要序列化/反序列化才能使它们工作。 Electron 的默认行为更糟糕,因为它使用 JSON,除非您使用 ArrayBuffers。
关于electron - 根据 CSS 规则测量文本高度 – _无需浏览器渲染_ – 与虚拟化列表一起使用,提前指定高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59440762/
过去几天我一直试图解决这个问题,但我做不到。我正在尝试生成 _ _ _ 形式的随机数。 _ _ _ _ 小数点前 3 位,然后是 4 位小数。 非常感谢任何帮助。谢谢, 院长 最佳答案 您发布的代码有
我的方法有问题。我需要从主类调用的方法的输出打印我: 需要这个输出:_ _ _ _ _ 我知道我可以将 System 的静态方法放入循环中,但这不是我想要的解决方案。我需要它来打印主类中方法的输出。
我正在学习 Scala,有一个非常基本的问题。考虑以下两个使用占位符语法的表达式 - // Syntax A val fnA = (_: Int, _: Int) => _ / _ // Synta
我正在使用图书馆 URLEmbeddedView 它在其库中定义了以下代码: func addConstraints(with view: UIView, center: CGPoint, multi
我一直在许多受人尊敬的文档中看到这个相当令人尴尬的事情:_|_ 或 (_|_) 找不到它的定义(Google 不能很好地处理符号)。那到底是什么呢? 最佳答案 来自 here :- Bottom Th
,_,( ){ ,_,| ,_,&};,_, 不知道是什么意思... 看起来像一个 bash 命令,但它可能是 s bash shell 指令或其他东西如果有人可以帮助理解这一点,我们将不胜感激。当我
所以我正在尝试构建一个函数,它接受一个元组列表并找到具有最大第二个元素的元组。但是我遇到了模式匹配错误。 这是我的代码。 resultTuple :: [((Int,Int),Int)] ->
我在 try Flow 编辑器中重现了我的情况,可以访问 here . 以下是链接发生问题时的代码: /* @flow */ type PayloadType = 1 | 2 | 3; type Tr
我在plfa读到这样一段代码。 import Relation.Binary.PropositionalEquality as Eq open Eq using (_≡_; refl; cong; s
这个问题在这里已经有了答案: Swift 3.0: compiler error when calling global func min(T,T) in Array or Dictionary e
是否有理由使用一个而不是另一个?似乎 _.some 和 _.map 更易于使用或适用于更多情况(根据我非常有限的经验),但从阅读它来看,它们听起来好像应该做同样的事情。我敢肯定还有其他这样的例子,我很
在 Xcode 7 Beta 中开始使用 Swift 2 后,出现错误 cannot invoke。是什么导致了这个问题? 我试图通过以下两个问题找出我的问题,但我仍然收到错误:Question 1
所以我玩了一会儿,试图写一些关于存在和变化的东西,我遇到了这段有趣的代码。 final case class Box[+T](val value: T) { def >>=[U](f: T =>
Here is the screenshot for the error. 遵循本教程 https://developers.google.com/places/ios-api/start 在本教程中
我正在为许多标准的 Underscore.js 函数重写底层代码,以提高我的 JavaScript 技能,但我有点受困于 _.every/ _.全部。似乎在库本身中,_.every/_.all 函数仅
我在 shell 脚本中多次看到他们在 if 比较中使用 "_",如下所示: if [ "_$str" = "_" ]; then ....; fi 上面的代码通过比较 if [ "_$str"= "
我正在尝试快速过滤字典: var data: [String: String] = [:] data = data.filter { $0.1 == "Test" } 上面的过滤器代码在 Swift
我在 Entity Framework 核心映射方面遇到了问题。我收到此异常“不支持从‘付款’到‘购买。付款’的关系,因为拥有的实体类型‘购买’不能位于非所有权关系的主要方面。”在调试此功能的测试时。
我正在尝试模拟groovy.sql.Sql调用(查询,params [],闭包)类。 下面是我正在尝试在DatabaseService类文件中的方法。 public void getUsers(Lis
在阅读 dart 代码时,我经常看到一些仅使用下划线 _ 参数调用的函数。这让我困扰了一段时间,由于 flutter 改进了它的分析消息,我有了一些线索......但我觉得我并没有真正理解这个概念:-
我是一名优秀的程序员,十分优秀!