[译] 用 Web Worker 改善 Vue 组件性能

简介: [译] 用 Web Worker 改善 Vue 组件性能

原文: vuedose.tips/use-web-wor…

有时开发者需要和一些“很重”的组件打交道 -- 这通常是指由于执行了复杂的任务,所以创建和渲染开销都很大的组件。

比方说,我昨天就在使用“StoryBlok”工具库创建富文本编辑器的时候遇到了麻烦。

事情是这样的,从 StoryBlok API 获取富文本内容的时候,得到的数据有其独有的结构。为了将这种数据渲染到 HTML 中,就必须使用 storyblok-js-client 库提供的 richTextResolver.render(content) 方法。

我们可以将这个功能封装到一个 RichText.vue 组件中。一种基本的实现可能是:


<template>
  <div v-html="contentHtml"></div>
</template>
<script>
  export default {
    props: ["content"],
    computed: {
      contentHtml() {
        // $storyapi 是来自于 StoryBlok Nuxt.js 模块中的一个实例
        return this.$storyapi.richTextResolver.render(content);
      }
    }
  };
</script>

至此似乎平淡无奇,但...惊雷⚡️不期而至。

看上去,把这些内容渲染出来可是个繁重的工作,这在 StoryBlok 的各种组件开始渲染包含大量内容的数据时尤为明显。

现在再想象这样的场景:你的页面上有个包含富文本组件的列表,以及一个下拉筛选器。当你改变筛选项时,将重新请求符合筛选的所有内容,再把列表项都重新渲染一遍。

实际运行后你还将看到 richTextResolver.render 带来的渲染负担:筛选下拉框在被选择值后的关闭动作非常迟缓。

原因就在于默认的 JavaScript 运行在主线程,也就是被称作 UI-blocking 的问题。

问题是理解了,但...如何解决呢?其实也很简单:为富文本渲染任务使用一个 Web Worker 就行了。

如果要对 JS 单线程和 Web Worker 有所了解,请阅读:

Web Worker 运行在一个独立的线程中,且不会造成 UI 阻塞,非常适于我们的用例。

worker-loader 插件

更多的技术细节请阅读上面的链接,这里只要知道 Web Worker 运行在自有的上下文中,并且默认情况无法访问外部上下文就行了。但本例中我们要访问到 storyblok-js-client npm 模块。对此,可以用 Webpack 中的 worker-loader 解决。

首先用  npm install -D worker-loader 安装依赖。然后需要对其配置,比如在本例中的 Nuxt.js 中像这样配置 nuxt.config.js :


build: {
  extend(config, { isDev, isClient }) {
    config.module.rules.push({
      test: /\.worker\.js$/,
      use: { loader: "worker-loader" }
    });
  }
}

这样一来,所有 .worker.js 结尾的文件都将被 worker-loader 注册为 Web Worker

下面创建一个 render-html.worker.js


import StoryblokClient from "storyblok-js-client";
let storyClient = new StoryblokClient({});
self.addEventListener("message", ({ data }) => {
  const result = storyClient.richTextResolver.render(data);
  self.postMessage(result);
});

这就是一个 worker 的基础实现。需要监听 message 事件,这也正是与你的 Vue.js 应用通讯的方式。当你从事件中得到 data 后,用 storyblok-js-client 渲染该数据,并将得到的结果用 self.postMessage 回传。

接着来升级一下 RichText.vue 组件,以使用以上 worker :


<template>
  <div v-html="contentHtml"></div>
</template>
<script>
  import Worker from "./render-html.worker.js";
  const worker = new Worker();
  export default {
    props: ["content"],
    data: () => ({
      contentHtml: ""
    }),
    mounted() {
      // 等待处理好的 HTML 内容,并更新到状态中
      worker.onmessage = ({ data }) => {
        this.contentHtml = data;
      };
      // 将原始内容传递给 worker 渲染
      worker.postMessage(this.content);
    }
  };
</script>

结果

你肯定很好奇,经过这一番折腾,性能上有何改善呢?看看就知道了。

在 main.js 等处设置 Vue.config.performance = true 后,在 Chrome DevTools 里的 performance 选项卡中可查看性能监测数据。

结果分别是:组件渲染(创建 VDom 结构的时间)快了 20.65 倍、patch(将 VDom 结构应用到 DOM 上的时间)快了 1.39 倍。


相关文章
|
1月前
|
前端开发 JavaScript 安全
入门Vue+.NET 8 Web Api记录(一)
入门Vue+.NET 8 Web Api记录(一)
55 4
|
15天前
|
JavaScript 前端开发 开发者
哇塞!Vue.js 与 Web Components 携手,掀起前端组件复用风暴,震撼你的开发世界!
【8月更文挑战第30天】这段内容介绍了Vue.js和Web Components在前端开发中的优势及二者结合的可能性。Vue.js提供高效简洁的组件化开发,单个组件包含模板、脚本和样式,方便构建复杂用户界面。Web Components作为新兴技术标准,利用自定义元素、Shadow DOM等技术创建封装性强的自定义HTML元素,实现跨框架复用。结合二者,不仅增强了Web Components的逻辑和交互功能,还实现了Vue.js组件在不同框架中的复用,提高了开发效率和可维护性。未来前端开发中,这种结合将大有可为。
57 0
|
5天前
|
JavaScript 前端开发
【前端web入门第一天】03 综合案例 个人简介与vue简介
该网页采用“从上到下,先整体再局部”的制作思路,逐步分析并编写代码实现个人简介页面。内容涵盖尤雨溪的背景、学习经历及主要成就,同时介绍其开发的Vue.js框架特点。代码结构清晰,注重细节处理,如使用快捷键提高效率,预留超链接位置等,确保最终效果符合预期。
|
14天前
|
缓存 安全 前端开发
【性能大逆袭】Web2py应用如何从龟速变飞快?六大优化秘籍让你的应用焕然一新!
【8月更文挑战第31天】Web2py是一款备受欢迎的全栈Python Web框架,以其内置的数据库抽象层和安全特性著称。然而,随着应用规模的扩大,性能瓶颈逐渐显现。本文通过对比分析,从代码层面(如减少数据库查询、避免全局变量)到部署策略(如静态文件压缩、CDN加速、选择合适数据库、优化查询、异步处理),全面介绍Web2py应用的性能优化方法及其应用场景。通过具体示例,展示了如何创建并优化一个简单的Web2py应用,旨在帮助开发者构建高效稳定的Web应用。
35 2
|
15天前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
18 1
|
17天前
|
缓存 NoSQL 数据库
Web服务器与数据库优化:提升系统性能的最佳实践
【8月更文第28天】在现代的Web应用中,Web服务器与后端数据库之间的交互是至关重要的部分。优化这些组件及其相互作用可以显著提高系统的响应速度、吞吐量和可扩展性。本文将探讨几种常见的优化策略,并提供一些具体的代码示例。
32 1
|
18天前
|
缓存 前端开发 JavaScript
超时空加速秘籍:揭秘JavaScript前端开发中的性能魔法,让您的Web应用瞬间穿越到未来!
【8月更文挑战第27天】本文介绍了一系列实用的JavaScript性能优化方法并提供了示例代码,包括减少DOM操作、使用事件委托、避免阻塞主线程、异步加载资源、利用浏览器缓存、代码分割以及使用Service Worker等技术,帮助开发者有效提升Web应用性能和用户体验。
31 2
|
21天前
|
存储 缓存 监控
Memcached玩转Web性能:一致性哈希、数据持久化,一文全掌握!
【8月更文挑战第24天】Memcached是一款高性能的分布式内存对象缓存系统,它通过在网络中存储数据并使用简单的键值对机制来提高动态Web应用的性能。它可以显著减少数据库查询次数,进而减轻数据库负载并加快响应时间。为了最大化利用Memcached的优势,建议合理配置内存使用、采用一致性哈希策略、实施数据持久化措施,并持续监控系统健康状况。提供的示例代码展示了如何使用Java创建客户端、添加和获取数据。
27 1
|
27天前
|
缓存 编解码 前端开发
优化Web应用性能的前端技巧:从加载时间到用户体验
在现代Web开发中,提升前端性能不仅仅是为了缩短页面加载时间,更是为了提供更流畅的用户体验。本文将探讨几种有效的前端优化技术,包括懒加载、代码拆分、资源压缩以及浏览器缓存策略。通过具体实例和最佳实践,读者将能够掌握如何系统地提高Web应用的响应速度,减少资源消耗,并最终改善用户的整体体验。
|
14天前
|
物联网 C# 智能硬件
智能家居新篇章:WPF与物联网的智慧碰撞——通过MQTT协议连接与控制智能设备,打造现代科技生活的完美体验
【8月更文挑战第31天】物联网(IoT)技术的发展使智能家居设备成为现代家庭的一部分。通过物联网,家用电器和传感器可以互联互通,实现远程控制和状态监测等功能。本文将探讨如何在Windows Presentation Foundation(WPF)应用中集成物联网技术,通过具体示例代码展示其实现过程。文章首先介绍了MQTT协议及其在智能家居中的应用,并详细描述了使用Wi-Fi连接方式的原因。随后,通过安装Paho MQTT客户端库并创建MQTT客户端实例,演示了如何编写一个简单的WPF应用程序来控制智能灯泡。
32 0