1.vue3-computed源码解析
2.深入p-limit源码,发布如何限制并发数?
3.Vue—关于响应式(二、微任务平异步更新队列原理分析)
4.2023年兼职副业推荐,台源台10个让你持续赚钱的布微好方法
5.Async、Await 从源码层面解析其工作原理
6.SIGGRAPH:生成创意图形的任务智能工具4
vue3-computed源码解析
在 Vue 3 中,理解 computed 源码有助于深入掌握其工作原理。发布期货源码平台版本为 3.2.,微任务平通过单例测试和官网文档,台源台我们了解到 computed 的布微主要特性是基于 getter 函数创建,类似于一个只读的任务响应式值,其更新依赖于传入的发布 getter 函数,而非直接修改.value属性。微任务平其核心逻辑与 ref 类似,台源台利用 dep 和 trackRefValue/triggerRefValue 函数实现响应式。布微
计算属性的任务实现分为两种:通过 computed 函数或 deferredComputed。两者都是 ref 类型,但 deferredComputed 在 effect 中具有异步特性,只有在下一次微任务中才会更新。在 Vue 中,通过ComputedRefImpl 对象管理计算属性,它使用 _value 和 _dirty 机制实现懒加载,当数据改变时,会触发收集函数并更新缓存值。
在源码中,可以看到计算属性的 getter 被包装在 effect 中,依赖数据变化时会通过调度器来触发收集。但需要注意的是,当在 effect 内先改变依赖,再改变外部的计算属性,可能会导致异常。对于 deferredComputed,其调度器更为复杂,会在下一次微任务执行时处理异步更新。
虽然 deferredComputed 的处理存在一些特殊情况,如在微任务期间的值比较问题,但 Vue 通过缓存相关 effect 的值,以及 hasCompareTarget 变量,确保了异步更新的正确性。至此,我们已经详细了解了 Vue3 computed 的源码实现,接下来可以继续探索 effectScope 的源码。
上一章:vue3-ref源码解析
下一章:vue3-effectScope源码解析
深入p-limit源码,如何限制并发数?
并发处理在现代编程中扮演着至关重要的角色,尤其在异步操作和并行任务处理中。虽然JavaScript是单线程执行的,但它通过Promise.all等API实现了并发效果,允许同时处理多个异步操作。
Promise.all是Promise库中的一个关键函数,它接受一个Promise数组作为参数。此函数会等待所有给定的区间振幅指标源码Promise实例全部完成或其中一个失败,然后返回一个新Promise的数组结果。如果所有Promise都成功,则返回所有成功结果的数组;如果一个或多个Promise被拒绝,则返回第一个拒绝的Promise的reason。
然而,有时并发操作需要被限制。过多的并发请求可能给服务器带来压力,影响性能。这时候,p-limit库就显得尤为重要,它允许我们为并发操作设置一个上限。
p-limit提供了pLimit函数来定义并发限制。使用pLimit时,你可以传入一个数量参数,这个参数决定了同时可以执行的异步任务数量。函数返回一个新函数,该函数接收需要并发执行的异步任务。当执行队列中的任务数量达到上限时,新传入的任务会被加入队列,等待前面的任务释放资源后执行。
p-limit的实现中,核心在于初始化一个计数器和一个任务队列。队列采用了yocto-queue库实现,它提供了一个基于链表的队列结构。在并发处理过程中,p-limit通过enqueue函数将异步任务入队,并在队列中管理任务的执行顺序和限制。
enqueue函数负责将异步任务入队,同时对任务进行包装和控制,确保任务在队列中按顺序执行,且不会超过指定的并发限制。这通过使用async函数实现,以确保等待下一个微任务的到来,从而在异步更新的activeCount值上进行比较,以维持并发限制。
在实际执行时,每个任务的执行由run函数控制。此函数在内部管理并发计数,并在任务完成后执行下一个任务,确保并发限制被严格遵守。enqueue、run和next三个函数协同工作,构成了p-limit中一个动态、有限的异步任务执行流程。
此外,p-limit还包含了辅助函数用于管理任务状态,如获取当前执行任务数量(activeCount)、队列中等待任务数量(pendingCount)以及清空任务队列(clearQueue)。这些功能共同协作,怎么查看虚幻源码确保并发处理既高效又可控。
通过p-limit库,开发人员能够轻松实现异步操作的并发控制,优化性能并防止服务器过载。了解其内部机制,能更好地利用并发处理技术,提升应用响应速度和用户体验。
Vue—关于响应式(二、异步更新队列原理分析)
本节学习要点:Event Loop、Promise
关于Event Loop的介绍,可以参考阮一峰老师的文章。
关于Promise,请访问:developer.mozilla.org/z...
上一节介绍了Vue通过Object.defineProperty拦截数据变化的响应式原理,数据变化后会触发notify方法来通知变更。这一节将继续分析,收到通知后Vue会开启一个异步更新队列。
以下是两个问题:
一、异步更新队列
首先看一段代码演示。
将上一节的代码拿过来,假设我们现在不仅依赖x,还有y、z,分别将x、y、z输出到页面上。我们现在依赖了x、y、z三个变量,那么我们应该把onXChange函数名改为watch,表示它可以监听变化,而不仅仅是监听一个x的变化。
可以看到这三个值都被打印在页面上。
现在我们对x、y、z的value进行修改。
查看页面,结果没有问题,每个数据的变化都被监听到并且进行了响应。
既然结果是对的,那我们的问题是什么?
这个问题是:每次数据变化都进行了响应,每次都渲染了模板,如果数据变化了一百次、一千次呢?难道要重复渲染一百遍、一千遍吗?
我们都知道频繁操作DOM会影响网页性能,涉及重排和重绘的知识感兴趣请阅读阮一峰老师的文章:ruanyifeng.com/blog/...
因此,既要保证所有的依赖都准确更新,又要保证不能频繁渲染成为了首要问题。现在我们修改x.value、y.value、更新后的源码z.value都是同步通知依赖进行更新的,有没有一种机制可以等到我修改这些值之后再执行更新任务呢?
这个答案是——异步。
异步任务会等到同步任务清空后执行,借助这个特点和我们前面的分析,我们需要:
按照步骤,我们创建如下代码:
接着我们需要修改一下notify的代码,监听到数据变化后不立即调用依赖进行更新,而是将依赖添加到队列中。
回到页面,我们发现页面上还是重复渲染了三次模板。
那么我们写的这段代码有什么用呢?异步又体现在哪里呢?接着往下看。
二、nextTick原理分析
上面的代码中,虽然我们开启了一个队列,并且成功将任务推入队列中进行执行,但本质上还是同步推入和执行的。我们要让它变成异步队列。
于是到了Promise发挥作用的时候了。关于宏任务和微任务的介绍请参考:zhuanlan.zhihu.com/p/...
我们创建nextTick函数,nextTick接收一个回调函数,返回一个状态为fulfilled的Promise,并将回调函数传给then方法。
然后只需要在添加任务时调用nextTick,将执行任务的flushJobs函数传给nextTick即可。
回到页面。
虽然修改了x、y、z三个变量的value,最后页面上只渲染了一次。
再来总结一下这段代码的执行过程:
这也正是Vue采用的解决方案——异步更新队列,官方文档描述得很清楚。
文档地址:cn.vuejs.org/v2/guide/r...
三、结合Vue源码来看nextTick
在Vue中,我们可以通过两种方式来调用nextTick:
(至于什么时候使用nextTick,如果你不偷懒看了官方文档的话,都能找到答案哈哈)
以下源码节选自vue2.6.版本,这两个API分别在initGlobalAPI函数和renderMixin函数中挂载,它们都引用了nextTick函数。
nextTick源码如下:
在内部,它访问了外部的callbacks,这个callbacks就是前面提到的队列,nextTick一调用就给队列push一个回调函数,然后判断pending(pending的作用就是控制同一时间内只执行一次timerFunc),调用timerFunc(),最后返回了一个Promise(使用过nextTick的应该都知道吧)。
我们来看一下callbacks、pending、timerFunc是如何定义的。
可以看到timerFunc函数只是艾聪宝源码调用了p.then方法并将flushCallbacks函数推入了微任务队列,而p是一个fulfilled状态的Promise,与我们自己的nextTick功能一致。
这个flushCallbacks函数又干了什么呢?
flushCallbacks中重新将pending置为初始值,复制callbacks队列中的任务后将队列清空,然后依次执行复制的任务,与我们自己的flushJobs函数功能一致。
看完上面的源码,可以总结出Vue是这么做的,又到了小学语文之——提炼中心思想的时候了。
对比一下我们自己写的代码,你学会了吗?
以上演示代码已上传github:github.com/Mr-Jemp/VueS...
后面要学习的内容在这里:
Vue—关于响应式(三、Diff Patch原理分析)
Vue—关于响应式(四、深入学习Vue响应式源码)
本文由博客一文多发平台OpenWrite发布!
年兼职副业推荐,个让你持续赚钱的好方法
在这个经济社会,我们都希望在空闲时间里增加一些额外收入,并有机会找到自己热爱的事业,每天赚几十上百元是一个不错的开始。以下是小编为大家整理了个一直持续赚钱的好副业。
如果你喜欢绘画,擅长创作,下面这几个副业非常适合你。首先,动画模板是一个好选择。如果你对动画感兴趣,或者有一定的美术功底,那么这个副业非常适合你。现在有几家国内知名的MG动画厂商,比如来画、万彩动画大师、优芽互动**等,他们都推出了动画模板设计的创作者招募计划。你只要利用他们提供的编辑器,做出好看生动的动画模板,就能获得源源不断的订单和模板收入。我有一个朋友就是做这个的,他说一个月能赚几千块钱。其次,手机主题商店也是一个大的市场。很多手机用户都喜欢换主题、壁纸、铃声、图标、字体等等,来美化自己的手机界面。我们可以利用这个需求,设计一些主题包或者其他内容,在手机主题商店里出售或者分成。我认识一个同行,他就是在华为主题商店里设计了一系列主题包,恰好遇到热点事件,他的下载量暴涨,四天就赚了元。相关平台有:小米主题、OPPO主题、VIVO主题、华为EMUI主题商店等。
第三,PPT模板是一个我一直看好的副业,也是我自己做过的。年,我就靠PPT模板赚到了元。因为PPT美观实用,企事业单位需求强烈。但不是每一个用户都能接受一页-元的原创设计费,所以购买PPT模板就成为了他们最佳选择。只要你能找到热门领域和风格,做出高质量的模板,在相关平台上发布就可以了。相关平台有:变色龙、演界网、稻壳儿、我图网、千图网等。如果你没有什么技能,也不喜欢推广,那么可以做下面这些简单的副业。在启源宝库这款任务合集综合性的平台上,提供多种短期和长期的副业项目,每个任务和项目都有详细的教程,并且操作简单易上手,非常适合新手小白。只需要在官网上下载启源宝库软件,然后选择自己感兴趣的任务项目,就可以开始赚取收益。该平台的优点在于项目多样化,通过这个平台,你可以轻松学习到各种副业技巧并挣到钱。
数据标注也是针对AI数据的需求,采集结构化的标准人工数据,开展机器算法学习的一种用途。这个项目上手简单,结算便捷,在微任务市场,找到你能做的任务操作,上交结果审核,等待结算即可。威客简单小任务也是不错的选择。进入网站的任务大厅,找到招标、计件选项,选择编辑校对选项。这里面有打字、校对、编辑等简单的工作,%以上的人都能胜任。
如果你人脉不错,擅长分享,下面3个副业一定要试一下。漫画分销是一个年轻人喜欢的小说、漫画、心理测评、命理测算的分销佣金市场。我们完全可以利用这种需求,去推荐拿分销佣金。目前做得比较好的方式是在抖音、小红书等平台引流,导入公众号,开启付费阅读(分销网站提供源码)。如果你感兴趣,可以参考下同行的做法,模仿再超越。知乎好物也是一个值得关注的领域。每当我们搜索一个问题时,知乎总会在第一页展示,这就产生了长尾效应。同时,知乎的读者%是一线城市白领和大学生,购买付费意识强,几千元的家电出货也不足为奇。我们可以用自己最真实的感受加上多张,一样可以产生爆款。课程推广员也是一个不错的选择。知识付费是未来的潮流,我们对于知识一直有焦虑的心态。我们可以分销优秀作者的课程,佣金比例至少超过%。我们可以通过微信、朋友圈、公众号、微博、微头条等形式进行推广。
Async、Await 从源码层面解析其工作原理
深入理解 Async 和 Await 的工作原理,往往需要从源码层面进行剖析。使用 Babel 进行转换后,可以清晰地发现 Async 和 Await 实际上借助了 switch-case 和 promise,实现对流程的控制。以一个使用 Async 和 Await 的函数为例,我们仅关注核心部分代码。
经过 Babel 转换后的 name 函数,可以被拆分为三个主要部分:await 部分、return 部分以及 async 流程控制的结束部分(即 case "end")。这个拆分使得流程控制变得更为直观。在流程控制中,每一步执行后,都会等待合适的时机进入下一次执行。
这个“合适的时机”并非由 Async 内部决定,而是由执行的内容决定。例如,在发送异步请求后,只有在请求返回后才会进入下一个 case。
为了实现流程控制,需要借助 regenerator-runtime 这个 generator、Async 函数的运行时。它负责将 name 函数进行包装,并添加流程控制所需的信息。如 _context,以及用于流程控制的关键 helper,如 _asyncToGenerator 和 asyncGeneratorStep。通过这些辅助工具,再在 regenerator-runtime 的基础上进行一层包装,最终得到一个可以执行的函数。这个函数实际执行时,会调用封装后的函数。
在封装后的函数中,async1、async2 等实际上是在执行最终的封装函数内部的调用。这里的第三步是 Async 函数的核心机制。在 Promise.resolve(value).then(_next) 中,value 是每个分段最后的 case 返回的值。如果 value 是一个 Promise,那么在它 resolved 后,会将其.then添加到微任务队列。如果 value 不是一个 Promise,则直接添加,因为.then是一个微任务,当执行到它时,会调用_next,从而开始执行下一个 case。
经过转换后的代码展示了封装后的函数内容,最终执行的是封装后的函数,因此说 async1、async2 执行实际上是执行封装后的函数。在封装后的函数内部,会调用 async1、async2。
SIGGRAPH:生成创意图形的智能工具4
在探索计算机辅助创意图形生成的智能工具方面,SIGGRAPH 提供了一系列引人入胜的课程。本文将串烧讲解四个方向,从理论到实践,展现如何用计算机自动设计出富有创意价值的图像。让我们一同领略SIGGRAPH中Special Interest Group的魅力,并汲取创意灵感。
SIGGRAPH,图形学领域的顶尖会议,不仅关注传统的几何计算与渲染技术,更深入探索将人工智能与图形学方法结合,应用于工业设计、美感创造等跨领域研究。对于那些对图形学范围抱有浓厚兴趣的工程师或研究生而言,SIGGRAPH的论文不仅提供直接的下载资源,还包含补充材料、源代码、数据集、视频介绍等,让研究者能更直观地理解技术应用。
在SIGGRAPH 中,课程聚焦于智能工具在创意图形设计中的应用,旨在提升专业人员和初学者的创作效率。这些工具通过机器计算能力,处理复杂和繁琐任务,解放人类创作者的束缚,使其专注于创造性过程,同时确保设计的高质量与效率。课程将介绍关键技术支持,包括几何推理、物理约束、数据驱动技术、机器学习以及众包方法。
特别提到的众包技术,是收集视觉设计感知反馈的有效手段。通过将人类的感知能力融入数字内容创作工具,使工具更加智能。课程将深入探讨参数化设计场景中的应用,如将众包集成到用户界面以方便探索和决策,或嵌入到优化引擎中,实现自动感知参数调整。以照片色彩增强和材料BRDF设计为例,展示如何利用众包提高设计的智能水平。
众包概念由Howe于年提出,指的是通过公开邀请的方式,将传统任务外包给未定义、通常规模庞大的人群。Amazon Mechanical Turk是最受欢迎的众包平台之一,允许用户按需执行微任务,以获取人类智能。此概念与人类计算密切相关,后者描述了利用人类处理能力解决计算机难以处理问题的方法。这体现了"人工"智能与人类智慧的融合。
在众包技术的实现中,计算机科学家需将问题分解为大量简单、精心设计的基于感知的人类微任务,通过算法组合解决原始问题。这一方法受到微任务和感知实验的启发,已应用于视觉任务的微感知人类计算算法中,用于提取深度层、图像法线、增强图像高级语义信息等。
通过众包定义偏好是智能工具的关键应用之一。研究表明,利用众包收集不同参数集之间的两两比较,可以分析偏好分布,为用户提供偏好函数,指导用户选择最佳参数集。这种交互方式,如智能滑块和建议工具、顺序线搜索优化器,使得参数调整变得更加高效和直观。
此外,研究还涉及利用众包进行肖像表情反馈、语义属性编辑、感知相似性度量、感知兼容性评估等高级应用,为创意图形设计提供更为精细的结构化反馈。这些应用通过众包收集大量数据,学习映射和预测,使设计过程更加智能、高效。
在探索智能图形生成的未来,除了众包,还有其他形式的智能工具,如基于用户需求的感知反馈系统和融合人类智慧的循环工具,以更少的交互次数加快收敛,达到满意的设计结果。这些创新方法展示了计算机辅助设计的无限可能,为创意图形生成开辟了新的道路。