标签

 前端 

相关的文章:

这是一个包含前端必学案例实战、使用 idb-kayval 作为前端数据存储、前端学SwiftUI第2篇:使用画布来开发、Web 版 VS Code 运行任何语言!纯前端环境,无后端,免费,开源、从零开始配置一套现代前端工具链的列表页。

安志合的学习博客

安志合的学习博客 -

微前端框架实践

微前端简介:微前端是一种前端架构设计方法,将前端应用程序拆分为独立的、半独立的“微应用”模块,它们在一定程度上松散地协同工作。微前端的概念最早出现在2016年的ThoughtWorks技术雷达报告中,将微服务的概念扩展到前端世界。微前端的核心思想是将前端应用程序分解为独立交付的前端应用,然后将它们组合成一个更大的整体。每个微前端可以由不同的团队管理,并且可以使用不同的框架来实现。这种方法使得团队可以独立开发、测试和部署各自的前端应用,同时向用户呈现为一个统一的产品。微前端的优势包括代码库更小、更具连贯性和可维护性,组织更具扩展性,能够逐步升级、更新或重写前端的各个部分,以及更灵活地进行增量升级等。微前端的核心理念包括组件化、独立开发和部署、技术多样性和团队自治。每个微前端都有自己的git存储库、package.json文件和构建工具配置,因此每个微前端都有独立的构建过程和独立的部署/持续集成。这意味着每个存储库的构建时间较短。微前端与微服务类似,都强调独立的构建和部署。微前端之间的通信通常通过DOM作为共享资源进行,一个微前端的DOM不应该被另一个微前端触碰,类似于一个后端微服务的数据库不应该被除了拥有/控制它的微服务之外的任何微服务触碰。在微前端中,可以使用不同类型的微前端,包括single-spa应用程序、single-spa包和实用模块。这些微前端可以使用React、Vue、Angular等框架来渲染其组件。微前端的性能通常比其来源于的单体应用更高,这归功于内置的懒加载和其他与性能相关的最佳实践。此外,微前端还提供了一个迁移路径,可以暴露和解决单体应用中存在的问题。一个重要的性能考虑是共享大型库(如React、Vue或Angular)的单个实例,这是非常鼓励的。微前端之 5 个核心思想前端工程化也面临着后端同样的问题,一个工程随着时间流逝会逐渐堆叠大量业务,从而让一个前端项目慢慢演变成一个巨石应用,基于此背景下在micro-frontends上对微前端做了如下阐述:微前端背后的想法是将网站或 Web 应用程序视为由独立团队拥有 的 功能的组合。每个团队都有不同的业务领域或任务,它关心和专注于,一个团队是跨职能的,从数据库到用户界面,端到端地开发其功能,但这个想法并不新鲜,它与自包含系统的概念有很多共同之处。在过去,这种方法被称为垂直系统的前端集成。但微前端显然是一个更友好、更简洁的术语。并进一步提炼出以下 5 点微前端的核心思想与技术无关每个团队都应该能够选择和升级他们的堆栈,而无需与其他团队协调。自定义元素是隐藏实现细节同时为其他人提供中性界面的好方法。隔离团队代码不要共享运行时,即使所有团队都使用相同的框架。构建自包含的独立应用程序。不要依赖共享状态或全局变量。建立团队前缀就尚无法隔离的命名约定达成一致。命名空间 CSS 、事件、本地存储和 Cookie ,以避免冲突并明确所有权。优先使用本机浏览器功能而不是自定义 API使用浏览器事件进行通信,而不是构建全局 PubSub 系统。如果你真的需要构建一个跨团队的 API ,尽量让它尽可能简单。构建弹性站点即使 JavaScript 失败或尚未执行,您的功能也应该很有用。使用通用渲染和渐进增强来提高感知性能。常用微前端框架:umijs/qiankun: Blazing fast, simple and complete solution for micro frontends.micro-zoe/micro-app: A simple, efficient and powerful micro front-end framework. 一款简约、高效、功能强大的微前端框架Tencent/wujie: 极致的微前端框架微前端框架学习实践:关于微前端,你理解到究极奥义了么? - V2EX前端架构成长之路——微前端架构理论篇微前端方案对比vue项目如何实现微前端架构?从零开发微前端框架实践qiankun微前端改造实战(架构设计+代码实现)vue微前端qiankun框架学习到项目实战「微前端实践」使用Vue+qiankun微前端方案重构老项目的本地验证参考:有落地微前端架构的大佬吗?目前来看哪个框架更好? - V2EX用 React 写了个仿 macOS 界面的个人主页,风格大概介于 Big Sur 和 Catalina 之间? - V2EXRenovamen/playground-macos: My portfolio website simulating macOS's GUI, developed with React and UnoCSS.

微前端是一种前端架构设计方法,将前端应用程序拆分为独立的、半独立的“微应用”模块,它们在一定程度上松散地协同工作。微前端的优势包括代码库更小、更具连贯性和可维护性,组织更具扩展性,能够逐步升级、更新或重写前端的各个部分,以及更灵活地进行增量升级等。微前端的核心理念包括组件化、独立开发和部署、技术多样性和团队自治。微前端可以使用不同类型的微前端,包括single-spa应用程序、single-spa包和实用模块。微前端的性能通常比其来源于的单体应用更高,这归功于内置的懒加载和其他与性能相关的最佳实践。微前端还提供了一个迁移路径,可以暴露和解决单体应用中存在的问题。微前端的核心思想包括与技术无关、隔离团队代码、建立团队前缀、优先使用本机浏览器功能而不是自定义API,以及构建弹性站点。

相关推荐 去reddit讨论
Rust.cc

Rust.cc -

想转rust的前端

我自己本身是六年的前端,react、vue 写的很熟练,复杂的业务也做过很多,仅限前端;rust 自学了一段时间,也做了一个微项目,实现了一些增删改查(actix-web sqlx redis)。想要转后端rust/全栈,缺少机会。有大佬可以带带我,微信 glfisj

作者是一位有六年前端经验的开发者,熟练掌握React和Vue,并在复杂业务中有丰富经验。自学了一段时间Rust,并完成了一个微项目,实现了一些增删改查功能。作者希望能有机会转向后端Rust或全栈开发,寻求大佬的指导。联系方式:微信glfisj。

相关推荐 去reddit讨论
蚊子

蚊子 -

反驳那些要实时刷新页面的前端部署方案

前端部署后实时通知用户更新页面的方案多种多样,但大部分都不必要且增加成本。现有的前端部署方案已经很成熟,不需要用户立即刷新页面。前端增量发布方案可以保证新旧页面都能正常访问,同时利用CDN强缓存提高用户访问速度。对于接口更新导致用户正在操作的情况,可以先发布非必填字段,再发布前端页面。整体部署流程中存在时间差,后台服务器分批更新,所以不需要实时更新前端。实现实时更新需要维护版本号并修改部署流程,但收益不大。前端无感更新是web端的优势,不需要实时刷新页面。

相关推荐 去reddit讨论
六虎

六虎 -

一个30岁老前端的人生经历(学习+工作+婚姻+孩子),给迷茫的朋友一点激励。

我93年的,还差几天就到30周岁生日了。做前端开发大概也有6、7年,算是老前端了。 和大家分享一下我的人生经历,与君共勉。

一位前端开发工程师面临裁员和降薪,但决定留在公司以支持家庭和孩子的教育。他的孩子学习压力过大,他开始关注健康问题并骑自行车上下班。展望2024年,他计划写更多文章,完善开源项目,学习React源码,并减肥。他鼓励大家坚持努力,不放弃。

相关推荐 去reddit讨论
六虎

六虎 -

低代码平台前端二开机制设计

低代码平台前端二开机制,大致有两种: 平台直接提供整个页面的代码,即出码 平台提供视图组件,组件约定二开机制,即配置扩展

低代码渠道前端二开机制有两种:出码和装备扩展。出码自由度高但杂乱,装备扩展本钱低且能持续运用。前端组件规划应敞开内部逻辑、数据和装备项。组件应进行ui和数据分层,规划多种hooks,将装备进行颗粒度划分。比方Pro-Table组件由装备层、视图层、数据层和action组成,视图由pro-component拼装完成。pro-component内部有逻辑和原子组件,可由二开组件替代。整个pro-component也可是二开组件。需从大局装备中拿到hooks,补充到action控制器,组件派发action前后需处理hooks。

相关推荐 去reddit讨论
六虎

六虎 -

智能界面:前端与AI的融合之美—智能识别图片

前言 当人工智能与前端技术融合时,可以创造出许多令人惊叹的应用和体验。在这样的融合中,前端技术负责用户界面的设计和交互,而人工智能则负责数据处理、分析和智能决策。以下是一些融合了AI和前端技术的介绍:

本文介绍了人工智能与前端技能结合的智能图画处理步骤,包括Emmet语法、前端代码和AI使命的实现。通过运用Emmet语法快速编写HTML和CSS代码,以及前端技能和人工智能的结合,可以实现图画处理的创新和便利。

相关推荐 去reddit讨论
六虎

六虎 -

前端 er 如何玩转音视频流-WebRTC 技术介绍

前端 er 如何玩转音视频流-WebRTC 技术介绍 最近做了一个 AI 问答的项目,需要获取用户的摄像头,录像录音,实时语音转文字等等功能,记录一下踩过的坑。以及目前的最佳实现。

本文介绍了前端开发者使用WebRTC处理音视频流的方法,包括获取用户设备权限、录制和转换音视频、截取视频画面和实现音频可视化。同时讨论了一些问题和解决方案。

相关推荐 去reddit讨论
颜海镜

颜海镜 -

异步难题:前端并发控制全解析

本文讲解Promise,callback,RxJS多种方式实现并发限制,通过示例循序渐进讲解,如何实现带数量限制的并发请求,这来源于笔者业务中的真实场景,同时也是一道前端面试题,作为面试题的话,一般是考察对Promise的理解。 问题 笔者的业务中,经常存在通过一堆ids,批量获取的场景,其中最复杂的一个场景是获取数千个手机号的数据,对于这种场景,发送请求并不容易。 这里先交代下背景,笔者的系统是运行在 http2 上的,由于 http2 支持并发处理,所以在笔者的系统里,后端接口设计是基于这个假设的,后端不会提供批量获取的接口,需要前端通过 id 来逐个获取。 当同时发送上千个请求时,浏览器会变的明显卡顿,虽然这样发送可以更快的获取数据,但会带来不好的用户体验,笔者的解决方案是,给并发添加最大数量限制。 这里我们将问题定义为,给你ids和并发限制max,一般作为面试题,会让你直接实现如下的函数: function gets(ids, max) { } 补充一点,如果是 http1.1,浏览器会有默认的并发限制,并不需要我们处理这个问题,比如Chrome 中并发数量是6个,所以这个问题的成立,建立在 http2 的基础上,如果是在面试中,不要忘了提这个知识点。 Promise 目前来说,Promise是最通用的方案,一般我们最先想到Promise.all,当然最好是使用新出的Promise.allsettled。 下面简单介绍下二者的区别,假如存在某个请求失败时,all会整体失败,而allsettled只会让单个请求失败,对于大部分情况来说,allsettled的是更好的选择,因为allsettled更为灵活,一般来说面对这种情况,总共有三种处理方式,如下所示,all只能支持第一种,而allsettled三种都支持: 整体失败 最终结果,过滤失败的选项 将单个失败的保留,并渲染到UI中 方法1 全部并发 直接使用Promise.all是最简单的,代码如下,然后all并没有并发控制能力,一瞬间会将全部请求发出,从而造成前面提到的浏览器卡顿问题。 这里get函数我们使用setTimeout+随机时间来模拟请求,其返回promise实例。 function gets(ids, max) { return Promise.all(ids.map(id => get(id))) } function get(id) { return new Promise((resolve) => { setTimeout(() => { resolve({ id }) }, Math.ceil(Math.random() * 5)) }); } 方法2 分批并发 你可能会想到一种分批发送的办法,将请求按max数量分成N个组,每组并行发送,这需要结合递归和Promise.all,示例代码如下: function gets(ids, max) { let index = 0; const result = []; function nextBatch() { const batch = ids.slice(index, index + max); index += max; return Promise.all(batch.map(get)).then((res) => { result.push(...res); if (index < ids.length) { return nextBatch(); } return result; }); } return nextBatch(); } 这种方法的优势在于实现相对简单,容易理解。但是它的缺点是,每一批请求中的最慢的请求会决定整个批次的完成时间,这可能会导致一些批次的其他请求早早完成后需要等待,从而降低整体的并发效率。 这种方法在业务中是不太能接受的,面试中的话,也只能勉强及格。 方法3 限制并发 一个更高效的思路是使用异步并发控制,而不是简单的批处理。这种方法可以在任何时刻都保持最大数量的并发请求,而不需要等待整个批次完成。这需要我们维护一个请求池,在每个请求完成时,将下一个请求添加到请求池中,示例代码如下: gets函数返回一个promise,在请求全部完成后,promise变为fulfilled状态;内部采用递归,每个请求成功和失败后,发送下一个请求;在最下面先发送max个请求到请求池中。 function gets(ids, max) { return new Promise((resolve) => { const res = []; let loadcount = 0; let curIndex = 0; function load(id, index) { return get(id).then( (data) => { loadcount++; if (loadcount === ids.length) { res[index] = data; resolve(res); } else { curIndex++; load(ids[curIndex]); } }, (err) => { res[index] = err; loadcount++; curIndex++; load(ids[curIndex]); } ); } for (let i = 0; i < max && i < ids.length; i++) { curIndex = i; load(ids[i], i); } }); } 当然这个代码还有其他实现方式,这里是笔者习惯的方式,聪明的你快来想想其他实现方式吧。 callback 在Promise之前,js中的异步都是基于回调函数的,比如 jQuery 的 ajax,Node.js 中的 http 模块等。 茴字有多种写法,下面我们挑战一下使用callback来解决这个问题。下面我们先把get函数改造一下,基于回调函数的get如下所示: function get(id, success, error) { setTimeout(() => success({ id }), Math.ceil(Math.random() * 5)) } gets函数的接口也要改成回调函数,如下所示: function gets(ids, max, success, error) {} 回调函数也是基于上面的思路,把上面的代码稍加改动即可,将其中的Promise换成callback,示例如下: 还记得前面让你想其他思路吗,还有一种结合递归和异步函数的方法,在Promise下会比这种方法更简单,但其实还是这个思路更好,Promise和callback都可以使用。 function gets(ids, max, success, error) { const res = []; let loadcount = 0; let curIndex = 0; function load(id, index) { return get( id, (data) => { loadcount++; if (loadcount === ids.length) { res[index] = data; success(res); } else { curIndex++; load(ids[curIndex]); } }, (err) => { res[index] = err; loadcount++; curIndex++; load(ids[curIndex]); } ); } for (let i = 0; i < max && i < ids.length; i++) { curIndex = i; load(ids[i], i); } } RxJS 最后我们来看看RxJS,这其实是我最想说的方法,笔者深度使用RxJS多年,相信绝大部分人都不太了解RxJS,RxJS号称异步编程的lodash,对于这个问题,其代码实现会非常简单。 RxJS 是一个用于处理异步数据流的 JavaScript 库,它通过可观察对象(Observable)来代表随时间推移发出值的数据流。你可以使用一系列操作符(如 map、filter、merge 等)来处理这些数据流,并通过订阅(subscribe)来观察并执行相关操作。RxJS 使得处理复杂的异步逻辑变得简单而优雅,特别适合于实现并发控制等场景。 上面是RxJS的简介,相信看完了还是不理解,RxJS其实是比较难学的,建议大家阅读其他扩展资料,这里让我们聚焦我们的问题。 下面先用RxJS改造我们的get函数,改造完如下所示,这需要用到Observable和observer,这些都是RxJS的概念,即便不知道其含义,看代码和Promise是比较相似的。 import { Observable } from 'RxJS'; function get(id) { return new Observable((observer) => { setTimeout(() => { observer.next({ id }); observer.complete(); }, Math.ceil(Math.random() * 5)); }); } 下面我们参考Promise中的思路,依次看看在RxJS中如何实现。 方法1 全部并发 在RxJS中和Promise.all类似的功能是forkJoin,这种方法最简单,代码如下所示,和Promise.all类似,这并不满足我们的需求。 import { forkJoin } from 'RxJS'; function gets(ids) { const observables = ids.map(get); return forkJoin(observables); } 方法2 分批并发 下面来看下如何实现分批并发,在Promise中我们使用递归+Promise.all来实现的。 在RxJS中,我们使用concatMap操作符来确保这些组是依次处理的,而不是同时处理。在处理每个组时,我们使用forkJoin来并行处理组内的所有请求。最后,我们使用reduce操作符来将所有组的结果合并成一个一维数组。 如果不理解RxJS,我们单纯看代码,可以看到RxJS代码的表现性更强,通过语义化的操作符串联,就完成了Promise中很多命令式的代码。 import { from, forkJoin } from 'RxJS'; import { concatMap, reduce } from 'RxJS/operators'; function gets(ids, max) { // 将ids按max分组 const groups = []; for (let i = 0; i < ids.length; i += max) { groups.push(ids.slice(i, i + max)); } // 使用concatMap控制组之间的串行执行,并在每一组内使用forkJoin实现并行请求 // 使用reduce来收集和合并所有组的结果 return from(groups).pipe( concatMap((group) => forkJoin(group.map(get))), reduce((acc, results) => acc.concat(results), []) ); } 方法3 限制并发 最后我们来看看RxJS如何实现限制并发,在这个实现中,我们使用mergeMap来控制并发,并使用一个Map对象来存储每个请求的结果,其中键是ID,值是请求结果。这样,我们可以在所有请求完成后,按照原始ID数组的顺序从Map中提取结果。 示例代码如下,控制并发是RxJS支持的功能,实现就是一个参数,非常简单,对比前面的代码,可以看到RxJS的代码非常短小精悍,操作符的也非常容易读懂。 function gets(ids, max) { return from(ids).pipe( mergeMap((id) => get(id).pipe( map(result => ({ id, result })) ), max), reduce((acc, { id, result }) => acc.set(id, result), new Map()), map(resMap => ids.map(id => resMap.get(id))) ); } 总结 在本文中,我们探讨了使用Promise,callback和RxJS的方式实现并发限制,每种方式中又介绍了三种代码思路,包括简单的批处理、分组并发以及具有顺序保留的并发控制。每种方法都有其适用场景和优缺点: 简单的批处理适用于需要将请求分批次处理的场景,简单易懂,但可能不是最高效的方法。 分组并发在保持一定并发度的同时,避免同时发出过多的请求,适用于需要控制资源消耗的场景。 具有顺序保留的并发控制则结合了并发的高效性和结果顺序的一致性,适用于对结果顺序有要求的并发请求处理。 通过选择合适的方法,我们可以在保证性能的同时,满足不同场景下对并发控制的需求。 再次给大家安利RxJS,RxJS作为一个强大的响应式编程库,为我们提供了灵活而强大的工具来处理这些复杂的异步逻辑。 文章的最后,我想引申下请求层的概念,在实际项目中,请求层的设计和实现对整个应用的性能和稳定性至关重要。一个健壮的请求层不仅能够处理基本的数据请求和响应,还能够应对各种复杂的网络环境和业务需求。以下是请求层可以处理的一些常见问题: 失败和错误处理:优雅地处理请求失败和服务器返回的错误,提升用户体验。 失败重试:在请求失败时自动重试,增加请求的成功率。 接口降级:在服务不可用时,提供备选方案,保证应用的基本功能。 模拟接口:在后端服务尚未开发完成时,模拟接口响应,加速前端开发。 模拟列表接口:模拟分页、排序等列表操作,方便前端调试和测试。 接口聚合和竞态:合并多个接口请求,减少网络开销;处理接口请求的竞态问题,确保数据的一致性。 逻辑聚合:将多个资源的创建和更新等操作聚合成一个请求,简化前端逻辑。 控制并发数量:限制同时进行的请求数量,避免过度消耗资源。 前端分页:在前端进行数据分页,减轻后端压力。 超时设置:为每个请求设置超时时间,防止长时间等待。 通过在请求层中实现这些功能,我们可以使得前端应用更加稳定和可靠,同时也提升了用户的体验。因此,加强请求层的建设是每个前端项目都应该重视的一个方面。 感谢大家的阅读!希望这篇文章能够为你在处理并发请求和优化请求层方面提供一些有价值的见解。如果你对请求层的这些内容感兴趣,或者有任何想法和经验想要分享,请在评论区留言,我非常期待大家的交流和讨论。 再次感谢,祝大家编程愉快!

本文介绍了使用Promise、callback和RxJS三种方式实现并发限制的方法。其中,Promise是最通用的方案,可以使用Promise.all或Promise.allsettled来实现并发请求。分批并发是将请求按照一定数量分组并并行发送,但可能会降低并发效率。限制并发是使用异步并发控制,可以在任何时刻保持最大数量的并发请求。RxJS是一个处理异步数据流的JavaScript库,通过可观察对象来处理数据流,并提供了丰富的操作符来处理复杂的异步逻辑。通过选择合适的方法,可以在保证性能的同时满足不同场景下的并发控制需求。

相关推荐 去reddit讨论
FreeBuf网络安全行业门户

FreeBuf网络安全行业门户 -

相关推荐 去reddit讨论
京东科技开发者

京东科技开发者 -

实现“代码可视化”需要了解的前置知识-编译器前端

代码可视化”的概念定义和业界案例在前文中已经进行了讲述,综述可阅读,更多相关知识可查看专栏“本文梳理了“代码可视化”功能开发需要前置了解的编译器前端部分知识,因能力有限若有解释不清和错误的地方敬请谅解,如果想更深入正规的学习相关知识可以查看文后扩展阅读。

本文介绍了代码可视化开发中的编译器前端知识,包括词法分析和语法分析。词法分析将字符流转化为词素序列,语法分析将词法单元组织成语法结构。文章还讨论了自顶向下和自底向上的语法分析方法,以及语义分析的作用和实践方法。

相关推荐 去reddit讨论

热榜 Top10

观测云
观测云
Dify.AI
Dify.AI
LigaAI
LigaAI
eolink
eolink

推荐或自荐