首页 文章 精选 留言 我的

精选列表

搜索[AI替代],共10000篇文章
优秀的个人博客,低调大师

Rocket.Chat 2.4.0-rc.0 发布,Slack 开源替代品

Rocket.Chat 2.4.0-rc.0 发布了,更新内容如下: 新特性 邀请链接:共享链接以邀请用户 (#15933) 更改密码时注销其他客户端 (#15927) 不要在生产模式下的控制台中打印电子邮件 (#15928) 关闭即时聊天室时的 Apps-Engine 事件 (#15837) Bug 修复 导入程序:出现变量名称而不是其值 (#16010) 在边栏上添加最新消息的时间格式(#15930) 管理员设置说明 (#15994) 上传进度文本的宽度(#16023) 消息列表滚动到响应的底部 (#16018) SAML 注销错误(#15978) …… 详情见更新说明: https://github.com/RocketChat/Rocket.Chat/releases/tag/2.4.0-rc.0

优秀的个人博客,低调大师

Rocket.Chat 2.2.0-rc.0 发布,Slack 开源替代品

Rocket.Chat 2.2.0-rc.0 发布了,更新内容如下: 新特性 接受将 GIF 和 SVG 头像转换为 PNG,并保持 PNG 的透明度 (#11385) 对应用程序 slashcommands 和 slashcommand 预览的线程支持 (#15574) 删除所有已关闭的 Livechat 聊天 (#13991by@knrt10) 单独的集成角色 (#13902) 添加 users.requestDataDownload API 端点 (#14428by@Hudell&@ubarsaiyan) 检查状态为 away/idle(空闲) 时是否可以接收新的实时聊天对话 (#15451) 导入 SAML 语言并自动加入 SAML 渠道 (#14203by@Hudell&@unixtam) 添加选项以启用 X-Frame-options 标头,以避免在任何 iframe 中加载 (#14698) 首先将新的 Livechat 对话分配给 bot 代理 (#15317) 向 RoomFiles 添加文件类型过滤器 (#15289by@juanpetterson) 添加新的 Livechat 外观设置以设置对话结束消息 (#15577) 使用键盘的 Escape 键关闭表情符号框 (#13956by@mohamedar97) 将 livechat 小部件版本更新为 1.2.5 (#15600) 从 CSV 文件导入 DM (#15534) 新版本还包含大量改进和 bug 修复,详情可查看更新说明。

优秀的个人博客,低调大师

替代Docker Compose实现容器双向联通的三种方法

Docker 是目前最热门的技术平台之一,他在产生后很短的时间内就获得了社会的广泛关注。简单的说,他使得开发者和系统管理员能够用一种简易的方法去部署分布式应用。Docker 的生态系统非常庞大,有很多的工具协同工作,比如最常用的工具之一:Docker Compose。他使你可以在单个文件中定义并运行多容器应用,然后通过一个命令执行。 一个 docker-compose.yml 文件看起来是这样的: links 选项使容器能够在一个运行中创建的内部网络中通讯,并且在运行终止后销毁。在上面的例子中,当这个应用启动时,将在 web 容器中的 /etc/hosts 文件中建立一个别名为“redis”的入口,这使web容器能接通 redis 容器的服务。 问题 到目前为止,这个工具使你能够通过一个命令运行多容器服务应用。但是,如果你的容器间有复杂的连通,这就有可能会导致问题甚至应用无法运行。这里复杂的意思是多于一个的容器通过 links 选项共用另一个容器的服务。举例来说,在上面的应用中,web 容器想使用 redis 容器中的服务,如果在 redis 容器中添加“links:-web”并且通过 docker-compose 来运行他,你会看到如下信息: 事实上,这是 Docker 的一个历史问题,Docker 的网络系统曾有一些问题,而这正是一个典型体现。社区建议使用 ambassador pattern 作为解决这个问题的方法,但是这个解决方法增加了你应用的开销,毕竟这只是一个变通方法,不是一个 docker 化的解决方式。 因为我在自己的应用开发中面临这个问题,所以我寻找了一些基于 Docker 平台和 Docker 工具的方法,下面是我尝试成功的三种解决方法。 解决方案1:使用新的 Docker 网络接口 Docker 在DockerCon 2015上宣布了很多新的特性和工具,其中一个进步就是新的网络系统。新的网络类型使我能够采用一个简单的方法来实现一个有复杂通讯的多容器应用。 使用下面的方法使在同一个私有网络中的两个容器相互可见。 创建一个网络 dockernetworkcreatemynetwork 通过列举所有的网络,确保这个网络成功创建。 dockernetworkls 把容器连接到你的网络上 打开一个终端,执行以下命令来运行一个容器: dockerrun-it--publish-serviceweb.mynetworkweb 打开另一个终端并且运行另一个容器: dockerrun-it--publish-serviceredis.mynetworkredis 容器相互可见 现在,你可以从第一个终端 ping redis.mynetwork 并且收到回复。同样,从第二个终端,你可以 ping web.mynetwork 并收到回复。这是发布在.下的服务。 通过这种方法,你无需将自己的应用与 Docker Compose 链接,你只需创建一个网络并且在这个网络上发布服务。换句话说,我们将 docker-compose.yml 的连接替换为一个网络。 虽然这个功能还在试验中(在本文写作时),但我认为这种灵活的方式就是运行多容器应用的未来,所以,建议你遵循 Docker 发展的方向。 解决方案2:在多主机网络中使用 Docker Swarm 和 Compose 在多主机网络中使用 Swarm 和 Compose 也是一个实验性的功能。这个解决方案比前一个需要做更多的工作,但是,如果你有很多容器需要连接并且你打算让他们运行在集群中,这是最好的解决方法。 关于解决的详细流程,请参照 GitHub 里的原始功能介绍。首先,在多主机网络中安装 Swarm,然后你可以在去掉 links 选项后立即运行一个组合应用。为什么?因为从这个使用 Swarm 集群的多主机网络上启动的每一个容器都默认使用“overlay:multihost”网络,这意味着他们可以通过容器名相互访问。 因为这是实验性功能,所以请在 GitHub 给作者反馈。 解决方案3:使用外部 DNS 容器 一个经典的解决方法(我觉得是临时方法)是在你的 docker-compose.yml 文件中添加一个额外的容器。添加如下的容器到你的文件中。 dnsdock: image:tonistiigi/dnsdock volumes: -/var/run/docker.sock:/run/docker.sock ports: -172.17.42.1:53:53/udp 并且,在每个容器中你需要做如下的操作: 告诉容器 DNS 服务在什么位置: dns:172.17.42.1 命名每个容器使其对于服务发现可见 environment: -DNSDOCK_NAME=web -DNSDOCK_IMAGE=web 使用环境变量来完成这个命名。对 redis 容器做同样的操作(不管你的其他容器是什么)。 现在容器在..docker下相互可见。这就是 redis 容器和 web 容器中的服务在 web.docker 下通信的方法。 本文作者:邵长钰 来源:51CTO

优秀的个人博客,低调大师

用 IntersectionObserver 替代 scroll 事件实现图片懒加载,避免主线程卡顿

图片懒加载是博客、电商列表、后台表格里最常见的性能优化手段。过去大多数实现依赖监听 `scroll` 事件,在回调里遍历所有图片,用 `getBoundingClientRect()` 判断是否进入视口。这种做法在页面图片数量少的时候没问题,可一旦列表有几百个节点,滚动时每次事件触发都同步计算布局,主线程会被大量 `getBoundingClientRect` 和样式读取占满,滚动掉帧、白屏、卡顿就跟着来了。更麻烦的是,`scroll` 事件本身触发频率极高,即使用节流,也无法避免在快速滚动时漏掉图片进入视口的那一帧。浏览器后来提供了 `IntersectionObserver`,它把“元素是否进入视口”的检测交给合成器线程异步处理,回调只在交叉状态变化时执行,主线程不再需要参与滚动计算。这篇文章会从实际代码出发,讲清楚如何用 `IntersectionObserver` 写一个可复用的懒加载指令,处理图片加载失败、占位图、提前加载距离,以及和现代框架结合时的注意事项。 ## 为什么 scroll 方案在长列表里会卡 先看一段典型的旧实现: ```js const images = document.querySelectorAll('img[data-src]') function lazyLoad() { let count = 0 images.forEach(img => { if (img.dataset.src && isInViewport(img)) { img.src = img.dataset.src img.removeAttribute('data-src') count++ } }) if (count === images.length) { window.removeEventListener('scroll', throttled) } } function isInViewport(el) { const rect = el.getBoundingClientRect() return rect.top 0 } const throttled = throttle(lazyLoad, 200) window.addEventListener('scroll', throttled) window.addEventListener('resize', throttled) ``` 这段代码的问题不在逻辑,而在执行时机。`scroll` 事件在滚动过程中可能每帧触发多次,节流到 200ms 只是减少了回调次数,但每次回调依然要在主线程完成所有图片的布局读取。当图片节点有 300 个,且它们分散在文档流里,`getBoundingClientRect()` 会强制浏览器重新计算布局,这就是典型的布局抖动。如果此时页面还有 CSS 动画或者正在加载字体,卡顿会非常明显。 `IntersectionObserver` 的模型不一样:你告诉它要观察哪些元素、视口作为根、提前多少距离触发,它自己会在合适的时机调用回调。回调里的 `entry.isIntersecting` 直接告诉你交叉状态,不需要再读布局。 ## 用 IntersectionObserver 写一个基础懒加载 先不封装,直接看核心逻辑: ```js const observer = new IntersectionObserver( (entries) => { entries.forEach((entry) => { if (!entry.isIntersecting) return const img = entry.target const src = img.dataset.src if (!src) return img.src = src img.removeAttribute('data-src') observer.unobserve(img) }) }, { root: null, rootMargin: '200px 0px', threshold: 0.01, } ) document.querySelectorAll('img[data-src]').forEach((img) => observer.observe(img)) ``` `root: null` 表示以视口为根。`rootMargin: '200px 0px'` 让观察区域向外扩展 200px,图片还没进入视口就开始加载,用户滚动到的时候已经加载好了。`threshold: 0.01` 表示只要有 1% 可见就触发,避免大图完全进入才加载。加载完成后 `unobserve` 掉,避免重复触发。 这段代码已经能跑,但实际项目里图片会动态插入,比如分页加载、无限滚动、Vue/React 列表更新。所以需要把 observer 实例管理起来,并提供一个可复用的加载函数。 ## 封装成可复用模块 下面这个模块把 observer 单例化,支持动态注册和销毁: ```ts // lazy-image.ts type LazyOptions = { rootMargin?: string threshold?: number onLoad?: (img: HTMLImageElement) => void onError?: (img: HTMLImageElement) => void } let observer: IntersectionObserver | null = null let options: LazyOptions = {} function createObserver() { return new IntersectionObserver( (entries) => { entries.forEach((entry) => { if (!entry.isIntersecting) return const img = entry.target as HTMLImageElement loadImage(img) observer?.unobserve(img) }) }, { root: null, rootMargin: options.rootMargin ?? '200px 0px', threshold: options.threshold ?? 0.01, } ) } function loadImage(img: HTMLImageElement) { const src = img.dataset.src if (!src) return const temp = new Image() temp.onload = () => { img.src = src img.removeAttribute('data-src') options.onLoad?.(img) } temp.onerror = () => { options.onError?.(img) } temp.src = src } export function initLazyImage(opts: LazyOptions = {}) { options = opts if (!observer) { observer = createObserver() } } export function observeImage(img: HTMLImageElement) { if (!observer) initLazyImage() observer!.observe(img) } export function unobserveImage(img: HTMLImageElement) { observer?.unobserve(img) } export function destroyLazyImage() { observer?.disconnect() observer = null } ``` 这里用 `new Image()` 预加载,等图片真正下载成功再替换 `src`,可以避免加载过程中出现裂图。如果图片加载失败,交给 `onError` 处理,比如换成占位图。 ## 在 Vue 和 React 里怎么接 在 Vue 3 里可以写成自定义指令: ```ts // lazy.ts import type { Directive } from 'vue' import { observeImage, unobserveImage } from './lazy-image' export const vLazy: Directive = { mounted(el, binding) { el.dataset.src = binding.value observeImage(el) }, updated(el, binding) { if (binding.value !== binding.oldValue) { unobserveImage(el) el.dataset.src = binding.value observeImage(el) } }, unmounted(el) { unobserveImage(el) }, } ``` 模板里直接写: ```html ``` React 里更适合封装成组件: ```tsx import { useEffect, useRef } from 'react' import { observeImage, unobserveImage } from './lazy-image' type LazyImageProps = { src: string alt?: string className?: string } export function LazyImage({ src, alt = '', className }: LazyImageProps) { const ref = useRef(null) useEffect(() => { const img = ref.current if (!img) return img.dataset.src = src observeImage(img) return () => unobserveImage(img) }, [src]) return } ``` React 的 effect 依赖 `src`,当图片地址变化时会先取消观察,再重新注册,不会出现旧地址还在观察的情况。 ## 占位图和加载失败的细节 懒加载不能只考虑“什么时候加载”,还要考虑“没加载时显示什么”。常见做法是给 `img` 一个低分辨率占位图或者纯色背景: ```css .lazy-img { display: block; width: 100%; height: auto; background: #f0f0f0; object-fit: cover; } ``` 如果后端支持,可以让 `data-src` 指向原图,`src` 直接给一个极小的 base64 模糊图。这样即使 JS 还没执行,用户也能看到模糊预览,不会有空白。 加载失败时,`onError` 里可以替换成兜底图: ```ts initLazyImage({ onError(img) { img.src = img.removeAttribute('data-src') }, }) ``` 注意失败后也要移除 `data-src`,否则下次滚动事件或者重新观察时还会尝试加载。 ## 和原生 loading="lazy" 的关系 现在浏览器原生支持 ``,它也是基于类似的异步观察机制,代码量更少: ```html ``` 但原生懒加载的触发距离由浏览器控制,不能自定义 `rootMargin`,也无法在加载完成后执行回调。对于需要精细控制提前量、需要占位图切换、需要统计曝光或者做骨架屏的场景,`IntersectionObserver` 仍然更合适。实际项目里可以两者结合:普通图片用 `loading="lazy"`,关键首屏图用 `IntersectionObserver` 控制。 ## 一个容易忽略的坑:observer 实例不要重复创建 如果每个组件都 `new IntersectionObserver`,页面里会存在大量 observer 实例,每个实例都有自己的回调队列。虽然浏览器对 observer 数量没有硬性上限,但实例太多会增加内存和调度开销。上面的模块用单例 `observer` 管理所有图片,通过 `observe` 和 `unobserve` 控制生命周期,是更稳妥的做法。 另外,在 SPA 路由切换时记得调用 `destroyLazyImage()`,否则旧的 observer 可能还在观察已经移除的 DOM 节点。虽然现代浏览器对已脱离文档的元素会降低观察优先级,但手动断开更干净。 ## 兼容性和降级 `IntersectionObserver` 在现代浏览器里支持很好,IE 完全不支持。如果项目还需要兼容 IE,可以动态检测: ```ts if (!('IntersectionObserver' in window)) { // 降级:直接加载所有图片 document.querySelectorAll('img[data-src]').forEach((img) => { const src = img.dataset.src if (src) img.src = src }) } ``` 降级方案不是再去写 scroll 监听,而是在不支持的环境里直接加载全部图片,保证功能可用。毕竟 IE 用户的设备性能本身也有限,再叠加 scroll 计算反而更容易卡死。 把图片加载从 scroll 事件里解放出来之后,滚动性能会有明显改善,尤其在中低端安卓机上。代码量没有增加多少,但主线程不再被无意义的布局读取占用,列表滚动和动画都能保持顺畅。 推荐查看天气:https://www.40tianqi.com/ningyang/7tian.html 推荐查看天气:https://www.40tianqi.com/ningyang/10tian.html 推荐查看天气:https://www.40tianqi.com/ningyang/15tian.html 推荐查看天气:https://www.40tianqi.com/ningyang/40tian.html 推荐查看天气:https://www.40tianqi.com/dongping/ 推荐查看天气:https://www.40tianqi.com/dongping/zuotian.html 推荐查看天气:https://www.40tianqi.com/dongping/7tian.html 推荐查看天气:https://www.40tianqi.com/dongping/10tian.html 推荐查看天气:https://www.40tianqi.com/dongping/15tian.html 推荐查看天气:https://www.40tianqi.com/dongping/40tian.html 推荐查看天气:https://www.40tianqi.com/xintai/ 推荐查看天气:https://www.40tianqi.com/xintai/zuotian.html 推荐查看天气:https://www.40tianqi.com/xintai/7tian.html 推荐查看天气:https://www.40tianqi.com/xintai/10tian.html 推荐查看天气:https://www.40tianqi.com/xintai/15tian.html 推荐查看天气:https://www.40tianqi.com/xintai/40tian.html 推荐查看天气:https://www.40tianqi.com/weihai/ 推荐查看天气:https://www.40tianqi.com/weihai/zuotian.html 推荐查看天气:https://www.40tianqi.com/weihai/7tian.html 推荐查看天气:https://www.40tianqi.com/weihai/10tian.html 推荐查看天气:https://www.40tianqi.com/weihai/15tian.html 推荐查看天气:https://www.40tianqi.com/weihai/40tian.html 推荐查看天气:https://www.40tianqi.com/huancui/ 推荐查看天气:https://www.40tianqi.com/huancui/zuotian.html 推荐查看天气:https://www.40tianqi.com/huancui/7tian.html 推荐查看天气:https://www.40tianqi.com/huancui/10tian.html 推荐查看天气:https://www.40tianqi.com/huancui/15tian.html 推荐查看天气:https://www.40tianqi.com/huancui/40tian.html 推荐查看天气:https://www.40tianqi.com/wendeng/ 推荐查看天气:https://www.40tianqi.com/wendeng/zuotian.html 推荐查看天气:https://www.40tianqi.com/wendeng/7tian.html 推荐查看天气:https://www.40tianqi.com/wendeng/10tian.html 推荐查看天气:https://www.40tianqi.com/wendeng/15tian.html 推荐查看天气:https://www.40tianqi.com/wendeng/40tian.html 推荐查看天气:https://www.40tianqi.com/weihairongcheng/ 推荐查看天气:https://www.40tianqi.com/weihairongcheng/zuotian.html 推荐查看天气:https://www.40tianqi.com/weihairongcheng/7tian.html 推荐查看天气:https://www.40tianqi.com/weihairongcheng/10tian.html 推荐查看天气:https://www.40tianqi.com/weihairongcheng/15tian.html 推荐查看天气:https://www.40tianqi.com/weihairongcheng/40tian.html 推荐查看天气:https://www.40tianqi.com/rushan/ 推荐查看天气:https://www.40tianqi.com/rushan/zuotian.html 推荐查看天气:https://www.40tianqi.com/rushan/7tian.html 推荐查看天气:https://www.40tianqi.com/rushan/10tian.html 推荐查看天气:https://www.40tianqi.com/rushan/15tian.html 推荐查看天气:https://www.40tianqi.com/rushan/40tian.html 推荐查看天气:https://www.40tianqi.com/rizhao/ 推荐查看天气:https://www.40tianqi.com/rizhao/zuotian.html 推荐查看天气:https://www.40tianqi.com/rizhao/7tian.html 推荐查看天气:https://www.40tianqi.com/rizhao/10tian.html 推荐查看天气:https://www.40tianqi.com/rizhao/15tian.html 推荐查看天气:https://www.40tianqi.com/rizhao/40tian.html 推荐查看天气:https://www.40tianqi.com/donggang/ 推荐查看天气:https://www.40tianqi.com/donggang/zuotian.html 推荐查看天气:https://www.40tianqi.com/donggang/7tian.html 推荐查看天气:https://www.40tianqi.com/donggang/10tian.html 推荐查看天气:https://www.40tianqi.com/donggang/15tian.html 推荐查看天气:https://www.40tianqi.com/donggang/40tian.html 推荐查看天气:https://www.40tianqi.com/wulian/ 推荐查看天气:https://www.40tianqi.com/wulian/zuotian.html 推荐查看天气:https://www.40tianqi.com/wulian/7tian.html 推荐查看天气:https://www.40tianqi.com/wulian/10tian.html 推荐查看天气:https://www.40tianqi.com/wulian/15tian.html 推荐查看天气:https://www.40tianqi.com/wulian/40tian.html 推荐查看天气:https://www.40tianqi.com/juxian/ 推荐查看天气:https://www.40tianqi.com/juxian/zuotian.html 推荐查看天气:https://www.40tianqi.com/juxian/7tian.html 推荐查看天气:https://www.40tianqi.com/juxian/10tian.html 推荐查看天气:https://www.40tianqi.com/juxian/15tian.html 推荐查看天气:https://www.40tianqi.com/juxian/40tian.html 推荐查看天气:https://www.40tianqi.com/laiwu/ 推荐查看天气:https://www.40tianqi.com/laiwu/zuotian.html 推荐查看天气:https://www.40tianqi.com/laiwu/7tian.html 推荐查看天气:https://www.40tianqi.com/laiwu/10tian.html 推荐查看天气:https://www.40tianqi.com/laiwu/15tian.html 推荐查看天气:https://www.40tianqi.com/laiwu/40tian.html 推荐查看天气:https://www.40tianqi.com/laicheng/ 推荐查看天气:https://www.40tianqi.com/laicheng/zuotian.html 推荐查看天气:https://www.40tianqi.com/laicheng/7tian.html 推荐查看天气:https://www.40tianqi.com/laicheng/10tian.html 推荐查看天气:https://www.40tianqi.com/laicheng/15tian.html 推荐查看天气:https://www.40tianqi.com/laicheng/40tian.html 推荐查看天气:https://www.40tianqi.com/gangcheng/ 推荐查看天气:https://www.40tianqi.com/gangcheng/zuotian.html 推荐查看天气:https://www.40tianqi.com/gangcheng/7tian.html 推荐查看天气:https://www.40tianqi.com/gangcheng/10tian.html 推荐查看天气:https://www.40tianqi.com/gangcheng/15tian.html 推荐查看天气:https://www.40tianqi.com/gangcheng/40tian.html 推荐查看天气:https://www.40tianqi.com/linyi/ 推荐查看天气:https://www.40tianqi.com/linyi/zuotian.html 推荐查看天气:https://www.40tianqi.com/linyi/7tian.html 推荐查看天气:https://www.40tianqi.com/linyi/10tian.html 推荐查看天气:https://www.40tianqi.com/linyi/15tian.html 推荐查看天气:https://www.40tianqi.com/linyi/40tian.html 推荐查看天气:https://www.40tianqi.com/luozhuang/ 推荐查看天气:https://www.40tianqi.com/luozhuang/zuotian.html 推荐查看天气:https://www.40tianqi.com/luozhuang/7tian.html 推荐查看天气:https://www.40tianqi.com/luozhuang/10tian.html 推荐查看天气:https://www.40tianqi.com/luozhuang/15tian.html 推荐查看天气:https://www.40tianqi.com/luozhuang/40tian.html 推荐查看天气:https://www.40tianqi.com/hedong/ 推荐查看天气:https://www.40tianqi.com/hedong/zuotian.html 推荐查看天气:https://www.40tianqi.com/hedong/7tian.html 推荐查看天气:https://www.40tianqi.com/hedong/10tian.html 推荐查看天气:https://www.40tianqi.com/hedong/15tian.html 推荐查看天气:https://www.40tianqi.com/hedong/40tian.html 推荐查看天气:https://www.40tianqi.com/yinan/ 推荐查看天气:https://www.40tianqi.com/yinan/zuotian.html 推荐查看天气:https://www.40tianqi.com/yinan/7tian.html 推荐查看天气:https://www.40tianqi.com/yinan/10tian.html 推荐查看天气:https://www.40tianqi.com/yinan/15tian.html 推荐查看天气:https://www.40tianqi.com/yinan/40tian.html 推荐查看天气:https://www.40tianqi.com/tancheng/ 推荐查看天气:https://www.40tianqi.com/tancheng/zuotian.html 推荐查看天气:https://www.40tianqi.com/tancheng/7tian.html 推荐查看天气:https://www.40tianqi.com/tancheng/10tian.html 推荐查看天气:https://www.40tianqi.com/tancheng/15tian.html 推荐查看天气:https://www.40tianqi.com/tancheng/40tian.html 推荐查看天气:https://www.40tianqi.com/yishui/ 推荐查看天气:https://www.40tianqi.com/yishui/zuotian.html 推荐查看天气:https://www.40tianqi.com/yishui/7tian.html 推荐查看天气:https://www.40tianqi.com/yishui/10tian.html 推荐查看天气:https://www.40tianqi.com/yishui/15tian.html 推荐查看天气:https://www.40tianqi.com/yishui/40tian.html 推荐查看天气:https://www.40tianqi.com/cangshan/ 推荐查看天气:https://www.40tianqi.com/cangshan/zuotian.html 推荐查看天气:https://www.40tianqi.com/cangshan/7tian.html 推荐查看天气:https://www.40tianqi.com/cangshan/10tian.html 推荐查看天气:https://www.40tianqi.com/cangshan/15tian.html 推荐查看天气:https://www.40tianqi.com/cangshan/40tian.html 推荐查看天气:https://www.40tianqi.com/feixian/ 推荐查看天气:https://www.40tianqi.com/feixian/zuotian.html 推荐查看天气:https://www.40tianqi.com/feixian/7tian.html 推荐查看天气:https://www.40tianqi.com/feixian/10tian.html 推荐查看天气:https://www.40tianqi.com/feixian/15tian.html 推荐查看天气:https://www.40tianqi.com/feixian/40tian.html 推荐查看天气:https://www.40tianqi.com/pingyi/ 推荐查看天气:https://www.40tianqi.com/pingyi/zuotian.html 推荐查看天气:https://www.40tianqi.com/pingyi/7tian.html 推荐查看天气:https://www.40tianqi.com/pingyi/10tian.html 推荐查看天气:https://www.40tianqi.com/pingyi/15tian.html 推荐查看天气:https://www.40tianqi.com/pingyi/40tian.html 推荐查看天气:https://www.40tianqi.com/junan/ 推荐查看天气:https://www.40tianqi.com/junan/zuotian.html 推荐查看天气:https://www.40tianqi.com/junan/7tian.html 推荐查看天气:https://www.40tianqi.com/junan/10tian.html 推荐查看天气:https://www.40tianqi.com/junan/15tian.html 推荐查看天气:https://www.40tianqi.com/junan/40tian.html 推荐查看天气:https://www.40tianqi.com/mengyin/ 推荐查看天气:https://www.40tianqi.com/mengyin/zuotian.html 推荐查看天气:https://www.40tianqi.com/mengyin/7tian.html 推荐查看天气:https://www.40tianqi.com/mengyin/10tian.html 推荐查看天气:https://www.40tianqi.com/mengyin/15tian.html 推荐查看天气:https://www.40tianqi.com/mengyin/40tian.html 推荐查看天气:https://www.40tianqi.com/linshu/ 推荐查看天气:https://www.40tianqi.com/linshu/zuotian.html 推荐查看天气:https://www.40tianqi.com/linshu/7tian.html 推荐查看天气:https://www.40tianqi.com/linshu/10tian.html 推荐查看天气:https://www.40tianqi.com/linshu/15tian.html 推荐查看天气:https://www.40tianqi.com/linshu/40tian.html 推荐查看天气:https://www.40tianqi.com/dezhou/ 推荐查看天气:https://www.40tianqi.com/dezhou/zuotian.html 推荐查看天气:https://www.40tianqi.com/dezhou/7tian.html 推荐查看天气:https://www.40tianqi.com/dezhou/10tian.html 推荐查看天气:https://www.40tianqi.com/dezhou/15tian.html 推荐查看天气:https://www.40tianqi.com/dezhou/40tian.html 推荐查看天气:https://www.40tianqi.com/decheng/ 推荐查看天气:https://www.40tianqi.com/decheng/zuotian.html 推荐查看天气:https://www.40tianqi.com/decheng/7tian.html 推荐查看天气:https://www.40tianqi.com/decheng/10tian.html 推荐查看天气:https://www.40tianqi.com/decheng/15tian.html 推荐查看天气:https://www.40tianqi.com/decheng/40tian.html 推荐查看天气:https://www.40tianqi.com/lingxian/ 推荐查看天气:https://www.40tianqi.com/lingxian/zuotian.html 推荐查看天气:https://www.40tianqi.com/lingxian/7tian.html 推荐查看天气:https://www.40tianqi.com/lingxian/10tian.html 推荐查看天气:https://www.40tianqi.com/lingxian/15tian.html 推荐查看天气:https://www.40tianqi.com/lingxian/40tian.html 推荐查看天气:https://www.40tianqi.com/ningjin/ 推荐查看天气:https://www.40tianqi.com/ningjin/zuotian.html 推荐查看天气:https://www.40tianqi.com/ningjin/7tian.html 推荐查看天气:https://www.40tianqi.com/ningjin/10tian.html 推荐查看天气:https://www.40tianqi.com/ningjin/15tian.html 推荐查看天气:https://www.40tianqi.com/ningjin/40tian.html 推荐查看天气:https://www.40tianqi.com/qingyun/ 推荐查看天气:https://www.40tianqi.com/qingyun/zuotian.html 推荐查看天气:https://www.40tianqi.com/qingyun/7tian.html 推荐查看天气:https://www.40tianqi.com/qingyun/10tian.html 推荐查看天气:https://www.40tianqi.com/qingyun/15tian.html 推荐查看天气:https://www.40tianqi.com/qingyun/40tian.html 推荐查看天气:https://www.40tianqi.com/dezhoulinyi/ 推荐查看天气:https://www.40tianqi.com/dezhoulinyi/zuotian.html 推荐查看天气:https://www.40tianqi.com/dezhoulinyi/7tian.html 推荐查看天气:https://www.40tianqi.com/dezhoulinyi/10tian.html 推荐查看天气:https://www.40tianqi.com/dezhoulinyi/15tian.html 推荐查看天气:https://www.40tianqi.com/dezhoulinyi/40tian.html 推荐查看天气:https://www.40tianqi.com/qihe/ 推荐查看天气:https://www.40tianqi.com/qihe/zuotian.html 推荐查看天气:https://www.40tianqi.com/qihe/7tian.html 推荐查看天气:https://www.40tianqi.com/qihe/10tian.html

优秀的个人博客,低调大师

CSS scroll-driven animations:用滚动进度替代JS监听,减少卡顿

页面里做滚动驱动的动画,过去基本靠 `scroll` 事件加 `requestAnimationFrame`,再手动计算 `scrollTop` 和目标元素的位置。这种写法在桌面端通常没事,一到移动端或者滚动容器嵌套比较深的时候,掉帧就很明显。原因是 `scroll` 事件触发频率极高,回调里如果有 `getBoundingClientRect()` 这类强制同步布局的操作,主线程会被反复打断,合成器线程只能干等。CSS scroll-driven animations 把进度计算交给浏览器合成器,动画属性在合成阶段直接更新,不经过主线程。它提供 `scroll()` 和 `view()` 两个 timeline,前者跟踪滚动容器进度,后者跟踪元素进入视口的过程。这篇文章会讲清楚两个 timeline 的坐标系差异、`animation-range` 的实际用法、以及什么情况下仍然得回退到 JS。 ## 一个会掉帧的旧实现 假设有一个横向滚动的卡片列表,每张卡片随着滚动逐渐放大。常见写法是这样的: ```html 1 2 3 ``` ```js const scroller = document.getElementById('scroller') const cards = document.querySelectorAll('.card') function update() { const rect = scroller.getBoundingClientRect() const progress = -rect.left / (rect.width - window.innerWidth) cards.forEach((card, i) => { const offset = Math.abs(i / (cards.length - 1) - progress) card.style.transform = `scale(${1 - offset * 0.3})` }) } let ticking = false scroller.addEventListener('scroll', () => { if (!ticking) { requestAnimationFrame(() => { update() ticking = false }) ticking = true } }) ``` 用了 `requestAnimationFrame` 做节流,但 `getBoundingClientRect()` 和 `style.transform` 的写入仍然在主线程。滚动一快,一帧里要跑好几次布局和样式重算,掉帧就难免。 ## scroll() 和 view() 的区别 `scroll()` 生成一条 timeline,进度从 0 到 1,对应滚动容器从起始位置滚到结束位置。它需要指定滚动源,默认是最近的祖先滚动容器: ```css .scroller { overflow-x: auto; } .card { animation: zoom linear both; animation-timeline: scroll(nearest inline); } @keyframes zoom { from { transform: scale(0.7); } to { transform: scale(1); } } ``` `scroll()` 的参数是 ` `,scroller 可以是 `nearest`、`root`、`self`,axis 是 `block`、`inline`、`x`、`y`。横向滚动就用 `inline` 或 `x`。 `view()` 关注的是某个元素进入其滚动容器的可视区域的过程,非常适合做进入视口的淡入、放大: ```css .card { animation: fade-in linear both; animation-timeline: view(); animation-range: entry 0% entry 100%; } @keyframes fade-in { from { opacity: 0; transform: translateY(24px); } to { opacity: 1; transform: translateY(0); } } ``` `view()` 默认跟踪元素从刚进入容器到完全离开容器,进度 0 到 1。`animation-range` 可以把这个区间缩窄,比如只在元素进入阶段做动画:`entry 0%` 到 `entry 100%`。range 关键字有 `cover`、`contain`、`entry`、`exit`、`entry-crossing`、`exit-crossing`,配合百分比或长度值。 ## 多个元素共享一条进度 实际页面里经常是滚动进度驱动一整组元素的动画,而不是每个元素独立计时。比如一个横向滚动的图表,柱子依次升起。如果把 `view()` 加在每个柱子上,每个柱子会按自己进入视口的时机独立播放,看起来是错开的,但错误地错开了。这种场景应该用 `scroll()` 绑到滚动容器上,再让每个柱子共享同一条 timeline,通过 animation-delay 拉开顺序: ```css .chart { overflow-x: auto; } .bar { animation: rise linear both; animation-timeline: scroll(nearest inline); animation-delay: calc(var(--i) * 0.05s); } @keyframes rise { from { transform: scaleY(0); } to { transform: scaleY(1); } } ``` 这里 `--i` 由模板或 JS 写在行内样式上。animation-delay 在 scroll timeline 里不是时间延迟,而是进度偏移,值 0.05s 对应 timeline 上 5% 的进度。这是容易踩坑的地方,很多人以为是秒数,结果顺序完全对不上。 ## 动态获取进度做其他计算 CSS 动画只影响属性,如果页面上还有别的元素需要根据滚动进度改文字、改类名,光靠 timeline 不够。可以在滚动容器上绑定一个 `animation` 监听 `animationstart`、`animationiteration`、`animationend`,但拿不到连续进度。比较务实的做法是继续用 `scroll` 事件,配合 `ScrollTimeline` API 读进度: ```js const scroller = document.querySelector('.scroller') const timeline = new ScrollTimeline({ source: scroller, axis: 'inline' }) timeline.addEventListener('progress', (e) => { const progress = e.currentTime / 100 // 更新文案、切换类名等 }) ``` `ScrollTimeline` 目前 Chrome 已经支持,但 Safari 和 Firefox 还需要前缀或 polyfill。生产环境用之前先做好特性检测: ```js if (CSS.supports('animation-timeline: scroll()')) { // 用 CSS timeline } else { // 回退到 IntersectionObserver 或 scroll 事件 } ``` ## 需要注意的兼容和边界 scroll timeline 的动画只在滚动容器可滚动时才有进度。容器内容不够长,滚动范围是 0,整个动画会被跳过,元素停留在 `animation-fill-mode: both` 决定的初始或结束状态。这个行为容易在数据量少的时候暴露 bug。 另外 `animation-range` 如果用百分比,分母是整个滚动范围,不是元素自身大小。想让元素从底部露出到完全出现做动画,应该用 `entry 0%` 到 `entry 100%` 这种基于元素位置的 range,而不是 `0%` 到 `50%`。 还有 `will-change` 不要乱加。scroll timeline 的动画本身已经在合成器上跑,加 `will-change: transform` 反而可能创建额外的层,增加内存开销。元素数量少时无所谓,上百个卡片时就得权衡。 移动端 Safari 目前对 scroll timeline 的支持仍然不完整,最稳妥的策略还是用 `@supports` 做能力检测,CSS 负责支持的环境,JS 回退负责其余环境。回退方案不需要做到像素级一致,保证内容可读、动画不突兀就够了。 推荐查看天气:https://www.0dtq.com/chizhouqingyang/15tian.html 推荐查看天气:https://www.0dtq.com/chizhouqingyang/40tian.html 推荐查看天气:https://www.0dtq.com/fuzhou/ 推荐查看天气:https://www.0dtq.com/fuzhou/zuotian.html 推荐查看天气:https://www.0dtq.com/fuzhou/7tian.html 推荐查看天气:https://www.0dtq.com/fuzhou/10tian.html 推荐查看天气:https://www.0dtq.com/fuzhou/15tian.html 推荐查看天气:https://www.0dtq.com/fuzhou/40tian.html 推荐查看天气:https://www.0dtq.com/mawei/ 推荐查看天气:https://www.0dtq.com/mawei/zuotian.html 推荐查看天气:https://www.0dtq.com/mawei/7tian.html 推荐查看天气:https://www.0dtq.com/mawei/10tian.html 推荐查看天气:https://www.0dtq.com/mawei/15tian.html 推荐查看天气:https://www.0dtq.com/mawei/40tian.html 推荐查看天气:https://www.0dtq.com/minhou/ 推荐查看天气:https://www.0dtq.com/minhou/zuotian.html 推荐查看天气:https://www.0dtq.com/minhou/7tian.html 推荐查看天气:https://www.0dtq.com/minhou/10tian.html 推荐查看天气:https://www.0dtq.com/minhou/15tian.html 推荐查看天气:https://www.0dtq.com/minhou/40tian.html 推荐查看天气:https://www.0dtq.com/fuzhoulianjiang/ 推荐查看天气:https://www.0dtq.com/fuzhoulianjiang/zuotian.html 推荐查看天气:https://www.0dtq.com/fuzhoulianjiang/7tian.html 推荐查看天气:https://www.0dtq.com/fuzhoulianjiang/10tian.html 推荐查看天气:https://www.0dtq.com/fuzhoulianjiang/15tian.html 推荐查看天气:https://www.0dtq.com/fuzhoulianjiang/40tian.html 推荐查看天气:https://www.0dtq.com/luoyuan/ 推荐查看天气:https://www.0dtq.com/luoyuan/zuotian.html 推荐查看天气:https://www.0dtq.com/luoyuan/7tian.html 推荐查看天气:https://www.0dtq.com/luoyuan/10tian.html 推荐查看天气:https://www.0dtq.com/luoyuan/15tian.html 推荐查看天气:https://www.0dtq.com/luoyuan/40tian.html 推荐查看天气:https://www.0dtq.com/minqing/ 推荐查看天气:https://www.0dtq.com/minqing/zuotian.html 推荐查看天气:https://www.0dtq.com/minqing/7tian.html 推荐查看天气:https://www.0dtq.com/minqing/10tian.html 推荐查看天气:https://www.0dtq.com/minqing/15tian.html 推荐查看天气:https://www.0dtq.com/minqing/40tian.html 推荐查看天气:https://www.0dtq.com/yongtai/ 推荐查看天气:https://www.0dtq.com/yongtai/zuotian.html 推荐查看天气:https://www.0dtq.com/yongtai/7tian.html 推荐查看天气:https://www.0dtq.com/yongtai/10tian.html 推荐查看天气:https://www.0dtq.com/yongtai/15tian.html 推荐查看天气:https://www.0dtq.com/yongtai/40tian.html 推荐查看天气:https://www.0dtq.com/pingtan/ 推荐查看天气:https://www.0dtq.com/pingtan/zuotian.html 推荐查看天气:https://www.0dtq.com/pingtan/7tian.html 推荐查看天气:https://www.0dtq.com/pingtan/10tian.html 推荐查看天气:https://www.0dtq.com/pingtan/15tian.html 推荐查看天气:https://www.0dtq.com/pingtan/40tian.html 推荐查看天气:https://www.0dtq.com/fuqing/ 推荐查看天气:https://www.0dtq.com/fuqing/zuotian.html 推荐查看天气:https://www.0dtq.com/fuqing/7tian.html 推荐查看天气:https://www.0dtq.com/fuqing/10tian.html 推荐查看天气:https://www.0dtq.com/fuqing/15tian.html 推荐查看天气:https://www.0dtq.com/fuqing/40tian.html 推荐查看天气:https://www.0dtq.com/changleshi/ 推荐查看天气:https://www.0dtq.com/changleshi/zuotian.html 推荐查看天气:https://www.0dtq.com/changleshi/7tian.html 推荐查看天气:https://www.0dtq.com/changleshi/10tian.html 推荐查看天气:https://www.0dtq.com/changleshi/15tian.html 推荐查看天气:https://www.0dtq.com/changleshi/40tian.html 推荐查看天气:https://www.0dtq.com/xiamen/ 推荐查看天气:https://www.0dtq.com/xiamen/zuotian.html 推荐查看天气:https://www.0dtq.com/xiamen/7tian.html 推荐查看天气:https://www.0dtq.com/xiamen/10tian.html 推荐查看天气:https://www.0dtq.com/xiamen/15tian.html 推荐查看天气:https://www.0dtq.com/xiamen/40tian.html 推荐查看天气:https://www.0dtq.com/siming/ 推荐查看天气:https://www.0dtq.com/siming/zuotian.html 推荐查看天气:https://www.0dtq.com/siming/7tian.html 推荐查看天气:https://www.0dtq.com/siming/10tian.html 推荐查看天气:https://www.0dtq.com/siming/15tian.html 推荐查看天气:https://www.0dtq.com/siming/40tian.html 推荐查看天气:https://www.0dtq.com/haicang/ 推荐查看天气:https://www.0dtq.com/haicang/zuotian.html 推荐查看天气:https://www.0dtq.com/haicang/7tian.html 推荐查看天气:https://www.0dtq.com/haicang/10tian.html 推荐查看天气:https://www.0dtq.com/haicang/15tian.html 推荐查看天气:https://www.0dtq.com/haicang/40tian.html 推荐查看天气:https://www.0dtq.com/huli/ 推荐查看天气:https://www.0dtq.com/huli/zuotian.html 推荐查看天气:https://www.0dtq.com/huli/7tian.html 推荐查看天气:https://www.0dtq.com/huli/10tian.html 推荐查看天气:https://www.0dtq.com/huli/15tian.html 推荐查看天气:https://www.0dtq.com/huli/40tian.html 推荐查看天气:https://www.0dtq.com/jimei/ 推荐查看天气:https://www.0dtq.com/jimei/zuotian.html 推荐查看天气:https://www.0dtq.com/jimei/7tian.html 推荐查看天气:https://www.0dtq.com/jimei/10tian.html 推荐查看天气:https://www.0dtq.com/jimei/15tian.html 推荐查看天气:https://www.0dtq.com/jimei/40tian.html 推荐查看天气:https://www.0dtq.com/tongan/ 推荐查看天气:https://www.0dtq.com/tongan/zuotian.html 推荐查看天气:https://www.0dtq.com/tongan/7tian.html 推荐查看天气:https://www.0dtq.com/tongan/10tian.html 推荐查看天气:https://www.0dtq.com/tongan/15tian.html 推荐查看天气:https://www.0dtq.com/tongan/40tian.html 推荐查看天气:https://www.0dtq.com/xiangan/ 推荐查看天气:https://www.0dtq.com/xiangan/zuotian.html 推荐查看天气:https://www.0dtq.com/xiangan/7tian.html 推荐查看天气:https://www.0dtq.com/xiangan/10tian.html 推荐查看天气:https://www.0dtq.com/xiangan/15tian.html 推荐查看天气:https://www.0dtq.com/xiangan/40tian.html 推荐查看天气:https://www.0dtq.com/putian/ 推荐查看天气:https://www.0dtq.com/putian/zuotian.html 推荐查看天气:https://www.0dtq.com/putian/7tian.html 推荐查看天气:https://www.0dtq.com/putian/10tian.html 推荐查看天气:https://www.0dtq.com/putian/15tian.html 推荐查看天气:https://www.0dtq.com/putian/40tian.html 推荐查看天气:https://www.0dtq.com/chengxiang/ 推荐查看天气:https://www.0dtq.com/chengxiang/zuotian.html 推荐查看天气:https://www.0dtq.com/chengxiang/7tian.html 推荐查看天气:https://www.0dtq.com/chengxiang/10tian.html 推荐查看天气:https://www.0dtq.com/chengxiang/15tian.html 推荐查看天气:https://www.0dtq.com/chengxiang/40tian.html 推荐查看天气:https://www.0dtq.com/hanjiang/ 推荐查看天气:https://www.0dtq.com/hanjiang/zuotian.html 推荐查看天气:https://www.0dtq.com/hanjiang/7tian.html 推荐查看天气:https://www.0dtq.com/hanjiang/10tian.html 推荐查看天气:https://www.0dtq.com/hanjiang/15tian.html 推荐查看天气:https://www.0dtq.com/hanjiang/40tian.html 推荐查看天气:https://www.0dtq.com/putianlicheng/ 推荐查看天气:https://www.0dtq.com/putianlicheng/zuotian.html 推荐查看天气:https://www.0dtq.com/putianlicheng/7tian.html 推荐查看天气:https://www.0dtq.com/putianlicheng/10tian.html 推荐查看天气:https://www.0dtq.com/putianlicheng/15tian.html 推荐查看天气:https://www.0dtq.com/putianlicheng/40tian.html 推荐查看天气:https://www.0dtq.com/xiuyu/ 推荐查看天气:https://www.0dtq.com/xiuyu/zuotian.html 推荐查看天气:https://www.0dtq.com/xiuyu/7tian.html 推荐查看天气:https://www.0dtq.com/xiuyu/10tian.html 推荐查看天气:https://www.0dtq.com/xiuyu/15tian.html 推荐查看天气:https://www.0dtq.com/xiuyu/40tian.html 推荐查看天气:https://www.0dtq.com/xianyou/ 推荐查看天气:https://www.0dtq.com/xianyou/zuotian.html 推荐查看天气:https://www.0dtq.com/xianyou/7tian.html 推荐查看天气:https://www.0dtq.com/xianyou/10tian.html 推荐查看天气:https://www.0dtq.com/xianyou/15tian.html 推荐查看天气:https://www.0dtq.com/xianyou/40tian.html 推荐查看天气:https://www.0dtq.com/sanming/ 推荐查看天气:https://www.0dtq.com/sanming/zuotian.html 推荐查看天气:https://www.0dtq.com/sanming/7tian.html 推荐查看天气:https://www.0dtq.com/sanming/10tian.html 推荐查看天气:https://www.0dtq.com/sanming/15tian.html 推荐查看天气:https://www.0dtq.com/sanming/40tian.html 推荐查看天气:https://www.0dtq.com/meilie/ 推荐查看天气:https://www.0dtq.com/meilie/zuotian.html 推荐查看天气:https://www.0dtq.com/meilie/7tian.html 推荐查看天气:https://www.0dtq.com/meilie/10tian.html 推荐查看天气:https://www.0dtq.com/meilie/15tian.html 推荐查看天气:https://www.0dtq.com/meilie/40tian.html 推荐查看天气:https://www.0dtq.com/mingxi/ 推荐查看天气:https://www.0dtq.com/mingxi/zuotian.html 推荐查看天气:https://www.0dtq.com/mingxi/7tian.html 推荐查看天气:https://www.0dtq.com/mingxi/10tian.html 推荐查看天气:https://www.0dtq.com/mingxi/15tian.html 推荐查看天气:https://www.0dtq.com/mingxi/40tian.html 推荐查看天气:https://www.0dtq.com/qingliu/ 推荐查看天气:https://www.0dtq.com/qingliu/zuotian.html 推荐查看天气:https://www.0dtq.com/qingliu/7tian.html 推荐查看天气:https://www.0dtq.com/qingliu/10tian.html 推荐查看天气:https://www.0dtq.com/qingliu/15tian.html 推荐查看天气:https://www.0dtq.com/qingliu/40tian.html 推荐查看天气:https://www.0dtq.com/ninghua/ 推荐查看天气:https://www.0dtq.com/ninghua/zuotian.html 推荐查看天气:https://www.0dtq.com/ninghua/7tian.html 推荐查看天气:https://www.0dtq.com/ninghua/10tian.html 推荐查看天气:https://www.0dtq.com/ninghua/15tian.html 推荐查看天气:https://www.0dtq.com/ninghua/40tian.html 推荐查看天气:https://www.0dtq.com/datian/ 推荐查看天气:https://www.0dtq.com/datian/zuotian.html 推荐查看天气:https://www.0dtq.com/datian/7tian.html 推荐查看天气:https://www.0dtq.com/datian/10tian.html 推荐查看天气:https://www.0dtq.com/datian/15tian.html 推荐查看天气:https://www.0dtq.com/datian/40tian.html 推荐查看天气:https://www.0dtq.com/youxi/ 推荐查看天气:https://www.0dtq.com/youxi/zuotian.html 推荐查看天气:https://www.0dtq.com/youxi/7tian.html 推荐查看天气:https://www.0dtq.com/youxi/10tian.html 推荐查看天气:https://www.0dtq.com/youxi/15tian.html 推荐查看天气:https://www.0dtq.com/youxi/40tian.html 推荐查看天气:https://www.0dtq.com/shaxian/ 推荐查看天气:https://www.0dtq.com/shaxian/zuotian.html 推荐查看天气:https://www.0dtq.com/shaxian/7tian.html 推荐查看天气:https://www.0dtq.com/shaxian/10tian.html 推荐查看天气:https://www.0dtq.com/shaxian/15tian.html 推荐查看天气:https://www.0dtq.com/shaxian/40tian.html 推荐查看天气:https://www.0dtq.com/jiangle/ 推荐查看天气:https://www.0dtq.com/jiangle/zuotian.html 推荐查看天气:https://www.0dtq.com/jiangle/7tian.html 推荐查看天气:https://www.0dtq.com/jiangle/10tian.html 推荐查看天气:https://www.0dtq.com/jiangle/15tian.html 推荐查看天气:https://www.0dtq.com/jiangle/40tian.html 推荐查看天气:https://www.0dtq.com/taining/ 推荐查看天气:https://www.0dtq.com/taining/zuotian.html 推荐查看天气:https://www.0dtq.com/taining/7tian.html 推荐查看天气:https://www.0dtq.com/taining/10tian.html 推荐查看天气:https://www.0dtq.com/taining/15tian.html 推荐查看天气:https://www.0dtq.com/taining/40tian.html

优秀的个人博客,低调大师

用 IntersectionObserver 替代滚动监听:解决长列表页面卡顿与重复触发

在做后台管理系统或者内容 feed 流时,经常遇到“滚动到某个区域才加载更多”或者“元素进入可视区域后播放入场动画”的需求。最早我们普遍用 scroll 事件监听配合 getBoundingClientRect 计算位置,简单场景没问题,但随着列表变长、DOM 节点变多,滚动时频繁触发布局计算和重绘,页面掉帧明显,而且节流参数没调好会出现加载两次、动画闪烁。IntersectionObserver 是浏览器原生提供的异步观察 API,它把“元素是否进入视口”这件事交给浏览器内部调度,不再需要持续监听滚动。这篇文章从实际踩坑出发,讲清楚 IntersectionObserver 的基础用法、常见误用、懒加载与无限滚动的实现细节,以及如何跟 Vue、React 的生命周期配合,避免重复 observe 和内存泄漏。 ## 为什么 scroll + getBoundingClientRect 会卡 页面滚动时,scroll 事件触发频率极高,哪怕加了 100ms 节流,回调里执行 `el.getBoundingClientRect()` 也会强制浏览器重新计算布局。如果列表里每项都做一次,主线程就被占满。更隐蔽的问题是:在滚动过程中插入新节点,会导致后续元素位置偏移,原本计算的阈值失效,出现“还没到底就加载了下一页”的情况。 IntersectionObserver 的回调不是在滚动线程同步执行的,浏览器把多个观察结果合并后异步派发,回调里拿到的是 `entry.isIntersecting` 和 `entry.intersectionRatio`,不需要自己算坐标。 ## 基本用法与容易写错的地方 ```js const observer = new IntersectionObserver( (entries) => { entries.forEach((entry) => { if (entry.isIntersecting) { loadMore() } }) }, { root: null, rootMargin: '0px 0px 200px 0px', threshold: 0 } ) observer.observe(document.querySelector('.load-more-trigger')) ``` `rootMargin` 为底部加 200px 表示提前 200px 触发,适合做预加载。threshold 设为 0 表示目标刚进入视口就触发。这里有个坑:如果目标本身高度为 0,或者被父级 `overflow: hidden` 裁掉,回调可能永远不触发。调试时先确认元素在视口里能正常显示。 另一个高频错误是无限滚动里每次 `loadMore` 后重新 observe。其实同一个 observer 可以观察多个元素,不需要重复创建。 ```js // 错误:每次加载都新建 observer,旧的没 disconnect function onLoad() { const io = new IntersectionObserver(cb) io.observe(sentinel.value) } ``` 正确做法是 observer 只建一次,用同一个实例 observe 底部哨兵元素。加载完成后如果还需要继续观察,保持 observe 即可;如果列表已经到底,调用 `observer.unobserve(sentinel)` 或 `disconnect`。 ## 在 Vue 3 里配合组合式 API 把观察逻辑封装成 composable,组件卸载时自动清理,避免路由切换后回调还在跑。 ```ts import { onBeforeUnmount, ref, watch } from 'vue' export function useIntersection(elRef, callback, options = {}) { let observer = null const stop = () => { if (observer) { observer.disconnect() observer = null } } watch(elRef, (el) => { stop() if (!el) return observer = new IntersectionObserver((entries) => { entries.forEach((entry) => { if (entry.isIntersecting) callback(entry) }) }, options) observer.observe(el) }, { immediate: true }) onBeforeUnmount(stop) return { stop } } ``` 组件里用一个底部 div 作为哨兵: ```vue ``` `loading` 这个标记很重要,因为 IntersectionObserver 在元素持续可见时可能多次回调,不加锁会重复请求。 ## React 中的清理与依赖问题 React 函数组件里常见写法是 `useEffect` 里创建 observer,依赖数组清空,回调通过 ref 保存最新引用,避免闭包拿到旧状态。 ```tsx import { useEffect, useRef } from 'react' function useIntersection(callback, options) { const ref = useRef(null) const cbRef = useRef(callback) cbRef.current = callback useEffect(() => { const el = ref.current if (!el) return const observer = new IntersectionObserver((entries) => { entries.forEach((entry) => { if (entry.isIntersecting) cbRef.current(entry) }) }, options) observer.observe(el) return () => observer.disconnect() }, []) return ref } ``` 如果 options 里有动态值,比如 rootMargin 要随屏幕宽度变化,需要把 options 序列化后放进依赖,或者干脆重建 observer。不要在渲染函数里直接 new IntersectionObserver,那会导致每次渲染都创建实例。 ## 图片懒加载与动画入场 `` 原生支持 `loading="lazy"`,但兼容性和可控性有限。用 IntersectionObserver 实现时,把真实地址放在 `data-src`,进入视口后再赋值 `src`,同时 `unobserve` 掉已经加载的图片。 ```js const imgObserver = new IntersectionObserver((entries, obs) => { entries.forEach((entry) => { if (!entry.isIntersecting) return const img = entry.target img.src = img.dataset.src img.removeAttribute('data-src') obs.unobserve(img) }) }, { rootMargin: '100px' }) document.querySelectorAll('img[data-src]').forEach((img) => { imgObserver.observe(img) }) ``` 入场动画也类似,观察元素后加 class,触发 CSS transition。动画只播一次的场景记得在回调里 unobserve,否则元素来回滚动会反复加 class。 ## 兼容性与降级 IntersectionObserver 在现代浏览器覆盖已经很好,但如果要照顾老版本 Safari 或部分 WebView,可以加一个判断: ```js if (!('IntersectionObserver' in window)) { // 简单降级:直接加载全部,或者用 scroll 节流兜底 } ``` 不建议直接引入 polyfill 而不做体积评估,很多 polyfill 内部还是用 scroll + 定时器模拟,在长列表下表现并不好。如果确实要兼容,优先考虑减少同时观察的元素数量。 ## 性能上的几个实际经验 观察的元素越少越好。懒加载图片可以一次性 observe 所有 img,但无限滚动的哨兵只保留一个。 回调里避免做重布局操作,比如读取 `offsetHeight`。需要读的话放到 requestAnimationFrame 里。 在移动端,rootMargin 不要设得太大,预加载区域过大会让用户快速滚动时一次性触发多个请求。 如果页面里有多个独立滚动容器,给每个容器设置对应的 root,不要都用默认视口,否则判断逻辑会错。 调试时可以在 Chrome DevTools 的 Rendering 面板打开 “Paint flashing” 和 “Layout Shift Regions”,观察观察器触发时有没有不必要的重绘。IntersectionObserver 本身开销很低,真正拖慢页面的是回调里做了什么。 推荐查看天气:http://www.362tq.com/shenqiu/zuotian.html 推荐查看天气:http://www.362tq.com/shenqiu/7tian.html 推荐查看天气:http://www.362tq.com/shenqiu/10tian.html 推荐查看天气:http://www.362tq.com/shenqiu/15tian.html 推荐查看天气:http://www.362tq.com/shenqiu/40tian.html 推荐查看天气:http://www.362tq.com/dancheng/ 推荐查看天气:http://www.362tq.com/dancheng/zuotian.html 推荐查看天气:http://www.362tq.com/dancheng/7tian.html 推荐查看天气:http://www.362tq.com/dancheng/10tian.html 推荐查看天气:http://www.362tq.com/dancheng/15tian.html 推荐查看天气:http://www.362tq.com/dancheng/40tian.html 推荐查看天气:http://www.362tq.com/huaiyang/ 推荐查看天气:http://www.362tq.com/huaiyang/zuotian.html 推荐查看天气:http://www.362tq.com/huaiyang/7tian.html 推荐查看天气:http://www.362tq.com/huaiyang/10tian.html 推荐查看天气:http://www.362tq.com/huaiyang/15tian.html 推荐查看天气:http://www.362tq.com/huaiyang/40tian.html 推荐查看天气:http://www.362tq.com/taikang/ 推荐查看天气:http://www.362tq.com/taikang/zuotian.html 推荐查看天气:http://www.362tq.com/taikang/7tian.html 推荐查看天气:http://www.362tq.com/taikang/10tian.html 推荐查看天气:http://www.362tq.com/taikang/15tian.html 推荐查看天气:http://www.362tq.com/taikang/40tian.html 推荐查看天气:http://www.362tq.com/luyi/ 推荐查看天气:http://www.362tq.com/luyi/zuotian.html 推荐查看天气:http://www.362tq.com/luyi/7tian.html 推荐查看天气:http://www.362tq.com/luyi/10tian.html 推荐查看天气:http://www.362tq.com/luyi/15tian.html 推荐查看天气:http://www.362tq.com/luyi/40tian.html 推荐查看天气:http://www.362tq.com/zhumadian/ 推荐查看天气:http://www.362tq.com/zhumadian/zuotian.html 推荐查看天气:http://www.362tq.com/zhumadian/7tian.html 推荐查看天气:http://www.362tq.com/zhumadian/10tian.html 推荐查看天气:http://www.362tq.com/zhumadian/15tian.html 推荐查看天气:http://www.362tq.com/zhumadian/40tian.html 推荐查看天气:http://www.362tq.com/xiping/ 推荐查看天气:http://www.362tq.com/xiping/zuotian.html 推荐查看天气:http://www.362tq.com/xiping/7tian.html 推荐查看天气:http://www.362tq.com/xiping/10tian.html 推荐查看天气:http://www.362tq.com/xiping/15tian.html 推荐查看天气:http://www.362tq.com/xiping/40tian.html 推荐查看天气:http://www.362tq.com/shangcai/ 推荐查看天气:http://www.362tq.com/shangcai/zuotian.html 推荐查看天气:http://www.362tq.com/shangcai/7tian.html 推荐查看天气:http://www.362tq.com/shangcai/10tian.html 推荐查看天气:http://www.362tq.com/shangcai/15tian.html 推荐查看天气:http://www.362tq.com/shangcai/40tian.html 推荐查看天气:http://www.362tq.com/pingyu/ 推荐查看天气:http://www.362tq.com/pingyu/zuotian.html 推荐查看天气:http://www.362tq.com/pingyu/7tian.html 推荐查看天气:http://www.362tq.com/pingyu/10tian.html 推荐查看天气:http://www.362tq.com/pingyu/15tian.html 推荐查看天气:http://www.362tq.com/pingyu/40tian.html 推荐查看天气:http://www.362tq.com/zhengyang/ 推荐查看天气:http://www.362tq.com/zhengyang/zuotian.html 推荐查看天气:http://www.362tq.com/zhengyang/7tian.html 推荐查看天气:http://www.362tq.com/zhengyang/10tian.html 推荐查看天气:http://www.362tq.com/zhengyang/15tian.html 推荐查看天气:http://www.362tq.com/zhengyang/40tian.html 推荐查看天气:http://www.362tq.com/queshan/ 推荐查看天气:http://www.362tq.com/queshan/zuotian.html 推荐查看天气:http://www.362tq.com/queshan/7tian.html 推荐查看天气:http://www.362tq.com/queshan/10tian.html 推荐查看天气:http://www.362tq.com/queshan/15tian.html 推荐查看天气:http://www.362tq.com/queshan/40tian.html 推荐查看天气:http://www.362tq.com/miyang/ 推荐查看天气:http://www.362tq.com/miyang/zuotian.html 推荐查看天气:http://www.362tq.com/miyang/7tian.html 推荐查看天气:http://www.362tq.com/miyang/10tian.html 推荐查看天气:http://www.362tq.com/miyang/15tian.html 推荐查看天气:http://www.362tq.com/miyang/40tian.html 推荐查看天气:http://www.362tq.com/runan/ 推荐查看天气:http://www.362tq.com/runan/zuotian.html 推荐查看天气:http://www.362tq.com/runan/7tian.html 推荐查看天气:http://www.362tq.com/runan/10tian.html 推荐查看天气:http://www.362tq.com/runan/15tian.html 推荐查看天气:http://www.362tq.com/runan/40tian.html 推荐查看天气:http://www.362tq.com/suiping/ 推荐查看天气:http://www.362tq.com/suiping/zuotian.html 推荐查看天气:http://www.362tq.com/suiping/7tian.html 推荐查看天气:http://www.362tq.com/suiping/10tian.html 推荐查看天气:http://www.362tq.com/suiping/15tian.html 推荐查看天气:http://www.362tq.com/suiping/40tian.html 推荐查看天气:http://www.362tq.com/xincai/ 推荐查看天气:http://www.362tq.com/xincai/zuotian.html 推荐查看天气:http://www.362tq.com/xincai/7tian.html 推荐查看天气:http://www.362tq.com/xincai/10tian.html 推荐查看天气:http://www.362tq.com/xincai/15tian.html 推荐查看天气:http://www.362tq.com/xincai/40tian.html 推荐查看天气:http://www.362tq.com/wuhan/ 推荐查看天气:http://www.362tq.com/wuhan/zuotian.html 推荐查看天气:http://www.362tq.com/wuhan/7tian.html 推荐查看天气:http://www.362tq.com/wuhan/10tian.html 推荐查看天气:http://www.362tq.com/wuhan/15tian.html 推荐查看天气:http://www.362tq.com/wuhan/40tian.html 推荐查看天气:http://www.362tq.com/jianghan/ 推荐查看天气:http://www.362tq.com/jianghan/zuotian.html 推荐查看天气:http://www.362tq.com/jianghan/7tian.html 推荐查看天气:http://www.362tq.com/jianghan/10tian.html 推荐查看天气:http://www.362tq.com/jianghan/15tian.html 推荐查看天气:http://www.362tq.com/jianghan/40tian.html 推荐查看天气:http://www.362tq.com/qiaokou/ 推荐查看天气:http://www.362tq.com/qiaokou/zuotian.html 推荐查看天气:http://www.362tq.com/qiaokou/7tian.html 推荐查看天气:http://www.362tq.com/qiaokou/10tian.html 推荐查看天气:http://www.362tq.com/qiaokou/15tian.html 推荐查看天气:http://www.362tq.com/qiaokou/40tian.html 推荐查看天气:http://www.362tq.com/hanyang/ 推荐查看天气:http://www.362tq.com/hanyang/zuotian.html 推荐查看天气:http://www.362tq.com/hanyang/7tian.html 推荐查看天气:http://www.362tq.com/hanyang/10tian.html 推荐查看天气:http://www.362tq.com/hanyang/15tian.html 推荐查看天气:http://www.362tq.com/hanyang/40tian.html 推荐查看天气:http://www.362tq.com/wuchang/ 推荐查看天气:http://www.362tq.com/wuchang/zuotian.html 推荐查看天气:http://www.362tq.com/wuchang/7tian.html 推荐查看天气:http://www.362tq.com/wuchang/10tian.html 推荐查看天气:http://www.362tq.com/wuchang/15tian.html 推荐查看天气:http://www.362tq.com/wuchang/40tian.html 推荐查看天气:http://www.362tq.com/qingshan/ 推荐查看天气:http://www.362tq.com/qingshan/zuotian.html 推荐查看天气:http://www.362tq.com/qingshan/7tian.html 推荐查看天气:http://www.362tq.com/qingshan/10tian.html 推荐查看天气:http://www.362tq.com/qingshan/15tian.html 推荐查看天气:http://www.362tq.com/qingshan/40tian.html 推荐查看天气:http://www.362tq.com/hongshan/ 推荐查看天气:http://www.362tq.com/hongshan/zuotian.html 推荐查看天气:http://www.362tq.com/hongshan/7tian.html 推荐查看天气:http://www.362tq.com/hongshan/10tian.html 推荐查看天气:http://www.362tq.com/hongshan/15tian.html 推荐查看天气:http://www.362tq.com/hongshan/40tian.html 推荐查看天气:http://www.362tq.com/dongxihu/ 推荐查看天气:http://www.362tq.com/dongxihu/zuotian.html 推荐查看天气:http://www.362tq.com/dongxihu/7tian.html 推荐查看天气:http://www.362tq.com/dongxihu/10tian.html 推荐查看天气:http://www.362tq.com/dongxihu/15tian.html 推荐查看天气:http://www.362tq.com/dongxihu/40tian.html 推荐查看天气:http://www.362tq.com/hannan/ 推荐查看天气:http://www.362tq.com/hannan/zuotian.html 推荐查看天气:http://www.362tq.com/hannan/7tian.html 推荐查看天气:http://www.362tq.com/hannan/10tian.html 推荐查看天气:http://www.362tq.com/hannan/15tian.html 推荐查看天气:http://www.362tq.com/hannan/40tian.html 推荐查看天气:http://www.362tq.com/caidian/ 推荐查看天气:http://www.362tq.com/caidian/zuotian.html 推荐查看天气:http://www.362tq.com/caidian/7tian.html 推荐查看天气:http://www.362tq.com/caidian/10tian.html 推荐查看天气:http://www.362tq.com/caidian/15tian.html 推荐查看天气:http://www.362tq.com/caidian/40tian.html 推荐查看天气:http://www.362tq.com/jiangxia/ 推荐查看天气:http://www.362tq.com/jiangxia/zuotian.html 推荐查看天气:http://www.362tq.com/jiangxia/7tian.html 推荐查看天气:http://www.362tq.com/jiangxia/10tian.html 推荐查看天气:http://www.362tq.com/jiangxia/15tian.html 推荐查看天气:http://www.362tq.com/jiangxia/40tian.html 推荐查看天气:http://www.362tq.com/huangbei/ 推荐查看天气:http://www.362tq.com/huangbei/zuotian.html 推荐查看天气:http://www.362tq.com/huangbei/7tian.html 推荐查看天气:http://www.362tq.com/huangbei/10tian.html 推荐查看天气:http://www.362tq.com/huangbei/15tian.html 推荐查看天气:http://www.362tq.com/huangbei/40tian.html 推荐查看天气:http://www.362tq.com/xinzhouqu/ 推荐查看天气:http://www.362tq.com/xinzhouqu/zuotian.html 推荐查看天气:http://www.362tq.com/xinzhouqu/7tian.html 推荐查看天气:http://www.362tq.com/xinzhouqu/10tian.html 推荐查看天气:http://www.362tq.com/xinzhouqu/15tian.html 推荐查看天气:http://www.362tq.com/xinzhouqu/40tian.html 推荐查看天气:http://www.362tq.com/huangshi/ 推荐查看天气:http://www.362tq.com/huangshi/zuotian.html 推荐查看天气:http://www.362tq.com/huangshi/7tian.html 推荐查看天气:http://www.362tq.com/huangshi/10tian.html 推荐查看天气:http://www.362tq.com/huangshi/15tian.html 推荐查看天气:http://www.362tq.com/huangshi/40tian.html 推荐查看天气:http://www.362tq.com/huangshigang/ 推荐查看天气:http://www.362tq.com/huangshigang/zuotian.html 推荐查看天气:http://www.362tq.com/huangshigang/7tian.html 推荐查看天气:http://www.362tq.com/huangshigang/10tian.html 推荐查看天气:http://www.362tq.com/huangshigang/15tian.html 推荐查看天气:http://www.362tq.com/huangshigang/40tian.html 推荐查看天气:http://www.362tq.com/xisaishan/ 推荐查看天气:http://www.362tq.com/xisaishan/zuotian.html 推荐查看天气:http://www.362tq.com/xisaishan/7tian.html 推荐查看天气:http://www.362tq.com/xisaishan/10tian.html 推荐查看天气:http://www.362tq.com/xisaishan/15tian.html 推荐查看天气:http://www.362tq.com/xisaishan/40tian.html 推荐查看天气:http://www.362tq.com/xialu/ 推荐查看天气:http://www.362tq.com/xialu/zuotian.html 推荐查看天气:http://www.362tq.com/xialu/7tian.html 推荐查看天气:http://www.362tq.com/xialu/10tian.html 推荐查看天气:http://www.362tq.com/xialu/15tian.html 推荐查看天气:http://www.362tq.com/xialu/40tian.html 推荐查看天气:http://www.362tq.com/tieshan/ 推荐查看天气:http://www.362tq.com/tieshan/zuotian.html 推荐查看天气:http://www.362tq.com/tieshan/7tian.html 推荐查看天气:http://www.362tq.com/tieshan/10tian.html 推荐查看天气:http://www.362tq.com/tieshan/15tian.html 推荐查看天气:http://www.362tq.com/tieshan/40tian.html 推荐查看天气:http://www.362tq.com/yangxin/ 推荐查看天气:http://www.362tq.com/yangxin/zuotian.html 推荐查看天气:http://www.362tq.com/yangxin/7tian.html

优秀的个人博客,低调大师

终于找到免费的ProcessOn的替代品了!

### 写在前面 大家好,这里是**IT学习日记**。今日推荐项目:**LogicFlow,获取方式在文后!** 1000+优质开源项目推荐进度:**33/1000**。如需更多类型优质项目推荐,请在文章后留言。 ### 项目简介 最近有读者投稿,询问能否推荐一款代替ProcessOn这样的免费开源工具,功夫不负有心人,经过开源社区一番探索,最终找到了。 ![](https://developer.qcloudimg.com/http-save/yehe-9303198/e768a48cbab59be1452a1ebd48e025ca.png) **LogicFlow:是滴滴体验平台技术研发一款功能非常强大的流程图编辑框架,提供了丰富的流程图交互与编辑功能,并支持灵活的节点自定义和插件扩展机制。** ![](https://developer.qcloudimg.com/http-save/yehe-9303198/0b89c925010ed4ea45cd0287ac97b259.png) **LogicFlow提供强大的拓展性,支持前端开发人员自定义各种逻辑编排场景,如流程图、ER图和BPMN流程等。** LogicFlow可以广泛应用于工作审批配置、机器人逻辑编排和无代码平台的流程配置,为用户提供高效的解决方案。 ![](https://developer.qcloudimg.com/http-save/yehe-9303198/9784029daf8c519d531d6fd427d474b0.png) **目前,它已经被应用在滴滴内部客服业务下 IVR、工单流转、智能机器人等多个运营系统中。** ### 项目特点 - **可视化模型**:借助 LogicFlow 提供的直观界面,用户可以轻松创建、编辑和管理复杂的逻辑流程图。 - **高可定制性**:用户可根据需求定制节点、连接器和样式,创建符合特定应用场景的定制逻辑流程图。 - **自执行引擎**:支持浏览器端执行流程图逻辑,为无代码执行提供创新解决方案。 - **高拓展性**:兼容各种产品自定义的流程编辑需求,绝大部分模块以插件的形式实现,支持各模块自由插拔 ### 功能展示 - **手绘风格流程图**: ![](https://developer.qcloudimg.com/http-save/yehe-9303198/44ea7d5de53f0c963336c4cc2204c563.png) - **BPMN**: ![](https://developer.qcloudimg.com/http-save/yehe-9303198/ec91c4885807d34eb5dfdd290cc6261d.png) ![](https://developer.qcloudimg.com/http-save/yehe-9303198/961e9ff291320ed6c19f5bcd0947c6a3.png) - **流程图绘制MVP**: ![](https://developer.qcloudimg.com/http-save/yehe-9303198/2a5fa607925ee3f1005e2ff87dc6a414.png) - **比赛晋级图**: ![](https://developer.qcloudimg.com/http-save/yehe-9303198/4c5ac590b5bd6ddef5de95808b5e3827.png) - **泳道图**: ![](https://developer.qcloudimg.com/http-save/yehe-9303198/ee4d411322fd33e4f901abdfdfcdca74.png) - **编排器**: ![](https://developer.qcloudimg.com/http-save/yehe-9303198/315cfab78d31ec51ab587f98198fa87c.png) - **脑图和一键美化**: ![](https://developer.qcloudimg.com/http-save/yehe-9303198/d15c9061efddaf80fdbc4c5589452905.png) - **其他功能**: ![](https://developer.qcloudimg.com/http-save/yehe-9303198/7d07a18a8a897561d889e7cddc941506.png) ### 项目架构 ![](https://developer.qcloudimg.com/http-save/yehe-9303198/08b86b8248507050caa76faf2bda6d8c.png) ### 项目获取 在文后留言:项目,即可获取! 如果这篇文章对您有帮助,请一定帮我点个 “点赞” 和 “收藏”, 这对我非常重要。我将会继续推荐更多优质项目和新闻 如果这篇文章对您有帮助,请**“彦祖们”**一定帮我点个 **“在看”** 和 **“点赞”**,这对我非常重要。我将会继续推荐更多优质项目和新闻。

优秀的个人博客,低调大师

OpenAI:GPT-4 本月底退役,由 4o 完全替代

OpenAI 发布公告表示,自 2025 年 4 月 30 日起,GPT-4 将从 ChatGPT 中退役,并完全由 GPT-4o 取代。但 GPT-4 仍将继续通过API提供使用。 “GPT-4o 是我们较新的、原生的多模态模型。在 head‑to‑head 评估中,它在写作、编码、STEM 等方面始终超越 GPT-4。最近的升级进一步改善了 GPT-4o 的指令遵循、问题解决和对话流程,使其成为 GPT-4 的自然继承者。” GPT-4 于 2023 年 3 月在 ChatGPT 和微软的 Copilot 网络聊天机器人上推出,是一个多模态大型语言模型,支持接受图像和文本输入,以文本形式输出。OpenAI 创始人兼首席执行官 Sam Altman 曾表示,GPT-4 的规模据称非常庞大,其训练成本超过 1 亿美元。 值得一提的是,Sam Altman 最新在社交平台上发文表示,从明天(即北京时间周二)开始,该公司将在本周发布很多精彩的产品。其中将包括GPT-4.1—— 4o多模态模型的改进版,以及推出更小的GPT-4.1 mini和nano版本,o3“推理”模型和新的名为o4-mini的推理模型。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册