关于前端:图扑软件受邀亮相-IOTE-2023-国际物联网展

IOTE 2023 国内物联网展,作为寰球物联网畛域的盛会,于 9 月 20 日 - 22 日在中国深圳拉开帷幕。本届展会以“IoT构建数字经济底座”为主题,由深圳市物联网产业协会主办,打造以后物联网最新科技大秀。促成物联网与各行业深度交融,增强国际交流与单干,为构建数字经济底座贡献力量。 作为第二十届国内物联网展会的重要组成部分和数字产品展现窗口,图扑软件携自研 HT for Web 产品构建的 PaaS/SaaS 层面低代码数字孪生平台、图形化组态 SCADA 平台、物联网 IoT 平台等各类产品和可视化我的项目利用亮相本届盛会。 展会期间,国内外千余家企业、行业专家领导、参展来宾驻足图扑软件展区,对构建的利用场景与技术体现出浓重的趣味与认可。咱们的工作人员以解说和实操的形式,为到访的参观者激情演示 HT 产品与技术的特点和劣势。 作为物联网行业规模最大、笼罩产业链企业最多的业余展会。本届 IOTE 2023 深圳国内物联网展正是汇聚了寰球物联网畛域的先进科技、翻新利用和行业智慧的盛典,将为构建数字经济底座注入新的生机。 展会聚焦物联网产业链上下游,展商们将带来各种智能硬件设施以及 RFID、传感器、5G、LPWAN、UWB、云计算、大数据分析等物联网核心技术产品和利用案例,展现物联网在智能家居、智慧城市、智能制作、AI安防、新批发等畛域的最新成绩和解决方案。 专精组态监控,助力轻松构建物联网平台图扑软件大屏组态、UI 组态、工业组态、三维组态为打造精细化监控策略提供了反对,交融数字建模、数字孪生、仿真模仿、智能物流等技术,轻松构建低代码、零代码物联网 IoT 平台,辅助传统工厂向智能工厂转型。 十多年来,图扑软件始终保持国产化,不依赖第三方商业或开源库,自主研发外围产品可满足工业物联网现代化、高性能,不局限于繁多平台的跨平台数据可视化需要;在技术畛域谋求极致性能,组件可接受万级甚至十万级别数据量。数百个工业互联网可视化我的项目施行教训,造成了⼀整套实践证明高效开发流程和生态系,可疾速实现现代化、高性能、跨平台桌面 Mouse/挪动 Touch/虚拟现实 VR 图形展现成果及交互体验。 专精可视化技术我的项目劣势,通过姿态控制、实时数据监测显示、设施近程管制以及零碎漫游等人机交互性能,实现对三维模型的全面出现和精准操作。已牵手泛滥龙头企业,打造多项利用场景,笼罩工业制作、楼宇园区、轨道交通、城市政务、水务能源、新基建、智慧运维、国防公安、医疗科研、金融军工等各个行业。 您能够至图扑软件官网查看更多案例及成果:图扑软件 - 构建先进 2D 和 3D 可视化所须要的所有

September 28, 2023 · 1 min · jiezi

关于前端:前端引导工欲善其事必先利其器

前端疏导-工欲善其事+必先利其器[!WARNING]工欲善其事必先利其器-前端装置 Githttps://git-scm.com/Git 配置命令参考git config --global --list # 查看全局配置git config --local --list # 查看本我的项目配置git config --global user.name "用户名" # 设置用户名git config --global user.email "邮箱" # 设置邮箱git config --global alias.cm commitgit config --global alias.br branch # 配置指令别名简写git config --global credential.helper store # 输出一次账号密码后第二次就会记住账号密码git config --global core.ignorecase false # 敞开疏忽大小写git config --system core.longpaths true # 配置长门路git config --global http.sslVerify false # 禁用 ssl 验证git config --global core.protectNTFS false # 敞开 NTFS 文件爱护git config --global url."https://".insteadOf git:// # 解决 git:// 报错装置 SourceTreehttps://www.sourcetreeapp.com/举荐应用 SourceTree,他是一个 Git 的图形化工具,能够让咱们更高效、便捷、优雅的合作。SourceTree 待办 ...

September 28, 2023 · 4 min · jiezi

关于前端:MarkDown-教学

?> 这是一个 MarkDown 教学 题目<!-- tabs:start --> 成果<!-- markdownlint-disable-next-line single-title --> 题目 1 {docsify-ignore}题目 2 {docsify-ignore}题目 3 {docsify-ignore}题目 4 {docsify-ignore}题目 5 {docsify-ignore}题目 6 {docsify-ignore}Markdown# 题目 1## 题目 2### 题目 3#### 题目 4##### 题目 5###### 题目 6<!-- tabs:end --> Text<!-- tabs:start --> 成果Body text Bold text Italic text Strikethrough <mark>Marked text</mark> <pre>Preformatted text</pre> Small Text This is subscript This is superscript MarkdownBody text**Bold text***Italic text*~~Strikethrough~~<mark>Marked text</mark><pre>Preformatted text</pre><small>Small Text</small>This is <sub>subscript</sub>This is <sup>superscript</sup><!-- tabs:end --> ...

September 28, 2023 · 3 min · jiezi

关于前端:Docker-命令教学

[!WARNING]Docker 常用命令命令参考# windows 登录远端echo "password"|docker login docker.xxx.cn -u username --password-stdin# 登录远端docker login docker.xxx.cn -u username -p password# 打包镜像,-f 指定要应用的 Dockerfile 门路,-t 设置标签。docker build -t xxx .# 启动运行容器,-it 示意与容器进行交互式启动,-d 示意可后盾运行容器(守护式运行),--name 给要运行的容器起名字。# -p 将容器的端口映射到宿主机上,通过宿主机拜访外部端口,-v 将容器内的指定文件夹挂载到宿主机对应地位。docker run --name [container-name] -d -p 80:80 [image-name]# 本地镜像打 tagdocker tag xxx docker.xxx.cn/test/xxx# push 远端docker push docker.xxx.cn/test/xxx# pulldocker pull docker.xxx.cn/test/xxx# 查看所有容器,-n 列出最近创立的 n 个容器,-s 显示总的文件大小。docker ps -a# 查看镜像列表docker images# start/stop/restartdocker start [container] # 启动一个或多个曾经被进行的容器docker stop [container] # 进行一个运行中的容器docker restart [container] # 重启容器# 删除不须要的镜像 docker rmi [image]# 删除不须要的容器,--force 强制删除。docker rm [container]docker rm $(docker ps -a -q) # 删除所有进行的容器# 导入导出镜像docker save -o xxx.tar [image]docker load -i xxx.tar [image]# docker save [image] > xxx.tar# docker load [image] < xxx.tar# 导入导出容器docker export -o xxx-`date +%Y%m%d`.tar [container]docker import xxx.tar [container-image]docker export [container] > xxx.tarcat ./xxx.tar | sudo docker import - [container-image]# 进入容器操作docker exec -it [container] /bin/bash# docker-compose 启动docker-compose up -d

September 28, 2023 · 1 min · jiezi

关于前端:前端团队文档

前端团队文档文档地址GitHub蕴含开发规定/标准、工具应用教学、我的项目常识分享/积淀前端团队文档文档,是一个团队的根底建设!帮忙大家疾速相熟、融入团队。将技术常识固化分享,共同进步。加强对常识的提炼总结能力,温故而知新。晋升成员间的合作与效率,防止非必要的反复。作为团队的积淀与财产,进行常识传递,避免断档。...

September 28, 2023 · 1 min · jiezi

关于前端:将Flutter推向极限每个开发人员都应该知道的性能提示

有没有感觉 Flutter 是较量中的乌龟?别放心!只有咱们有几招,咱们就能把乌龟变成涡轮增压的兔子。筹备好放大了吗?让咱们深刻理解一些 Flutter 性能技巧! Flutter 应用程序在默认状况下是高性能的,因而您只须要防止常见的陷阱即可取得杰出的性能。如何设计和实现利用的 UI 会对利用的运行效率产生很大影响。 这些最佳实际倡议将帮忙您编写最高性能的 Flutter 应用程序。 让咱们开始浏览吧!! 1.应用 Clean Architecture(洁净架构)Clean Architecture 是一种软件设计模式,强调关注点拆散和独立测试。此模式激励将利用程序逻辑拆散到不同的层中,每一层负责一组特定的工作。Clean Architecture 非常适合大型应用程序,因为它提供了清晰的关注点拆散,并使测试更容易。 您能够查看此软件包 - clean_architecture_scaffold 以下是 Flutter 中的一个 Clean Architecture 实现示例: lib/ data/ models/ user_model.dart repositories/ user_repository.dart domain/ entities/ user.dart repositories/ user_repository_interface.dart usecases/ get_users.dart presentation/ pages/ users_page.dart widgets/ user_item.dart main.dart2.应用良好的状态治理状态治理在 Flutter 利用性能中起着至关重要的作用。依据利用的复杂性抉择正确的状态治理办法。对于中小型应用程序,内置的 setState 办法可能就足够了。然而,对于更大更简单的应用程序,能够思考应用状态治理库,如 bloc 或 riverpod。 // Bad ApproachsetState(() { // Updating a large data structure unnecessarily myList.add(newItem);});// Better Approachfinal myListBloc = BlocProvider.of<MyListBloc>(context);myListBloc.add(newItem);3.应用代码剖析工具进步代码品质代码剖析工具,如 Flutter Analyzer 和 Lint,对于进步代码品质和升高 bug 和谬误的危险十分有帮忙。这些工具能够帮忙在潜在问题成为问题之前辨认它们,还能够提供改良代码构造和可读性的倡议。 ...

September 27, 2023 · 7 min · jiezi

关于前端:探索Lighthouse性能分数计算背后的奥秘

作为开发咱们都晓得,页面性能很重要,一个性能良好的页面能够给用户带来十分好的用户体验。那么,怎么能晓得本人写的页面性能是好是坏呢? Lighthouse 是Chrome提供给开发者用来测量页面性能的工具。通过Lighthouse,咱们能够很分明的看到页面的性能状况。 以后页面的性能总体得分为96分,是十分优异的。 这个分数是怎么得进去的?这些指标又跟分数有什么样的关系呢?让咱们来一探到底。 Lighthouse性能分数的计算上图中提到了Lighthouse是基于FCP (First Contentful Paint)、SI (Speed Index)、 LCP (Largest Contentful Paint)、 TBT (Total Blocking Time) 和 CLS (Cumulative Layout Shift)这5个指标来计算性能得分的。 点击“查看计算机”,能够看到以下页面: 页面中蕴含了性能的指标、数据(value)、得分(Metric Score)以及权重(Weighting),而最终的性能得分就是这些指标分数的加权平均值。即(从上往下开始计算):(100*0.1 + 95*0.1 + 84*0.25 + 100 * 0.3 + 100 * 0.25) / (0.1+ 0.1+ 0.25+0.3+0.25) 约等于 96(四舍五入)。 加权平均值: 行将各数值乘以相应的权数,而后加总求和失去总体值,再除以总的单位数。点击理解更多 指标的定义Web指标是Google创始的一项新打算,旨在为网络品质信号提供对立领导,这些信号对于提供杰出的网络用户体验至关重要。 指标定义的框架长久以来,网络性能都是通过load事件进行测量的。然而通过这个事件获取到的数据,跟理论的用户体验并不是很相符。 举个例子:服务器能够通过加载一个“最小”的页面来进行响应,响应实现之后,再通过异步获取次要的页面信息进行展现。通过load事件进行测量,性能上看起来很优良,然而用户实际上看到页面的时候工夫可能变得更长了(因为多了一次申请)。这显著跟实在的用户体验不匹配。 为了能更精确地测量用户的网页性能体验,Chrome团队成员与W3C Web性能工作组独特单干,围绕几个关键问题构建出了指标的框架:能够依据这几个点去对指标进行定义,这些都是跟用户非亲非故的。 指标类型用户对性能感知相干的指标能够分为以下几类: Perceived load speed 感知加载速度: 页面在屏幕上加载并渲染出所有视觉元素的速度。Load responsiveness 加载响应度: 为了使组件对用户交互作出疾速响应,页面加载和执行任何所需 JavaScript 代码的速度。Runtime responsiveness 运行时响应度: 页面在加载后,对用户交互的响应速度。Visual stability 视觉稳定性: 页面上的元素是否会呈现让用户感到意外的偏移,并对用户交互造成潜在的烦扰?Smoothness 平滑度: 过渡和动画在页面状态切换的过程中是否具备稳固的帧速率和顺滑的流动性?通过上述的性能指标类型表明,只用一项指标去捕捉页面的所有性能特色是远远不够的。 ...

September 27, 2023 · 1 min · jiezi

关于前端:display-none与visibility-hidden的区别

引言: 在前端面试中,个别比拟偏重JavaScript方面的考查,CSS布局方面考查的内容会绝对少一些,其中display: none与visibility: hidden的区别是较常见的考点,这两个css配置都能够从视觉上暗藏DOM元素,那这两者的应用上有什么区别呢? display: none首先咱们来看W3C中对display: none的形容: 'none' The element and its descendants generate no boxes or text sequences. Similarly, if a text node is defined to behave as display: none, it generates no text sequences. Elements with either of these values do not have inner or outer display types, because they don’t generate any boxes at all. NOTE: As these values cause affected elements to not generate a box, anonymous box generation rules will ignore the elided elements entirely, as if they did not exist in the box tree. ...

September 27, 2023 · 2 min · jiezi

关于前端:JS三大运行时全面对比Nodejs-vs-Bun-vs-Deno

全文约 5100 字,预计浏览须要 15 分钟。 JavaScript 运行时是指执行 JavaScript 代码的环境。目前,JavaScript 生态中有三大运行时:Node.js、Bun、Deno。老牌运行时 Node.js 的霸主位置正受到 Deno 和 Bun 的挑战,上面就来看看这三个 JS 运行时有什么区别! JS 运行时概述Node.jsNode.js 在 2023 年被 Stack Overflow 开发者评为最受欢迎的 Web 技术。Node.js 于 2009 年推出,容许开发人员在浏览器之外应用 JavaScript,彻底改变了服务端编程。它领有弱小的生态系统、宏大的社区,并且通过验证且稳固。为大型应用程序提供 LTS 构建。基于 V8 JavaScript 引擎构建。 多年来,Node.js 始终是服务端 JavaScript 开发的支柱,通过第三方工具反对了有数性能。其提供了微小的性能和灵活性。丰盛的文档、教程和社区反对使开发者能够更轻松地克服挑战。如果思考内置工具和与 Web API 的兼容性,它是落后于其余两个运行时的。 从历史上看,Node.js 因其平安办法(尤其是在包方面)而受到批评。然而,社区和维护者曾经显着改善了这一方面。权限模型曾经在 Node.js v20 中实现,这使 Node.js 更加平安。 DenoDeno 最后由 Node.js 的原始创建者 Ryan Dahl 于 2018 年创立,旨在解决他认为 Node.js 中存在的一些问题,比方性能、安全性。它专一于安全性、古代 JavaScript 实际和开发人员体验。基于 V8 JavaScript 引擎构建并用 Rust 编写。 ...

September 27, 2023 · 4 min · jiezi

关于前端:手把手教你集成环信ReactNative离线推送

前言:在集成ReactNative推送之前,须要理解ReactNative与Android原生交互 一、RN与Android原生交互RN给原生传递参数步骤:1.用Android Studio关上一个曾经存在的RN我的项目,即用AS关上 我的项目文件夹/android,如下图所示 2.在Android原生这边创立一个类继承ReactContextBaseJavaModule,这个类里边放咱们须要被RN调用的办法,将其封装成一个原生模块。 MyNativeModule.java代码如下: package com.awesomeproject;import com.facebook.react.bridge.ReactApplicationContext;import com.facebook.react.bridge.ReactContextBaseJavaModule;import com.facebook.react.bridge.ReactMethod;import com.facebook.react.modules.core.DeviceEventManagerModule;import com.xiaomi.mipush.sdk.MiPushClient;import org.json.JSONException;import org.json.JSONObject;public class PushModule extends ReactContextBaseJavaModule { private ReactApplicationContext reactContext; public PushModule(ReactApplicationContext reactContext) { super(reactContext); this.reactContext = reactContext; } @Override public String getName() { return "PushModule"; } /** 从RN界面外面调用该办法 **/ @ReactMethod public void getDeviceToken(){ MainApplication.getReactPackage().mModule.sendDataToJS( MiPushClient.getRegId(MainApplication.getContext())); } public void sendDataToJS(String deviceToken){ JSONObject jsonObject = new JSONObject(); try { jsonObject.put("deviceToken",deviceToken); jsonObject.put("deviceName",""); } catch (JSONException e) { throw new RuntimeException(e); } this.reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) .emit("deviceToken",jsonObject.toString()); }}本类中寄存咱们要复用的原生办法,继承了ReactContextBaseJavaModule类,并且实现了其getName()办法,构造方法也是必须的。按着Alt+Enter程序会主动提醒。接着定义了一个办法,该办法必须应用注解@ReactMethod表明,阐明是RN要调用的办法。 ...

September 27, 2023 · 9 min · jiezi

关于前端:图扑数字孪生-风光储一体化能源中心

自“双碳”指标提出以来,我国能源产业一直朝着清洁低碳化、绿色化的方向倒退。其中,风能、太阳能等可再生能源在促成寰球能源可继续倒退、共建清洁漂亮世界中被寄予厚望。风能、太阳能具备波动性、间歇性、随机性等特点,次要通过转化为电能再加以利用。 在大规模新能源接入电网的背景下,储能作为电力系统中高比例新能源稳固运行的保障,具备重大意义。然而,景色储联结发电运行调控,往往是技术性难题,若能实现新能源总出力平滑可控,达到惯例电源程度,将会促成国产配备程度大幅晋升。景色储一体化电站在能源清洁低碳转型中起到要害的引领作用,为我国新能源翻新成绩的利用验证提供了良好的平台。 图扑软件以储能新技术为突破口,建设新一代电网敌对型新能源示范电站可视化零碎,其利用自研 HT for Web 产品的二三维协同设计工具、2D 组态/3D 组态、低代码开发等各类可视化工具,构建的景色储监控零碎是新一代电网敌对绿色电站的“中枢大脑”。通过景色储协调优化管制,实现指令跟踪、高峰供电、零碎调峰等多种网源交互模式,让新能源最大化消纳利用。 资产概览可视化进入零碎后,映入眼帘的是三维地图范畴内所有的景色贮存站资产。这些资产依据理论地理位置摆放,并将集控核心、各场站相互关联,让团体的全副资产更直观地展示。点击某个场站,即可下钻至下一层级。 在数据看板方面,统计了各类场站的装机数量、装机容量,以及输电线路的次要信息。 场站概览点击“三维场景”或“二维组态”性能,将以“源-网-荷-储”的角度,活泼形象的展现一段科技感后行动画。即围绕“中枢大脑”——集控核心,介绍整个我的项目的组成:风力发电、光伏发电和储能电站。动画要害节点处还展现了风电场、光伏电站、变电站、储能电站、城市用电等次要运行数据,这些数据可通过前端调用接口的形式实现 7*24h 实时更新。 可视化页面内反对随便切换风电场、光伏站、储能站等模块界面。 图扑 HT 通过对接我的项目现场不同业务零碎的接口,将重点关注的数据会集至驾驶舱大屏界面。 工程详情:统计了整个景色储我的项目的总装机容量,以及风、光、储各局部装机容量,清晰表白出占比;区域当日负荷:展现了当日或 24h 内全场的总负荷、风电负荷、光伏负荷曲线图,直观体现出负荷随工夫的稳定状况,有助于统计分析;区域发电指标:将当日、当月、当年发电量以单点数据的模式展现给用户;不仅如此,页面还集成了充放电总览数据、月度充放电量柱状图、节能减排等数据。 储能站治理储能电站的建设与投运能够进步电网的稳定性,缩小或防止因为发电设备而造成的频率稳定。储能,较为常见的则是磷酸铁锂电池、超级电容、液流电池、铅酸电池等,能够梯次利用储能零碎将电动汽车服役电池在工程化零碎级联平台上再次深度利用。 通过图扑 HT for Web 二三维可视化将储能电站二维层面的监控数据与三维层面的渲染场景无缝联合。储能电站场景范畴内蕴含调度核心、储能零碎、变电站(电力接线图)。 点击场景中的调度核心,弹出重要事件信息弹窗,反对查看实时事件,让运维人员及时同步信息。 数据展现 在数据层面,看板分为右侧和底部两局部构造。右侧看板为对应模块的相干出力指标,如处在“平滑出力”监测模块时,将展现风电出力、光伏出力、联结出力、储能出力、风电与光伏稳定率等数据;底部左侧数据看板次要展现储能电站根本详情,如:储能总功率、最大可充可放功率、当日可充可放容量、日充放电量等,清晰地告知用户以后储能站的充放能力;底部右侧则为以后模块的实时功率与输入稳定率曲线图,为实时对接展现测点数据,横坐标细分至每 5 秒钟取值。该 HT 2D 面板组件特点可提供具体的稳定曲线,满足电力行业的要求。 图扑 HT 平滑出力、跟踪打算、储能调频、削峰填谷四个数据监测模块独特承载起储能站的数据分析能力,别离对应着景色输入稳定率剖析、景色储出力偏差剖析、储能输入稳定率剖析、储能实时功率剖析。以晋升数据的可感知、可共享、可解决、可预测和可协同作为监控目标,为集控核心提供松软的决策依据。 主接线图 电力系统的电气接线图,次要显示该零碎中发电机、变压器、母线、断路器、电力线路等次要电机、电器、线路之间的电气接线。由电气接线图可取得对该零碎的更粗疏的理解。 基于图扑 HT 产品 Web 2D 组态性能,再联合采集到的实时数据,实现更新鲜的主接线图可视化,页面采纳固定面板形式出现变电站电力系统内电气设备的实时运行参数和状态模式。 储能单元信息 点击储能集装箱模型,场景以三维动画形式出现电池组总体残余电量,视觉效果更佳活泼形象。面板中展现了次要数据实时二维看板,如可用充放电量、有功功率、无功功率、充放电可调深度等实时数据。 线路展现 以三维组态的模式展现储能站内理论的充电、放电线路走向,直观展示储能站工艺流程。 ...

September 27, 2023 · 1 min · jiezi

关于前端:风光储一体化能源中心-图扑数字孪生

自“双碳”指标提出以来,我国能源产业一直朝着清洁低碳化、绿色化的方向倒退。其中,风能、太阳能等可再生能源在促成寰球能源可继续倒退、共建清洁漂亮世界中被寄予厚望。风能、太阳能具备波动性、间歇性、随机性等特点,次要通过转化为电能再加以利用。 在大规模新能源接入电网的背景下,储能作为电力系统中高比例新能源稳固运行的保障,具备重大意义。然而,景色储联结发电运行调控,往往是技术性难题,若能实现新能源总出力平滑可控,达到惯例电源程度,将会促成国产配备程度大幅晋升。景色储一体化电站在能源清洁低碳转型中起到要害的引领作用,为我国新能源翻新成绩的利用验证提供了良好的平台。 图扑软件以储能新技术为突破口,建设新一代电网敌对型新能源示范电站可视化零碎,其利用自研 HT for Web 产品的二三维协同设计工具、2D 组态/3D 组态、低代码开发等各类可视化工具,构建的景色储监控零碎是新一代电网敌对绿色电站的“中枢大脑”。通过景色储协调优化管制,实现指令跟踪、高峰供电、零碎调峰等多种网源交互模式,让新能源最大化消纳利用。 资产概览可视化进入零碎后,映入眼帘的是三维地图范畴内所有的景色贮存站资产。这些资产依据理论地理位置摆放,并将集控核心、各场站相互关联,让团体的全副资产更直观地展示。点击某个场站,即可下钻至下一层级。 在数据看板方面,统计了各类场站的装机数量、装机容量,以及输电线路的次要信息。 场站概览点击“三维场景”或“二维组态”性能,将以“源-网-荷-储”的角度,活泼形象的展现一段科技感后行动画。即围绕“中枢大脑”——集控核心,介绍整个我的项目的组成:风力发电、光伏发电和储能电站。动画要害节点处还展现了风电场、光伏电站、变电站、储能电站、城市用电等次要运行数据,这些数据可通过前端调用接口的形式实现 7*24h 实时更新。 可视化页面内反对随便切换风电场、光伏站、储能站等模块界面。 图扑 HT 通过对接我的项目现场不同业务零碎的接口,将重点关注的数据会集至驾驶舱大屏界面。 工程详情:统计了整个景色储我的项目的总装机容量,以及风、光、储各局部装机容量,清晰表白出占比;区域当日负荷:展现了当日或 24h 内全场的总负荷、风电负荷、光伏负荷曲线图,直观体现出负荷随工夫的稳定状况,有助于统计分析;区域发电指标:将当日、当月、当年发电量以单点数据的模式展现给用户;不仅如此,页面还集成了充放电总览数据、月度充放电量柱状图、节能减排等数据。 储能站治理储能电站的建设与投运能够进步电网的稳定性,缩小或防止因为发电设备而造成的频率稳定。储能,较为常见的则是磷酸铁锂电池、超级电容、液流电池、铅酸电池等,能够梯次利用储能零碎将电动汽车服役电池在工程化零碎级联平台上再次深度利用。 通过图扑 HT for Web 二三维可视化将储能电站二维层面的监控数据与三维层面的渲染场景无缝联合。储能电站场景范畴内蕴含调度核心、储能零碎、变电站(电力接线图)。 点击场景中的调度核心,弹出重要事件信息弹窗,反对查看实时事件,让运维人员及时同步信息。 数据展现 在数据层面,看板分为右侧和底部两局部构造。右侧看板为对应模块的相干出力指标,如处在“平滑出力”监测模块时,将展现风电出力、光伏出力、联结出力、储能出力、风电与光伏稳定率等数据;底部左侧数据看板次要展现储能电站根本详情,如:储能总功率、最大可充可放功率、当日可充可放容量、日充放电量等,清晰地告知用户以后储能站的充放能力;底部右侧则为以后模块的实时功率与输入稳定率曲线图,为实时对接展现测点数据,横坐标细分至每 5 秒钟取值。该 HT 2D 面板组件特点可提供具体的稳定曲线,满足电力行业的要求。 图扑 HT 平滑出力、跟踪打算、储能调频、削峰填谷四个数据监测模块独特承载起储能站的数据分析能力,别离对应着景色输入稳定率剖析、景色储出力偏差剖析、储能输入稳定率剖析、储能实时功率剖析。以晋升数据的可感知、可共享、可解决、可预测和可协同作为监控目标,为集控核心提供松软的决策依据。 主接线图 电力系统的电气接线图,次要显示该零碎中发电机、变压器、母线、断路器、电力线路等次要电机、电器、线路之间的电气接线。由电气接线图可取得对该零碎的更粗疏的理解。 基于图扑 HT 产品 Web 2D 组态性能,再联合采集到的实时数据,实现更新鲜的主接线图可视化,页面采纳固定面板形式出现变电站电力系统内电气设备的实时运行参数和状态模式。 储能单元信息 点击储能集装箱模型,场景以三维动画形式出现电池组总体残余电量,视觉效果更佳活泼形象。面板中展现了次要数据实时二维看板,如可用充放电量、有功功率、无功功率、充放电可调深度等实时数据。 线路展现 以三维组态的模式展现储能站内理论的充电、放电线路走向,直观展示储能站工艺流程。 ...

September 27, 2023 · 1 min · jiezi

关于前端:揭秘前端滑块验证技术

大家好,明天咱们聊一下古代利用中常见的一种交互验证形式:滑块验证。滑块验证也被称为拼图验证码,是一种用于验证用户是否为人类而不是机器人的常见办法。用户须要实现验证后能力持续往下操作,而机器人通常很难模仿这种人类行为。也因为这样,滑块验证曾经成为了网站注册、登录、商品防爬以及其余交互过程中的一种重要安全措施。 简略思路滑块验证的外围思路是要求用户实现一个工作来验证其非机器人的身份。大多数利用通常包含将一个滑块拖动到正确的地位,使其与一个缺口图像对齐。用户须要通过鼠标或手指触摸滑动来实现。在这个过程中,利用会检测用户的行为数据,并且判断是否是机器人操作。 筹备工具筹备两张图片,一张是背景图,一张是从背景图上截的一块: 实现步骤上面咱们实现一个简略的滑块验证示例,通过简略的HTML、CSS和JavaScript来实现一个残缺的拼图验证码。 步骤1:HTML构造创立HTML构造,包含一个背景图和一个滑块,以及一个蕴含缺口的小图块。代码非常简单: <div class="slider-container"> <div class="slider-background"> <div class="gap-fixed"></div> <!-- 固定缺口地位 --> <div class="slider"> <div class="gap"></div> <!-- 缺口图搁置在滑块外部 --> </div> <div class="slider-trabecula"></div> </div></div>步骤2:CSS款式咱们须要为HTML元素增加款式,包含背景图、滑块、缺口等。款式能够通过CSS来定义,以下是一些根本款式的示例: /* 款式 */.slider-container { width: 500px; /* 背景图宽度 */ height: 300px; /* 背景图高度 */ margin: 20px auto; position: relative;}.slider-background { width: 100%; background: url('https://files.mdnice.com/user/1107/739c3c4b-0082-4719-a5fd-f17506e9ea01.png'); /* 背景图URL */ background-size: 100% 100%; /* 背景图铺满 */ border-radius: 5px; height: 300px; position: relative; overflow-x: hidden;}.slider { width: 80px; /* 滑块宽度 */ height: 50px; background-color: #3498db; border-radius: 5px; position: absolute; cursor: pointer; user-select: none; /* 禁止文本选中 */ bottom: 10px; /* 滑块位于底部 */ z-index: 2; transition: transform 0.2s ease; /* 增加平滑动画成果 */}.slider-trabecula { bottom: 10px; width: 100%; height: 50px; position: absolute; z-index: 1; background: rgb(204 204 204 / 50%);}.gap { width: 75px; /* 缺口图的宽度 */ height: 50px; /* 缺口图的高度 */ background-image: url('https://files.mdnice.com/user/1107/b835a241-5a0d-40ac-9b95-23f7e283dc03.png'); /* 缺口图的URL */ background-size: 100% 100%; position: absolute; top: -112px; box-shadow: 0px 0px 5px 1px #ccc;}.gap-fixed { width: 75px; /* 缺口图的宽度 */ height: 50px; /* 缺口图的高度 */ position: absolute; bottom: 122px; left: 358px; box-shadow: 0px 0px 5px 1px #ff0000;}步骤3:JavaScript交互最初一步也是最重要的局部JS交互。咱们须要解决滑块的拖动、验证逻辑以及用户与滑块的交互。这里展现外围局部: ...

September 27, 2023 · 2 min · jiezi

关于前端:Kivicube-v26版本更新啦个人版会员正式上线

为满足不同用户的更多需要,为大家提供更好的AR制作体验,Kivicube平台又降级啦! Kivicube v2.6版本更新亮点价格更低廉:开明个人版会员与场景独自购买权限,限时特惠¥19.90/年内容更丰盛:AR内容编辑器接入寰球最大3D模型素材库Sketchfab,大幅升高内容制作门槛操作更晦涩:优化场景编辑器和内容编辑器中泛滥性能,反对模型一键优化,应用体验更佳性能更全面:新增遮罩、渲染设置、摄像头切换等性能 一、Kivicube个人版会员正式上线思考到更多用户的AR制作需要,咱们正式推出Kivicube个人版会员,限时特惠¥19.90/年。大家能够按需购买,所购场景在会员期内永恒无效,再也不必放心场景不够限度施展啦! ☆ 个人版会员权利蕴含 ☆1.  新增2个场景数量2.  反对独自购买场景数量 个人版会员降级办法:办法1:登录Kivicube-点击【用户核心】-点击【购买场景数】即可购买办法2:当场景数量达到下限后,登录Kivicube-点击【创立空白场景】-点击【暂不降级购买场景数】即可购买。 有更多开发需要的同学也可间接降级至高级版/企业版会员,点击此处查看定价详情。 二、AR内容编辑器更新优化咱们在AR内容编辑器中接入寰球最大3D模型素材网站Sketchfab,为创作者们打造一站式的AR在线制作体验。同时修复了泛滥模型导入与保留问题,使Kivicube可能适配更多格局的模型,晋升大家在AR制作过程中的情绪指数。 1. 接入Sketchfab 3D模型素材库为了升高内容制作门槛,彻底买通AR制作过程中后期素材筹备环节,咱们将领有海量3D模型的Sketchfab接入Kivicube AR内容编辑器。即便是没有建模根底的用户,也能够任意抉择3D模型,实现本人的AR创想! Sketchfab 3D模型素材库接入后,从模型素材筹备、优化,到AR内容制作,大大提高了Kivicube的可扩大能力,为创作者们打造一站式的AR在线制作体验。 2. 限时凋谢「优化模型」性能AR内容编辑器中新增「优化模型」性能,通过对模型面数、动画大小、贴图分辨率的设置、疾速将其调整为更合乎素材上传标准的模型;中心点地位调整能够疾速调整模型中心点,进步场景构建效率。 三、场景编辑器更新优化此次迭代,咱们对Kivicube场景编辑器进行整体UI/UX更新,基于用户的理论需要,重点优化模型上传流程和编辑器操作性能,为您提供更优质的应用体验。 1. 模型调整更便捷在AR制作过程中,为使素材达到上传标准,往往要通过长时间的调整过程,因而咱们优化了模型上传流程,使模型调整更便捷。 ① 以往FBX/OBJ模型的材质,以及上传后报错问题,只能切换至其余建模软件进行调整,当初能够间接在AR内容编辑器中调整② 针对一些不符合要求的模型,能够应用内容编辑器上传,疾速判断模型是否满足标准,调节模型材质 2. 编辑器操作更晦涩在场景编辑器中减少更多快捷性能,以满足创作者的个性化需要:① 别离以模型和AR场景为核心,减少「部分」与「世界」坐标系,不便调模型布局 ② 「布局」中减少撤回/重做、复制粘贴、重置以及可能一键调节素材整体大小的缩放锁定性能 ③ 左下角新增场景编辑器坐标轴,不便疾速调节制作视角 ④ 新增「画布中素材暗藏/显示」性能,不便场景中素材较多时针对某个素材进行调整 ⑤ 新增快捷键性能,AR制作过程更晦涩 3. 新增遮罩性能为使大家发明出更丰盛的AR场景,咱们新增了「模型遮罩」性能。用户能够将任意模型素材设置为遮罩,体验更加乏味的AR成果~(点击此处查看具体教程) 4. 模型渲染设置在模型渲染设置中新增ACES色调映射,让模型(尤其是金属材质)出现更优的成果 5. 切换摄像头方向网页展现端与小程序端反对前/后摄像头切换(小程序端图像AR场景暂不反对) 更多功能能够登录www.kivicube.com进行体验!后续Kivicube还将凋谢降级更多功能,帮忙创作者晋升AR制作效率,打造更加便捷、丰盛的AR互动,敬请期待!

September 27, 2023 · 1 min · jiezi

关于前端:angular-报错没有将FormControl实例附加到具有名称的表单控件元素

September 27, 2023 · 0 min · jiezi

关于前端:JVS低代码开发工具触发逻辑引擎后对象变量节点回显配置说明

应用阐明通常业务中会波及到表单上局部字段填写后通过触发逻辑解决已填写的数据进行回显到表单上,这时咱们能够采纳业务逻辑来配置对象变量节点进行表单数据回显。对象变量:将自定义字段从新组装新的数据结构,数据结构类型为对象。 设计表单入口 在表单中配置按钮组件或者是设置组件的网络事件(业务逻辑)触发。 例如:依据图中单价和金额配置表单中【计算】按钮触发逻辑回显金额。 在业务引擎中选择对象变量节点配置逻辑内容获取金额。 间接配置函数公式解决能够抉择具体参数配置逻辑解决测试执行查看后果,若数据与构造定义不统一时点击【构造定义】【援用测试】以执行后的构造定义为准,也能够自定义批改参数。 还能够对节点对象变量的名称批改。 留神:参数名肯定对应上,必须点击【提交】并【保留】。成果展现 JVS开源根底框架:https://gitee.com/software-minister/jvs在线demo:https://frame.bctools.cn/ 往期回顾JVS规定引擎,打造智能自动化决策的利器jvs-logic逻辑引擎,将外包我的项目需要变更老本升高80%用JVS低代码,半天搞定固定资产管理系统

September 27, 2023 · 1 min · jiezi

关于前端:整会promise这8个高级用法再被问倒来喷我

发现很多人还只会promise惯例用法在js我的项目中,promise的应用应该是必不可少的,但我发现在共事和面试者中,很多中级或以上的前端都还停留在promiseInst.then()、promiseInst.catch()、Promise.all等惯例用法,连async/await也只是知其然,而不知其所以然。但其实,promise还有很多奇妙的高级用法,也将一些高级用法在alova申请策略库外部大量使用。当初,我把这些毫无保留地在这边分享给大家,看完你应该再也不会被问倒了,最初还有压轴题哦。8个例子1. promise数组串行执行例如你有一组接口须要串行执行,首先你可能会想到应用awaitconst requestAry = [() => api.request1(), () => api.request2(), () => api.request3()];for (const requestItem of requestAry) {  await requestItem();}如果应用promise的写法,那么你能够应用then函数来串联多个promise,从而实现串行执行。const requestAry = [() => api.request1(), () => api.request2(), () => api.request3()];const finallyPromise = requestAry.reduce(    (currentPromise, nextRequest) => currentPromise.then(() => nextRequest()),    Promise.resolve(); // 创立一个初始promise,用于链接数组内的promise);2. 在new Promise作用域外更改状态假如你有多个页面的一些性能须要先收集用户的信息能力容许应用,在点击应用某性能前先弹出信息收集的弹框,你会怎么实现呢?以下是不同程度的前端同学的实现思路:高级前端:我写一个模态框,而后复制粘贴到其余页面,效率很杠杠的!中级前端:你这不便于保护,咱们要独自封装一下这个组件,在须要的页面引入应用!高级前端:封什么装什么封!!!写在所有页面都能调用的中央,一个办法调用岂不更好?看看高级前端怎么实现的,以vue3为例来看看上面的示例。<!-- App.vue --><template>  <!-- 以下是模态框组件 -->  <div class="modal" v-show="visible">    <div>      用户姓名:<input v-model="info.name" />    </div>    <!-- 其余信息 -->    <button @click="handleCancel">勾销</button>    <button @click="handleConfirm">提交</button>  </div>  <!-- 页面组件 --></template><script setup>import { provide } from 'vue';const visible = ref(false);const info = reactive({  name: ''});let resolveFn, rejectFn;// 将信息收集函数函数传到上面provide('getInfoByModal', () => {  visible.value = true;  return new Promise((resolve, reject) => {    // 将两个函数赋值给内部,冲破promise作用域    resolveFn = resolve;    rejectFn = reject;  });})const handleConfirm = info => {  resolveFn && resolveFn(info);};const handleCancel = () => {  rejectFn && rejectFn(new Error('用户已勾销'));};</script>接下来间接调用getInfoByModal即可应用模态框,轻松获取用户填写的数据。<template>  <button @click="handleClick">填写信息</button></template><script setup>import { inject } from 'vue';const getInfoByModal = inject('getInfoByModal');const handleClick = async () => {  // 调用后将显示模态框,用户点击确认后会将promise改为fullfilled状态,从而拿到用户信息  const info = await getInfoByModal();  await api.submitInfo(info);}</script>这也是很多UI组件库中对罕用组件的一种封装形式。3. async/await的另类用法很多人只晓得在async函数调用时用await接管返回值,但不晓得async函数其实就是一个返回promise的函数,例如上面两个函数是等价的:const fn1 = async () => 1;const fn2 = () => Promise.resolve(1);fn1(); // 也返回一个值为1的promise对象而await在大部分状况下在前面接promise对象,并期待它成为fullfilled状态,因而上面的fn1函数期待也是等价的:await fn1();const promiseInst = fn1();await promiseInst;然而,await还有一个鲜为人知的机密,当前面跟的是非promise对象的值时,它会将这个值应用promise对象包装,因而await后的代码肯定是异步执行的。如下示例:Promise.resolve().then(() => {  console.log(1);});await 2;console.log(2);// 打印程序位:1  2等价于Promise.resolve().then(() => {  console.log(1);});Promise.resolve().then(() => {  console.log(2);});4. promise实现申请共享当一个申请已收回但还未响应时,又发动了雷同申请,就会造成了申请节约,此时咱们就能够将第一个申请的响应共享给第二个申请。request('GET', '/test-api').then(response1 => {  // ...});request('GET', '/test-api').then(response2 => {  // ...});下面两个申请其实只会真正收回一次,并且同时收到雷同的响应值。那么,申请共享会有哪几个应用场景呢?我认为有以下三个:当一个页面同时渲染多个外部自获取数据的组件时;提交按钮未被禁用,用户间断点击了屡次提交按钮;在预加载数据的状况下,还未实现预加载就进入了预加载页面;这也是alova的高级性能之一,实现申请共享须要用到promise的缓存性能,即一个promise对象能够通过屡次await获取到数据,简略的实现思路如下:const pendingPromises = {};function request(type, url, data) {  // 应用申请信息作为惟一的申请key,缓存正在申请的promise对象  // 雷同key的申请将复用promise  const requestKey = JSON.stringify([type, url, data]);  if (pendingPromises[requestKey]) {    return pendingPromises[requestKey];  }  const fetchPromise = fetch(url, {    method: type,    data: JSON.stringify(data)  })  .then(response => response.json())  .finally(() => {    delete pendingPromises[requestKey];  });  return pendingPromises[requestKey] = fetchPromise;}5. 同时调用resolve和reject会怎么样? 大家都晓得promise别离有pending/fullfilled/rejected三种状态,但例如上面的示例中,promise最终是什么状态?const promise = new Promise((resolve, reject) => {  resolve();  reject();});正确答案是fullfilled状态,咱们只须要记住,promise一旦从pending状态转到另一种状态,就不可再更改了,因而示例中先被转到了fullfilled状态,再调用reject()也就不会再更改为rejected状态了。6. 彻底理清then/catch/finally返回值先总结成一句话,就是以上三个函数都会返回一个新的promise包装对象,被包装的值为被执行的回调函数的返回值,回调函数抛出谬误则会包装一个rejected状态的promise。如同不是很好了解,咱们来看看例子:// then函数Promise.resolve().then(() => 1); // 返回值为 new Promise(resolve => resolve(1))Promise.resolve().then(() => Promise.resolve(2)); // 返回 new Promise(resolve => resolve(Promise.resolve(2)))Promise.resolve().then(() => {  throw new Error('abc')}); // 返回 new Promise(resolve => resolve(Promise.reject(new Error('abc'))))Promise.reject().then(() => 1, () = 2); // 返回值为 new Promise(resolve => resolve(2))// catch函数Promise.reject().catch(() => 3); // 返回值为 new Promise(resolve => resolve(3))Promise.resolve().catch(() => 4); // 返回值为 new Promise(resolve => resolve(调用catch的promise对象))// finally函数// 以下返回值均为 new Promise(resolve => resolve(调用finally的promise对象))Promise.resolve().finally(() => {});Promise.reject().finally(() => {});7. then函数的第二个回调和catch回调有什么不同?promise的then的第二个回调函数和catch在申请出错时都会被触发,咋一看没什么区别啊,但其实,前者不能捕捉以后then第一个回调函数中抛出的谬误,但catch能够。Promise.resolve().then(  () => {    throw new Error('来自胜利回调的谬误');  },  () => {    // 不会被执行  }).catch(reason => {  console.log(reason.message); // 将打印出"来自胜利回调的谬误"});其原理也正如于上一点所言,catch函数是在then函数返回的rejected状态的promise上调用的,天然也就能够捕捉到它的谬误。8. (压轴)promise实现koa2洋葱中间件模型koa2框架引入了洋葱模型,能够让你的申请像剥洋葱一样,一层层进入再反向一层层进去,从而实现对申请对立的前后置解决。咱们来看一个简略的koa2洋葱模型:const app = new Koa();app.use(async (ctx, next) => {  console.log('a-start');  await next();  console.log('a-end');});app.use(async (ctx, next) => {  console.log('b-start');  await next();  console.log('b-end');});app.listen(3000);以上的输入为 a-start -> b-start -> b-end -> a-end,这么神奇的输入程序是如何做到的呢,某人不才,应用了20行左右的代码简略实现了一番,如有与koa雷同,纯属巧合。接下来咱们剖析一番留神:以下内容对老手不太敌对,请斟酌观看。首先将中间件函数先保存起来,并在listen函数中接管到申请后就调用洋葱模型的执行。function action(koaInstance, ctx) {  // ...}class Koa {  middlewares = [];  use(mid) {    this.middlewares.push(mid);  }  listen(port) {    // 伪代码模仿接管申请    http.on('request', ctx => {      action(this, ctx);    });  }}在接管到申请后,先从第一个中间件开始串行执行next前的前置逻辑。// 开始启动中间件调用function action(koaInstance, ctx) {  let nextMiddlewareIndex = 1; // 标识下一个执行的中间件索引    // 定义next函数  function next() {    // 剥洋葱前,调用next则调用下一个中间件函数    const nextMiddleware = middlewares[nextMiddlewareIndex];    if (nextMiddleware) {      nextMiddlewareIndex++;      nextMiddleware(ctx, next);    }  }  // 从第一个中间件函数开始执行,并将ctx和next函数传入  middlewares0;}解决next之后的后置逻辑function action(koaInstance, ctx) {  let nextMiddlewareIndex = 1;  function next() {    const nextMiddleware = middlewares[nextMiddlewareIndex];    if (nextMiddleware) {      nextMiddlewareIndex++;      // 这边也增加了return,让中间件函数的执行用promise从后到前串联执行(这个return倡议重复了解)      return Promise.resolve(nextMiddleware(ctx, next));    } else {      // 当最初一个中间件的前置逻辑执行完后,返回fullfilled的promise开始执行next后的后置逻辑      return Promise.resolve();    }  }  middlewares0;}到此,一个简略的洋葱模型就实现了。

September 27, 2023 · 1 min · jiezi

关于前端:深入理解React中fiber

一、前言Fiber是对React外围算法的重写,Fiber是React外部定义的一种数据结构,将更新渲染耗时长的大工作,分为许多的小片。Fiber节点保留啦组件须要更新的状态和副作用,一个Fiber代表一个工作单元。二、Fiber在React做了什么在react中,次要做了上面这些操作:为每个减少了优先级,优先级高的工作能够中断低优先级的工作。而后再从新,留神是从新执行优先级低的工作减少了异步工作,调用requestIdleCallback api,浏览器闲暇的时候执行dom diff树变成了链表,一个dom对应两个fiber(一个链表),对应两个队列,这都是为找到被中断的工作,从新执行Fiber中的属性type Fiber = {  // 用于标记fiber的WorkTag类型,次要示意以后fiber代表的组件类型如FunctionComponent、ClassComponent等  tag: WorkTag,  // ReactElement外面的key  key: null | string,  // ReactElement.type,调用createElement的第一个参数  elementType: any,  // The resolved function/class/ associated with this fiber.  // 示意以后代表的节点类型  type: any,  // 示意以后FiberNode对应的element组件实例  stateNode: any,  // 指向他在Fiber节点树中的parent,用来在解决完这个节点之后向上返回  return: Fiber | null,  // 指向本人的第一个子节点  child: Fiber | null,  // 指向本人的兄弟构造,兄弟节点的return指向同一个父节点  sibling: Fiber | null,  index: number,  ref: null | (((handle: mixed) => void) & { _stringRef: ?string }) | RefObject,  // 以后处理过程中的组件props对象  pendingProps: any,  // 上一次渲染实现之后的props  memoizedProps: any,  // 该Fiber对应的组件产生的Update会寄存在这个队列外面  updateQueue: UpdateQueue<any> | null,  // 上一次渲染的时候的state  memoizedState: any,  // 一个列表,寄存这个Fiber依赖的context  firstContextDependency: ContextDependency<mixed> | null,  mode: TypeOfMode,  // Effect  // 用来记录Side Effect  effectTag: SideEffectTag,  // 单链表用来疾速查找下一个side effect  nextEffect: Fiber | null,  // 子树中第一个side effect  firstEffect: Fiber | null,  // 子树中最初一个side effect  lastEffect: Fiber | null,  // 代表工作在将来的哪个工夫点应该被实现,之后版本改名为 lanes  expirationTime: ExpirationTime,  // 疾速确定子树中是否有不在期待的变动  childExpirationTime: ExpirationTime,  // fiber的版本池,即记录fiber更新过程,便于复原  alternate: Fiber | null,}三、从架构的角度了解Fiber增量渲染把一个渲染工作分解成多个,而后扩散在多个帧。实现工作能够中断、能够复原,并且能够给不同的工作赋予不同的优先级,最终实现更加丝滑的用户体验。React16之前,React的渲染和更新依赖分为Reconciler->Render,Reconciler比照新旧虚构DOM(Document Object Model)的变动,Render将变动利用到视图。React16加多了一个Scheduler,用来调度更新的优先级。更新的流程变成:每一个更新的工作都被赋予一个优先级,Scheduler把优先级高的先Reconciler,如果有一个优先级比之前的工作更高的,之前的工作会中断,执行完后,新一轮调度之前被中断的工作会从新Reconciler,持续渲染。四、Fiber的concurrent模式在React中,异步渲染中“工夫切片”、“优先级”是Scheduler的外围能力,Scheduler在源码目录中与react-dom是同级的。咱们都晓得浏览器的刷新频率是60Hz,每16.6ms会刷新一次,没开启Concurrent模式,能够看到浏览器的Task中灰色的那长条不可中断工作,调用了createRoot后,那条大工作被切割成许个个小工作。切割后的小工作工作量加起来跟之前那条大工作是一样的,这就是“工夫切片”成果。如何实现工夫切片在源代码中,搜寻workLoopSync函数就能够看到。   function wrokLoopSync () {      while (workInProgress !== null) {        performUnitOfWork(workInProgress)      }    }同步渲染wrokLoopSync中while循环中触发下一个同步performUnitOfWork。异步渲染workLoopConcurrent中while循环触发也是performUnitOfWork,只不过多了一个shouldYield,这个是用来解决让出主过程的。初略了解:React依据浏览器的帧率计算出工夫切片大小,联合以后工夫计算每一个切片的到期工夫,workLoopConcurrent中每一个循环都会判断是否到期,让出主线程。如何实现优先级调度Scheduler中的unstable_scheduleCallback函数是一个外围办法,解决工作的优先级执行不同的调度逻辑。在源码门路~/packages/scheduler/src/forks/Scheduler.js中能够看到这个办法。function unstable_scheduleCallback(  priorityLevel: PriorityLevel,  callback: Callback,  options?: {delay: number},): Task {  //  获取以后工夫  var currentTime = getCurrentTime(); // 工作的预期开始工夫  var startTime;  // 解决options的入参  if (typeof options === 'object' && options !== null) {    var delay = options.delay;    // 如果定义了延迟时间,在加上这个延迟时间    if (typeof delay === 'number' && delay > 0) {      startTime = currentTime + delay;    } else {      startTime = currentTime;    }  } else {    startTime = currentTime;  } // 解决exoirationTime的计算根据  var timeout;  // 依据priorityLevel给timeout赋值  switch (priorityLevel) {    case ImmediatePriority:      timeout = IMMEDIATE_PRIORITY_TIMEOUT;      break;    case UserBlockingPriority:      timeout = USER_BLOCKING_PRIORITY_TIMEOUT;      break;    case IdlePriority:      timeout = IDLE_PRIORITY_TIMEOUT;      break;    case LowPriority:      timeout = LOW_PRIORITY_TIMEOUT;      break;    case NormalPriority:    default:      timeout = NORMAL_PRIORITY_TIMEOUT;      break;  }  // 优先级越高,timeout越小,expirationTime越小  var expirationTime = startTime + timeout; // 创立工作对象  var newTask: Task = {    id: taskIdCounter++,    callback,    priorityLevel,    startTime,    expirationTime,    sortIndex: -1,  };  if (enableProfiling) {    newTask.isQueued = false;  } // 如果以后工夫小于开始工夫,阐明该工作能够提早(还没过期)  if (startTime > currentTime) {    // 提早工作    newTask.sortIndex = startTime;    push(timerQueue, newTask);    // 如果工作队列没有能够执行的工作,而且当前任务又是工作队列的第一个工作    if (peek(taskQueue) === null && newTask === peek(timerQueue)) {      // All tasks are delayed, and this is the task with the earliest delay.      if (isHostTimeoutScheduled) {        // Cancel an existing timeout.        cancelHostTimeout();      } else {        isHostTimeoutScheduled = true;      }      // 派发一个延时工作,查看是否过期      requestHostTimeout(handleTimeout, startTime - currentTime);    }  } else {    // 解决工作过期逻辑    newTask.sortIndex = expirationTime;    // 过期工作推入taskQueue    push(taskQueue, newTask);    if (enableProfiling) {      markTaskStart(newTask, currentTime);      newTask.isQueued = true;    }    // Schedule a host callback, if needed. If we're already performing work,    // wait until the next time we yield.    if (!isHostCallbackScheduled && !isPerformingWork) {      isHostCallbackScheduled = true;      // 执行taskQueue中的工作      requestHostCallback();    }  }  return newTask;}这个函数大略意思:创立task,而后依据startTime工作的预期开始工夫把task推入timerQueue或者taskQueue,最初依据timerQueue、taskQueue执行延时工作或者即时工作。从下面的函数能够看出几个要害信息:expirationTime越小,工作优先级越高timerQueue是用来存储待执行的工作taskQueue是用开存储过期的工作五、Fiber中的一些函数createFibermount过程中,创立了 rootFiber,是 react 利用的根 fiber。function createFiber(  tag: WorkTag,  pendingProps: mixed,  key: null | string,  mode: TypeOfMode,): Fiber {  // $FlowFixMe[invalid-constructor]: the shapes are exact here but Flow doesn't like constructors  return new FiberNode(tag, pendingProps, key, mode);}Fiber的深度遍历开始:Fiber 从最下面的 React 元素开始遍历,并为其创立一个 fiber 节点。子节点:而后,它转到子元素,为这个元素创立一个 fiber 节点。这样继续下去直到在没有孩子兄弟节点:当初,它查看是否有兄弟节点元素。如果有,它就遍历兄弟节点元素,而后再到兄弟姐妹的叶子元素。返回:如果没有兄弟节点,那么它就返回到父节点。createWorkInProgress更新过程,创立 workInProgress fiber,对其标记副作用。current Fiber 中每个 fiber 节点通过 alternate 字段,指向 workInProgress Fiber 中对应的 fiber 节点。同样 workInProgress Fiber 中的 fiber 节点的 alternate 字段也会指向 current Fiber 中对应的 fiber 节点。源代码门路~/packages/react-reconciler/src/ReactFiber.jswindow.requestIdleCallback()将在浏览器的闲暇时段内调用的函数排队。办法提供 deadline,即工作执行限度工夫,以切分工作,防止长时间执行,阻塞UI渲染而导致掉帧;【安顿低优先级或非必要的函数在帧完结时的闲暇工夫被调用】requestAnimationFrame安顿高优先级的函数在下一个动画帧之前被调用六、最初 React Fiber scheduler将工作分为多个工作单元。它设置每个工作的优先级,并使暂停、重用和停止工作单元。

September 27, 2023 · 1 min · jiezi

关于前端:页面崩溃

列表页面切换进入打印页面![上传中...]() 整改把这里的切换批改路由切换的模式每次切换销毁组件和销毁jspreadsheet 切换已选委托问题 整改 把这里的调用由每次实例化,批改为只实例化一次。初始申明一个实例,后续点击切换已选委托,复用实例,只从新批改实例的参数 let spreadsheet = jspreadsheet(this.$refs["spreadsheet"], this.options);

September 27, 2023 · 1 min · jiezi

关于前端:2023年前端流行什么技术和框架了

Web前端三大支流框架有React、Vue.js和Angular,因为接触过Vue.js,接下来主讲最新的Vue3.0! Vue3.0作为最新版本的Vue.js框架,领有更弱小的性能和更丰盛的性能,为低代码开发平台注入了全新的生机。而JNPF疾速开发平台作为其利用的榜样之一,利用Vue3.0的劣势,在低代码开发畛域斩获巨大成功。 一、什么是Vue.js ?Vue.js 是一款基于 MVVM 模式的 JavaScript 框架,通过其简洁、高效的语法和弱小的性能,帮忙开发者构建出更加灵便、疾速和可保护的 Web 利用。与其余框架相比,Vue 区别于市场上的繁冗,它重视易用性和迅速上手的劣势,给开发者提供了更大的自由度。无论是用于构建简略的集体我的项目,还是简单的企业级利用,Vue 都能胜任。 Vue3.0 的诞生源于对用户反馈和技术挑战的综合考量。作为一项重大的降级,Vue3 在性能、开发体验和合作能力等方面迈进了重要一步。JNPF 疾速开发平台(低代码)目前更新至最新的 Vue3版本。 二、Jnpf-Web-Vue3 的技术栈介绍JNPF 疾速开发平台的 Vue3.0 版本是基于 Vue3.x、Vue-router4.x、Vite4.x、Ant-Design-Vue3.x、TypeScript、Pinia、Less 的后盾解决方案,采纳 Pnpm 包管理工具,旨在为中大型项目做开发,提供开箱即用的解决方案。 以下对各项技术做简略的拓展介绍: (1)Vue3.xVue3.x 作为一款当先的 JavaScript 框架,通过响应式数据绑定和组件化架构实现高效的利用开发。相较于 Vue2.x,在大规模利用场景下,Vue3.x 的渲染速度晋升了近 3 倍,初始化速度晋升了 10 倍以上,这不仅为咱们提供了更杰出的用户体验,也为企业应用的开发和保护提供了极大的便当。 此外,它所反对的 Composition API 能够更加灵便地实现代码复用和组件化,让咱们的代码更加可读、可保护。总而言之,Vue3 在许多方面都进行了改良,包含更好的性能、更少的代码大小和更好的开发体验。 (2)Vue-router4.xVue-router4.x 作为 Vue.js 框架中的路由管理器,具备杰出的性能和扩展性,为开发者提供了一种高效而灵便的前端路由解决方案。Vue Router 次要用于构建单页应用程序,容许创立可导航的 Web 利用,使您能够轻松地构建简单的前端利用。 Webpack 更加杰出,内置了许多优化伎俩,包含 HMR、代码宰割、CSS 提取、缓存策略等,从而在保障开发速度的前提下,为应用程序的加载速度和性能提供了极致的保障。此外,它还反对疾速的冷启动、模块化的打包形式以及自动化的多页面构建等个性,极大的晋升了前端开发效率。UI 需要,帮忙开发者事倍功半。 (5)TypeScriptTypeScript 作为一种动态类型的 JavaScript 超集,不仅完满兼容 JavaScript,还提供了弱小的动态类型束缚和面向对象编程个性,极大地晋升了代码的可读性和重用性。TypeScript领有弱小的类型零碎,能够帮忙开发者在代码编写阶段发现潜在的谬误,缩小未知谬误产生概率,并提供更好的代码补全和类型查看。这一个性让团队合作更加高效,同时也升高了保护代码的老本。 (6)PiniaPinia 是 Vue3.x 的状态治理库,基于 Vue3.x 的 Composition API 个性,为开发者提供了清晰、直观、可扩大和强类型化的状态治理计划,能够更好地治理利用数据和状态。无论是在小型我的项目还是宏大的企业级利用中,咱们都能够依附这个弱小的状态治理库来迅速构建出高质量的利用。 ...

September 27, 2023 · 1 min · jiezi

关于前端:ThingsBoard-前端项目背景图片部件开发

前言ThingsBoard 是目前 Github 上最风行的开源物联网平台(14.4k Star),能够实现物联网我的项目的疾速开发、治理和扩大, 是中小微企业物联网平台的不二之选。 本文介绍如何在 ThingsBoard 前端我的项目中开发背景图片部件。 产品需要最近接到产品经理一个需要,在 TB 仪表板中部件的上面能够增加背景图片,实现相似如下的成果: TB 仪表板整个界面是反对背景图设置的,单个部件只反对背景色彩设置,还不反对背景图片设置,本来想着加个背景图片设置性能就能够解决,后果被告知可能会存在两个部件共用一个背景图片的需要,这就有些麻烦了... 解决方案通过我一番斟酌,终于找到了一个正当的解决方案,那就是开发一个可拖拽到其余部件底部的图片部件,将上方的部件背景设置为通明,即可实现预期成果。 开发一个新的部件这个我有教训,难点在于实现拖拽的其余部件下方的部件,这个目前 TB 是不反对的。 在开发者工具中能够查看到,两个部件元素款式 z-index: 1 统一,均在一个层级上,所以无奈重叠。 查看我的项目代码发现,该性能用到了网格布局插件:angular-gridster2,那么就查查看它的官网支不反对重叠性能了。 github:https://github.com/tiberiuzuld/angular-gridster2(1.2k)哎呦,star还不低的样子。官网文档:https://tiberiuzuld.github.io/angular-gridster2官网文档是英文的,在我糟糕的英文浏览程度下,终于找到了该性能:https://tiberiuzuld.github.io/angular-gridster2/multiLayer,感激官网文档贴心的带 demo 演示性能。 容许我的项目分层显示要害参数:allowMultiLayer:allow items show in layers。 确定计划可行,那就开干! 背景图片部件部件高级设置首先我将背景图片部件定义为 Cards 部件库的一种,所以我在 ui-ngx\src\app\modules\home\components\widget\lib\settings\cards 目录下创立部件设置文件 image-widget-settings.component.html 和 image-widget-settings.component.ts。 其中 image-widget-settings.component.html 代码: <section class="tb-widget-settings" [formGroup]="imageWidgetSettingsForm"> <fieldset class="fields-group"> <legend class="group-title" translate>widgets.image.settings</legend> <div fxLayout.xs="column" fxLayout="column" fxLayoutGap="8px"> <!--上传图片--> <tb-image-input label="{{ 'widgets.image.imageUrl' | translate }}" formControlName="imageUrl"> </tb-image-input> <!--是否为背景图片--> <mat-slide-toggle formControlName="isUnderLayer" class="slide-block"> {{ 'widgets.image.isUnderLayer' | translate }} </mat-slide-toggle> </div> </fieldset></section>用 FormGroup 表单控件 imageWidgetSettingsForm 存储数据,数据字段 imageUrl 用存储背景图,应用 TB 的 tb-image-input 上传图片组件。另一个数据字段 isUnderLayer 用来存储是否设定为背景图片,即是否可拖拽到其余部件下方,应用 UI 插件 Material 的滑块开关组件 mat-slide-toggle 来实现。 ...

September 27, 2023 · 3 min · jiezi

关于前端:Unity收费了我还要用吗纠结

引言大家好,我是亿元程序员,一位有着8年游戏行业教训的主程。 Unity于9月12日发表,从2024年1月1日起,将履行一项新的免费规范,其中最引人关注的是“Unity Runtime Fee”(Unity运行时费用)的引入。这一费用意味着Unity引擎开发的游戏在玩家设施上运行时,会给开发者带来新的经济负担。 有粉丝就问我了,Unity要免费了,我到底还要不要用它去开发游戏呢?十分纠结。 1.Unity是什么? Unity是用于开发游戏的游戏引擎,这个是大家都晓得的。咱明天文章不这个,聊聊对Unity的印象。 笔者刚接触游戏开发的时候,对游戏开发没有半点理解,在摸索打滚中,学习了游戏世界中的图形处理的一些理论知识,包含DirectX编程、渲染管线、三维图形形态、纹理、映射以及照明等等。 这些货色对于一个刚入门的小白,显然有些难以会见,学游戏开发原来门槛这么高吗?直到遇到了Unity,我对游戏开发的想法产生了扭转。 原来游戏开发是真的那么乏味和易上手,首先Unity的界面简略直观、对新人特地敌对,只有用鼠标在场景中推拉提敲,就可能把地形模仿进去,种种树、刷刷草地,十分好玩。把工具人往场景外面一拖,运行就能盘绕场景,参观真切的草地、被风吹过的椰子树以及很蓝很大的一片海。你别说还真有大作的既视感,这是一个游戏开发新人对游戏引擎的钦佩之心。他让游戏开发零根底的人更容易贴近游戏开发。 2.Unity免费了? 如上图所示,Unity引入了新的装置费用政策,对于达到了官网设定的免费门槛的游戏收取装置费用,具体门槛如下: 个人版开发的游戏在过来12个月的支出大于等于20万美元并且装置量超过20万次的。专业版和企业版开发的游戏在过来12个月支出大于等于100万美元并且装置量超过100万次的。 其实在Unity新政公布之前,Unity始终都是存在着门槛的,如上图。咱们比拟关注的个人版门槛:过来 12 个月整体财务规模未超过 10 万美元的集体、爱好者和小型组织。超过了的必须要抉择专业版。 Unity新政策一出,引起了游戏行业的巨震,被争相批评“吃相差”,“心太黑”,“失了智”。 不晓得是迫于舆论的压力还是说原本就有planB,就在9月25日,Unity官网发表了道歉信并示意: Runtime 费用不适用于Unity Personal 或 Unity Plus 订阅用户,同时Unity Personal订阅打算的支出限度将从10万美元进步到20万美元,并且将勾销应用 Made with Unity 启动画面的要求。 然而也并不能很好的改善目前的窘境。 3.那咱们还要用Unity吗? 用,只管它怎么作死,它仍旧是目前游戏开发界的头部引擎,而且Unity新政看起来仿佛并不是针对集体开发者,它仅仅是给咱们展示了一个,现实很饱满,事实很骨感的情理。 目前游戏市场许多大作都是用Unity引擎开发的,例如咱们熟知的《王者光荣》《炉石传说》《原神》《纪念碑谷》等等,都是游戏市场的经典大作。不是因为它收不免费,而是因为它可能配得上“头部引擎”的地位,所以咱们集体开发者是能够坚韧不拔的持续应用Unity的。 4.不必Unity是否有代替 答案是必定的,目前支流的游戏引擎不仅仅只有Unity,还有以下引擎能够抉择: Unreal Engine:一款风行的游戏引擎,反对多平台开发和VR开发。Godot Engine: 一款收费的开源游戏引擎,反对VR、AR等新兴技术,并且十分易于学习和应用。Cocos Creator 3D : 一款是借用Unity 3D的操作形式,开发的另一个引擎(号称中国版的Unity)。自研引擎:回归传统模式,本人入手饥寒交迫。5.Unity新政沉思 虽阐明面上看,Unity新政不会影响到集体和小型开发厂家,然而大家千万不要忘了,羊毛其实出在羊身上。Unity减少新的免费项之后,大厂如果想要持续赚钱,那么他就不得不转嫁危险。最终受益的预计就是宽广的游戏玩家。网友们打趣道:Unity小户腾讯收到音讯之后,淡定的在王者光荣上架了更贵的游戏新皮肤。再这么上来,咱们的游戏市场或者会减少更多的氪金套路。这样的环境下,还会有玩家们青睐的游戏吗? 结语不论游戏引擎如何变动,咱们做游戏的基本功(编程、算法、设计模式、开发思维等等)不会受到影响。关注我,一起扎实地学习游戏开发的基本功,引擎只是工具,就算引擎不给咱们用了,咱们凭借基本功还是能够淡定地切换的。 我是"亿元程序员",一位有着8年游戏行业教训的主程。在游戏开发中,心愿能给到您帮忙, 也心愿通过您能帮忙到大家。 AD:笔者线上的小游戏《贪吃蛇掌机经典》《填色之旅》《重力迷宫球》大家能够自行点击搜寻体验。 实不相瞒,想要个赞和在看!请把该文章分享给你感觉有须要的其余小伙伴。谢谢! 举荐专栏: 和8年游戏主程一起学习设计模式 8年主程手把手打造Cocos独立游戏开发框架 从零开始开发贪吃蛇小游戏到上线系列

September 27, 2023 · 1 min · jiezi

关于前端:大型DOM结构是如何影响交互性的

首发于公众号 大迁世界,欢送关注。 每周7篇实用的前端文章 ️ 分享值得关注的开发工具 分享集体守业过程中的趣事快来收费体验ChatGpt plus版本的,咱们出的钱 体验地址: https://chat.waixingyun.cn 能够退出网站底部技术群,一起找bug,另外新版作图神器已上线 https://cube.waixingyun.cn/home 没有方法绕过这一点:当你构建一个网页时,该页面肯定会有一个文档对象模型(DOM)。DOM代表了你页面HTML的构造,并为JavaScript和CSS提供了拜访页面构造和内容的路径。 然而,问题在于DOM的大小会影响浏览器疾速和高效地渲染页面的能力。一般来说,DOM越大,最后渲染该页面以及稍后在页面生命周期中更新其渲染就越低廉。 这在具备十分大的DOM的页面上会变得问题重重,因为批改或更新DOM的交互会触发低廉的布局工作,从而影响页面疾速响应的能力。低廉的布局工作可能会影响页面从交互到下一次绘制(INP)的速度;如果你心愿页面能疾速响应用户交互,确保你的DOM大小只有必要的大小是很重要的。 什么时候页面的DOM过大?理解DOM元素和DOM节点之间的区别十分重要。DOM元素是指DOM树中的一个特定HTML元素。DOM节点与DOM元素有重叠的含意,但其定义扩大到包含正文、空白和文本。尽管Lighthouse的DOM大小审计是指DOM节点,但本指南将尽可能地提到DOM元素而不是节点。依据 Lighthouse,当页面的DOM大小超过1400个节点时,就过大了。当页面的DOM超过 800个节点时,Lighthouse 将开始收回正告。以以下HTML为例: <ul> <li>List item one.</li> <li>List item two.</li> <li>List item three.</li></ul>在下面的代码中,有四个DOM元素:<ul> 元素及其三个 <li> 子元素。你的网页简直必定会有比这更多的节点,因而理解你能够如何管制DOM大小是很重要的——以及一旦你让页面的DOM尽可能小,其余优化渲染工作的策略。 大型DOM如何影响页面性能?大型 DOM以几种形式影响页面性能: 在页面的初始渲染期间。当 CSS 利用于页面时,会创立一个相似于 DOM 的构造,称为 CSS 对象模型(CSSOM)。随着CSS选择器特异性的减少,CSSOM变得更简单,须要更多的工夫来实现绘制网页所需的布局、款式、合成和绘制工作。这减少了页面加载初期交互的提早。当交互批改DOM时,无论是通过元素的插入或删除,还是通过批改DOM内容和款式,渲染该更新所需的工作可能会导致十分低廉的布局、款式、合成和绘制工作。与页面的初始渲染一样,CSS选择器特异性的减少会减少交互导致的HTML元素插入到DOM时的渲染工作。当 JavaScript 查问DOM时,对 DOM 元素的援用存储在内存中。例如,如果你调用 document.querySelectorAll 来抉择页面上的所有<div> 元素,如果后果返回大量的DOM元素,内存老本可能会相当可观。 所有这些都会影响交互性,但下面列表中的第二项尤为重要。如果一个交互导致DOM的扭转,它可能触发大量的工作,从而导致页面上不良的交互到下一次绘制(INP)。 如何测量DOM大小?能够用几种形式来测量DOM大小。第一种办法是应用Lighthouse。当你运行一个审计时,以后页面的DOM统计信息将呈现在"Diagnostics"题目下的"Avoid an excessive DOM size"审计局部。在这一部分中,你能够看到DOM元素的总数、蕴含最多子元素的DOM元素,以及最深的DOM元素。 更简略的办法是在任何次要浏览器的开发者工具中应用JavaScript控制台。要获取DOM中HTML元素的总数,你能够在页面加载后在控制台中应用以下代码: document.querySelectorAll('*').length;请留神,下面的代码片段仅包含DOM中HTML元素的数量。它不包含DOM中的所有节点。 如果你想实时查看DOM大小的更新,你也能够使用性能监督工具。应用这个工具,你能够将布局和款式操作(以及其余性能方面)与以后的DOM大小进行关联。 果DOM的大小靠近Lighthouse DOM大小的正告阈值,或者齐全不合格,下一步就是找出如何减小DOM的大小,以进步你的页面对用户交互的响应能力,从而改善你网站的交互到下一次绘制(INP)。 如何测量受交互影响的DOM元素数量?如果你在实验室中剖析一个你狐疑与页面DOM大小无关的慢速交互,你能够通过抉择标有“从新计算款式”的性能分析器中的任何流动,并察看底部面板中的上下文数据来理解有多少DOM元素受到了影响。 在下面的截图中,留神到入选中时,款式从新计算的工作显示了受影响元素的数量。尽管下面的截图显示了一个具备多个DOM元素的页面上DOM大小对渲染工作影响的极其案例,但这种诊断信息在任何状况下都是有用的,以确定DOM的大小是否是响应交互到下一帧绘制所需工夫的限度因素。 如何减小DOM大小?除了审查你网站的HTML以删除不必要的标记外,减小DOM大小的次要办法是减小DOM深度。如果你在浏览器开发者工具的“Elements”选项卡中看到像这样的标记,那么你的DOM可能不必要地过深: <div> <div> <div> <div> <!-- Contents --> </div> </div> </div></div>当你看到这样的模式时,你可能能够通过扁平化你的DOM构造来简化它们。这样做将缩小DOM元素的数量,并可能给你一个机会来简化页面款式。 ...

September 26, 2023 · 1 min · jiezi

关于前端:写给前端工程师的-CICD-知识

CI / CD 是继续集成 (Continuous Integration) 和继续部署 (Continuous Delivery) 的缩写。CI / CD 是一种软件开发实际,通过自动化的形式将代码集成到一个共享的代码库中,并将其部署到生产环境。CI / CD 能够帮忙软件开发团队进步开发效率、升高错误率、缩短公布周期。 正如题目所示,以下内容是为前端开发人员编写的,因为这是我最理解的畛域,尤其是在工具方面。 根本介绍当你想理解或者为你的团队做 CI/CD 之前。你应该先有一个根本的意识。 当代码被推送到 git 存储库时,它会触发主动构建和测试过程。运行单元测试用例来验证代码。如果测试通过,代码能够主动部署到登台/生产环境。 下图展现一个, 我了解的残缺的 CI/CD 的开发治理流程。 CI 继续集成局部继续集成 (CI) 主动执行构建、测试和合并过程。只有提交代码,它就会运行测试以尽早检测集成问题。这激励频繁的代码提交和疾速反馈。 Lint 与 格式化Linting 和格式化对于放弃代码库统一和洁净至关重要。每个团队成员在编写代码时都应遵循雷同的规定和约定。代码库自身的一致性至关重要。 对于这一步,我心愿我的工具疾速且牢靠。只需 几秒钟 即可查看并格式化我的代码库。 我所应用的工具: ESlint 用于 linting,它附带了一组用于编写正确 Javascript 的规定,并且能够依据您本人的团队的需要定制这些规定。此外,如果您须要更具体的货色,您能够构建本人的 ESLint 规定,我在这里写过,这是一个波及形象语法树(AST)的乏味练习。Prettier 用于格式化。在过来的几年里,它成为 Javascript 开发人员事实上的格式化工具。我在我的我的项目和编辑器中设置它,保留文件会主动为我格式化。Husky 提交前校验。 正如之前说到的,咱们冀望这一步十分快。 所以,咱们在代码提交前,应用husky 来保障,代码曾经被格式化好了。单元测试我十分喜爱单元测试,因为它们能够作为我的项目的健全性查看,以确保其各个局部随着工夫的推移以十分无效的形式(疾速、牢靠)按预期工作。 额, 然而,理论开发中,除了开源类作品,很少有残缺的单元测试。 因为我日常应用Vue 开发。 所以我的单元测试工具如下: @vue/test-utils 测试套件。 @vue/test-utils 旨在简化测试 Vue.js 组件的过程。它提供了一组用于编写测试的API,能够模仿用户与组件的交互,以确保组件在各种状况下都能按预期工作。 并且不依赖于特定的测试框架(jest , mocha, vitest)。vitest 测试框架。 Vitest 是一个弱小的JavaScript测试框架,专为Vue.js利用程序设计。它反对单元测试和端到端测试,具备易用性和灵活性,实用于各种测试需要。Vitest使您可能轻松编写和运行Vue.js应用程序的测试,确保代码的品质和可靠性。@pinia/testing 是一个用于测试Pinia状态治理库的官网测试工具库。它提供了用于模仿Pinia应用程序中的状态和行为的API,以便进行单元测试和集成测试,确保状态治理的正确性和可靠性。如果您不会应用。能够看我之前的对于vue 单元测试的文章。 ...

September 26, 2023 · 1 min · jiezi

关于前端:开源低代码引擎-TinyEngine-源码正式开放啦

贺中秋、迎国庆!!! TinyEngine 低代码引擎开始营业啦~ 源码正式凋谢!!! TinyEngine 官网:https://opentiny.design/tiny-engine TinyEngine 源码:https://github.com/opentiny/tiny-engine TinyEngine 我的项目介绍:https://juejin.cn/post/7280926568854667299#comment 欢送体验、欢送star、欢送转发~

September 26, 2023 · 1 min · jiezi

关于前端:React项目中如何实现一个简单的锚点目录定位

小册这是我整顿的学习材料,十分零碎和欠缺,欢送一起学习古代JavaScript高级小册深入浅出Dart古代TypeScript高级小册linwu的算法笔记前言锚点目录定位性能在长页面和文档类网站中十分常见,它能够让用户疾速定位到页面中的某个章节 如何在React中实现锚点定位和平滑滚动目录主动高亮的实现思路解决顶部导航遮挡锚点的解决方案服务端渲染下的实现计划性能优化策略实现根本锚点定位首先,咱们须要实现页面内根本的锚点定位性能。对于锚点定位来说,次要波及这两个局部:设置锚点,为页面中的某个组件增加id属性点击链接,跳转到指定锚点处例如: // 锚点组件function AnchorComponent() { return <h2 id="anchor">This is anchor</h2> }// 链接组件function LinkComponent() { return ( <a href="#anchor">Jump to Anchor</a> )}当咱们点击Jump to Anchor这个链接时,页面会平滑滚动到AnchorComponent所在的地位。 应用useScrollIntoView自定义hookReact中实现锚点定位,最简略的形式就是应用useScrollIntoView这个自定义hook。 import { useScrollIntoView } from 'react-use';function App() { const anchorRef = useRef(); const scrollToAnchor = () => { useScrollIntoView(anchorRef); } return ( <> <a href="#anchor" onClick={scrollToAnchor}> Jump to Anchor </a> <h2 id="anchor" ref={anchorRef}>This is anchor</h2> </> )}useScrollIntoView承受一个ref对象,当调用这个hook函数时,会主动滚动页面,使得ref对象在可视区域内。 原生scrollIntoView办法useScrollIntoView外部其实就是应用了原生的scrollIntoView办法,所以咱们也能够间接调用: function App() { const anchorRef = useRef(); const scrollToAnchor = () => { anchorRef.current.scrollIntoView({ behavior: 'smooth', block: 'start' }) }; return ( <> <a href="#anchor" onClick={scrollToAnchor}>Jump to Anchor</a> <h2 id="anchor" ref={anchorRef}>This is anchor</h2> </> )}scrollIntoView能够让元素的父容器主动滚动,将这个元素滚动到可见区域。behavior:'smooth'能够启用平滑滚动成果。 ...

September 26, 2023 · 4 min · jiezi

关于前端:小程序编译器性能优化之路

作者 | 马可 导读 小程序编译器是百度开发者工具中的编译构建模块,用来将小程序代码转换成运行时代码。旧版编译器因为业务倒退,存在编译慢、内存占用高的问题,咱们对编译器做了一次大规模的重构,采纳自研架构,做了多线程、代码缓存、sourcemap 等多项优化,在性能和内存占用上都有很大晋升。全文介绍了新版编译器的设计思路和优化办法,以及一些可能用在通用打包工具里的技术点。 全文6629字,预计浏览工夫17分钟。01 前言小程序编译器在小程序开发、预览、公布各个阶段都须要应用,因而编译器性能会间接影响到开发者开发效率,也会影响到开发者工具的应用体验。 因为旧版的编译器(基于 webpack4)在构建大型项目时会很慢,内存占用也高,始终被开发者吐槽。咱们通过大量的调研和开发,最初采纳齐全自研架构做新编译,针对小程序我的项目构建做了大量优化,根本解决了旧编译存在的问题。 下图是局部我的项目构建工夫比照: 新版编译器绝对于旧版实现了 2~7 倍的性能晋升,并且反对实时编译、热重载等个性,内存占用更少,构建产物更优。 上面从 框架选型、新编译器工作原理、性能和产物优化办法 等方面介绍新版编译器的成长之路。 02 框架选型在进行新版编译器设计时,须要明确以后的痛点问题:性能,优先解决性能问题。其余新技术和新想法对编译器有帮忙的也一起施行。 旧版编译器基于 webpack4 存在如下几个问题: 大型项目构建速度太慢。dev 启动慢、增量编译慢,仅反对 loader 缓存,bundle 无缓存也比较慢。基于 webpack4 做扩大开发,须要 patch 局部模块能力工作,保护艰难。局部 webpack bundle 过程无奈针对小程序代码构造进行优化,存在有效构建。新编译的设计指标: 更快的全量编译速度,打消 webpack 存在的有效构建过程。反对全缓存,放慢首次和增量编译速度。反对实时编译,缩小 dev 启动和二次编译工夫。反对多线程编译减速,反对页面热重载。优化产物构造,缩小产物体积。2.1 支流构建工具上面介绍的是咱们调研过的支流前端构建工具,每个工具都有实用场景和优缺点。 在新版本编译器架构设计时,其余构建工具的设计理念和技术特点都值得参考。 Webpack 构建过程: Webpack 长处:功能完善、社区沉闷、可配置性强、有很强的扩展性。 Webpack 毛病:配置简单、构建速度慢,二次开发艰难。 Parcel 构建过程: Parcel 长处:无需配置,构建速度快,原生反对多线程和全缓存,多线程之间共享数据通过 lmdb 进行,防止跨线程通信开销。 Parcel 毛病:生态小,自定义性无限,大量采纳 Node 插件,兼容性也差一些。 Vite 构建过程: Vite 长处:配置较为简单,按需编译,启动快,dev 时有不错的体验。 Vite 毛病:生态小,dev 和 公布走两套构建流程。 ...

September 26, 2023 · 4 min · jiezi

关于前端:前端开发必备文档

前言本文尽可能为各大插件、工具、框架等官网文档导航,标注为中文文档参考则为民间有志青年翻译。 学习平台w3school这是一个收费的在线学习资源,提供HTML的残缺教程,包含各种标签和属性的具体介绍,并附有实例演示。 网址:https://www.w3school.com.cn/ MDN Web Docs这是Mozilla开发的收费学习资源,提供HTML的具体介绍和教程,并蕴含实例演示和用法示例。 网址:https://developer.mozilla.org/zh-CN/docs/Web/HTML HTML Dog这是一个HTML教程和参考网站,提供HTML的基础知识、标签、属性和实例,还包含HTML的最佳实际和CSS款式。 网址:https://www.htmldog.com/guides/html/ HTML.com这是一个专门为HTML初学者筹备的网站,提供HTML的入门教程和实例演示,以及更高级的技巧和用法。 网址:https://html.com/ 菜鸟教程菜鸟教程是一个收费的中文编程学习网站,它的内容丰盛、易于了解,非常适合初学者学习应用。 网址:https://www.runoob.com/html/html-tutorial.html CSS-TricksCSS-Tricks是一个由Coyier开办的CSS学习网站。它提供了大量的CSS教程、技巧和代码实例,适宜初学者和进阶者应用。此外,它还有一个社区论坛和博客,让学习者能够和其余开发者交换。 网址:https://css-tricks.com/ Coding FantasyCoding Fantasy是一个通过游戏的形式,让你迅速学习到flex和grid布局形式,让你在玩游戏的过程学习到常识。 网址:https://codingfantasy.com/games bilibili在B站上,有很多优质的前端编程视频,其中包含Web开发入门、HTML、CSS、JavaScript等根底课程,也有Vue.js、React等风行前端框架的教程,以及一些实用的编程技巧和开发工具的介绍。这些视频由许多有教训的前端工程师制作,涵盖了从根底到高级的前端常识和实际内容。 网址:https://search.bilibili.com/all?keyword=前端开发 leetcodeLeetCode 平台提供了一个大量的算法练习题库,其中包含了多个类别的算法问题,例如数组、链表、树、字符串、动静布局等等。在这里,用户能够收费练习、在线编程较量和比赛、提交和评估本人的算法问题解决能力,同时也能够通过和其余用户的比拟,激发本人更好的体现。 网址:https://leetcode.cn/ 技术交换GitHub一个十分受欢迎的开源代码托管平台,让开发者能够共享、单干、摸索各种开源我的项目,同时也是一个十分沉闷的技术社区。 网址:https://github.com/ Stack Overflow一个专门针对编程问题的问答社区,开发者能够在这里发问、答复问题,并与其余开发者交换和分享教训。 网址:https://stackoverflow.com/ 掘金稀土掘金是一个专一于程序员技术分享和交换的社区平台,致力于帮忙开发者互相学习、交换和成长。它提供了丰盛的技术博客和文章、开源我的项目、求职招聘信息等内容,同时也有大量的技术社区和问答平台。 网址:https://juejin.cn/ 知乎知乎是一个常识分享社区,也是一个十分受欢迎的技术博客平台。在知乎上,不仅能够浏览大量的技术文章和博客,还能够与其余技术爱好者交换和分享教训,取得业余的技术领导和解决方案。 网址:https://www.zhihu.com/ devdev社区和国内的掘金社区很类似,技术分类也比拟多,像 Java、Python、js、分布式等包罗万象,文章品质广泛都还不错,其实如果平时多注意不难发现,掘金上有一些文章是翻译自 dev社区。 网址:https://dev.to/ 书读百遍,其意自现JS格调指南这里蕴含了各种代码的标准格调,不会让你立即变成一个优良的工程师,长期奉行他们也并不意味着你可能居安思危不再犯错。 千里之行,始于足下。咱们须要时常和同行们进行代码评审,一直优化本人的代码。 网址:https://github.com/airbnb/javascript 你不晓得的JavaScript这里讲述了很多你已经并不在意然而又不可疏忽的js小细节,它将带你把js的不同槽点、另类之处,一次性说个明确。 网址:https://github.com/getify/You-Dont-Know-JS what the f*ck JavaScriptJavaScript 是一个不错的语言。它的语法简略,生态系统也很宏大,最重要的是,它领有最平凡的社区力量。咱们晓得,JavaScript 是一个十分乏味的语言,但同时也充斥了各种奇怪的行为。这些奇怪的行为有时会搞砸咱们的日常工作,有时则会让咱们忍俊不禁。 网址:https://github.com/denysdovhan/wtfjs 正确的学习JavaScript这是一份为 JavaScript 老手筹备的指南,同时也蕴含了能够给高手学习的最佳材料,尽管网站的名字是 the right way,但并不代表是学习 JavaScript 的惟一办法。这里只是将一些顶尖开发者的文章、揭示和技巧收集于此。因为它是由一些十分厉害的网民身上收集而来,故称之为 'the right way'或是最佳做法。 网址:https://github.com/braziljs/js-the-right-way JavaScript数据结构和算法齐全解析这里蕴含了多种基于 JavaScript 语法的算法与数据结构。每种算法和数据结构都有本人的README.md,蕴含相干阐明和链接,以便进一步浏览。 网址:https://github.com/trekhleb/javascript-algorithms 优良开源我的项目大全awesome-viteawesome-vite 是一个收集了 Vite 生态圈相干资源的 GitHub 仓库,包含插件、模板、示例、文章等等。它的目标是为了帮忙开发者更好地应用和摸索 Vite。这个仓库由社区驱动,大家能够通过 Pull Request 来奉献本人发现的有价值的 Vite 资源,也能够通过 Issues 来反馈问题和倡议。 ...

September 26, 2023 · 2 min · jiezi

关于前端:一文讲清楚webpack和vite原理

一、前言 每次用vite创立我的项目秒建好,用vue-cli创立了一个我的项目,却有点久,那为什么用 vite 比 webpack 要快呢,这篇文章带你梳理分明它们的原理及不同之处!文章有一点长,看完相对有播种! 目录: webpack根本应用webpack打包原理vite工作原理小结二、webpack根本应用 webpack 的呈现次要是解决浏览器里的 javascript 没有一个很好的形式去引入其它的文件这个问题的。话说必定有小伙伴不记得 webpack 打包是咋应用的(分明的话能够跳过这一大节),那么我以一个小 demo 来实现一下: 搭建根本目录构造咱们在vue我的项目中初始化后全局装置 webpack 和 webpack-cli :yarn add webpack webpack-cli -g 创立vue所需的目录文件,以及webpack配置文件。目录构造如下: 编辑 webpack.config.js配置文件编写不分明webpack配置项的敌人能够进官网文档瞅一眼:webpack 中文文档 看完之后,咱们晓得webpack次要蕴含的几个概念就开始编写配置文件了! (1)打包main.js 代码如下: const path = require('path') module.exports = {  mode: 'development',  //设置开发模式  entry: path.resolve(__dirname, './src/main.js'),   //打包入口  output: {   //打包到哪里去    path: path.resolve(__dirname, 'dist'),    filename: 'js/[name].js',  //默认文件名main.js  }} 为了不便咱们运行,咱们去package.json中配置命令,只需yarn dev就能运行了: "dev": "webpack server --progress --config ./webpack.config.js" 运行后咱们发现根目录多出了一个dist文件夹,咱们进到main.js中查看发现打包胜利了! (2)打包index.html 问题❓:咱们晓得vue我的项目中是有一个index.html文件的,咱们如果要打包这个html文件咋办呢?咱们就须要借助plugin插件去扩大webpack的能力,去装它: yarn add html-webpack-plugin -D 引入并应用它: const HtmlWebpackPlugin = require('html-webpack-plugin')   plugins: [    new HtmlWebpackPlugin({      template: path.resolve(__dirname, 'index.html'),    //须要被打包的html      filename: 'index.html',  //文件打包名      title: '手动搭建vue' //html传进去的变量    }),  ] index.html 代码如下: <!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <meta name="viewport" content="width=device-width, initial-scale=1.0">  <title><%= htmlWebpackPlugin.options.title%></title></head><body>  <div id="app"></div></body></html> 好啦,咱们再次运行打包命令,发现dist目录下多出index.html文件,打包胜利! (3)打包vue文件 首先,咱们须要去装置vue的源码: yarn add vue 新建一个App.vue: <template>  <div>    vue我的项目测试  </div></template> <script setup></script> <style lang="css" scoped></style> main.js中写入: import { createApp } from 'vue'import App from './App.vue' const app = createApp(App)app.mount('#app') 咱们再去打包,发现报错了,依据提醒,咱们能够推断webpack是不能解决且不能编译.vue后缀的文件的,这就须要引入loader及vue编译插件了!装它! yarn add vue-loader@nextyarn add vue-template-compiler -D 持续在配置文件中引入并应用: const { VueLoaderPlugin } = require('vue-loader') ...

September 26, 2023 · 1 min · jiezi

关于前端:代码层面探索前端性能-京东云技术团队

前言最近在做性能优化,具体优化伎俩,网上铺天盖地,这里就不反复了。 性能优化可分为以下几个维度:代码层面、构建层面、网络层面。 本文次要是从代码层面摸索前端性能,次要分为以下 4 个大节。 应用 CSS 代替 JS深度分析 JS前端算法计算机底层应用 CSS 代替 JS这里次要从动画和 CSS 组件两个方面介绍。 CSS 动画CSS2 进去之前,哪怕要实现一个很简略的动画,都要通过 JS 实现。比方上面红色方块的程度挪动: 对应 JS 代码: let redBox = document.getElementById('redBox')let l = 10setInterval(() => { l+=3 redBox.style.left = `${l}px`}, 50)1998 年的 CSS2 标准,定义了一些动画属性,但因为受过后浏览器技术限度,这些个性并没有失去宽泛的反对和利用。 直到 CSS3 的推出,CSS 动画失去了更全面地反对。同时,CSS3 还引入了更多的动画成果,使得 CSS 动画在明天的 Web 开发中失去了宽泛的利用。 那么 CSS3 都能实现什么动画,举几个例子: 过渡(Transition)- 过渡是 CSS3 中罕用的动画成果之一,通过对一个元素的某些属性进行变换,使元素在一段时间内从一个状态平滑地过渡到另一个状态。动画(Animation)- 动画是 CSS3 中另一个罕用的动画成果,其用于为一个元素增加一些简单的动画成果,能够通过关键帧(@keyframes)来定义一串动画序列。变换(Transform)- 变换是 CSS3 中用于实现 2D/3D 图形变换成果的一种技术,包含旋转、缩放、挪动、斜切等成果。把下面的例子改写成 CSS 代码如下: #redBox { animation: mymove 5s infinite;}@keyframes mymove{ from {left: 0;} to {left: 200px;}}同样的成果,用款式就能实现,何乐而不为呢。 ...

September 26, 2023 · 7 min · jiezi

关于前端:jvsrules规则引擎和jvs智能bi自助式数据分析922更新内容

规定引擎更新性能新增:1.新增节点匹配筛选用于做多个条件的数据筛选,以便将符合条件的数据传递给下一个节点进行解决,通常用于实现简单的查问逻辑。 2.复合变量节点新增判断条件选项阐明用户能够依据本人的需要,为复合变量节点增加不同的判断条件,从而实现更简单的逻辑管制。 优化:1.Api数据源保留时,数据结构由每次都生成新key改为与上一次的不统一时才生成新的key bug:1.修复决策流中新增复合变量时会多引入其余复合变量2.修复复制决策流时嵌入的变量编号未修改导致变量执行异样3.修复复合变量设计过于简单导致在根底变量中抉择其余变量无奈失常显示的bug 智能bi更新性能新增:1.大屏组件减少显示、暗藏属性设置 2.大屏反对静态数据(模仿数据)设置大屏静态数据是指在数据大屏上展现的静态数据,这些数据能够是由零碎主动生成的模仿数据,而非实在的业务数据。这些数据能够用于测试和演示,以便在真正的业务数据到来之前进行验证和调试。 3.数据集节点新增判断条件选项阐明 4.大屏事件反对1对多1对多事件性能是指一个数据能够对应多个事件,比方:一个数据能够对应多个图表,当数据发生变化时,对应的图表也会随之变动 5.大屏新增自定义素材治理(可上传本地素材) 优化:1.大屏组件属性分类优化2.优化大屏组件分类3.优化报表配置阐明4.大屏主页底部新增管制栏5.优化文本框、抉择框等交互成果 bug:1.修复大屏多个图层切换时多个组件同时挪动bug2.修复backspace回退键触发组件删除事件bug3.修复素材在拖入画布后预览无成果bug 往期干货回顾jvs-logic逻辑引擎,将外包我的项目需要变更老本升高80%解锁IT能力:JVS疾速开发平台引领企业数字化将来JVS规定引擎,打造智能自动化决策的利器

September 26, 2023 · 1 min · jiezi

关于前端:聊聊-QianKun-JS-沙箱的那些事

咱们是袋鼠云数栈 UED 团队,致力于打造优良的一站式数据中台产品。咱们始终保持工匠精力,摸索前端路线,为社区积攒并流传教训价值。 本文作者:空山 什么是沙箱沙箱即 SandBox,它是一种平安机制,用于严格控制拜访资源。通过在程序中创立一个独立的运行环境,把一些起源不可信、具备破坏力或者又是无奈断定的恶意程序使其在该环境下运行,隔离了对外部程序的影响,这样即便产生了谬误或者平安问题都不会影响到里面。咱们依据实现的计划不同, SandBox能够分为两种模式: 单实例模式:全局只存在一个实例,间接代理原生的window对象,记录每个沙箱内window对象上的增删改等操作,激活某个沙箱时复原上一次失活时的状态,失活时复原原来window的状态。多实例模式:代理一个全新的window对象,所有的更改基于这个全新的对象,多个实例之间互不影响。沙箱的利用场景基于下面对沙箱的介绍,简而言之咱们最终的目标还是为了保障程序的失常运行,通过隔离的伎俩防止谬误、异样或者恶意代码的影响,在咱们日常开发或者接触中,也有很多这样的场景,以下列举几个: 微前端:微前端场景下,各个子利用被集成到一个运行时,防止每个子利用相互影响,导致的一些如全局净化的问题,上面会以QianKun为例进行具体的讲述JSONP:当运行通过 <script>标签的url返回的JS代码时,为了躲避肯定水平上的危险可能须要在沙箱中执行在线编辑器:在某些场景下咱们会提供一个编辑器或者相似的可输出界面须要用户自主的编辑代码,而后去执行它,比方:CodeSandBox对于用户输出的不确定代码为了避免净化最好是在沙箱中执行咱们把它们进行形象的归类,大略能够分为以下三类: 执行时:执行不确定、不可信的JS代码引入时:为引入的JS代码提供隔离环境拜访时:执行代码对全局对象的拜访和批改进行限度JS沙箱的常见解决方案在实现JS沙箱问题之前咱们须要有两点须要留神: 构建独立的上下文环境模仿浏览器的原生对象基于这两点,目前给出以下几种计划: withwith语句将扭转作用域,会让外部的拜访优先从传入的对象上查找。怎么了解呢,咱们来看一下这一段代码: const obj = { a: 1}const obj2 = { b: 2}const a = 9const fun = (obj) => { with(obj) { // 相当于{}内拜访的变量都会从obj上查找 console.log(a) a = 3 }}fun(obj) // 1console.log(obj) // { a: 3 }在以后的外部环境中找不到某个变量时,会沿着作用作用域链一层层向上查找,如果找不到就拋出ReferenceError异样。咱们看下上面这个例子: const obj = { a: 1}const obj2 = { b: 2}const b = 9const fun = (obj) => { with(obj) { console.log(a, b) }}fun(obj) // 1 9fun(obj2) // ReferenceError: a is not defined尽管with实现了在以后上下文中查找变量的成果,然而依然存在一下问题: ...

September 26, 2023 · 14 min · jiezi

关于前端:设计模式专栏和8年游戏主程一起让糟糕的代码在潜移默化中升华

引言大家好,我是亿元程序员,一位有着8年游戏行业教训的主程。 本系列是《和8年游戏主程一起学习设计模式》,让蹩脚的代码在耳濡目染中升华,欢送大家关注分享珍藏订阅。 问大家个问题: 你写过蹩脚的代码吗? 对于这个问题,身边80%的敌人给出了必定的答案,还有几位敌人给蹩脚的代码加了个副词--十分。 笔者也不例外,回过头去看本人刚入门编程时的代码,堪称惨不忍睹。 在接下来的工夫里,和笔者一起学习在编程开发中的设计模式,一起在耳濡目染中晋升本人的代码能力。 1.设计模式是什么?在编程的微妙世界中,有一种智慧之光始终在为咱们照亮前行的途程,那就是——设计模式。 设计模式是软件设计中常见问题的典型解决方案,就像在建造一座雄伟修建之前,有一份精心设计的蓝图。 2.设计模式与算法的区别首先,让咱们明确一个重要的区别:设计模式与算法不同。算法是一组明确定义的步骤,用于解决特定的计算问题。而设计模式更像是一种高级形象,是解决一般性设计问题的方法论。 举个例子,排序算法是一个明确的步骤序列,而单例模式是一种通用的解决方案,用于确保一个类只有一个实例。 3.设计模式的形成设计模式通常包含以下因素: 用意(Intent):简要形容问题和解决方案的指标。动机(Motivation):深刻解释问题并阐明为什么须要该模式以及如何提供解决方案。构造(Structure):展现模式的组成部分和它们之间的关系,通常用 UML 类图来示意。实现(Implementation):提供如何在代码中实现该模式的理论领导,并通常包含示例代码。适用性(Applicability):阐明在哪些状况下应用该模式最为无效。相干模式(Related Patterns):列出与该模式相干的其余设计模式,以帮忙开发人员更好地了解和抉择适当的模式。4.设计模式的起源设计模式并非忽然呈现,它们是通过理论利用中重复验证的。最早的设计模式概念能够追溯到修建畛域,由克里斯托佛·亚历山大在《修建模式语言》中首次提出。在这本书中,他形容了城市设计的“语言”,而模式是其根本形成单元,如窗户的高度、修建的层数等。 但将设计模式引入程序开发畛域的功臣是埃里希·伽玛、约翰·弗利赛德斯、拉尔夫·约翰逊和理查德·赫尔姆,他们于1994年合著了《设计模式:可复用面向对象软件的根底》,这本书定义了23种模式,成为了设计模式的标志性之作。 5.学习设计模式的价值为什么要学习设计模式呢?即便你曾经在编程畛域摸爬滚打多年,理解设计模式依然是一项重要工作。设计模式提供了解决各种设计挑战的通用办法。它们是工具箱中的弱小工具,帮忙你更高效地应答问题,进步代码品质,缩小谬误,减速开发过程。 此外,设计模式还定义了一种通用的编程语言,使你可能与其余开发人员更轻松地沟通。不再须要简明扼要地解释你的设计思路,只需提到模式名称,大家都能明确你的用意。 6.设计模式的争议当然,设计模式也不是白璧无瑕的。它们在编程语言不足以反对某些形象性能的状况下才会被应用,这有时被批评为“为不欠缺的编程语言提供糟糕解决方案”。此外,有些人可能适度应用设计模式,将其套用到不适宜的中央,这可能导致过于简单的代码。 7.设计模式的分类设计模式能够分为不同的类别,包含创立型模式、结构型模式和行为型模式。每个类别都解决不同档次的问题,从创建对象到治理对象关系再到定义对象的行为。 创立型模式1.工厂办法模式 2.形象工厂模式 3.生成器模式 4.原型模式 5.单例模式 结构型模式1.适配器模式 2.桥接模式 3.组合模式 4.装璜模式 5.外观模式 6.享元模式 7.代理模式 行为型模式1.责任链模式 2.命令模式 3.迭代器模式 4.中介者模式 5.备忘录模式 6.观察者模式 7.状态模式 8.策略模式 9.模板办法模式 10.访问者模式 结语在将来的文章中,咱们将深入研究各种设计模式,为你提供更多的示例和指南,以便更好地了解和利用它们。 在设计模式的疏导下,让咱们一起摸索编程世界的有限可能吧! 本系列是《和8年游戏主程一起学习设计模式》,让蹩脚的代码在耳濡目染中升华,欢送大家关注分享珍藏订阅。 我是"亿元程序员",一位有着8年游戏行业教训的主程。在游戏开发中,心愿能给到您帮忙, 也心愿通过您能帮忙到大家。 AD:笔者线上的小游戏《贪吃蛇掌机经典》《填色之旅》《重力迷宫球》大家能够自行点击搜寻体验。 实不相瞒,想要个赞和在看!请把该文章分享给你感觉有须要的其余小伙伴。谢谢!

September 26, 2023 · 1 min · jiezi

关于前端:前端开发标准规范

在生命的低潮期,我减少了思考人生的次数。前言:最近在观看胖东来的创始人于东来学生的一些直播切片,使我感悟良多,同时他的观点,他的人生态度疾速地将我从高涨的情绪的沼泽中拉进去。对于他的观点,我大部分是认同的,观赏的,称誉的,少部分不认同。对于他阔达,乐观,自信,自爱的人生态度;有成人之美的心;寻找本人的短处,不自量力,循序渐进的做事格调,这些点我是很观赏,感觉他的高度是比我高,也使我有种我也要这样做的茅塞顿开的感觉。甚至感觉他有种修道,修佛的心态,十分厉害。 从他的观点联合一些我的察看和他人的说法,我发现,如果档次越高,责任和势力越大,仿佛就越应该花更多的工夫在制订规定上,比方我作为一个前端小组长去面试,常常被问到说给团队制订了什么规定,如何促成团队倒退和保障代码的品质,而我的技术水平好像没那么重要了,技术可能只占50%-70%吧。而如果做到于东来学生这个地位,他每天花大量工夫是用于散会制订员工守则,制订对员工的晋升和考核的机制,制订公司制度,奖惩规定,利润的调配规定。甚至开直播流传思维和理念。而纵观当今世界一些“先进”国家,手上更是握着大把的规定,并且哪个国家不恪守,还必定会满脸通红,七窍生烟。他们手中规定的效劳仿佛与他们的国家位置是相挂钩的。透过这个景象是否阐明了,当治理后,一个当下好的规定才是当下对大部分人收益最高的抉择?有趣味的敌人能够在评论区探讨。 注释:以下前端开发标准规范均以ESLint和TypeScript的默认配置为前提,并且在继续更新中 单个文件的代码行数不超过300行,非凡状况能够多至四百多五百行反复的代码必须抽离出独自的函数或者组件,而后放在反复代码的文件构造的独特父级处代码提交测试前应尽量减少控制台的warning,齐全打消控制台的报错。上线前应该把绝大部分的warning打消。满足需要后,代码的编写以低复杂度的计划为准,以缩小接口调用次数的计划为准。单个逻辑不能反复渲染。定时器,事件监听器应用后在组件销毁时也要随之销毁和勾销监听,缩小闭包的应用。每个函数,类和私有变量都应加上性能,作用阐明的正文。并且命名应用其中文性能的英文翻译。缩小if...else if...else的应用,用单if,switch,includes等代替。结语:放弃学习,放弃成长,放弃后退,放弃心中的那道光。

September 25, 2023 · 1 min · jiezi

关于前端:TinyEngine-低代码引擎到底是什么

据说最近华为云开源一个低代码引擎,在华为全联接大会2023,会正式进行开源公布。因而去理解了下 TinyEngine 到底是什么。 TinyEngine 是 OpenTiny 开源我的项目下的一个子项目。它是一个低代码引擎,提供低代码底层能力。集成人工智能,让AI助力用户高效开发。适宜于多场景的低代码平台开发。如:资源编排、服务端渲染、模型驱动、挪动端、大屏端、页面编排等低代码平台。 同时他还具备十分多特点: 灵便: 提供开发低代码平台的底层能力,自在布局,满足用户随心调整。可基于该引擎可轻松开发出各式各样的低代码平台,灵活性好、二次开发能力强。 轻量: 整个我的项目外围代码的体积只有数M。插件或工具可任意装卸。能够轻松嵌套入业务零碎。如:流程/资源编排,商家可视化装修等我的项目中。 易用: 可导入任意第三方平台的组件库。提供组件开发脚手架,用户可在线下开发高阶简单组件,打包上传即可应用。 跨栈: 我的项目区块采纳webcomponent技术计划,容许多个技术栈(vue angular react)的组件在平台应用。 除此之外,还有很多个性,例如采纳了灵便的零碎架构、规范的底层协定、弱小的拓展能力具备开发的物料协定和拓展接口、搭建输入源码、反对自定义DSL 生成定制的源码、反对跨技术栈、反对高下代码混合开发。 当然想要理解更多,能够增加微信小助手:opentiny-official 一起参加交换前端技术~ OpenTiny 官网:https://opentiny.design/ TinyEngine 官网 :https://opentiny.design/tiny-engine OpenTiny 代码仓库:https://github.com/opentiny/ 欢送进入代码仓库 StarTinyEngine、TinyVue、TinyNG、TinyCLI~ 如果想要一起参加共建,能够进入代码仓库,找到 good first issue标签,一起参加开源奉献

September 25, 2023 · 1 min · jiezi

关于前端:引用类型隐式转换规则详解

援用类型转换1、对象类型在隐式转换的时候,在 +、==、!=运算符等时,对象首先调用valueOf办法,如果返回非根本类型,对象将调用toString办法。2、对象类型在隐式转换的时候,如果对象具备Symbol.toPrimitive属性时,==、!=运算符时,对象将执行默认行为。+ 运算符时,执行hint为 number行为。字符串模板时,执行hint为 string 行为。3、对象类型在隐式转换的时候,在!运算符时,对象取反时,返回false。 例子例一、默认let arr = [];let obj = {};arr == ''; // true // 即 arr.toString() '' == ''obj == '[object Object]'; // true // 即obj.toString() '[object Object]' == '[object Object]'例二、重写valueOf办法let arr = [];arr.valueOf = function () { retun 1;};let obj = {};obj.valueOf = function () { retun 1;};arr == ''; // false // arr.valueOf()返回 1,即 1 == '',字符串与数值相等比拟时,将字符串转换成数值进行比拟,即 1 == 0 obj == '[object Object]'; // false// obj.valueOf()返回1, 即 1 == '[object Object]',字符串与数值相等比拟时,将字符串转换成数值进行比拟,即 1 == NaN例三、重写toString办法let arr = [];arr.toString = function () { retun "array qdk";};let obj = {};obj.toString = function () { retun "object qdk";};arr == 'array qdk'; // true // arr.valueOf()返回非根本类型,将调用arr.toString(),即 'array qdk' == 'array qdk'obj == 'object qdk'; // true// obj.valueOf()返回非根本类型,将调用obj.toString(),即 'object qdk' == 'object qdk'例四、Symbol.toPrimitiveconst obj = { [Symbol.toPrimitive](hint) { if (hint === 'number') { retun 1; } if(hint === 'string'){ retun 'object'; } retun 'qdk'; },};obj == 'qdk'; // true // 在相等运算符时,采纳默认行为。+obj == 1; // true // 在 + 加运算符时,采纳 hint 为 number 行为。`${obj}` == 'object'; // true// 在字符串模板时,采纳 hint 为 string 行为。大厂高频面试题面试题一、如何使 a == 1 && a == 2 && a == 3 成立,请 let a = ? ...

September 25, 2023 · 1 min · jiezi

关于前端:6个基于DSPM组件的使用案例

在这个信息技术时代,企业必须应答日益增长的生成和爱护大量数据的需要。这就是为什么制订宽泛而无效的策略来解决和爱护这些数据比以往任何时候都更加重要的起因。数据安全情况治理 (DSPM) 是一种解决方案,可帮忙古代组织施行全面的数据安全措施。在本文中,您将理解 DSPM 用例,并理解组织如何利用 DSPN 解决方案来确保数据安全性和数据法规合规性。DSPM 解决方案是过程和技术的混合体,使组织可能掌控其数据安全性。具体的 DSPM 解决方案从数据编目开始,而后转到数据流映射、风险管理以及数据事件检测和响应。全面的DSPM解决方案将使任何组织都能及时检测和响应数据安全威逼。除此之外,DSPM还提供恪守法规的保障,继续监控数据安全情况,并就改良倡议。DSPM 组件残缺的 DSPM 解决方案的要害组件如下:数据发现和分类数据流映射风险管理数据事件检测和响应。数据发现和分类平安方面的个别规定是,您无奈爱护您不晓得存在的货色。如果您不理解本人的资产,那么您相对没有足够的能力爱护它们。这就是为什么任何 DSPM 解决方案的第一步都是数据编目,它波及发现和编目组织生成和存储的所有数据。此过程包含依据数据敏感度对数据进行辨认和分类,例如个人身份信息 (PII)、受爱护的衰弱信息 (PHI) 和支付卡行业数据安全规范 (PCI-DSS) 数据。数据编目可帮忙组织分明地理解其数据,这对于治理和爱护数据至关重要。数据流映射此步骤波及跟踪组织内数据的挪动,并确定潜在的破绽和裸露区域。通过剖析数据的存储地位、谁有权拜访数据以及如何应用数据,组织能够更好地理解其敏感数据的解决形式。而后,能够辨认和解决潜在的危险和破绽。数据风险管理风险管理意味着评估与组织数据相干的危险,并施行安全措施来加重这些危险。这可能波及施行安全控制和策略、治理定期平安审核以及继续监督潜在危险。风险管理是DSPM解决方案中的要害组成部分,因为它能够帮忙组织在潜在危险对其数据安全情况形成间接威逼之前辨认和解决潜在危险。数据事件检测和响应DSPM 的最初一个组件波及检测和响应对组织的数据安全构成威胁的事件。这可能波及检测和响应外部威逼,例如具备歹意的员工,或解决内部威逼,例如来自黑客的网络攻击。数据事件检测和响应对于爱护组织的数据至关重要。上面提到的 DSPM 用例基于上述 DSMP 组件。让咱们借助用例深刻理解每个组件。 用例 1:主动执行数据编目在第一个 DSPM 用例中,咱们将探讨如何自动化数据编目过程以进一步简化数据安全性。手动编目组织的整个数据不仅艰难,而且是一个十分耗时的过程。手动数据目录波及向不同的代理询问他们正在应用的数据。因为无奈验证他们的响应,这种办法通常会导致谬误。另一个问题是代理可能不晓得他们正在解决的数据的全副范畴,因而他们的常识差距将导致数据目录中的差距。因而,分明地理解组织的数据可能是一项艰巨的工作。应用 DSPM,剖析组织整个数据的过程变得疾速而精确,因为没有人为谬误的余地。这是通过应用数据发现工具实现的,这些工具能够发现和分类组织中生成和存储的所有数据。发现的所有数据都将增加到数据目录中。而后,此目录用于跟踪组织内此数据流,并且此数据流图可用于指出数据门路中的潜在危险。假如在数据编录过程中,DSPM 标识了存储在未加密数据库中的数据。该组织将意识到这一事实。而后,他们能够采取措施,通过将数据挪动到平安数据库或爱护以后数据库来解决此平安威逼。 用例 2:促成合规性和审计流程大多数状况下,您的经营区域正在运行多个平安规范和策略,确保恪守每个规范和策略可能成为一项忙碌的工作。对于第二个用例,咱们将探讨全面的 DSPM 解决方案如何帮忙您的组织确保合乎任何平安规范和策略,例如通用数据保护条例 (GDPR)、加州消费者隐衷法案 (CCPA) 和支付卡行业数据安全规范 (PCI-DSS)。例如,GDPR要求组织执行适当的技术和构造措施,以确保数据安全。然而,什么是适当的措施?这就是DSPM的用武之地。DSPM 零碎将让您晓得您的平安程序和策略是否合乎行业标准,从而确保对根底构造策略的法规。GDPR的另一个要求是,在产生数据泄露的状况下,组织必须在72小时外向无关当局报告。然而,如果组织自身不晓得数据泄露怎么办?在DSPM的帮忙下,也能够防止这种状况。应用实时事件报告能力,DSPM不仅能够及时告诉您无关数据泄露的信息,而且您还能够防止数据泄露。某些平安法规的另一个要求是对组织的数据安全情况进行定期审核。手动审核平安情况不仅耗时,而且还须要资源。此过程也能够应用DSPM实现自动化,这不仅能够确保继续恪守这些法规,还能够节省时间和资源。 用例 3:升高数据泄露危险让咱们看看 DSPM 解决方案如何升高组织中数据泄露的危险。通常,组织的数据存在于多个平台上,例如本地数据库、基于云的数据库和第三方应用程序。这种数据碎片使组织难以爱护每个端点的数据,这减少了在最低安全性点产生数据泄露的危险。应用数据流映射等工具,DSPM 零碎使组织可能跟踪数据从一个点到另一个点的挪动。应用此信息,组织能够辨认数据泄露危险最大的薄弱点,并采取适当措施将这种危险降至最低。假如DSPM零碎指出财务信息存储在未加密的数据库中。或者,它可能标识组织在没有适当安全策略的状况下与内部各方共享敏感数据。这些信息将使组织可能在数据泄露危险最大的这些单薄畛域发展工作。而后,组织能够应用 DSPM 中的信息设置适当的安全策略和过程。在咱们的示例中,这些策略可能看起来像将所有数据迁徙到平安的加密数据库,或者在与内部各方共享数据时设置安全策略。这样,组织能够确保其数据免受毁坏,并专一于组织指标,而不用放心安全性。除了辨认潜在危险外,DSPM 还可用于确定要首先解决的危险的优先级。这能够帮忙组织专一于最要害的危险,防止在优先级较低的问题上破费工夫和资源。在 DSPM 用例中,许多组织将数据危险升高定位为最优先思考的问题。例如,DSPM 零碎能够辨认组织数据安全情况中的几个潜在破绽。通过依据这些破绽的可能性和影响确定这些破绽的优先级,组织能够专一于首先解决最要害的危险,防止在优先级较低的问题上浪费时间和资源。 用例 4:外部威逼、供应链攻打检测和响应在此示例中,咱们将探讨如何应用 DSPM 零碎来检测和响应组织内的外部威逼。外部威逼的一个示例可能是员工尝试泄露敏感的组织数据,或者您的组织在其应用程序中应用第三方库。起初发现该图书馆受到了供应链攻打。在这两种状况下,歹意代理都能够间接拜访组织的数据。为了防备此类威逼,全面的 DSPM 零碎会执行实时数据流剖析。数据流剖析意味着继续监控组织内的数据流,并注意未经受权或可疑的数据拜访流动。例如,有权拜访敏感客户数据的员工在未经受权的状况下将该数据下载到集体设施。具备实时数据流剖析性能的 DSPM 零碎将检测此流动并及时向组织收回警报。这样,组织能够在员工超出敏感信息的界线之前采取适当的措施。另一个示例可能是组织应用程序正在应用的第三方库。假如库蕴含从组织中提取敏感数据的供应链攻打。具备实时数据流剖析性能的 DSPM 零碎将检测到库正在拜访敏感数据,并实时向组织收回警报。这容许组织采取适当的操作,例如从应用程序中删除受损的库。在上述两种状况下,DSPM 都帮忙组织及时检测和响应外部威逼,以防止损坏并爱护其敏感信息不被泄露。 用例 5:内部威逼检测和响应DPSM 还可用于检测和响应对组织敏感数据的内部威逼,例如针对数据泄露的网络攻击。这是通过继续监督组织的零碎和网络是否存在潜在威逼并在检测到威逼时向组织收回警报来实现的。例如,当歹意数据偷盗尝试以组织的网站为指标时,DSPM 零碎将检测到攻打并向组织收回警报。这容许组织采取措施,例如分割执法部门、施行额定的安全措施或临时敞开其服务,直到问题失去解决等,以避免攻打造成侵害。 用例 6:危险优先级和缩小警报疲劳在最初一个示例中,咱们将看到全面的 DSPM 解决方案如何帮忙组织防止警报疲劳。通过依据检测到的危险的敏感性确定其优先级,DSPM 零碎容许组织首先关注最要害的危险,防止将资源破费在低优先级危险上。假如 DSPM 在组织的数据安全情况中发现了几个破绽。零碎还将依据这些破绽产生的可能性及其影响对这些破绽进行优先级排序。应用此优先级,该组织的平安团队能够首先解决最要害的问题,而不会陷入几个影响较小的问题。因为大型组织中的警报数量泛滥,平安团队通常最终会呈现警报疲劳。团队被生成的大量警报压得喘不过气来,无奈辨认或响应关键问题。然而,当DSPM预先确定所有危险的优先级时,也能够防止这个问题,因为员工能够专一于关键问题,而不用放心微不足道的问题。这就是弱小的DSPM解决方案如何不仅能够帮忙组织确定危险的优先级,以便在次要根底上解决最要害的问题,还能够帮忙平安团队防止警报疲劳。 ...

September 25, 2023 · 1 min · jiezi

关于前端:低代码引擎-TinyEngine-正式发布

在当今数字化飞速发展的时代,企业对高效、麻利的应用程序需要日益旺盛。为了满足这一需要,越来越多的低代码开发平台开始涌现。这些平台通过提供简略易用的开发工具和优化后的开发流程,帮忙开发者疾速构建高质量、可重复使用的应用程序,同时升高了开发的难度和老本,进步了开发效率和灵活性。这些低代码开发平台的呈现,无疑为企业的数字化转型提供了更疾速、更高效的办法,也将推动整个软件开发行业的提高。 TinyEngine 我的项目介绍随着企业对于低代码开发平台的需要日益增长,急需一个通用的解决方案来满足各种低代码平台的开发需要。正是在这种状况下,低代码引擎应运而生。它是一种通用的开发框架,通过对低代码平台零碎罕用的性能进行解构,将其划分为多个功能模块,并为每个模块定义了相应的协定和开发范式,使得开发者能够依据本身的业务需要,轻松定制开发出本人的低代码开发平台。 TinyEngine 提供了低代码底层能力,并集成了人工智能,从而使用户可能高效开发。TinyEngine 具备弱小的拖拽性能,无论是图元还是简单组件,都能在画布上带来晦涩的体验。它实用于多场景的低代码平台开发,包含资源编排、流程编排、服务端渲染、模型驱动、挪动端、大屏端以及页面编排等低代码平台。 架构 外围亮点能够定制开发低码平台TinyEngine 采纳灵便的零碎架构,其杰出的整体架构提供了高度的自定义自由度,使用户可能像搭建积木一样抉择不同的模块来构建本人的专属设计器。此外,插件化的架构使得用户能够不便地扩大与业务相干的性能。 在 TinyEngine 中,插件依据地位大抵分为三类:toolbars/plugins/settings,别离对应顶部区域、左侧区域和右侧区域。toolbars 插件次要偏差于无需 UI 或者 UI 较为简单的工具插件,plugins 是业务性能插件,显示在左侧(或下方)抽屉页面,能够通过点击进行开展收起或切换。这些性能都像是独立的积木块,用户能够选择性地保留或删除。同时,用户也能够开发本人的插件或工具,并将其装置到对应的地位。TinyEngine 的灵活性极强,用户能够自在地决定他们想要开发什么样的低代码平台。 TinyEngine 提供了一套欠缺的插件体系,涵盖了插件开发所需的根底 UI 库、工具库、插件面板的显示管制、生命周期治理、公共 API 注册与共享等。这一体系使得开发者只需遵循简略的标准,即可疾速开发出业务所需的插件,从而极大地提高了开发效率和灵活性。通过应用 TinyEngine 提供的插件体系,开发者能够更加轻松地治理和保护简单的插件生态系统,同时升高保护老本。总之,TinyEngine 的插件体系为开发者提供了一个全面、高效、灵便的开发平台,使得疾速开发出高质量的插件成为可能。 插件开发须要遵循肯定的开发标准,次要是文件标准与导出标准: 文件标准,必须蕴含上面几个文件 pluginProject - src 插件源码 - index.js 注册插件入口,须要导出约定的数据结构 - package.json导出标准, index.js 文件须要导出一个对象来申明根底信息 import component, { api } from './src/Main.vue' export default { id: 'pluginId', // 插件id title: 'pluginName', // 插件名 icon: 'js', // 插件 icon align: 'top', // 插件地位,左侧插件可选值:'top' | 'bottom' 工具栏可选值:'right' | 'center' | 'left' component, // 插件面板关上时渲染的组件 api, // 插件裸露的 api,能够提供给其余插件调用}在此基础上就能够依照业务须要自在开发相干逻辑代码。 ...

September 25, 2023 · 3 min · jiezi

关于前端:深入解读pnpm-patch-packages的底层实现实现自定义忽略文件或目录的方法探索

概论在本文中,咱们将深刻探讨pnpm的patch-package性能,并探讨如何实现自定义疏忽文件或目录的办法。咱们将回顾patch-package的原理,介绍Git中的diff命令以及它们在patch commit中的利用。而后,咱们将探讨文件或目录疏忽的重要性和利用场景,并探讨在patch commit中实现自定义疏忽的新办法。 在实现自定义疏忽文件或目录的办法方面,咱们将具体解说如何获取要打包的文件列表。 接下来,咱们将解释在改变和实现过程中所做的具体改变和代码逻辑,并剖析在patch commit中实现自定义疏忽性能的关键步骤。 最初,咱们将分享在实现过程中遇到的挑战和解决方案,并总结实现自定义疏忽性能对于技术能力晋升和常识拓展的影响。 通过本文的浏览,读者将对pnpm的patch-package性能有更深刻的理解。 引言介绍patch-package的概念和作用在前端开发中,咱们常常会遇到一些依赖包的问题,比方某个包有bug,或者某个包的性能不合乎咱们的需要。这时候,咱们可能会想要批改这些包的源码,然而间接批改node_modules中的文件是不可取的,因为这样会导致依赖不稳固,而且每次装置或更新依赖都会笼罩咱们的批改。那么,有没有一种办法能够让咱们在不影响依赖治理的前提下,对某些包进行定制化的批改呢?答案是有的,那就是patch-package。 patch-package是一个npm包,它能够让咱们对node_modules中的任何包进行批改,并且将这些批改保留在一个patch文件中。这样,咱们就能够在我的项目中应用这个patch文件来笼罩原始的包,从而实现对依赖包的定制化。patch-package的应用非常简单,只须要装置它,而后在package.json中增加一个postinstall脚本,就能够在每次装置或更新依赖后主动利用patch文件。然而遗憾的是,在应用pnpm的状况下,这个包无奈失常应用,然而pnpm官网新增了两个命令来解决这个问题:pnpm patch xxx@xxx (--edit-dir xxx)和pnpm patch-commit (--edit-dir) 为什么须要实现自定义疏忽文件或目录的性能pnpm patch-package是一个十分实用和弱小的工具,它能够帮忙咱们解决很多依赖包的问题。然而,在应用它的过程中,我发现了一个问题:它没有提供一种办法来让咱们自定义疏忽某些文件或目录。这意味着,如果咱们对一个包进行了批改,然而只想保留其中一部分批改,而疏忽其余局部,那么咱们就无奈实现。比方IDE的配置文件、长期文件夹等。这样就会导致patch文件过大,而且可能会引入一些不必要或谬误的批改。 然而pnpm v8.6.2之前的版本的patch-package并没有这个性能,于是笔者在pnpm的Git仓库提了一个issue:Issues · pnpm/pnpm (github.com)。为了解决这个问题,我决定摸索一种新的办法来实现自定义疏忽文件或目录的性能。在本文中,我将具体介绍我所做的尝试和实现过程,并分享我在这个过程中的心得和播种。 patch-package的原理回顾在介绍我的办法之前,让咱们先回顾一下patch-package的基本原理和流程。patch-package的核心思想是利用Git中的diff命令来生成和利用patch文件。diff命令能够比拟两个文件或目录之间的差别,并以一种特定的格局输入后果。这种格局被称为unified diff format(对立差别格局),它能够用来形容两个版本之间的变动。例如: diff--- a/file1.txt+++ b/file1.txt@@ -1,3 +1,4 @@+This is an important lineThis is the original file-This is a line to delete+This is a modified lineThis is another line下面的例子展现了file1.txt文件从a版本到b版本之间的变动。其中: ---和+++示意两个版本的文件名。@@示意变动产生的地位和范畴。+示意新增的行。-示意删除的行。有了这种格局,咱们就能够用Git中的apply命令来将这些变动利用到另一个文件或目录上。例如: git apply file1.patch下面的命令会将file1.patch文件中的变动利用到当前目录下的file1.txt文件上。 patch-package就是利用了这种机制来实现对依赖包的批改。它的工作流程大抵如下: 在我的项目中装置或更新依赖包。在node_modules中找到要批改的包,并对其进行批改。运行npx patch-package <package-name>命令,生成一个patch文件,并保留在patches目录下。在package.json中增加一个postinstall脚本,如"postinstall": "patch-package"。在我的项目中应用patch文件笼罩原始的包。这样,每次装置或更新依赖后,patch-package就会主动利用patch文件,从而实现对依赖包的定制化。 剖析需要和实现思路在摸索如何实现自定义疏忽文件或目录的性能之前,咱们须要先剖析一下这个需要的实现思路。最直观的想法是,咱们须要一个配置文件来指定哪些文件或目录须要疏忽。而后,在利用patch文件时,咱们能够读取这个配置文件,并在利用补丁之前先疏忽这些文件或目录。 当初咱们须要思考的就是如何实现这个配置文件。一个简略的办法是应用.gitignore配置文件,其中蕴含一个列表,列出了咱们要疏忽的文件或目录。然而,这样子看上去并不是很优雅和灵便,因为.gitignore配置文件次要是为git版本控制服务而设计的,而不是为补丁工具服务。在pnpm作者给出的倡议下,咱们能够利用现有的设置来指定哪些文件在打包时须要蕴含。这就须要应用package.json文件中的files字段。 咱们后面提到,patch-package的核心思想是利用Git中的diff命令来生成和利用patch文件,所以剖析得出,想要实现自定义疏忽文件或目录的性能,咱们须要在patchd操作的diff局部的代码中进行批改。具体来说,咱们须要在进行diff操作之前先将须要疏忽的文件过滤掉,或者在进行diff操作时对这些文件进行过滤。这样就能够确保在生成patch文件时排除这些文件,从而达到疏忽文件或目录的目标。 package.json文件中的files字段。当咱们在编写npm包时,能够在package.json文件中增加一个名为files的字段,用来指定蕴含在npm包中的文件和目录。这个字段的值是一个数组,其中列出的文件或目录将被蕴含在npm包中,而其余文件和目录则会被疏忽。 例如,上面是一个简略的package.json文件,其中蕴含了files字段: { "name": "my-package", "version": "1.0.0", "description": "My awesome package", "files": [ "src", "index.js", "LICENSE" ]}下面的例子中,咱们列出了包中蕴含的文件和目录,包含src目录、index.js文件和LICENSE文件。这意味着,当咱们公布这个包时,只有这些文件会被蕴含在npm包中。 ...

September 25, 2023 · 3 min · jiezi

关于前端:一文带你了解-Web-Worker-前端的多线程

前言家喻户晓,JavaScript 采纳的是单线程模型,即所有工作都在一个线程上实现,一次只能做一件事件。但单线程意味着所有的工作都须要排队,前一个工作完结了,才会执行后一个工作。如果一个工作消耗了太长的工夫,后一个工作就始终无奈执行。体现在浏览器里就是浏览器卡住了,无奈操作。 试一下,把上面的代码粘贴到浏览器console外面,会发现浏览器卡住无奈操作。 // 计算斐波那契数列const fibonacci = (n) => { count += 1; if (n === 0) return 0; if (n === 1) return 1; if (n > 1) return fibonacci(n - 1) + fibonacci(n - 2)}const time0 = new Date().getTime();console.log('time0', time0);fibonacci(40);const time1 = new Date().getTime();console.log('time1', time1);const duration = time1 - time0;console.log('duration', duration);// const f = (n) => n > 1 ? f(n - 1) + f(n -2) : njs为什么是单线程的?JavaScript 能够操纵 DOM ,如果在批改元素属性同时渲染界面,渲染线程前后取得的元素数据可能不统一。为了避免渲染呈现不可预期的后果,浏览器设置GUI渲染线程与JS引擎为互斥关系,当JS引擎执行时GUI线程会被挂起,GUI更新则会被保留在一个队列中等到JS引擎线程闲暇时立刻被执行。 ...

September 25, 2023 · 5 min · jiezi

关于前端:如何用一行-CSS-实现-10-种现代布局

一、前言当初微信小程序越来越火了,置信不少人都通过各种路径学习过微信小程序或者尝试开发,作者就是已经因为趣味理解开发过微信小程序,所以当初用这篇博客记录我之前开发的一些教训和一些心得吧。二、次要内容springboot后端架构构建小程序我的项目构建小程序api调用后盾resetful接口编写小程序调用后盾接口收费的https申请linux下部署上线三、微信小程序我的项目构建这些根底的货色我就不过多介绍,大家在刚开始开发的时候个别都没有本人的服务器及域名,所以大家在本地编写的时候,在“具体”下的“我的项目设置”外面将“不校验域名安全性”勾选。至于微信小程序的组件,即前端页面的开发心愿大家耐住寂寞认真在微信开发平台上。组件:  https://developers.weixin.qq.com/miniprogram/dev/component/api: https://developers.weixin.qq.com/miniprogram/dev/api/四、后打量解我在后端编写次要是用java,当然对其余开发语言相熟的也能够应用其余语言开发后端。当初我就java编写后端api的解说。次要框架springboot,开发工具myeclipse,服务器阿里云服务器。创立一个maven我的项目,导入相干依赖:pom.xml依赖 <!-- 对立版本控制 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> </parent> <dependencies> <!-- freemarker渲染页面 --> <!-- https://mvnrepository.com/artifact/org.springframework.boot/s... --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> <!-- spring boot 外围 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- springboot整合jsp --> <!-- tomcat 的反对. --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency>  </dependencies>在配置文件src/main/resources/下创立application.properties文件能够批改一些配置参数等。#jsp反对spring.mvc.view.suffix=.jspspring.mvc.view.prefix=/WEB-INF/jsp/#this is set port#server.port=80server.port=443#增加ssl证书#ssl证书文件名server.ssl.key-store=classpath:xxxxxxx.pfxserver.ssl.key-store-password=xxxxxxxxserver.ssl.keyStoreType=xxxxxxxx在理论我的项目中可能波及数据库,还要整合mybatis,在文章中,我仅仅做测试就不做应用数据库的测试。首先创立springboot的入口程序:app.class上面贴上代码:@ComponentScan(basePackages= "com.bin")//增加扫包@ComponentScan(basePackages= "")@EnableAutoConfigurationpublic class App{ //启动springboot public static void main(String[] args) { SpringApplication.run(App.class, args); }}启动我的项目时间接右击run即可。在写一个测试的controller进行微信小程序与java后端实现通信,controller代码如下:@RestController@SpringBootApplicationpublic class ControllerText { @RequestMapping("getUser") public Map<String, Object> getUser(){ System.out.println("微信小程序正在调用。。。"); Map<String, Object> map = new HashMap<String, Object>(); List<String> list = new ArrayList<String>(); list.add("zhangsan"); list.add("lisi"); list.add("wanger"); list.add("mazi"); map.put("list",list); System.out.println("微信小程序调用实现。。。"); return map; } @RequestMapping("getWord") public Map<String, Object> getText(String word){ Map<String, Object> map = new HashMap<String, Object>(); String message = "我能力无限,不要尴尬我"; if ("起初".equals(word)) { message="正在热映的起初的咱们是刘若英的处女作。"; }else if("微信小程序".equals(word)){ message= "想获取更多微信小程序相干常识,请更多的浏览微信官网文档,还有其余更多微信开发相干的内容,学无止境。"; }else if("西安工业大学".equals(word)){ message="西安工业大学(Xi'an Technological University)简称”西安工大“,位于世界历史名城古都西安,是中国西北地区唯一一所以兵工为特色,以工为主,理、文、经、管、法协调倒退的教学研究型大学。原中华人民共和国兵器工业部直属的七所本科院校之一(“兵工七子”),陕西省重点建设的高水平教学研究型大学、陕西省人民政府与中国兵器工业集团、国防科技工业局共建高校、教育部“卓越工程师教育培养打算”试点高校、陕西省大学生创新能力造就综合改革试点学校。国家二级窃密资格单位,是一所以\"军民结合,寓军于民\"的国防科研高校。"; } map.put("message", message); return map; } @RequestMapping("") public String getText(){ return "hello world"; }}至此繁难的后端框架及测试根本实现。阐明:@RestController与@Controller注解的区别@RestController相当于两个注解,它能实现将后端失去的数据在前端页面(网页)中以json串的模式传递。而微信小程序与后盾之间的数据传递就是以json报文的模式传递。所以这就是抉择springboot框架开发小程序后端的次要起因之一。能够方面咱们进行小程序的后端开发。五、小程序发动网络申请在实现了小程序的后端开发,上面进行小程序端发动网络申请。上面以一个简略的按钮申请数据为例:wxml文件<button bindtap='houduanButton1'>点击发动申请</button><view wx:for="{{list}}"> 姓名:{{item}}  </view>js文件 /* 页面的初始数据 */ data: { list: '', word: '', message:'' }, houduanButton1: function () { var that = this; wx.request({ url: 'http://localhost:443/getUser', method: 'GET', header: { 'content-type': 'application/json' // 默认值 }, success: function (res) { console.log(res.data)//打印到控制台 var list = res.data.list; if (list == null) { var toastText = '数据获取失败'; wx.showToast({ title: toastText, icon: '', duration: 2000 }); } else { that.setData({ list: list }) } } })  }次要调用的api就是wx.request,想晓得将具体的介绍大家能够去微信公众平台(https://developers.weixin.qq.com/miniprogram/dev/api/)。接下来以搜寻类型的申请为例:wxml文件: <input type="text" class="houduanTab_input" placeholder="请输出你要查问的内容" bindinput='houduanTab_input'></input> <button bindtap='houduanButton2'>查问</button> <view wx:if="{{message!=''}}"> {{message}}  </view>js文件:变量的定义见上一个js文件//获取输入框的内容 houduanTab_input: function (e) { this.setData({ word: e.detail.value }) }, // houduanButton2的网络申请 houduanButton2: function () { var that = this; wx.request({ url: 'http://localhost:443/getWord', data:{ word: that.data.word }, method: 'GET', header: { 'content-type': 'application/json' // 默认值 }, success: function (res) { console.log(res.data)//打印到控制台 var message = res.data.message; if (message == null) { var toastText = '数据获取失败'; wx.showToast({ title: toastText, icon: '', duration: 2000 }); } else { that.setData({ message: message }) } } })  }至此曾经实现了繁难的微信小程序端与java后端进行通信。当初能够在启动后端我的项目在微信开发工具上进行测试。演示成果: ...

September 25, 2023 · 2 min · jiezi

关于前端:15-个常用的正则表达式技巧

你对正则表达式有何认识?我猜你会说这太艰涩难懂了,我对它基本不感兴趣。是的,我已经和你一样,认为我这辈子都学不会了。 但咱们不能否定它的确很弱小,我在工作中常常应用它,明天,我总结了15个十分应用的技巧想与你一起来分享,同时也心愿这对你有所帮忙。 那么,咱们当初就开始吧。 格式化货币我常常须要格式化货币,它须要遵循以下规定: 123456789 => 123,456,789 123456789.123 => 123,456,789.123 const formatMoney = (money) => { return money.replace(new RegExp((?!^)(?=(\\d{3})+${money.includes('.') ? '\\.' : '$'}), 'g'), ',') } formatMoney('123456789') // '123,456,789'formatMoney('123456789.123') // '123,456,789.123'formatMoney('123') // '123'您能够设想如果没有正则表达式咱们将如何做到这一点? Trim性能的两种实现形式有时咱们须要去除字符串的前导和尾随空格,应用正则表达式会十分不便,我想与大家分享至多两种办法。 形式1 const trim1 = (str) => { return str.replace(/^\s|\s$/g, '') } const string = ' hello medium 'const noSpaceString = 'hello medium'const trimString = trim1(string) console.log(string)console.log(trimString, trimString === noSpaceString)console.log(string)太好了,咱们曾经删除了字符串“string”的前导和尾随空格。 形式2 const trim2 = (str) => { return str.replace(/^\s(.?)\s*$/g, '$1') } ...

September 25, 2023 · 3 min · jiezi

关于前端:浏览器存储

1. 概念浏览器存储:是指浏览器提供的一种本地存储数据的机智,包含: Cookie、WebStorage、IndexedDB。前端长久优化存储:通过JavaScript 在客户端进行数据长久化存储的形式,包含 LocalStores、IndexedDB、File API等 个性CookieLocalStorageSessionStoresIndexedDB数据生命周期由服务器生成,能够设置过期工夫;前端采纳和js-cookie等组件也能够生成除非被清理,否则始终存在;浏览器敞开也会保留在本地刷新仍然存在,页面敞开就清理,不反对跨页面交互除非被清理,否则始终存在数据存储大小4K5M5M不限度与服务端通信每次都会携带在申请的header中,对于申请性能有影响;同时因为申请中都带着,容易呈现平安问题不参加不参加不参加特点字符串键值对在本地存储字符串键值对在本地存储字符串键值对在本地存储IndexedDB是一个非关系型数据库(不反对通过SQL语句操作)。能够存储大量数据,提供接口来查问,还能够建设索引,这些都是其余存储计划无奈提供的。2、CookieCookie 设计之初不是用来做本地存储的,而是用来补救 HTTP 在状态治理上的有余。HTTP 协定是一个无状态的协定,客户端向服务器发申请,服务器返回响应,故事就这样完结了,然而下次发送申请如何让服务器晓得你是谁呢?这种状况下就产生了 Cooike。Cookie 实质上是浏览器外面存储的文本文件,外部以键值对的形式存储,向同一个域名下发送申请,都会携带雷同的 Cookie,服务器拿到 Cookie 进行剖析,就能拿失去客户端的状态。它能够设置过期工夫,用于在客户端和服务器端传递数据,因为每次携带 Cookie 信息,可能导致网络开销减少,并且存在平安问题,所以不适宜存储大量数据。Cookie 本职工作并不是本地存储,而是“维持状态”,HTTP 是无状态的,HTTP协定自身不对申请响应之间的通信状态保留。Cookie 过期等配置Cookie 分为:Session Cookie 和长久型 Cookie,Cookie 设置中有个 HttpOnly 参数,前端浏览器应用 document.cookie 是读取不到 HttpOnly 类型的 Cookie 的,被设置为 HttpOnly 的 Cookie 记录只能通过 HTTP 申请头发送到服务端进行读写操作,这样就防止了服务器的 Cookie 记录被 JavaScript 批改,保障了服务器验证 Cookie 的安全性。Cookie 的内容次要包含:名字、值、过期工夫、门路、域。门路和域一起形成 Cookie 的作用范畴。若不设置过期工夫,则示意这个 Cookie 的生命周期为浏览器会话工夫,敞开浏览器窗口,Cookie 就隐没。这种生命周期为浏览器会话期的 Cookie 被称为会话Cookie。会话Cookie 个别不存在硬盘下面而是保留在内存里。若设置了过期工夫,浏览器就会把 Cookie 保留在硬盘上,敞开后再次关上浏览器,这些 Cookie 依然无效,晓得超过设定的过期工夫,存储在硬盘上的 Cookie 能够在不同的浏览器进过程中共享,比方两个窗口。而对于保留在内存中的 Cookie ,不同的浏览器有不同的解决形式。 // 设置 Cookiefunction setCookie(name, value, days) { let expires = ""; if (days) { const date = new Date(); date.setTime(date.getTime() + (days * 24 * 60 * 1000)); expires = "; expires=" + date.toUTCString(); } document.cookie = name + "=" + value + expires + "; path=/";}// 读取 Cookiefunction getCookie(name) { const nameEQ = name + "="; const ca = document.cookie.split(";"); for (let i = 0; i < ca.length; i++) { let c = ca[i]; while(c.charAt(0) === " ") { c = c.substring(1, c.length); } if (c.indexOf(nameEQ) === 0) { return c.substring(nameEQ.length, c.length); } } return null;}// 删除 Cookiefunction deleteCookie(name) { setCookie(name, "", -1)}// 应用// 设置Cookie 有效期 7 天setCookie("username", "john_doe", 7);console.log(cookie); // "username-john_doe; expires= o4 Aug 2023 14:47:16“ GMT: path=/"// 读取Cookieconst username = getCookie("username");console.log(username) // "john_doe"// 删除CookiedeleteCookie("username")Cookie 的作用是用来做状态存储的,然而有缺点: ...

September 25, 2023 · 2 min · jiezi

关于前端:面试官你了解axios的原理吗有看过它的源码吗

面试官:你理解axios的原理吗?有看过它的源码吗?一、axios的根本应用对于 axios 的根本应用,上篇文章曾经有所波及,这里再略微回顾一下: 发送申请 import axios from 'axios';axios(config) // 间接传入配置axios(url[, config]) // 传入url和配置axios[method](url[, option]) // 间接调用申请形式办法,传入url和配置axios[method](url[, data[, option]]) // 间接调用申请形式办法,传入data、url和配置axios.request(option) // 调用 request 办法const axiosInstance = axios.create(config)// axiosInstance 也具备以上 axios 的能力axios.all([axiosInstance1, axiosInstance2]).then(axios.spread(response1, response2))// 调用 all 和传入 spread 回调申请拦截器 axios.interceptors.request.use(function (config) { // 这里写发送申请前解决的代码 return config;}, function (error) { // 这里写发送申请谬误相干的代码 return Promise.reject(error);});响应拦截器 axios.interceptors.response.use(function (response) { // 这里写失去响应数据后处理的代码 return response;}, function (error) { // 这里写失去谬误响应解决的代码 return Promise.reject(error);});勾销申请 // 形式一const CancelToken = axios.CancelToken;const source = CancelToken.source();axios.get('xxxx', { cancelToken: source.token})// 勾销申请 (申请起因是可选的)source.cancel('被动勾销申请');// 形式二const CancelToken = axios.CancelToken;let cancel;axios.get('xxxx', { cancelToken: new CancelToken(function executor(c) { cancel = c; })});cancel('被动勾销申请');二、实现一个简易版axios构建一个 Axios 构造函数,外围代码为 request 办法: ...

September 25, 2023 · 6 min · jiezi

关于前端:和-Nodejs-说拜拜Deno零配置解决方案

不晓得大家留神没有,在咱们启动各种类型的 Node repo 时,root 目录很快就会被配置文件塞满。例如,在最新版本的 Next.js 中,咱们就有 next.config.js、eslintrc.json、tsconfig.json 和 package.json。而在款式那边,还有 postcss.config.js 和 tailwind.config.js。 如果加上中间件 middleware.ts,谬误监控 sentry.server.config.js、sentry.client.config.js 和 entry.edge.config.js,以及各种 env 文件、Git 文件和 Docker 文件……于是还没等咱们缓过神来,repo 可能就曾经变成了这个样子: 所有软件都须要配置。毕竟咱们终归要用某种办法来设置本人正在应用的我的项目、工具、插件和软件。然而,真有必要用 30 个文件来运行繁多我的项目吗?答案是不须要,那咱们须要怎么做呢? 配置,但要用上智能默认项软件畛域没有“银弹”——所有用户的需要都会略有不同。配置能让用户更灵便地依据理论用例,从软件当中吸取最大价值。但“想用软件?先搞配置”的确是种十分蹩脚的用户体验。 咱们以向现有 Next.js 我的项目中增加 TypeScript 为例,看看整个流程要怎么推动。首先,咱们须要装置 TypeScript 和类型: npm install --save-dev typescript @types/react @types/node之后须要创立本人的 tsconfig.json: touch tsconfig.json接下来,如果大家刚刚开始应用 TypeScript、搞不清本人须要什么配置,那必定要祭起开发者都晓得的“秘密武器”——从 Stack Overflow 上扒一套配置: { "compilerOptions": { "target": "es5", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "esModuleInterop": true, "allowSyntheticDefaultImports": true, "strict": true, "forceConsistentCasingInFileNames": true, "module": "esnext", "moduleResolution": "node", "resolveJsonModule": true, "isolatedModules": true, "noEmit": true }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], "exclude": ["node_modules"]}不想手动往我的项目里增加 TypeScript 反对?能够试试 Deno,它原生反对 TypeScript。而这,还仅仅是增加了个 TypeScript。 ...

September 25, 2023 · 2 min · jiezi

关于前端:九加密

前言本篇章次要介绍了前端加密的次要场景以及形式。面试答复1.加密:常见的有四种加密形式。Hash加密、base64加密、AES加密、RSA加密。不论是哪种加密形式,在前端的应用场景个别有两种情景,一种是纯前端加密,加密后与后端的交互间接应用密文,后端数据库保留的也是密文,返回给前端的也是密文。另一种是前后端独特加密,会应用到公钥或者协商后的解密形式,个别呈现在后端也须要解密数据的场景。对称加密能够用AES,通过CryptoJS.AES.encrypt,传入value和key进行加密,解密的话则用CryptoJS.AES.decrypt传入密文和key。非对称加密能够用RSA,通过JSEncrypt.setPublicKey,传入公钥来设置公钥,而后用JSEncrypt.encrypt对value进行加密,解密的话相似,只不过将公钥换成私钥。知识点1.Hash算法加密Hash加密,就是把任意长度的输出,通过散列算法,变换成固定长度的输入。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输出的空间,不同的输出可能会散列成雷同的输入,而不可能从散列值来惟一的确定输出值。简略的说就是一种将任意长度的消息压缩到某一固定长度的音讯摘要的函数。 长处:不可逆、易计算、特色化毛病:可能存在散列抵触应用场景:因为不可逆性,罕用于明码存储、数字签名、电子邮件验证、验证下载、鉴权协定等方面,更多的是用在验证数据的完整性方面。md5加密MD5是比拟常见的 Hash 算法,对于MD5而言,有两个个性是很重要的,第一:明文数据通过散列当前的值是定长的;第二:是任意一段明文数据,通过散列当前,其后果必须永远是不变的。前者的意思是可能存在有两段明文散列当前失去雷同的后果,后者的意思是如果咱们散列特定的数据,失去的后果肯定是雷同的。比方在登录时将明码进行md5加密再传输给服务器,服务器中的明码也是用md5加密后存储的,那么只有验证加密后的密文是否统一则可。 在我的项目中须要用到MD5加密时,能够应用开源的js库:js-md5,应用形式: // 装置npm install --save js-md5//引入import md5 from 'js-md5'; //应用md5('hello') // bcecb35d0a12baad472fbe0392bcc0432.base64加密Base64 编码只是一种编码格局并不是加密算法,它可用于在 HTTP 环境下传递较长的标识信息。 能够将任意的二进制数据进行 Base64 编码数据加密之后,数据量会变大,变大 1/3 左右编码后有个十分显著的特点,开端有个=号可进行反向解码Base64 编码具备不可读性目前浏览器都提供了 Base64 编码、解码办法,btoa() 和 atob(),应用形式: // 装置npm install --save js-base64// 引入let Base64 = require('js-base64').Base64// 加密Base64.encode('测试'); // 解密Base64.decode('5bCP6aO85by+'); //或者var enc = window.btoa('Hello World'); // SGVsbG8gV29ybGQ=var str = window.atob(enc); // Hello World3.对称加密(AES加密)对称加密指的是加密和解密应用雷同密钥的加密算法。它要求发送方和接管方在平安通信之前,约定一个密钥。对称算法的安全性依赖于密钥,透露密钥就意味着任何人都能够对他们发送或接管的音讯解密,所以密钥的保密性对通信的安全性至关重要。 对称加密(AES):用的同一个密钥进行加解密的 长处: 算法公开、计算量小、加密速度快、加密效率高。毛病: 在传输密钥过程中,这个密钥容易被拦挡,导致密钥透露,安全性不高应用场景:本地数据加密、https 通信、网络传输等在我的项目中须要用到AES加密时,能够应用开源的js库:crypto-js,应用形式: var Cryptojs = require('crypto-js');var data = { id: 1, text: 'Hello World' };// 加密生成密文var ciphertext = CryptoJS.AES.encrypt(JSON.stringify(data), 'secret_key').toString();// 解密失去明文var bytes = CryptoJS.AES.decrypt(ciphertext, 'secret_key');var decryptedData = JSON.parse(bytes.toString(CryptoJS.enc.Utf8));4.非对称加密非对称加密算法须要两个密钥:公开密钥(publickey:简称公钥)和公有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥能力解密。因为加密和解密应用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 ...

September 25, 2023 · 1 min · jiezi

关于前端:正则表达式学习记录

目录:1、什么是正则2、字符的了解3、循环与反复4、地位边界5、子表达式6、逻辑解决1、什么是正则表达式 正则表达式实质上就是一个用于字符串模式匹配的工具,实现字符串的搜寻和替换性能。 从其命名咱们能够看进去,它是一种用于形容某种规定的表达式。 咱们要学习的,就是其外部的搜寻及替换的性能,至于其底层实现机制,并不深究。 2、字符的了解 正则表达式基本上是由各种字符组成的,其分为字符和元字符: 字符:就是根底的计算机字符编码,通常正则表达式外面应用的就是数字、英文字母。元字符:就是用来示意非凡语义的字符。如^示意非,|示意或等。正则表达式就是由这两种字符来组成各种理论的规定。 2.1 单个字符匹配 最简略的正则表达式就由数字和字母组成。如我想匹配 'banana'中的 'b' 这个字符,那我间接应用 /b/ 这个正则就行了,然而咱们用 /a/ 就会匹配到所有的 'a' 字符。 然而如果咱们想要匹配非凡的字符,如 '*' 这个字符自身是特殊字符,咱们就须要转义字符 \ 来让特殊字符失去本来的含意。 /\*/ 就是匹配 '*'这个字符咱们还能够用 \ 让本来不是特殊字符的字符,让其具备非凡的含意。如咱们要匹配空格、换行、回退等符号的时候,能够用上面这张表记忆: 2.2 多个字符匹配 单个字符的匹配的一对一的,也就是说只能匹配一个后果,这显然不够用。正则表达式又引入了汇合区间和通配符的形式实现一对多的匹配,即一个正则匹配多个不同的字符。 汇合区间用 [] 示意,如:/[123]/ 能匹配字符串中的所有 1 2 3 字符。能够应用元区间 - 来示意汇合区间的范畴,如:/[0-9]/ 能匹配字符串中所有的数字,/[a-z]/ 则能够匹配所有的英文小写字母。 此外,正则表达式还衍生了一批用于匹配区间的简便非凡正则正则表达式,如下: 3、循环与反复 下面讲的是一对一和一对多的字符匹配,这里要讲的就是匹配字符的规定。 所谓的同时匹配多种字符,就是管制正则表达式中某字符的呈现次数,呈现次数分为:0次、1次、无数次、固定次数。 3.1 匹配0次或1次 元字符 '?' 示意匹配其后面的字符0次或1次,如:正则表达式 /colou?r/ 就能同时匹配字符串 'color' 和 'colour', 它示意 'u' 能够呈现0次或1次。 3.2 匹配0次或屡次 元字符 '*' 用来示意匹配0个字符或无数个字符. 3.3 匹配1次或屡次 ...

September 25, 2023 · 2 min · jiezi

关于前端:前端新轮子Nue号称替代VueReact和Svelte

首发于公众号 大迁世界,欢送关注。 每周一篇实用的前端文章 ️ 分享值得关注的开发工具 分享集体守业过程中的趣事快来收费体验ChatGpt plus版本的,咱们出的钱 体验地址:https://chat.waixingyun.cn能够退出网站底部技术群,一起找bug,... 新的简洁前端开发工具集Nue.js 于周三公布。在 Hacker News 上介绍它时,前端开发者和Nue.js 的创作者Tero Piirainen示意,它是 React、Vue、Next.js、Vite、Svelte 和 Astro 的替代品。他在 Nue.js的 FAQ 中进一步解释说,它是为网站和响应式用户界面设计的。该工具集已依据MIT许可进行了开源。 “Nue生态系统仍在开发中,明天我公布了一个小而弱小的外围:Nue JS。”他在Hacker News上写道。“这是一个十分小的(压缩后2.3kb)用于构建用户界面的JavaScript库。” Nue 来源于德语词汇 neue,翻译成英语是新。它容许具备HTML、CSS和JavaScript常识的开发者构建服务器端组件和响应式界面。他补充说,它就像React或Vue,但没有钩子、成果、道具或其余抽象概念。 Nue 语法Nue 应用基于 HTML 的模板语法: <div @name="media-object" class="{ type }"> <img src="{ img }"> <aside> <h3>{ title }</h3> <p :if="desc">{ desc }</p> <slot/> </aside></div>尽管React和JSX声称是“纯JavaScript”,但 Nue能够被认为是 “纯HTML”。Nue非常适合那些专一于交互设计、无障碍和用户体验的UX开发者。 Nue与React相比 Nue.js 的网站声称,与竞争对手相比,它能够应用10倍更少的代码构建用户界面(只管没有具体阐明)。它旨在成为一个生态系统的一部分,打算包含: Nue CSS,用于代替CSS-in-JS、Tailwind和SASS的级联款式;Nue MVC,用于构建单页利用;Nue UI,用于创立可重用的组件以疾速进行UI开发;Nuemark,一个用于丰盛和交互式内容的markdown格调;Nuekit,用于用更少的代码构建网站和web利用。来自赫尔辛基的Piirainen在开源我的项目、技术产品和守业公司方面领有超过25年的教训。Piirainen之前编写的我的项目包含 iot.js、Flowplayer和jQuery Tools。目前,他是Nue.js的惟一开发者,但正在寻求贡献者。 相干github:https://github.com/nuejs/nuejs 交换首发于公众号 大迁世界,欢送关注。 每周一篇实用的前端文章 ️ 分享值得关注的开发工具 ❓ 有疑难?我来答复 ...

September 25, 2023 · 1 min · jiezi

关于前端:Git-Stash临时保存和切换工作状态的利器

Git是咱们日常工作中不可或缺的版本控制系统。它提供了许多弱小的性能,其中之一是Git Stash(暂存)。Git Stash能够帮忙咱们在切换分支或保留未实现的工作时,长期保留以后的批改,以便稍后从新利用。本文将介绍Git Stash的用处、常见场景以及如何应用该性能。 Git Stash的利用Git Stash的用处十分宽泛,特地实用于以下几种常见场景: 分支切换:当你正在进行某个分支上的开发工作,但须要紧急修复其余分支的bug或进行其余工作时,你能够应用Git Stash来保留以后分支上的批改。这样,你能够切换到其余分支,实现紧急任务后再回到原来的分支,并通过复原Stash来从新利用你之前保留的批改。长期保留工作状态:有时候你可能须要中断以后的工作,但又不想提交未实现的批改。应用Git Stash能够将你的批改长期保存起来,以便稍后持续工作。这在你须要临时切换到其余工作、参加会议或解决其余紧急问题时十分有用。解决代码抵触:当你在合并分支或拉取近程更新时遇到代码抵触,你能够应用Git Stash来保留以后的批改,并将工作区复原到洁净的状态。而后你能够解决抵触,再从新利用你之前保留的批改。Git Stash的应用上面是一些罕用的Git Stash命令: git stash:保留当前工作区的批改,但不保留已提交的批改;git stash save "message":保留当前工作区的批改,并增加一条阐明信息;git stash list:列出所有储备记录;git stash apply [stash@{n}]:利用某个储备记录,并将其从储备列表中删除;git stash pop [stash@{n}]:利用某个储备记录,并将其从储备列表中删除,同时复原当前工作目录到储备时的状态。 假如咱们当初批改index.html文件,并将index.html文件git add index.html 提交到暂存区,再执行git ls-files 查看暂存区的文件后果如下图: 当初咱们长期保留index.html批改状态git stash,贮存记录中就会多一条记录: 当然,工作中不能这么随便,不然记录变多不便于找到本人想复原的记录,通常应用git stash save "message"命令: 复原保留的批改有两种常见的办法能够复原保留的批改。一种是应用git stash apply命令,它会从新利用最新的stash,并保留stash的正本。另一种是应用git stash pop命令,它会利用最新的stash,并将其从stash列表中删除。 如果你有多个stash,你能够通过git stash apply stash@{n}命令来利用特定的stash,其中n是stash的索引号。 一旦你不再须要某个stash,你能够应用git stash drop命令将其从stash列表中删除。 加强 Git 的VS Code 扩大我想少数人不喜爱在黑白的窗口敲命令,咱们能够通过VS Code 扩大来加强应用 Git,我举荐本人罕用的一个Git插件为GitLens,装置如下图: 装置后,咱们就能直观地看到Git Stash所有储备记录。 这样,增加保留长期工作状态,也就是鼠标点点的事件。 ...

September 25, 2023 · 1 min · jiezi

关于前端:有人说前端已死请不要再制造焦虑

前言 最近,在知乎上看到一个热门帖子,题目是“站在2023年,如何对待「前端已死」的观点?” 这个话题引发了宽泛的探讨,也引发了一些对于“前端已死”的担心。然而,对于这个问题,作为一个从业10余年的老鸟看来,咱们须要进行全面、感性的剖析,而不是陷入适度乐观的情绪。 先说论断 只管过来两年前端行业经验了一些挑战,包含招聘需要降落、薪资增长放缓以及一些企业的裁员,但前端技术仍在迅速演进。新的技术和方向不断涌现,例如WebAssembly、Serverless、低代码平台等,这些都须要前端从业者一直学习,以适应技术和市场的变动。尽管行业可能会面临瓶颈,但前端技术依然是互联网和挪动互联网等畛域的基石和外围。接下来,我将从前端倒退的现状、技术发展趋势和待业市场几个方面进行深入分析,并为那些感到焦虑的同行提供一些倡议。 22年招聘网站数据 依据Boss直聘2022年公布的《Boss直聘rbac编程语言人才报告》,2022年前端方向的招聘需要同比2021年降落了15.6%。依据智联招聘的薪资数据,2022年国内前端开发者的均匀月薪为15000元,与2021年根本持平,但增长率低于2020和2021年的两位数增长。猎聘网公布的《2022年Q3中国互联网企业薪酬指数报告》显示,2022年上半年互联网行业技术类岗位的平均工资较2021年呈现小幅回落,其中高级前端开发岗位均匀月薪为25600元。Boss直聘公布的2022年编程语言招聘报告指出,把握新技术如WebAssembly、web3的候选人更占优势。多份调研报告显示,企业对前端开发者的团队合作能力等软技能也越来越器重。前端倒退的现状 行业竞争加剧,招聘需要有所降温。这两年,前端开发者的供给量减少,而需要市场增速放缓,导致待业竞争加剧,很多公司的招聘需求量比以前有所降落。同时,公司对候选人的技术要求也在一直进步。 行业增长进入平台期,薪资增长放缓。与前几年惊人的薪资增长相比,以后前端开发者的薪资增长速度已显著放缓,甚至呈现小幅回落。行业增长进入绝对安稳的平台期。 更加看重全栈能力。因为前后端界线逐步含糊,不少公司更青眼有全栈开发教训的候选人。作为前端,须要把握肯定的后端技能。 技术发展趋势: WebAssembly、Serverless等新技术趋势。WebAssembly改善前端执行效率,Serverless升高部署和保护老本。这些技术为前端开发带来新机遇。 继续渲染、JS框架等支流技术迭代减速。React Fiber、Vue3等框架的推出,使继续渲染等技术更加成熟,前端支流技术也在疾速迭代。 更加重视性能优化,如PRPL、iCode等。性能优化将是前端开发的重要方向。各种性能优化模式和技术将越来越遍及。 待业市场剖析 只管前端招聘市场竞争强烈,但高级和中级前端开发岗位依然有很多机会,潜在的应聘者依然能够找到就业机会。然而须要留神的是,为了在竞争强烈的市场中怀才不遇,可能须要更多的技能和教训,这也能够做为一个契机,迫使前端开发者踊跃晋升本人的技能和常识。 薪资回落无限,仍处较高水平。尽管薪资增速放缓,但相对薪资程度仍处于技术人员较高区间,前端的整体待遇仍具备很高吸引力。 全栈方向、新技术将优先思考。把握全栈能力,以及新技术如WebAssembly、Web3等,都是候选人的加分项。 给新入行的小伙伴一些倡议 夯实前端根底:打好HTML、CSS、JavaScript等前端基础知识的根底,把握良好的编程习惯。这是入行的基石。多学习支流框架:像Vue、React等支流框架,倡议都能纯熟应用。重视实战能力造就:做出理论我的项目能力锤炼技能。能够从仿站、外部练手我的项目做起,逐渐证实开发能力。学习版本管理工具:像Git这样的版本控制工具也要把握,这在团队合作中十分重要。关注新技术动向:前端倒退迅速,新技术层出不穷,关注它们的倒退也能让你继续提高。建立继续学习理念:技术更新太快,如果进行学习,很容易被甩在前面。放弃学习激情很要害。重视造就团队单干精力:在工作中,团队合作能力也十分重要。多交换,放弃虚心态度。积极参与开源我的项目:参加开源我的项目能取得教训,如果有奉献也能在简历上加分。重视造就良好的编程习惯:如正文、格式化、命名等,这会对代码品质有很大帮忙。多与人交换,不要关闭自我:在学习中交流经验,共同进步。放弃凋谢心态也很重要。给曾经入行的小伙伴一些倡议 踊跃学习新技术,勤于练习理论我的项目,并参加开源我的项目奉献代码。这能够展现你的学习能力和技术积攒。重视掌握业务能力,学习一些产品、设计等方面的常识,让本人成为可落地产品价值的全面人才。多学习一些前后端交融的常识,把握全栈技能。这能够晋升本人的竞争力,也合乎将来行业的发展趋势。重视团队合作能力的晋升,积极参与外部分享,传递正能量。总的来说,前端开发是一个充斥挑战但也充斥时机的畛域。无论是新入行还是曾经在这个畛域工作的人,继续学习、拓宽技能和不断进取都是取得成功的要害。前端依然是数字时代的外围,对于那些违心一直学习和适应变动的人来说,前途一片光明。

September 24, 2023 · 1 min · jiezi

关于前端:Angular-LOCATIONINITIALIZED-Injection-token-的作用介绍

import { LOCATION_INITIALIZED } from '@angular/common' 这行代码的作用是从 Angular 框架的 @angular/common 模块中导入名为 LOCATION_INITIALIZED 的符号(也能够称为常量、变量或标识符)。这个符号通常用于解决 Angular 应用程序的路由初始化过程,特地是在应用程序启动时。 为了更具体地解释这行代码的作用,咱们须要深刻理解 Angular 框架中的路由和初始化过程,以及 LOCATION_INITIALIZED 常量的具体用处。 Angular 路由和初始化Angular 是一个用于构建单页应用程序(SPA)的前端框架,它通过路由机制来治理不同页面之间的导航。在 Angular 中,路由是指定应用程序视图的形式,并定义了哪个组件应该在特定的 URL 被加载和显示。 在 Angular 中,路由初始化是指应用程序启动时,Angular 路由器开始监听 URL 变动,并依据以后 URL 加载相应的组件。这个过程通常在应用程序启动时执行,因而十分要害,因为它确保了应用程序在用户拜访不同的 URL 时可能正确地加载和显示相应的内容。 LOCATION_INITIALIZED 常量的作用LOCATION_INITIALIZED 常量是 Angular 框架提供的一个标识符,用于示意路由初始化过程的实现。它是 @angular/common 模块的一部分,这个模块蕴含了许多 Angular 应用程序罕用的公共性能和工具。 具体来说,LOCATION_INITIALIZED 常量是一个标记,用于通知开发者何时能够平安地执行与路由初始化相干的操作。在应用程序启动时,路由器会在 URL 监听器之前触发 LOCATION_INITIALIZED 事件,这样开发者就能够在这个事件中执行一些初始化工作,确保应用程序正确地筹备好了路由导航。 举例说明为了更清晰地阐明 import { LOCATION_INITIALIZED } from '@angular/common' 的作用,让咱们通过一个简略的示例来展现如何在 Angular 应用程序中应用它。 假如咱们有一个 Angular 应用程序,其中蕴含多个路由,每个路由对应不同的页面。在某些状况下,咱们可能心愿在路由初始化实现后执行一些特定的操作,例如在路由导航开始之前加载一些数据,或者在特定路由被激活时执行某些逻辑。 以下是一个示例代码,演示了如何应用 LOCATION_INITIALIZED 常量来执行路由初始化后的操作: import { Component, Injector } from '@angular/core';import { Router } from '@angular/router';import { LOCATION_INITIALIZED } from '@angular/common';import { take } from 'rxjs/operators';@Component({ selector: 'app-root', template: ` <h1>{{ title }}</h1> <router-outlet></router-outlet> `,})export class AppComponent { title = 'Angular Routing Example'; constructor(private router: Router, private injector: Injector) { // 应用 LOCATION_INITIALIZED 常量来执行初始化操作 this.router.events.pipe(take(1)).subscribe((event) => { if (event instanceof NavigationEnd) { // 在路由初始化后执行一些操作 this.initializeAfterNavigation(); } }); } private initializeAfterNavigation() { // 在路由初始化后执行的操作 console.log('路由已初始化,能够执行额定的操作。'); }}// 在应用程序启动时执行初始化操作export function appInitializerFactory( injector: Injector) { return () => new Promise<void>((resolve) => { const locationInitialized = injector.get( LOCATION_INITIALIZED, Promise.resolve(null) ); locationInitialized.then(() => { console.log('路由初始化实现!'); resolve(); }); });}// 提供应用程序初始化函数export const appInitializerProvider = { provide: APP_INITIALIZER, useFactory: appInitializerFactory, deps: [Injector], multi: true,};在上述示例中,咱们的 AppComponent 类中应用了 LOCATION_INITIALIZED 常量来监听路由初始化实现的事件。一旦路由初始化实现,咱们执行了 initializeAfterNavigation 办法,能够在这个办法中执行任何须要在路由初始化后进行的操作。 ...

September 24, 2023 · 1 min · jiezi

关于前端:SAP-Hybris-Backoffice-site-里-Require-Authentication-字段的作用

“SAP Commerce Cloud Backoffice” 是一个用于治理和保护电子商务网站的弱小工具,容许管理员和经营团队轻松地治理网站内容和配置。在Backoffice的WCMS(Web Content Management System)局部,管理员能够创立、编辑和治理网站上的内容。在WCMS的Administration面板中,有一个字段称为Requires Authentication,容许您抉择True或False。这个字段的作用是管制特定网站页面是否须要用户进行身份验证能力拜访。本文将具体解释这个字段的用处,并提供理论示例来阐明其重要性。 Requires Authentication 字段的作用Requires Authentication 字段的目标是确定特定网站页面是否须要用户进行身份验证(登录)能力拜访。它是电子商务网站中的一个重要性能,因为不同类型的页面可能须要不同的安全级别和访问控制。以下是该字段的两个选项的解释: True: 如果将字段设置为True,那么拜访该页面将须要用户登录零碎并提供无效的凭据(通常是用户名和明码)。这通常用于爱护敏感信息或须要特定用户权限的页面,如订单历史、购物车内容、个人资料等。只有通过身份验证的用户能力查看这些页面。False: 如果将字段设置为False,则页面将在不须要用户登录的状况下对任何人凋谢。这通常用于公共信息页面,如主页、产品目录或分割页面,这些页面不须要用户身份验证,以确保宽泛的拜访。具体阐明和示例当初,让咱们通过几个示例来具体阐明Requires Authentication字段的用处和重要性。 示例 1:购物车页面假如您的电子商务网站有一个购物车页面,用户能够在其中查看和编辑他们增加到购物车的商品。这个页面通常蕴含了用户的敏感信息,如商品数量、价格总计等。在这种状况下,您应该将Requires Authentication字段设置为True,以确保只有已登录的用户能力拜访购物车页面。这样,您能够确保用户只能查看和批改本人的购物车,同时爱护用户的隐衷和平安。 示例 2:产品目录页面您的网站可能还有一个产品目录页面,展现了您提供的所有产品。这个页面通常用于吸引新客户,并让他们理解您的产品范畴。在这种状况下,您能够将Requires Authentication字段设置为False,容许任何人都能够拜访产品目录,无需登录。这样,潜在客户能够在不受限制的状况下浏览您的产品,理解您的业务,这有助于进步潜在客户的趣味。 示例 3:订单历史页面如果您的网站容许用户查看其以前的订单历史记录,这些页面蕴含了用户的订单详细信息,包含付款信息和送货地址。这是敏感信息,只有已注册并登录的用户才应该可能拜访。因而,对于订单历史页面,您应该将Requires Authentication字段设置为True,以确保只有已登录的用户能力查看其订单历史。 安全性和用户体验的均衡Requires Authentication字段的设置波及到安全性和用户体验之间的均衡。如果适度应用身份验证,可能会导致用户体验不佳,因为用户须要频繁地登录能力拜访网站的各个局部。相同,如果不足够应用身份验证,可能会导致平安危险,因为敏感信息可能会对未经受权的用户凋谢。 因而,管理员必须认真思考每个页面的平安需要,并相应地配置Requires Authentication字段,以确保安全性和用户敌对性的均衡。 总结SAP Commerce Cloud Backoffice的Requires Authentication字段是一个重要的性能,用于管制网站页面是否须要用户身份验证能力拜访。通过抉择True或False,管理员能够准确地治理网站的访问控制,从而爱护敏感信息并提供优良的用户体验。在不同的页面和用例中,正确配置这个字段能够确保您的电子商务网站既平安又易于应用。 须要留神的是,不同的电子商务平台和零碎可能会以不同的形式实现这种性能,但Requires Authentication字段的基本概念在各种电子商务环境中都是实用的。管理员应依据其应用的具体零碎和需要来正确配置这个字段,以满足其网站的安全性和用户体验要求。

September 24, 2023 · 1 min · jiezi

关于前端:Angular-APPINITIALIZER-Injection-Token-的使用方法介绍

import { APP_INITIALIZER } from '@angular/core' 这行代码在 Angular 中的作用是导入名为 APP_INITIALIZER 的常量,它来自 Angular 外围模块 @angular/core。APP_INITIALIZER 是一个重要的 Angular 个性,它用于执行一系列初始化操作,通常用于配置应用程序之前执行一些必要的工作。在本答复中,我将具体解释 APP_INITIALIZER 的作用,它的用法以及如何通过示例来阐明。 APP_INITIALIZER 的作用APP_INITIALIZER 是 Angular 提供的一个机制,用于在应用程序启动时执行一些初始化工作。这些工作通常包含加载配置、设置全局变量、初始化国际化设置、预取数据等。它容许你在利用程序模块加载之前运行代码,确保应用程序在启动时处于正确的状态。 用法要应用 APP_INITIALIZER,你须要在 Angular 的依赖注入零碎中注册一个工厂函数,该工厂函数将在应用程序启动时被调用。这个工厂函数返回一个 Promise 或者 Observable,Angular 将期待这个 Promise 或 Observable 实现,而后才会持续应用程序的启动过程。 具体的步骤如下: 在应用程序的模块文件中导入 APP_INITIALIZER。 import { APP_INITIALIZER } from '@angular/core';创立一个初始化函数,该函数将在应用程序启动时执行。这个函数能够蕴含任何你须要在应用程序启动时执行的代码。 export function initializeApp() { // 在这里执行初始化操作 return () => { // 可选的清理代码 };}注册初始化函数作为 APP_INITIALIZER 依赖注入令牌。 @NgModule({ declarations: [...], imports: [...], providers: [ { provide: APP_INITIALIZER, useFactory: initializeApp, multi: true, // 如果有多个初始化函数,设置为 true }, ], bootstrap: [...],})export class AppModule { }在下面的示例中,咱们定义了一个名为 initializeApp 的初始化函数,并将它注册为 APP_INITIALIZER 的提供者。multi: true 示意能够有多个初始化函数,它们会依照注册的程序顺次执行。 ...

September 24, 2023 · 2 min · jiezi

关于前端:什么是-JSON-Web-Token

JSON Web Token(JWT),又称为JSON令牌,是一种用于在网络应用之间平安地传输信息的凋谢规范(RFC 7519)。它采纳了一种紧凑的、自蕴含的形式来示意信息,通常用于身份验证和受权。JWT的设计指标是确保信息的完整性和安全性,同时具备易于应用和传输的特点。 JWT的构造JWT由三个局部组成,它们之间以.分隔,别离是: Header(头部):蕴含了对于令牌的元数据和形容,通常包含令牌的类型(typ)和签名算法(alg)等信息。这一部分是一个JSON对象,通常会被base64url编码。Payload(载荷):蕴含了须要传输的数据,也是一个JSON对象,通常包含一些申明(claim)和用户定义的数据。常见的申明有: iss(Issuer):令牌的发行者。sub(Subject):令牌的主题,通常是用户的惟一标识符。aud(Audience):令牌的受众,示意该令牌针对哪些接收者。exp(Expiration Time):令牌的过期工夫。iat(Issued At):令牌的颁发工夫。nbf(Not Before):令牌的失效工夫。jti(JWT ID):令牌的惟一标识符。除了规范申明,你还能够在Payload中增加自定义的数据。 Signature(签名):用于验证JWT的真实性和完整性。签名的生成形式通常是将Header和Payload局部组合起来,应用一个密钥(secret key)进行哈希运算,而后再与令牌中的签名局部比对。这个局部确保了令牌在传输过程中没有被篡改。上面是一个JWT的示例: Header:{ "alg": "HS256", "typ": "JWT"}Payload:{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022}Signature:HMACSHA256( base64UrlEncode(Header) + "." + base64UrlEncode(Payload), secret_key)上述示例中,Header指定了应用HS256(HMAC SHA-256)算法进行签名,Payload蕴含了主题(sub)、姓名(name)以及颁发工夫(iat)等信息,Signature应用了一个秘钥(secret_key)来生成。 JWT的工作流程JWT的工作流程通常波及三个次要角色:颁发者(Issuer)、用户(User)、验证者(Verifier)。 颁发者(Issuer):颁发者是负责创立JWT的实体。颁发者将用户的信息和一些申明以及一个签名加工在一起,生成一个JWT,并将其发送给用户。用户(User):用户是JWT的持有者,通常是一个须要在不同利用之间传递信息的实体。用户能够在须要的时候将JWT发送给不同的利用来进行身份验证或受权。验证者(Verifier):验证者是负责验证JWT的实体。它们接管到JWT后,首先会解析JWT的Header和Payload,而后应用当时共享的密钥来验证Signature的有效性。如果验证胜利,验证者能够信赖JWT中蕴含的信息。JWT的工作流程如下: 用户通过某种形式(例如用户名明码登录)向颁发者申请令牌。颁发者验证用户的身份后,创立一个JWT,蕴含用户的信息和一些申明,而后应用本人的私钥来签名JWT。颁发者将JWT发送给用户。用户在与不同的利用通信时,能够将JWT发送给利用作为身份验证或受权凭证。利用接管到JWT后,应用之前与颁发者共享的公钥来验证JWT的签名,确保JWT没有被篡改。如果JWT验证通过,利用能够信赖其中的信息,并依据须要执行相应的操作。JWT的长处JWT在古代应用程序中宽泛应用,因为它具备多个长处: 轻量级和自蕴含性:JWT是紧凑的文本格式,易于传输和解析。所有必要的信息都蕴含在JWT自身中,无需在服务器上保留会话状态。分布式身份验证:JWT使得分布式系统中的身份验证变得更加简略,因为不同的利用能够共享雷同的JWT颁发者,而无需在各自的数据库中存储用户凭据。无状态:因为JWT自身蕴含了所有必要的信息,服务器不须要保护会话状态,这对于负载平衡和容错性很有帮忙。可扩展性:JWT的Payload能够蕴含自定义申明,能够依据利用的需要增加额定的信息。安全性:JWT应用签名来爱护其完整性,避免篡改。应用适当的算法和密钥能够确保JWT的安全性。应用场景JWT通常用于以下场景: 身份验证:用户登录后,颁发者能够生成一个蕴含用户信息的JWT,用户能够在申请中携带该JWT,以证实其身份。受权:利用能够应用JWT来受权用户拜访某些资源或执行特定操作。JWT的Payload能够包含用户的角色和权限信息。 单点登录(SSO):JWT能够用于实现单点登录,用户只需登录一次,就能够拜访多个关联的利用。明码重置:JWT能够用于生成蕴含明码重置信息的令牌,用户能够应用该令牌来重置其明码。信息替换:JWT能够用于不同利用之间平安地替换信息,例如在微服务架构中。平安思考尽管JWT在许多场景下十分有用,但也须要审慎应用以确保安全性: 密钥治理:密钥的平安治理是要害。透露密钥会导致令牌被伪造,因而须要采纳适当的密钥治理措施,如定期轮换密钥。过期工夫:JWT通常蕴含了过期工夫(exp)申明,利用须要定期检查令牌的有效性,并确保不应用已过期的令牌。非对称加密:对于高度敏感的信息,能够思考应用非对称加密算法,以进步安全性。在这种状况下,验证者应用颁发者的公钥来验证签名。防止在令牌中存储敏感信息:尽量避免在JWT的Payload中存储敏感信息,因为Payload局部是Base64编码的,可能会被解码。应用HTTPS:JWT在传输过程中可能会被截获,因而倡议在应用JWT时始终应用HTTPS来确保通信的安全性。示例利用:应用Node.js和Express验证JWT上面是一个应用Node.js和Express验证JWT的简略示例: const express = require('express');const jwt = require('jsonwebtoken');const app = express();const secretKey = 'your-secret-key';// 中间件:验证JWTconst verifyToken = (req, res, next) => { const token = req.headers.authorization; if (!token) { return res.status(401).json({ message: '无奈验证身份' }); } jwt.verify(token, secretKey, (err, decoded) => { if (err) { return res.status(401).json({ message: '身份验证失败' }); } req.user = decoded; next(); });};// 路由:受爱护的资源app.get('/protected', verifyToken, (req, res) => { res.json({ message: '欢送拜访受爱护的资源', user: req.user });});// 路由:生成JWTapp.post('/login', (req, res) => { const user = { id: 1, username: 'user123' }; const token = jwt.sign(user, secretKey, { expiresIn: '1h' }); res.json({ token });});app.listen(3000, () => { console.log('服务器运行在端口 3000');});在上述示例中,服务器应用Express框架创立,蕴含了两个路由。/login路由用于生成JWT,/protected路由受爱护,只有携带无效JWT的申请能力拜访。 ...

September 24, 2023 · 1 min · jiezi

关于前端:国庆微信头像DIY轻松打造个性化头像

前言国庆节马上要到了,明天就教你如何从0到1应用canvas生成国庆风微信头像。 本文蕴含以下内容: vue3我的项目搭建,需要剖析canvas合成图片原理github自动化部署开发过程遇到的问题及解决方案文末附源码及在线体验地址~ 搭建我的项目,剖析需要我的项目的话就间接应用脚手架生成一个 Vue3 + TS我的项目 npm create vue@latest为了不便,应用了Element PlusUI库 npm install element-plus --save配置的话,能够查看文档,全局导入、按需导入都能够看本人的需要 我的项目搭建完后,就能够来剖析一下本次需要大略会波及哪些性能了 上传头像这是一个合成微信头像的工具,那就必须得让用户上传本人的微信头像了 合成模版为了不便,咱们当然还须要提供多种模版供用户本人抉择 用户自定义内容为了让生成的头像更具举世无双性,咱们还须要提供用户自定义内容的性能,比方:用户输出文字、抉择文字色彩等 合成头像本次需要的重点当然是合成头像了 下载合成后的头像用户合成完当然还得反对让他下载 性能开发上传头像<script setup lang="ts">// 用户头像const user_img = ref("");const change = (file: any, fileList: any) => { console.log(file, fileList); const fileReader = new FileReader(); fileReader.readAsDataURL(file.raw); fileReader.onload = (e: any) => { user_img.value = e.target.result; };};// 删除用户头像const remove = () => { user_img.value = "";};</script>这部分比较简单,次要是用户上传本人的微信头像后再进行展现,UI局部就不贴了,前面有源码。 合成模版合成模版局部,这里次要是须要思考各个模版所须要的合成性能有哪些 <script>const gqList = ref([ { id: 1, name: "模版1", img: getImg("gq0", "jpg"), template: getImg("tem1"), has: ["text"], textLabel: "请输出你的姓", desc: "最多输出1个字", text: "宋", textLength: 1, }, { id: 2, name: "模版2", img: getImg("gq1", "jpg"), template: getImg("tem2"), }, { id: 3, name: "模版3", img: getImg("gq2", "jpg"), template: getImg("tem3"), }, { id: 4, name: "模版4", img: getImg("gq3", "jpg"), template: getImg("tem4"), has: ["text"], textLabel: "请输出祝福语", textColor: "#FED800", text: "生在国旗下,长在春风里", desc: "最多输出12个字, 请用中文逗号隔开", textLength: 12, }, { id: 5, name: "模版5", img: getImg("gq4"), template: getImg("tem5") }, { id: 6, name: "模版6", img: getImg("gq5", "jpg"), template: getImg("tem6"), has: ["text"], textLabel: "请输出祝福语", textColor: "#FED800", desc: "最多输出12个字, 请用中文逗号隔开", text: "不负韶华,只争朝夕", textLength: 12, }, { id: 7, name: "模版7", img: getImg("gq6"), template: getImg("tem7") },]);const template_id = ref(1);// 抉择模版const gqChange = (val: any) => { console.log(val); template_id.value = val; generateImgRef.value.clear(); generateImgRef.value.init();};</script>合成图片这里其实也不难,次要是应用canvas来绘制图片以及文字,因为各个模版的合成逻辑不一样,这里就不全副展现了,但整体上的合成流程是一样 ...

September 24, 2023 · 3 min · jiezi

关于前端:Angular-应用程序的-Hydration-概念详解

Angular 应用程序的Hydration概念 Hydration概念是Angular应用程序中的一个要害概念,它波及到Angular框架在客户端渲染(Client-side rendering,CSR)中的运作形式。要深刻了解Hydration,首先须要理解CSR和SSR(Server-side rendering,服务器端渲染)之间的根本区别,以及Angular是如何利用Hydration来进步CSR性能的。本文将具体解释Angular应用程序的Hydration概念,并通过示例来阐明。 CSR和SSR的根本区别在了解Hydration之前,让咱们简要回顾一下CSR和SSR的根本区别。 CSR(Client-side Rendering):在CSR中,整个应用程序的构建和渲染都产生在客户端浏览器中。当用户拜访一个CSR利用时,浏览器会下载利用的JavaScript代码,而后在用户的设施上执行该代码来渲染页面。这种形式的益处是能够在客户端实现动静交互,但也有性能挑战,因为首次加载时须要下载大量的JavaScript代码,导致页面加载工夫较长。SSR(Server-side Rendering):在SSR中,服务器在接管到客户端申请时,会在服务器上事后渲染HTML内容,并将其发送到客户端浏览器。这意味着用户会更快地看到内容,因为不用期待大量JavaScript代码下载和执行。但与CSR相比,SSR可能在简单的利用中导致服务器负载减少,并且对实现某些交互性能有肯定限度。Angular的CSR和SSRAngular反对两种渲染模式:CSR和SSR。默认状况下,Angular应用程序采纳CSR模式,这意味着整个渲染过程产生在客户端。但在某些状况下,如须要更好的首屏加载性能或SEO(搜索引擎优化)要求,能够抉择应用SSR。 在Angular中,CSR应用程序通常应用以下形式启动: platformBrowserDynamic().bootstrapModule(AppModule) .catch(err => console.error(err));而SSR应用程序则应用以下形式启动: platformServer().bootstrapModule(AppModule) .then(moduleRef => { const appRef = moduleRef.injector.get(ApplicationRef); const state = moduleRef.injector.get(PlatformState); appRef.isStable.pipe( first(isStable => isStable === true), ).subscribe(() => { state.renderToString().then(html => { console.log(html); // 在服务器上渲染的HTML moduleRef.destroy(); }); }); });在CSR模式下,Angular应用程序的初始加载将包含一些根本的HTML构造和一个JavaScript包(通常蕴含整个利用的代码),而后在浏览器中运行这些代码以渲染残缺的页面。 但这里波及到一个性能问题:JavaScript包的下载和执行可能须要肯定的工夫,用户在此期间将看到一个空白的页面或加载指示器。这正是Hydration概念的出发点。 Hydration概念的背地Hydration的核心思想是在CSR应用程序中,尽快显示内容,而不用期待整个JavaScript包的下载和执行。为了做到这一点,Angular引入了一种机制,使应用程序可能在浏览器端逐渐加载和填充内容。 具体来说,当Angular应用程序以CSR模式启动时,它会将一些初始HTML内容嵌入到服务器生成的HTML中,这些内容会立刻在浏览器端显示。而后,JavaScript包会下载并在后盾执行。一旦JavaScript包下载实现并筹备好,它会“水合”(hydrate)这些初始HTML内容,也就是将其转化为具备交互性的Angular组件。 这意味着用户在期待JavaScript包下载和执行时,依然能够与页面上的内容进行交互。Hydration的益处是进步了用户感知的加载速度,因为页面会尽早显示内容,同时依然容许应用程序在后盾加载和初始化。 Hydration的工作原理要了解Hydration的工作原理,让咱们更深刻地理解它的步骤: 服务器端渲染(SSR)生成初始HTML:在服务器端渲染中,Angular应用程序的初始HTML内容会被生成,并蕴含一些非凡的标记,以标识哪些局部须要水合。初始HTML发送到客户端:生成的初始HTML内容会随响应发送到客户端浏览器。客户端下载JavaScript包:浏览器开始下载Angular应用程序的JavaScript包,这个包蕴含了应用程序的代码、组件和模块。JavaScript包的执行:一旦JavaScript包下载实现,浏览器会开始执行它。在执行过程中,Angular框架会辨认初始HTML中的非凡标记,而后将这些标记转化为Angular组件。水合(Hydration):当Angular框架水合(hydrate)初始HTML内容时,它会将这些内容替换为理论的Angular组件,并建设起与这些组件的交互能力。这意味着用户能够与页面上的内容进行交互,而不用期待整个JavaScript包的加载和执行。Hydration示例为了更好地了解Hydration,让咱们通过一个简略的示例来演示它的工作原理。假如咱们有一个Angular应用程序,其中蕴含一个简略的组件,用于显示用户的 姓名。这个组件的初始HTML可能如下所示: <!-- 初始HTML --><app-root> <app-user-name>Loading...</app-user-name></app-root>在这个示例中,<app-user-name>是一个Angular组件,用于显示用户的姓名。初始HTML中蕴含了一个占位符文本“Loading...”,这是因为在水合之前,JavaScript包尚未下载和执行。 当初,让咱们看看Hydration是如何利用于这个示例的: 服务器端渲染(SSR)生成初始HTML,并将其发送到客户端。<!-- 服务器生成的初始HTML --><app-root> <app-user-name _nghost-abc123>John Doe</app-user-name></app-root>在这个HTML中,咱们能够看到<app-user-name>组件的内容曾经被填充为“John Doe”,并且有一个非凡的属性 _nghost-abc123,它用于标识这个组件。 客户端浏览器开始下载JavaScript包。JavaScript包的执行过程中,Angular框架检测到初始HTML中的非凡标记。Angular框架将初始HTML中的非凡标记替换为理论的Angular组件,并建设交互。<!-- 水合后的HTML --><app-root> <app-user-name _nghost-abc123 _ngcontent-def456>John Doe</app-user-name></app-root>在这个HTML中,<app-user-name>组件曾经被替换为一个具备Angular交互能力的组件,并且有两个非凡属性 _nghost-abc123 和 _ngcontent-def456,它们用于确保组件的款式隔离。 ...

September 24, 2023 · 1 min · jiezi

关于前端:什么是-Client-Certificate-Authentication

Client Certificate Authentication 客户端证书认证是一种用于确保网络通信安全性的身份验证机制,通常利用于平安敏感的网络服务和应用程序中。它基于公钥基础设施(PKI)技术,容许服务器验证客户端的身份,并确保只有通过受权的客户端能力拜访受爱护的资源。在这篇文章中,我将具体介绍什么是客户端证书认证,它是如何工作的,以及为什么它在平安畛域中如此重要。我还将提供一个具体的示例,以演示客户端证书认证的理论利用。 什么是客户端证书认证?客户端证书认证是一种网络身份验证办法,通过这种办法,服务端能够验证连贯到它的客户端的身份。这种身份验证是基于加密技术和数字证书的,数字证书蕴含了客户端的公钥和相干的身份信息。客户端证书通常应用X.509证书规范进行编码,这是一种宽泛应用的数字证书格局。 客户端证书通常由受信赖的证书颁发机构(Certificate Authority,CA)签发,这些CA是可信的实体,负责验证证书持有者的身份,并将其公钥与身份信息绑定在一起。这些证书通常以文件的模式存储在客户端设施上,例如电脑、手机或其余网络连接设施。 客户端证书认证的工作流程如下: 客户端申请连贯:客户端申请与服务器建设连贯,通常通过HTTPS或其余加密协议进行。服务器要求客户端提供证书:服务器要求客户端提供其数字证书,以验证其身份。这一申请通常在TLS握手过程的一部分实现。客户端会将其证书发送给服务器。服务器验证证书:服务器收到客户端的证书后,会应用当时装置的CA根证书来验证客户端证书的合法性。这个过程包含查看证书的签名是否无效,证书是否尚未过期,以及证书的主题是否与客户端的申请匹配。认证胜利或失败:如果服务器胜利验证了客户端的证书,它会持续解决客户端的申请。如果验证失败,服务器将回绝连贯或采取其余适当的安全措施。客户端证书认证的次要长处是它提供了弱小的身份验证,能够避免歹意用户伪装成非法用户拜访服务器资源。此外,因为证书是由可信的CA签发的,因而它们能够避免中间人攻打,确保通信的机密性和完整性。 客户端证书认证的示例为了更好地了解客户端证书认证的工作原理,咱们能够思考一个理论的示例。假如咱们有一个在线银行服务,用户能够登录并查看其银行账户信息。因为波及敏感的金融数据,银行决定采纳客户端证书认证来确保只有受权用户可能拜访其账户。 上面是这个示例的具体步骤: 步骤1:为客户端生成证书在这个示例中,银行会要求每个客户都生成一个数字证书,以便在未来与银行服务器通信时进行身份验证。客户须要在银行的网站上实现以下步骤: 注册账户:客户在银行的网站上注册一个账户,并提供其个人信息,如姓名、地址和社会平安号码等。生成密钥对:客户应用一个密钥生成工具来生成一个密钥对,包含一个公钥和一个私钥。私钥必须窃密存储在客户端设施上,而公钥将与客户的身份信息一起发送给银行。证书签发:银行将客户的公钥和身份信息发送给受信赖的证书颁发机构(CA),以申请生成数字证书。CA会对客户的身份进行验证,并应用其私钥对证书进行签名,而后将证书返回给客户。装置证书:客户收到数字证书后,将其装置在其设施上,通常是在浏览器或操作系统的证书存储中。步骤2:客户端连贯到银行服务器一旦客户生成了数字证书并装置在其设施上,他们能够尝试连贯到银行服务器以拜访其账户信息。以下是连贯过程的步骤: 客户端申请连贯:客户关上浏览器,输出银行的网址,并申请建设平安连贯。服务器要求证书:银行服务器收到客户端申请后,要求客户端提供其数字证书,以验证其身份。这是TLS握手过程的一部分。客户端发送证书:客户端浏览器自动检测到服务器要求证书,因而它从证书存储中抉择适合的证书,并将其发送给服务器。服务器验证证书:银行服务器应用事后装置的CA根证书来验证客户端证书的合法性。如果证书无效且与客户的身份信息匹配,服务器将认为客户端是非法的,持续解决申请。拜访账户:一旦服务器验证了客户端的身份,客户端被受权拜访其银行账户信息。他们能够查看余额、进行交易或执行其余与其账户相干的操作。 步骤3:爱护通信一旦客户端胜利连贯到银行服务器,通信将受到弱小的爱护。TLS协定用于加密数据传输,确保数据在传输过程中不被窃听或篡改。此外,客户端证书认证提供了双向身份验证,这意味着客户端也能够验证服务器的身份,确保他们连贯到的是真正的银行服务器而不是歹意的仿冒网站。 步骤4:更新证书数字证书通常有一个有效期限,一旦过期,客户须要向银行申请更新证书。这波及到与银行再次验证客户的身份,并颁发新的数字证书。这是为了确保客户依然有权拜访其账户,并且他们的身份信息依然是最新的。 客户端证书认证的劣势客户端证书认证具备许多劣势,使其成为平安敏感的应用程序和服务的现实抉择: 弱小的身份验证:客户端证书认证提供了弱小的身份验证,因为它要求客户持有无效的数字证书,这些证书由受信赖的CA签发。这缩小了歹意用户伪装成非法用户的危险。避免中间人攻打:因为证书是由可信的CA签发的,因而它们能够避免中间人攻打。攻击者无奈在客户端和服务器之间插入歹意代理,因为他们无奈提供无效的客户端证书。双向身份验证:客户端证书认证容许服务器验证客户的身份,并且反过来,客户也能够验证服务器的身份。这种双向验证加强了通信的安全性。缩小明码治理:客户端证书认证打消了传统的用户名和明码验证,缩小了明码治理和存储的危险。客户不再须要记住简单的明码。升高帐户劫持危险:因为客户的私钥是必须窃密存储的,因而即便客户的设施被盗或失窃,攻击者也无法访问其证书,因而无奈劫持其账户。合乎合规性要求:对于一些行业,如金融和医疗保健,须要严格的平安合规性。客户端证书认证能够帮忙满足这些合规性要求。客户端证书认证的挑战和注意事项尽管客户端证书认证具备许多劣势,但也存在一些挑战和注意事项: 复杂性:设置和治理客户端证书认证能够绝对简单,特地是对于大规模的用户群体。客户须要生成、装置和定期更新证书。老本:受信赖的证书颁发机构通常会收取费用以签发证书,这可能会减少经营老本。用户体验:对于一些用户来说,生成和装置证书可能会感到不便,这可能会影响用户体验。证书治理:客户端证书的治理须要建设一个无效的证书管理策略,以确保证书的及时更新和撤消。遗失或泄露的危险:如果客户端的私钥失落或泄露,攻击者可能会拜访客户的证书,这可能会导致平安危险。向后兼容性:在一些状况下,与传统的用户名和明码验证零碎进行过渡可能会受到一些挑战,须要审慎布局和施行。论断客户端证书认证是一种弱小的身份验证机制,通过它,服务器能够验证连贯到它的客户端的身份,确保只有受权用户能够拜访受爱护的资源。它提供了弱小的安全性、避免中间人攻打、缩小明码治理危险以及满足合规性要求的劣势。然而,它也波及到复杂性、老本和用户体验等挑战,须要慎重考虑。 在理论利用中,客户端证书认证通常用于须要极高安全性的环境,如金融、医疗保健和政府畛域。它提供了一种弱小的工具,有助于爱护敏感数据和资源,避免未经受权的拜访。如果正确施行和治理,客户端证书认证能够是确保网络通信安全性的要害组成部分。

September 24, 2023 · 1 min · jiezi

关于前端:关于-Spartacus-项目中的-CmsPageGuardService

CmsPageGuardService 是 Spartacus 框架中的一个重要服务,用于管制拜访 CMS 页面的权限。在本文中,我将具体阐明如何应用它,并提供示例代码,以帮忙您更好地了解其性能和用法。 Spartacus 概览首先,让咱们简要回顾一下 Spartacus 是什么。Spartacus 是一套开源的 Angular 应用程序,用于构建古代的电子商务 Web 应用程序,它与 SAP Commerce Cloud 严密集成,为开发人员提供了弱小的工具和组件,以构建用户敌对且高度可定制的电子商务站点。 Spartacus 应用 Angular 框架,它遵循模块化的设计准则,容许开发人员依据业务需要轻松扩大和自定义性能。CmsPageGuardService 正是其中之一的服务,它用于治理对 CMS 页面的拜访权限。 CmsPageGuardService 简介CmsPageGuardService 用于管制用户对 CMS 页面的拜访权限。在电子商务网站中,有些页面可能须要用户登录能力拜访,而有些页面可能对所有用户都可见。CmsPageGuardService 容许开发人员轻松配置这些权限,并在用户尝试拜访 CMS 页面时执行相应的操作。 上面,我将具体介绍如何应用 CmsPageGuardService。 CmsPageGuardService 的根本用法CmsPageGuardService 的根本用法包含导入、配置和应用。以下是一步一步的指南: 步骤 1:导入 CmsPageGuardService要应用 CmsPageGuardService,首先须要在您的 Angular 组件或服务中导入它。在您的组件或服务文件中,增加以下导入语句: import { CmsPageGuardService } from '@spartacus/storefront';步骤 2:配置权限在配置权限之前,您须要确保曾经设置了相应的 CMS 页面和页面模板。Spartacus 应用 CMS 来治理内容,您能够在 SAP Commerce Cloud 中配置这些页面。 假如您有一个名为 "customPage" 的 CMS 页面,您想要管制谁能够拜访它。您能够在 Angular 模块中配置权限,如下所示: import { CmsPageGuardService } from '@spartacus/storefront';@NgModule({ imports: [ // 其余模块的导入 ], providers: [ CmsPageGuardService, { provide: CmsPageGuardService, useExisting: CmsPageGuardService, }, ],})export class YourModule { }此配置通知 Spartacus 应用 CmsPageGuardService 来治理页面权限。 ...

September 24, 2023 · 2 min · jiezi

关于前端:竟然可以在一个项目中混用-Vue-和-React

React和Vue是前端开发中的两大热门框架,各自都有着弱小的性能和丰盛的生态系统。然而,你有没有想过,在一个我的项目中同时应用React和Vue?是的,你没有听错,能够在同一个我的项目中混用这两个框架!本文就来分享 3 个用于混合应用 React 和 Vue 的工具! VeauryVeaury 是一个基于 React 和 Vue3 的工具库,次要用于React和Vue在一个我的项目中公共应用的场景,次要使用在我的项目迁徙、技术栈交融的开发模式、跨技术栈应用第三方组件的场景。 Veaury的特点如下: 同时反对Vue3和React,不便在一个我的项目中公共应用;反对同一个利用中呈现的vue组件和react组件的context共享;反对跨框架的hooks调用,能够在react组件中应用vue的hooks,也能够在vue组件中应用react的hooks;能够解决React和Vue在公共应用时的代码反复、冗余的问题。在一个利用中能够随便应用React或者Vue的第三方组件, 比方 antd, element-ui, vuetify。提供了具体的官网文档,包含英文版和中文版。 Veaury 的文档写的十分具体,这里就不再具体介绍其应用形式了。须要留神的是,Veaury 并不反对 Vue 2,如果须要应用Vue 2,能够应用上面要介绍的工具库。 Github:https://github.com/devilwjp/veaury VueraVuera 是一个用于在 Vue 利用中应用 React 组件的库,同时也反对在 React 利用中应用 Vue 组件。它提供了一种不便的形式,使开发人员可能在不同的框架之间无缝地应用对方的组件。 要在 Vue 利用中应用React组件,能够依照以下步骤应用Vuera。 装置插件装置Vuera:应用npm或yarn在您的Vue我的项目中装置Vuera库。// 应用 yarn 装置yarn add vuera// 应用 npm 装置npm i -S vuera装置依赖因为须要在Vue中应用React组件,所以首先须要在我的项目中装置 React,装置指令如下: npm install --save react react-dom我的项目配置在babel.config.js文件中增加以下配置即可: { "presets": [ "react" ], "plugins": [ "vuera/babel" ]}接下来在我的项目中以插件的模式来引入并应用vuera库,能够在 main.js 中退出如下代码: import { VuePlugin } from 'vuera'Vue.use(VuePlugin)根本应用实现上述配置之后,就能够在Vue我的项目中引入并应用React组件了。 ...

September 24, 2023 · 2 min · jiezi

关于前端:antdfusion表格增加圈选复制功能

背景介绍咱们存在着大量在PC页面通过表格看数据业务场景,表格又分为两种,一种是 antd / fusion 这种基于 dom 元素的表格,另一种是通过 canvas 绘制的相似 excel 的表格。 基于 dom 的表格功能丰富较为好看,能实现多表头、合并单元格和各种自定义渲染(如表格中渲染图形 / 按钮 / 进度条 / 单选框 / 输入框),以展现为主,不提供圈选、整列复制等性能。 canvas 绘制的类 excel 表面奢侈更为实用,大量数据渲染不卡顿,操作相似 excel,能行/列选中,圈选、复制等性能。 两者应用场景有所差别,各有利弊,但业务方不心愿一套零碎中呈现两种类型的交互,冀望能将两种表格的优缺点进行交融,在好看的dom表格中减少圈选、复制的性能。 圈选成果业务方所冀望的圈选成果和excel相似,鼠标按下即选中元素,而后滑动鼠标,鼠标所通过造成的四边形就是选中区域,此时鼠标右键点击复制按钮,或者键盘按下 ctrl + c 复制文本。 而dom表格通过如上操作,会把一整行数据都选上,不合乎业务同学的应用预期。 实现过程去除默认款式咱们须要自行定义鼠标事件、元素款式,须要先将无用的默认款式革除,包含上图中的 hover 和选中元素的背景色。 禁用表格自身的鼠标点击抉择性能,设置css,userSelect: none <Table style={{ userSelect: 'none' }} ></Table>去除 hover 款式(这里应用的是 fusion 组件) .next-table-row:hover {background-color: transparent !important;}鼠标按下,记录选中元素为表格绑定鼠标按键时触发事件 mousedown。 当鼠标按下时,这个元素就是核心元素,无论是向哪个方向旋转,所造成的区域肯定会蕴含初始选中的元素。 getBoundingClientRect() 用于取得页面中某个元素的上下左右别离绝对浏览器视窗的地位。 const onMouseDown = (event) => { const rect = event.target.getBoundingClientRect(); // funsion 判断点击是否为表头元素,为否时才持续前面的逻辑。antd 不须要判断,因为点击表头不会触发该事件 const isHeaderNode = event.target?.parentNode?.getAttribute('class')?.indexOf('next-table-header-node') > -1; if (isHeaderNode) return; originDir = { top: rect.top, left: rect.left, right: rect.right, bottom: rect.bottom, }; // 渲染 renderNodes(originDir);};<Table style={{ userSelect: 'none' }} onMouseDown={onMouseDown}></Table>鼠标滑过为表格绑定鼠标滑过期触发事件 mousemove。 ...

September 24, 2023 · 4 min · jiezi

关于前端:Nextjs-135-正式发布速度大幅提升

9 月 19 日,Next.js 13.5 正式公布,该版本通过以下形式进步了本地开发性能和可靠性: 本地服务器启动速度进步 22%:应用App和Pages Router能够更快地进行迭代HMR(疾速刷新)速度进步 29%:在保留更改时进行更快的迭代内存使用量缩小 40%:在运行next start 时测量优化的包导入:应用风行的图标和组件库时进行更快的更新next/image 改良:反对<picture>标签、暗模式等修复了超过 438 个谬误!改善启动和疾速刷新工夫App Router 的采纳在继续减少,依据 HTTP Archive 对前1000万个网站进行的统计数据来看,其增长速度达到了每月 80%。 image.png 自 Next.js 13.4 版本以来,Next.js 团队的重点始终是改良 App Router 利用的性能和可靠性。将13.4与13.5版本进行比拟,在一个新的利用上,能够看到以下改良: 本地服务器启动速度进步 22%HMR(疾速刷新)速度进步 29%内存使用量缩小 40%通过以下优化办法实现了这种性能晋升: 通过缓存或缩小慢速操作来缩小工作量优化低廉的文件系统操作在编译过程中实现更好的增量树遍历将不必要的阻塞同步调用改为懒加载主动配置大型图标库Next.js 用户 Hanford 在他们的测试中报告了其编译速度晋升 87-92%! image.png 在持续迭代和改良以后打包工具性能的同时,Next.js 团队还在开发 Turbopack(beta)以进一步提高性能。在13.5版本中,next dev --turbo当初反对更多功能。 优化的包导入此版本对包导入进行了令人兴奋的冲破,改善了在应用大型图标或组件库以及其余从新导出了数百或数千个模块的依赖项时的本地开发性能和生产冷启动速度。 之前,增加了modularizeImports的反对,使开发者可能配置在应用这些库时如何解析导入。在13.5版本中,用optimizePackageImports代替了这个选项,它不须要指定导入映射,而是会主动优化导入。 像@mui/icons-material、@mui/material、date-fns、lodash、lodash-es、ramda、react-bootstrap、@headlessui/react、@heroicons/react和lucide-react等库当初都能够主动优化,只加载理论应用的模块,同时不便编写带有很多命名导出的导入语句。 next/image 改良基于社区的反馈,此版本增加了一个新的实验性函数unstable_getImgProps(),以反对不间接应用<Image>组件的高级用例,包含: 解决background-image或image-set应用canvas的context.drawImage()或new Image()时进行操作应用<picture>媒体查问来实现艺术方向或明/暗模式图片利用<picture>元素的媒体查问性能,实现明/暗模式图片的切换。import { unstable_getImgProps as getImgProps } from 'next/image'; export default function Page() { const common = { alt: 'Hero', width: 800, height: 400 }; const { props: { srcSet: dark }, } = getImgProps({ ...common, src: '/dark.png' }); const { props: { srcSet: light, ...rest }, } = getImgProps({ ...common, src: '/light.png' }); return ( <picture> <source media="(prefers-color-scheme: dark)" srcSet={dark} /> <source media="(prefers-color-scheme: light)" srcSet={light} /> <img {...rest} /> </picture> );}此外,当初placeholder属性反对提供任意的data:image/作为占位图像,这些图像不会被含糊解决。 ...

September 24, 2023 · 1 min · jiezi

关于前端:Remix-20-正式发布现代化全栈Web框架

9 月 16 日,全栈 Web 框架 Remix 正式公布了 2.0 版本,Remix 团队在公布 1.0 版本后通过近 2 年的继续致力,公布了 19 个主要版本、100 多个补丁版本,并解决了数千个问题和拉取申请,终于迎来了第二个次要版本! Remix 具备以下个性: 谋求速度、用户体验(UX),反对任何 SSR/SSG 等基于 Web 根底技术,如 HTML/CSS 与 HTTP 以及 Web Fecth API,在绝大部分状况能够不依赖于 JavaScript 运行,所以能够运行在任何环境下,如 Web Browser、Cloudflare Workers、Serverless 或者 Node.js 等客户端与服务端统一的开发体验,客户端代码与服务端代码写在一个文件里,无缝进行数据交互,同时基于 TypeScript,类型定义能够跨客户端与服务端共用内置文件即路由、动静路由、嵌套路由、资源路由等去掉 Loading、骨架屏等任何加载状态,页面中所有资源都能够预加载(Prefetch),页面简直能够立刻加载辞别以往瀑布式(Waterfall)的数据获取形式,数据获取在服务端并行(Parallel)获取,生成残缺 HTML 文档,相似 React 的并发个性提供开发网页须要所有状态,开箱即用;提供所有须要应用的组件,包含 <Links> 、<Link>、 <Meta> 、<Form> 、<Script/> ,用于解决元信息、脚本、CSS、路由和表单相干的内容内置错误处理,针对非预期错误处理的 <ErrorBoundary> 和开发者抛出错误处理的 <CatchBoundary>Remix 是一个由 React Router 开发团队所开发的基于 React 和 TypeScript 的全栈框架。2021 年 11 月,Remix 正式开源,至今已在 Github 上取得了 24.6k star。Remix 正式开源时,引发了前端圈不小的关注,其被普遍认为是 Next.js 的强劲对手,那时隔两年,它和 Next.js 之间的“竞争”怎么样了呢? ...

September 24, 2023 · 1 min · jiezi

关于前端:JavaScript怎么模拟-delaysleeppausewait-方法

首发于公众号 大迁世界,欢送关注。 每周7篇实用的前端文章 ️ 分享值得关注的开发工具 分享集体守业过程中的趣事许多编程语言都有一个 sleep 函数,能够提早程序的执行若干秒。JavaScript短少这个内置性能,但不必放心。在这篇文章中,咱们将探讨在JavaScript代码中实现提早的各种技巧,同时思考到该语言的异步性质。 如何在 JS 中创立 sleep 函数对于那些只想疾速解决问题而不想深刻理解技术细节的人,咱们也有简单明了的解决方案。上面是如何在你的JavaScript工具箱中增加一个 sleep 函数的最间接形式: function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms));}console.log('Hello');sleep(2000).then(() => { console.log('World!'); });运行这段代码,你会在控制台看到 “Hello”。而后,在短暂的两秒钟后,“World!”v会接着呈现。这是一种既简洁又无效的引入提早的办法。 如果你只是为了这个来的,那太好了!但如果你对“为什么”和“怎么做”的起因感到好奇,还有更多能够学习的内容。JavaScript中解决工夫有其轻微之处,理解这些可能会对你有所帮忙。 了解JavaScript的执行模型当初咱们曾经有了一个疾速的解决方案,让咱们深刻理解JavaScript的执行模型的机制。了解这一点对于无效地治理代码中的工夫和异步操作至关重要。 思考以下Ruby代码: require 'net/http'require 'json'url = 'https://api.github.com/users/jameshibbard'uri = URI(url)response = JSON.parse(Net::HTTP.get(uri))puts response['public_repos']puts 'Hello!'正如人们所冀望的,这段代码向GitHub API发送一个申请以获取我的用户数据。而后解析响应,输入与我的GitHub帐户关联的公共仓库的数量,最初在屏幕上打印“Hello!”。执行是从上到下进行的。 相比之下,这是雷同性能的JavaScript版本: fetch('https://api.github.com/users/jameshibbard') .then(res => res.json()) .then(json => console.log(json.public_repos));console.log('Hello!');如果你运行这段代码,它会先在屏幕上输入“Hello!”,而后输入与我的GitHub帐户关联的公共仓库的数量。 这是因为在JavaScript中,从API获取数据是一个异步操作。JavaScript解释器会遇到 fetch 命令并发送申请。然而,它不会期待申请实现。相同,它会继续执行,将“Hello!”输入到控制台,而后当申请在几百毫秒后返回时,它会输入仓库的数量。 如何在JavaScript中正确应用SetTimeout既然咱们曾经更好地了解了JavaScript的执行模型,让咱们看看JavaScript是如何解决提早和异步代码的。 在JavaScript中创立提早的规范办法是应用其 setTimeout 办法。例如: console.log('Hello');setTimeout(() => { console.log('World!'); }, 2000);这将在管制台上输入 "Hello",而后两秒后输入 "World!"。在很多状况下,这曾经足够了:做某事,而后在短暂的提早后,做其余事件。问题解决! 但可怜的是,事件并不总是那么简略。 你可能会认为 setTimeout 会暂停整个程序,但事实并非如此。它是一个异步函数,这意味着其余的代码不会期待它实现。 ...

September 23, 2023 · 3 min · jiezi

关于前端:TS-范型你还不会来我教你

前言:最近遇到了一些写作上的懊恼,本人如同陷入了程序员的通病想法,“这个知识点这么简略,大家应该都会吧,我说进去是不是显得我很笨。” 思考了近一个月,又翻了翻本人最开始写作的文章,文笔虽显稚嫩,但初心是真真正正想和大家分享某一个知识点。那时候的写作不为求浏览量,不为凸显本人的程度,只求能把语言尽可能用大白话表达出来,帮忙同样是初学者的某位读者。 而当初怎么随着工作工夫的增长,反而越来越违反本人写作的初心了呢?于是就诞生了这篇文章的写作契机。 留神:本文面向 TS 范型初学者,遂只会用艰深的书面语来表白。不会旁征博引插入官网文档,我要做的就是让你初步了解它解决了什么事件。 一. 场景再现咱们先不要去想范型这两个字是什么意思,咱们先思考上面这个场景。有这样一个需要,这个函数能够传递一个字符串,并且把参数一成不变返回。你心想,太简略了,一秒钟实现,ok 工资到手。产品经理这时候又跑来加了个需要,要求也能输出数字类型,ok,没问题,简略的。没一会,产品经理又说:不行不行,布尔值也得加上。你尽管埋怨了几句,但还是很快的批改实现了批改。“emm,那个韩同学呀。我想了一下,还得加上 undefined ,和 null ”这样才残缺,看着产品小姐姐满脸笑容的样子,你也怄气不起来,于是又加上了两行代码。当初性能倒是实现了,然而你看着这个函数陷入了深思,倒不是因为产品经理的需要让你懊恼,而是有一丢丢代码洁癖的你开始思考有没有什么办法让这么一大串的货色简略点呢?二. 理清线索咱们将刚刚的下面这段代码搬到上面来。 function say(txt: string | number | boolean | undefined | null) { return txt;}先别着急,咱们捋一下目前咱们已把握的线索:(1)这个函数会承受一个参数。(2)这个函数有一个返回值。(3)这个函数的返回值的类型和参数的类型是绝对应的。你忽然灵光一闪,我怎么给忘了一个神器了呢?any 救我,好家伙,那你和间接写 js 有什么区别呢?那到底有没有什么更加简略的办法就能达成咱们最后的需要呢?你别说,还真有,加下来引入明天的配角范型。三. 范型的用处不要被这个名字给吓唬到了,刚开始我不敢去了解这个知识点,有百分之90的起因就是因为范型这个名字就给人一种很高冷的感觉,但其实了解起来非常简略,只不过它的写法有些非凡,仅此而已。接下来我不会提及“范型”二字,只让你了解它是干什么的。这是咱们下面的代码,TS 老给我划红线提醒我没传参数,我也很急啊,因为我真的不晓得该写什么类型,我当初也没确定。这咋办,于是你在想,我能不能先轻易写个货色占着中央,等我真正用的时候再通知你我须要什么类型。于是你顺手写了一堆符号,先占住地位,然而你并没有申明这个 XXXXX 的类型啊,TS 不晓得啊,那我必定不给你通过的。这咋整,这不让,那不让,那我还写不写代码了?别急嘛,人家 TS 也不是那么有情,慷慨的甩给你两个尖括号<>,也就是键盘上的大于号&小于号。你和 TS 各退一步,TS 容许你在图书馆占座,然而你得通知它占座的人是谁,占座的那个人你得用<>包起来。在哪占座?TS 环顾四周,指着这个地位,“那你就在这坐吧。”怎么占座?人家不通知你了嘛?用<>包起来。此时咱们再看 TS 的类型提醒,返回值,参数类型都变为了占座的这个人。当咱们理论调用的时候,让占座的人走开,把已知的参数放进去即可。此时咱们再察看函数提醒,就会发现 TS 主动帮咱们替换掉了 XXXXX 占位符。到这里你其实会发现,我并没有用惯例的大写 T 来这里占位,而是用来一个很不规则的 xxxxx 来占位,其实就是想通知大家,官网文档用 T ,并不代表它只能用 T,不要把本人局限在“他人这样写,我就只能这样写。” 否则当他人问及你的时候,你只能答复:“我也不晓得,我看他人都这样写,所以我才这样写。” 这样其实很不好。tips:官网这里用 T 其实是取字母 type 的首字母来表白类型占位的概念,写 T 更多的是代码标准而不是定死的论断。四. 你其实正在应用范型写 vue3 的小伙伴其实对这种写法曾经相熟的不能再相熟了。你也早已习惯 vue 的类型提醒,因为我 name 是 string 类型,所以自然而然有上面这些提醒。但不要忘了,vue 只是包装了 js,它自身并不提供类型提醒,这时你可能开始好奇了,这是怎么回事?不要忘了这个 ref 其实是一个函数!!!。你下面的写法其实等价于上面的写法。眼生吗?这不就是咱们刚刚提到的占位吗?那 vue 其实不就是这样定义 ref 函数的吗?computed 也是同样的情理。只不过咱们开发时省略了占位类型,因为 TS 会通过函数的返回值类型帮你做这一步。五. 补充范型其实和函数的形参的概念很相似,你能够比照这两个概念的理论用法。范型不止能够传递一个,能够传递多个。范型能够有本人的默认类型,写法如下。范型还有更加灵便的用法,比方束缚类型中的某个类型。范型还有更多灵便的组合办法,须要读者遇到具体的场景时,通过这些前置常识组合出本人的范型束缚,届时会领会的更加粗浅,本文不做过多探讨。

September 23, 2023 · 1 min · jiezi

关于前端:现代CSS全新的-display-属性

从 Chrome 115、Safari 15、Firefox 70 开始,古代浏览器曾经反对了 display 多值语法。咱们应用的 display 单值语法曾经被视为传统值,但为了向后兼容,浏览器中仍保留了这些值。 1.display 多值语法介绍display 属性具备相当弱小的性能,除了显示某个内容与页面上其余方框的关系是块级还是行内级外,它还能显示利用该属性的方框外部的格局上下文。 为了更好地形容这种行为,display 类型被分为内部显示类型和外部显示类型两局部: 内部显示类型:决定了主方框自身如何参加流程布局。外部显示类型:决定了其后辈框的布局形式(被替换的元素除外,这一点比较复杂)。例如:display: flex 变为 display: block flex,意味着内部显示类型是 block(在内部体现为块状元素),但它的子元素是依照 flex 布局出现的。 这意味着,咱们不须要设置 display: flex 来创立带有 flex 子代的块级方框,而是应用 display: block flex。咱们应用 display: inline flex 代替 display: inline-flex 来创立带有 flex 子代的 inline-level 框。 有了这一变动,咱们就能够探讨显示属性对子元素和四周元素的影响了。这种思维模式能够让咱们更轻松地创立更可预测的布局,也更容易解释不同的布局模式及其成果。 2.display 多值语法兼容性从 Chrome 115、Safari 15、Firefox 70 开始,古代浏览器曾经反对了 display 多值语法。 3.display 属性常见单值 vs 多值映射下表显示了其中一些新值与标准中的繁多值(现称为传统值)之间的映射关系。 Short displayFull displayblockblock flowflow-rootblock flow-rootinlineinline flowinline-blockinline flow-rootflexblock flexinline-flexinline flexgridblock gridinline-gridinline grid下面表中除了 flow-root 在日常开发中常常被用到,大家应该都比拟相熟。当赋予一个元素 display: flow-root,它就会成为一个新的块格局上下文,成为一个新的失常流程的根元素。从实质上讲,这将导致浮动元素被蕴含在内。此外,子元素的边距会保留在容器内,而不会随父元素的边距一起折叠。如下示例: ...

September 23, 2023 · 1 min · jiezi

关于前端:面试官为什么说HTTPS比HTTP安全-HTTPS是如何保证安全的

公众号 小册这是我整顿的学习材料,十分零碎和欠缺,欢送一起学习古代JavaScript高级小册深入浅出Dart古代TypeScript高级小册linwu的算法笔记一、平安个性在前文中,咱们曾经理解到HTTP在通信过程中存在以下问题: 通信应用明文(未加密),内容可能会被窃听。不验证通信方的身份,因而容易受到假装攻打。而HTTPS的呈现旨在解决这些问题,HTTPS建设在SSL(Secure Sockets Layer,安全套接字协定)之上,通过SSL来保障通信的安全性。 一旦采纳SSL,HTTP就领有了HTTPS的加密、证书和完整性爱护等性能。 SSL(Secure Sockets Layer,安全套接字协定)及其后继协定传输层平安(Transport Layer Security,TLS)是为网络通信提供安全性和数据完整性的平安协定。 二、实现办法SSL次要依赖于以下三种伎俩来实现其性能: 1. 对称加密对称加密是指应用协商的密钥对数据进行加密和解密,而密钥是雷同的。只有密钥的安全性失去保障,整个通信过程就能确保机密性。 2. 非对称加密非对称加密应用两个不同的密钥,一个是公钥,一个是私钥。公钥能够公开分享,而私钥必须窃密。 公钥和私钥都能够用于加密和解密,但应用公钥加密后只能应用私钥解密,反之亦然。 3. 混合加密在HTTPS通信中,采纳混合加密,联合了对称加密和非对称加密。具体做法是发送方应用接管方的公钥对"对称密钥"进行加密,而后接管方应用本人的私钥解密,获取"对称密钥"。 这样能够确保在密钥替换的过程中安全性失去保障,随后能够应用对称加密形式进行通信。 举例说明:假如网站领有私钥并将公钥公开公布。当用户想要登录网站时,只需应用公钥加密数据,密文只有私钥持有者能力解密。黑客无奈解密密文,因为他们没有私钥。 上述办法解决了数据加密问题,但在网络传输过程中,数据可能被篡改,且黑客可能伪造身份公布公钥。若获取了伪造的公钥,混合加密也无奈保障数据的安全性。为此,咱们须要摘要算法来确保完整性和身份验证。 4. 摘要算法摘要算法是保障数据完整性的次要伎俩,也称为散列函数或哈希函数。它将任意长度的数据压缩成固定长度的惟一摘要字符串,相似于为数据生成数字"指纹"。 摘要算法确保数字"指纹"与原文是齐全等价的。因而,只需在原文后附上其摘要,即可确保数据的完整性。 举例来说,若发送一条音讯:"转账 1000 元",并附上SHA-2摘要,网站接管后计算音讯的摘要,将两个"指纹"进行比照,如果匹配,表明音讯是残缺可信的,没有被批改。 5. 数字签名数字签名用于确定音讯的确是由发送方签订并发送的,因为没有人能伪造发送方的签名。 其原理很简略,应用私钥加密,公钥解密。 签名和公钥一样齐全公开,任何人都能够获取。但只有应用私钥对应的公钥能力解密它,进而验证原文的完整性,就像签订文件一样证实音讯的确是发送者收回的。 然而,咱们仍须要避免黑客伪造公钥,即如何确定公钥的真实性。这时,须要第三方机构,即证书验证机构(Certificate Authority,CA)。 6. 证书验证机构(CA)数字证书认证机构位于客户端和服务器单方都可信赖的第三方地位。 CA对公钥的签名认证要求包含序列号、用处、颁发者、无效工夫等等,将这些信息打包并签名,残缺地证实了公钥的各种信息,造成"数字证书"。 流程如 下图: 服务器运营者向数字证书认证机构申请公开密钥。数字证书认证机构在验证申请者身份后,对已申请的公开密钥进行数字签名。接着,散发已签名的公开密钥,并将其与公钥证书绑定在一起。服务器将数字证书发送给客户端,以便应用非对称加密形式通信。客户端收到证书后,应用数字证书认证机构的公开密钥验证数字签名。一旦验证通过,就能够确认: 服务器的公开密钥是由数字证书认证机构认证的,无效的。服务器的公开密钥是值得信赖的。三、总结能够看到,HTTPS与HTTP尽管只差一个SSL,但通信的安全性大幅提高,满足了通信的四大个性: 机密性:通过混合算法实现。完整性:通过摘要算法实现。身份认证:通过数字签名实现。不可否认性:同样通过数字签名实现。同时引入了第三方证书认证机构,以确保公开密钥的安全性。 参考文献知乎文章掘金文章腾讯云开发者社区文章

September 23, 2023 · 1 min · jiezi

关于前端:vue3x-vite4x-pinia-tsx-等诸多前沿框架开发的中后台模板

技术栈由 vue3.x vite4.x ts(x) pinia 等诸多前沿技术栈所开发。 个性最新技术栈:应用 Vue3.x/vite4.x 等前端前沿技术开发TypeScript:应用程序级 JavaScript 的语言主题:可配置的主题国际化:内置欠缺的国际化计划Mock 数据:内置 Mock 数据计划权限:内置欠缺的动静路由权限生成计划组件:二次封装了多个罕用的组件Axios 申请:深度封装 axios 申请拦截器一键中转我的项目地址 Ray Template预览地址 在线预览:一键中转在线预览(减速地址):一键中转文档地址 文档:一键中转筹备node 和 git -我的项目开发环境Vite - 相熟 vite 个性Vue3 - 相熟 Vue 根底语法TypeScript - 相熟 TypeScript 根本语法Es6+ - 相熟 es6 根本语法Vue-Router-Next - 相熟 vue-router4.x 根本应用Naive-UI - ui 根本应用Mock.js - mockjs 根本语法Pinia - 状态管理器 pinia 应用TSX - tsx 根本语法装置与应用# 获取git clone https://github.com/XiaoDaiGua-Ray/ray-template.git# 依赖装置pnpm i# 运行我的项目pnpm dev最初谢谢各位大佬们了,如果对于大家有帮忙,能够点一个小星星~~~

September 22, 2023 · 1 min · jiezi

关于前端:解锁创新力的钥匙低代码开发平台引领数字化未来

导言随着数字化浪潮愈发汹涌,企业们纷纷寻求更高效、灵便、老本更优的解决方案来放慢企业数字化建设。在这个背景下,低代码开发平台对于企业外部IT团队绝对有余,建设老本严格控制的企业是十分 敌对的解决方案,成为企业实现数字化转型的得力助手。在泛滥低代码开发平台中,咱们向您推荐——JVS,它不仅仅是一个平台,更是您的数字化对立根底框架,反对利用可插拔、技术代码凋谢、易扩大定制二开敌对、丰盛利用等特点越来越被大多数企业所承受。轻利用:在线热插拔配置,一键部署轻利用以插拔式配置和疾速部署为特点,提供高效率和灵活性。用户通过直观界面轻松插拔功能模块,无需深刻代码。所见即所得,所得即所配,即刻将利用投入生产,疾速响应需要部门的IT要求。反对按需定制,适应不同场景和流程,进步工作效率技术开源凋谢,代码反对商用JVS疾速开发平台以技术开放性为设计理念,为企业提供了灵便自在的开发环境。无论您是拥抱最新技术的先锋,还是偏好稳固传统的开发者,都能在平台上找到适宜本人的开发模式。这种开放性使得开发团队能够纵情施展创意,打造合乎企业需要的独特解决方案。平台私有化,数据安全可靠在当下环境,数据安全至关重要。JVS采纳私有化部署的模式,反对源码构建,为您的数据保驾护航,让您无需担心敏感信息泄露的问题,全身心投入到业务翻新中零代码+原生开发=低代码交融,继续化的低成本建设传统的编码开发模式须要大量的工夫和人力,而低代码平台以其直观、图形化的界面,大大降低了开发难度,让开发者们将重心放在了创意的实现上,采纳零代码+源代码交融开发的模式,大部分性能通过配置化,大量的性能可通过源码形式,实现继续化的低代码配置能力PC端挪动端,一次配置两端成型JVS挪动端采纳uniapp进行编写,在pc端性能配置后,挪动端主动生成小程序。JVS开源根底框架:https://gitee.com/software-minister/jvs在线demo:https://frame.bctools.cn/

September 22, 2023 · 1 min · jiezi

关于前端:用友BIP开发者生态亮相华为全联接大会

在这个疾速倒退的时代,智能化浪潮正奔流而来。9月20日至22日,2023华为全联接大会在上海隆重召开。华为此次大会以“减速行业智能”为主题,旨在与业界独特推动产业倒退,筑凋谢共赢的衰弱生态。在本次大会上,用友作为华为的重要合作伙伴,亮相华为全联接大会展台,展现了用友在企业数字化畛域的卓越实力。19日晚举办的华为合作伙伴之夜流动中,用友更是从泛滥合作伙伴中怀才不遇,荣获“华为云技术领航最佳实际搭档奖”,并作为搭档代表下台致辞。用友开发者生态展区,现场交换单干作为大会的重要组成,华为全联接大会展区于20日隆重启幕,近距离展现智能化技术在行业中的翻新和利用,向业界出现一场高规格、强阵容的数字化技术盛会。20-22日,用友也作为重要参展搭档携用友BIP多款行业数智化利用与生态计划能力亮相大会展区。展区现场,用友还展现了全面的开发者生态体系,以开发者核心为枢纽,基于iuap技术底座提供当先、高效的数智化开发技术,并聚合学习交换、赋能认证、利用开发等欠缺的生态服务。作为撑持生态开发的重要能力,用友YonBuilder低代码开发平台可助力企业组织和集体开发者疾速构建业务利用,提供可视化+低代码+全代码的一站式开发能力,旨在帮忙企业更好地实现数字化转型,进步企业的研发效率。此外,展区还有多位专家到场,为参会者提供开发者生态体系的具体解说。诚邀体验 转型降级更进一步通过开发者生态的展现,咱们心愿有更多的开发者人群可能意识用友开发者核心,并体验其中的YonBuilder低代码开发平台。随着企业对于数字化转型的需要日益增长,用友开发者核心的外围产品YonBuilder低代码开发平台正在成为越来越多企业的首选。通过YonBuilder,企业能够疾速构建和部署各类利用,放慢了数字化转型的步调。其次,因为YonBuilder的易用性,开发者能够更快地开发出业务逻辑简单的利用,从而进步了工作效率。此外,其还具备良好的可扩展性,可能满足企业一直增长的业务需要。 丰盛产品体系 使能高效开发为了丰盛产品体系,往年用友开发者核心上线了集成资产包及数字利用产品。集成资产包通过与第三方业务零碎对接,突破信息孤岛,让商业连贯更容易,帮忙企业实现低成本、疾速、便捷的业务利用连贯和集成,晋升运行效率,促成业务的一体化,是数智化建设的根底平台,撑持企业商业的疾速翻新。数字利用则通过用友组装式数据分析要害个性,解决传统剖析我的项目存在的交付周期长、剖析需要不清晰及指标变更频繁等问题。更新迭代,转型降级,用友开发者核心始终致力于让开发者通过平台便捷学习、高效开发、交换探讨、认证成长,推动开发者成为企业数字化转型的中坚力量。“不谋全局者,有余谋一域”,用友从依靠生态、到丰盛生态、再到赋能生态,最终心愿与宽广开发者在生态体系中共赢、共生、共荣,以凋敝的开发者生态体系,让商业翻新更简略、更高效、更有价值。将来,用友BIP开发者生态体系将持续秉持凋谢、单干的理念,与更多优良的企业单干,独特推动生态的凋敝与倒退。同时,用友开发者核心也将一直晋升本身产品和服务的品质和程度,帮忙更多的企业实现数字化转型和降级。

September 22, 2023 · 1 min · jiezi

关于前端:用友第五届开发者大赛初赛晋级公示复赛火热进行中

用友第五届开发者大赛初赛升级公示,复赛炽热进行中!   自7月13日鸣锣揭幕,9月6日各赛道作品初评工作实现,历时近两月,用友第五届企业云服务开发者大赛初赛阶段顺利落下帷幕。作为备受各界开发者关注的赛事,本届大赛吸引了来自寰球共计504支团队参赛,其中,商业级赛道216支,创新型利用赛道154支,院校赛道134支。通过大赛评委会层层提拔,共有290支精锐队伍怀才不遇,胜利升级复赛!  赋能认证BUFF全开! 用友第五届开发者大赛专题课程针对YonBuilder利用构建、挪动开发、YonLinker集成开发,共组织了46课时的赋能培训,定向辅导500+团队,此外,技术专家在线领导,为参赛者答疑解惑。   赋能培训内容 YonBuilder低代码开发平台 ( 规范服务) u  对象建模&页面建模 u  公式&流程 u  函数 u  智能剖析 u  员工治理案例 u  体检治理案例 u  更多进阶课程内容     YonBuilder低代码开发平台 (业余服务) u  创立流水线/引擎 u  本地开发环境搭建 u  典型奴才示例开发 u  YonBuilder客开脚手架 u  前/后端扩大开发 u  YonBIP微服务技术 u  更多进阶课程内容   YonBuilder挪动开发平台 u  全流程演示如何开发一款利用 u  挪动开发基础知识 u  App开发入门详解 u  模块解说与原生开发 u  开发治理与经营治理 u  案例实战-堂食点餐 u  案例实战-生鲜电商   YonLinker集成开发平台 u  YonLinker产品形成及架构基础知识 u  连接器开发基础知识 u  连接器开发详解 u  创立集成利用 u  集成方案设计 ...

September 22, 2023 · 1 min · jiezi

关于前端:JS-深拷贝详解

1.这里实现了深拷贝是因为在根本数据类型String Number 都能够实现深拷贝因为它只有一层 ,且每次扭转的变量的值都是扭转整个变量这样在堆中又开拓了一个内存空间,没有嵌套的状况下间接批改整个变量的办法在对象和办法中也实用var a = 1var b = aa 打印后果为 1b 打印后果为 1a = 2a 打印后果为 2b 打印后果为 1 2.这里实现了深拷贝的起因与第1条是一样的,因为改成a变量整个值,所以在堆中又开拓了一个新空间var a = [1,2,3]var b = aa 打印后果为 (3) [1, 2, 3]b 打印后果为 (3) [1, 2, 3]a = [3,2,1]a 打印后果为 (3) [3, 2, 1]b 打印后果为 (3) [1, 2, 3] 3.这里没有实现深拷贝是因为 这里的a是援用数据类型,且批改a的值时扭转的是下标0的数据,并没有整个a变量全副批改,所以并没有开拓新的内存空间,导致a和b都指向了同一个堆,故而打印的后果是一样的var a = [1,2,3]var b = aa 打印后果为 (3) [1, 2, 3]b 打印后果为 (3) [1, 2, 3]a[0] = 2a 打印后果为 (3) [2, 2, 3]b 打印后果为 (3) [2, 2, 3] ...

September 22, 2023 · 1 min · jiezi

关于前端:超全面的前端工程化配置指南

前端工程化配置指南本文解说如何构建一个工程化的前端库,并联合 Github Actions,主动公布到 Github 和 NPM 的整个具体流程。示例咱们常常看到像 Vue、React 这些风行的开源我的项目有很多配置文件,他们是干什么用的?他们的 Commit、Release 记录都那么标准,是否基于某种约定?废话少说,先上图!上图标红就是相干的工程化配置,有 Linter、Tests,Github Actions 等,笼罩开发、测试、公布的整个流程。相干配置清单EslintPrettierCommitlintHuskyJestGitHub ActionsSemantic Release上面咱们从创立一个 TypeScript 我的项目开始,一步一步实现所有的工程化配置,并阐明每个配置含意以及容易踩的坑。初始化为了防止兼容性问题,倡议先将 node 降级到最新的长期反对版本。首先在 Github 上创立一个 repo,拉下来之后通过npm init -y初始化。而后创立src文件夹,写入index.ts。package.json 生成之后,我须要增加如下配置项:   "main": "index.js",+  "type": "module",   "scripts": {     "test": "echo \"Error: no test specified\" && exit 1"   },+  "publishConfig": {+    "access": "public"+  }咱们将我的项目定义为ESM标准,前端社区正逐步向ESM规范迁徙,从Node v12.0.0开始,只有设置了 "type": "module", Node 会将整个我的项目视为ESM标准,咱们就能够间接写裸写import/export。publishConfig.access示意以后我的项目公布到NPM的拜访级别,它有 restricted和public两个选项,restricted示意咱们公布到NPM上的是公有包(免费),拜访级别默认为restricted,因为咱们是开源我的项目所以标记为public。配置创立我的项目之后,咱们开始装置工程化相干的依赖,因为咱们是 TypeScript 我的项目,所以也须要装置 TypeScript 的依赖。Typescript先装置 TypeScript,而后应用 tsc 命名生成 tsconfig.json。npm i typescript -Dnpx tsc --init而后咱们须要增加批改 tsconfig.json 的配置项,如下:{  "compilerOptions": {    / Basic Options /    "baseUrl": ".", // 模块解析根门路,默认为 tsconfig.json 位于的目录    "rootDir": "src", // 编译解析根门路,默认为 tsconfig.json 位于的目录    "target": "ESNEXT", // 指定输入 ECMAScript 版本,默认为 es5    "module": "ESNext", // 指定输出模块标准,默认为 Commonjs    "lib": ["ESNext", "DOM"], // 编译须要蕴含的 API,默认为 target 的默认值    "outDir": "dist", // 编译输入文件夹门路,默认为源文件同级目录    "sourceMap": true, // 启用 sourceMap,默认为 false    "declaration": true, // 生成 .d.ts 类型文件,默认为 false    "declarationDir": "dist/types", // .d.ts 类型文件的输入目录,默认为 outDir 目录    / Strict Type-Checking Options /    "strict": true, // 启用所有严格的类型查看选项,默认为 true    "esModuleInterop": true, // 通过为导入内容创立命名空间,实现 CommonJS 和 ES 模块之间的互操作性,默认为 true    "skipLibCheck": true, // 跳过导入第三方 lib 申明文件的类型查看,默认为 true    "forceConsistentCasingInFileNames": true, // 强制在文件名中应用统一的大小写,默认为 true    "moduleResolution": "Node", // 指定应用哪种模块解析策略,默认为 Classic  },  "include": ["src"] // 指定须要编译文件,默认当前目录下除了 exclude 之外的所有.ts, .d.ts,.tsx 文件} 更多具体配置参考:www.typescriptlang.org/tsconfig留神的点,如果你的我的项目波及到WebWorker API,须要增加到 lib 字段中"lib": ["ESN ext", "DOM", "WebWorker"],而后咱们将编译后的文件门路增加到 package.json,并在 scripts 中增加编译命令。 "main": "index.js","main": "dist/index.js","types": "dist/types/index.d.ts""type": "module","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"scripts": {"dev": "tsc --watch","build": "npm run clean && tsc","clean": "rm -rf dist"},"publishConfig": { "access": "public"}types 配置项是指定编译生成的类型文件,如果 compilerOptions.declarationDir 指定的是dist,也就是源码和 .d.ts 同级,那么types能够省略。验证配置是否失效,在 index.ts 写入 const calc = (a: number, b: number) => { return a - b}console.log(calc(1024, 28))在控制台中执行 ...

September 22, 2023 · 5 min · jiezi

关于前端:微前端架构的几种技术选型

微前端架构的几种技术选型随着SPA大规模的利用,紧接着就带来一个新问题:一个规模化利用须要拆分。一方面性能疾速减少导致打包工夫成比例回升,而紧急公布时要求是越短越好,这是矛盾的。另一方面当一个代码库集成了所有性能时,日常合作相对是十分艰难的。而且最近十多年,前端技术的倒退是十分快的,每隔两年就是一个时代,导致同志们必须降级我的项目甚至于换一个框架。但如果大家想在一个规模化利用中一个版本做好这件事,基本上是不可能的。最早的解决方案是采纳iframe的办法,依据性能次要模块拆分规模化利用,子利用之间应用跳转。但这个计划最大问题是导致页面从新加载和白屏。那有什么好的解决方案呢?微前端这样具备跨利用的解决方案在此背景下应运而生了!微前端的概念微前端是什么:微前端是一种相似于微服务的架构,是一种由独立交付的多个前端利用组成整体的架构格调,将前端利用分解成一些更小、更简略的可能独立开发、测试、部署的利用,而在用户看来依然是内聚的单个产品。有一个基座利用(主利用),来治理各个子利用的加载和卸载。f135ab0912746bd6.png所以微前端不是指具体的库,不是指具体的框架,不是指具体的工具,而是一种现实与架构模式。微前端的外围三大准则就是:独立运行、独立部署、独立开发微前端的劣势采纳微前端架构的益处就是,将这些小型利用交融为一个残缺的利用,或者将本来运行已久、没有关联的几个利用交融为一个利用能够将多个我的项目交融为一,又能够缩小我的项目之间的耦合,晋升我的项目扩展性。实现微前端的几种形式· 从single-spa到qiankun· 基于WebComponent的micro-app· webpack5实现的Module Federation微前端框架的分类Single-spasingle-spa是一个很好的微前端根底框架,而qiankun框架就是基于single-spa来实现的,在single-spa的根底上做了一层封装,也解决了single-spa的一些缺点。首先咱们先来理解该如何应用single-spa来实现微前端的搭建。single-spa.jpgSingle-spa实现原理首先在基座利用中注册所有App的路由,single-spa保留各子利用的路由映射关系,充当微前端控制器Controler,。URL响应时,匹配子利用路由并加载渲染子利用。上图便是对single-spa残缺的形容。有了实践根底,接下来,咱们来看看代码层面时如何应用的。以下以Vue工程为例基座构建single-spa,在Vue工程入口文件main.js实现基座的配置。基座配置//main.jsimport Vue from 'vue'import App from './App.vue'import router from './router'import { registerApplication, start } from 'single-spa'Vue.config.productionTip = falseconst mountApp = (url) => {  return new Promise((resolve, reject) => {    const script = document.createElement('script')    script.src = url    script.onload = resolve    script.onerror = reject    // 通过插入script标签的形式挂载子利用    const firstScript = document.getElementsByTagName('script')[0]    // 挂载子利用    firstScript.parentNode.insertBefore(script, firstScript)  })}const loadApp = (appRouter, appName) => {  // 近程加载子利用  return async () => {    //手动挂载子利用    await mountApp(appRouter + '/js/chunk-vendors.js')    await mountApp(appRouter + '/js/app.js')    // 获取子利用生命周期函数    return window[appName]  }}// 子利用列表const appList = [  {    // 子利用名称    name: 'app1',    // 挂载子利用    app: loadApp('http://localhost:8083', 'app1'),    // 匹配该子路由的条件    activeWhen: location => location.pathname.startsWith('/app1'),    // 传递给子利用的对象    customProps: {}  },  {    name: 'app2',    app: loadApp('http://localhost:8082', 'app2'),    activeWhen: location => location.pathname.startsWith('/app2'),    customProps: {}  }]// 注册子利用appList.map(item => {  registerApplication(item)}) // 注册路由并启动基座new Vue({  router,  mounted() {    start()  },  render: h => h(App)}).$mount('#app')复制代码构建基座的外围是:配置子利用信息,通过registerApplication注册子利用,在基座工程挂载阶段start启动基座。子利用配置import Vue from 'vue'import App from './App.vue'import router from './router'import singleSpaVue from 'single-spa-vue'Vue.config.productionTip = falseconst appOptions = {  el: '#microApp',  router,  render: h => h(App)}// 反对利用独立运行、部署,不依赖于基座利用// 如果不是微应用环境,即启动本身挂载的形式if (!process.env.isMicro) {  delete appOptions.el  new Vue(appOptions).$mount('#app')}// 基于基座利用,导出生命周期函数const appLifecycle = singleSpaVue({  Vue,  appOptions})// 抛出子利用生命周期// 启动生命周期函数export const bootstrap = (props)  => {  console.log('app2 bootstrap')  return appLifecycle.bootstrap(() => { })}// 挂载生命周期函数export const mount = (props) => {  console.log('app2 mount')  return appLifecycle.mount(() => { })}// 卸载生命周期函数export const unmount = (props) => {  console.log('app2 unmount')  return appLifecycle.unmount(() => { })}复制代码配置子利用为umd打包形式//vue.config.jsconst package = require('./package.json')module.exports = {  // 通知子利用在这个地址加载动态资源,否则会去基座利用的域名下加载  publicPath: '//localhost:8082',  // 开发服务器  devServer: {    port: 8082  },  configureWebpack: {    // 导出umd格局的包,在全局对象上挂载属性package.name,基座利用须要通过这个    // 全局对象获取一些信息,比方子利用导出的生命周期函数    output: {      // library的值在所有子利用中须要惟一      library: package.name,      libraryTarget: 'umd'    }  }复制代码配置子利用环境变量// .env.micro NODE_ENV=developmentVUE_APP_BASE_URL=/app2isMicro=true复制代码子利用配置的外围是用singleSpaVue生成子路由配置后,必须要抛出其生命周期函数。用以上形式便可轻松实现一个简略的微前端利用了。那么咱们有single-spa这种微前端解决方案,为什么还须要qiankun呢?相比于single-spa,qiankun他解决了JS沙盒环境,不须要咱们本人去进行解决。在single-spa的开发过程中,咱们须要本人手动的去写调用子利用JS的办法(如下面的 createScript办法),而qiankun不须要,乾坤只须要你传入响应的apps的配置即可,会帮忙咱们去加载。QiankunQiankun的劣势· 基于 single-spa[1] 封装,提供了更加开箱即用的 API。· · 技术栈无关,任意技术栈的利用均可 应用/接入,不论是 React/Vue/Angular/JQuery 还是其余等框架。· · HTML Entry 接入形式,让你接入微利用像应用 iframe 一样简略。· · 款式隔离,确保微利用之间款式相互不烦扰。· · JS 沙箱,确保微利用之间 全局变量/事件 不抵触。· · 资源预加载,在浏览器闲暇工夫预加载未关上的微利用资源,减速微利用关上速度。· 基座配置import { registerMicroApps, start } from 'qiankun';registerMicroApps([  {    name: 'reactApp',    entry: '//localhost:3000',    container: '#container',    activeRule: '/app-react',  },  {    name: 'vueApp',    entry: '//localhost:8080',    container: '#container',    activeRule: '/app-vue',  },  {    name: 'angularApp',    entry: '//localhost:4200',    container: '#container',    activeRule: '/app-angular',  },]);// 启动 qiankunstart();复制代码子利用配置以 create react app 生成的 react 16 我的项目为例,搭配 react-router-dom 5.x。1.在 src 目录新增 public-path.js,解决子利用挂载时,拜访动态资源抵触  if (window.__POWERED_BY_QIANKUN__) {    __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;  }复制代码2.设置 history 模式路由的 base:  <BrowserRouter basename={window.__POWERED_BY_QIANKUN__ ? '/app-react' : '/'}>复制代码3.入口文件 index.js 批改,为了防止根 id #root 与其余的 DOM 抵触,须要限度查找范畴。  import './public-path';  import React from 'react';  import ReactDOM from 'react-dom';  import App from './App';  function render(props) {    const { container } = props;    ReactDOM.render(<App />, container ? container.querySelector('#root') :     document.querySelector('#root'));  }  if (!window.__POWERED_BY_QIANKUN__) {    render({});  }  export async function bootstrap() {    console.log('[react16] react app bootstraped');  }  export async function mount(props) {    console.log('[react16] props from main framework', props);    render(props);  }  export async function unmount(props) {    const { container } = props;    ReactDOM.unmountComponentAtNode(container ? container.querySelector('#root') :      document.querySelector('#root'));  }复制代码4.批改 webpack 配置装置插件 @rescripts/cli,当然也能够抉择其余的插件,例如 react-app-rewired。npm i -D @rescripts/cli复制代码根目录新增 .rescriptsrc.js:const { name } = require('./package');module.exports = {  webpack: (config) => {    config.output.library = ${name}-[name];    config.output.libraryTarget = 'umd';    config.output.jsonpFunction = webpackJsonp_${name};    config.output.globalObject = 'window';    return config;  },  devServer: (_) => {    const config = _;    config.headers = {      'Access-Control-Allow-Origin': '*',    };    config.historyApiFallback = true;    config.hot = false;    config.watchContentBase = false;    config.liveReload = false;    return config;  },};复制代码以上对Qiankun的应用能够看出,与single-spa应用过程很类似。不同的是,Qiankun的应用过程更简便了。一些内置的操作交由给Qiankun外部实现。这是一种IOC思维的实现,咱们只管面向容器化开发,其余操作交给Qiankun框架治理。Micro-appmicro-app并没有因循single-spa的思路,而是借鉴了WebComponent的思维,通过CustomElement联合自定义的ShadowDom,将微前端封装成一个类WebComponent组件,从而实现微前端的组件化渲染。并且因为自定义ShadowDom的隔离个性,micro-app不须要像single-spa和qiankun一样要求子利用批改渲染逻辑并暴露出办法,也不须要批改webpack配置,是目前市面上接入微前端老本最低的计划。WebComponent的概念WebComponent[2]是HTML5提供的一套自定义元素的接口,WebComponent[3]是一套不同的技术,容许您创立可重用的定制元素(它们的性能封装在您的代码之外)并且在您的 web 利用中应用它们。以上是MDN社区对WebComponent的解释。· Custom elements(自定义元素): 一组 JavaScript API,容许您定义 custom elements 及其行为,而后能够在您的用户界面中依照须要应用它们。· Shadow DOM(影子 DOM) :一组 JavaScript API,用于将封装的“影子”DOM 树附加到元素(与主文档 DOM 离开出现)并管制其关联的性能。通过这种形式,您能够放弃元素的性能公有,这样它们就能够被脚本化和款式化,而不必放心与文档的其余局部发生冲突。· HTML templates(HTML 模板):  <template> 和 <slot> 元素使您能够编写不在出现页面中显示的标记模板。而后它们能够作为自定义元素构造的根底被屡次重用。接下来用一个小例子更快来了解WebComponent的概念。一个存在组件内交互的WebComponent// 基于HTMLElement自定义组件元素class CounterElement extends HTMLElement {  // 在结构器中生成shadow节点  constructor() {    super();    this.counter = 0;    // 关上影子节点    // 影子节点是为了隔离内部元素的影响    const shadowRoot = this.attachShadow({ mode: 'open' });    // 定义组件内嵌款式    const styles =           #counter-increment {              width: 60px;              height: 30px;              margin: 20px;              background: none;              border: 1px solid black;          }      ;    // 定义组件HTMl构造    shadowRoot.innerHTML =           <style>${styles}</style>          <h3>Counter</h3>          <slot name='counter-content'>Button</slot>          <span id='counter-value'>; 0 </span>;          <button id='counter-increment'> + </button>      ;    // 获取+号按钮及数值内容    this.incrementButton = this.shadowRoot.querySelector('#counter-increment');    this.counterValue = this.shadowRoot.querySelector('#counter-value');    // 实现点击组件内事件驱动    this.incrementButton.addEventListener("click", this.decrement.bind(this));  }  increment() {    this.counter++    this.updateValue();  }  // 替换counter节点内容,达到更新数值的成果  updateValue() {    this.counterValue.innerHTML = this.counter;  }}// 在实在dom上,生成自定义组件元素customElements.define('counter-element', CounterElement);复制代码有了对WebComponent的了解,接下来,咱们更明确了Micro-app的劣势。micro-app的劣势d879637b4bb34253.png· 应用简略· 咱们将所有性能都封装到一个类WebComponent组件中,从而实现在基座利用中嵌入一行代码即可渲染一个微前端利用。· 同时micro-app还提供了js沙箱、款式隔离、元素隔离、预加载、数据通信、动态资源补全等一系列欠缺的性能。· · 零依赖· micro-app没有任何依赖,这赋予它玲珑的体积和更高的扩展性。· · 兼容所有框架· 为了保障各个业务之间独立开发、独立部署的能力,micro-app做了诸多兼容,在任何技术框架中都能够失常运行。· 基座的繁难配置基座存在预加载子利用、父子利用通信、公共文件共享等等// index.jsimport React from "react"import ReactDOM from "react-dom"import App from './App'import microApp from '@micro-zoe/micro-app'const appName = 'my-app'// 预加载microApp.preFetch([  { name: appName, url: 'xxx' }])// 基座向子利用数据通信microApp.setData(appName, { type: '新的数据' })// 获取指定子利用数据const childData = microApp.getData(appName)microApp.start({  // 公共文件共享  globalAssets: {    js: ['js地址1', 'js地址2', ...], // js地址    css: ['css地址1', 'css地址2', ...], // css地址  }})复制代码调配一个路由给子利用// router.jsimport { BrowserRouter, Switch, Route } from 'react-router-dom'export default function AppRoute () {  return (    <BrowserRouter>      <Switch>        <Route path='/'>          <micro-app name='app1' url='http://localhost:3000/' baseroute='/'></micro-app>        </Route>      </Switch>    </BrowserRouter>  )}复制代码子利用的繁难配置// index.jsimport React from "react"import ReactDOM from "react-dom"import App from './App'import microApp from '@micro-zoe/micro-app'const appName = 'my-app'// 子利用运行时,切换动态资源拜访门路if (window.__MICRO_APP_ENVIRONMENT__) {  __webpack_public_path__ = window.__MICRO_APP_PUBLIC_PATH__}// 基子利用向基座发送数据// dispatch只承受对象作为参数window.microApp.dispatch({ type: '子利用发送的数据' })// 获取基座数据const data = window.microApp.getData() // 返回基座下发的data数据//性能优化,umd模式// 如果子利用渲染和卸载不频繁,那么应用默认模式即可,如果子利用渲染和卸载十分频繁倡议应用umd模式// 将渲染操作放入 mount 函数 -- 必填export function mount() {  ReactDOM.render(<App />, document.getElementById("root"))}// 将卸载操作放入 unmount 函数 -- 必填export function unmount() {  ReactDOM.unmountComponentAtNode(document.getElementById("root"))}// 微前端环境下,注册mount和unmount办法if (window.__MICRO_APP_ENVIRONMENT__) {  window[micro-app-${window.__MICRO_APP_NAME__}] = { mount, unmount }} else {  // 非微前端环境间接渲染  mount()}复制代码设置子利用路由import { BrowserRouter, Switch, Route } from 'react-router-dom'export default function AppRoute () {  return (    // 设置根底路由,子利用能够通过window.__MICRO_APP_BASE_ROUTE__获取基座下发的baseroute,    // 如果没有设置baseroute属性,则此值默认为空字符串    <BrowserRouter basename={window.__MICRO_APP_BASE_ROUTE__ || '/'}>      ...    </BrowserRouter>  )}复制代码以上便是Micro-app的用法Module FederationModule Federation是Webpack5提出的概念,module federation用来解决多个利用之间代码共享的问题,让咱们更加优雅的实现跨利用的代码共享。MF想做的事和微前端想解决的问题是相似的,把一个利用进行拆分成多个利用,每个利用可独立开发,独立部署,一个利用能够动静加载并运行另一个利用的代码,并实现利用之间的依赖共享。为了实现这样的性能, MF在设计上提出了这几个外围概念。Container一个被 ModuleFederationPlugin 打包进去的模块被称为 Container。艰深点讲就是,如果咱们的一个利用应用了 ModuleFederationPlugin 构建,那么它就成为一个 Container,它能够加载其余的 Container,能够被其余的 Container 所加载。Host&Remote从消费者和生产者的角度看 Container,Container 又可被称作 Host 或 Remote。Host:生产方,它动静加载并运行其余 Container 的代码。Remote:提供方,它裸露属性(如组件、办法等)供 Host 应用能够晓得,这里的 Host 和 Remote 是绝对的,因为 一个 Container 既能够作为 Host,也能够作为 Remote。Shared一个 Container 能够 Shared 它的依赖(如 react、react-dom)给其余 Container 应用,也就是共享依赖。微信图片_20220626184254.png微信图片_20220626184305.png以上是webpack5与之前版本的模块治理比照图微利用配置通过webpack5的配置达成微利用的成果// 配置webpack.config.jsconst { ModuleFederationPlugin } = require("webpack").container;new ModuleFederationPlugin({  name: "appA", //进口文件  filename: "remoteEntry.js", //裸露可拜访的组件  exposes: {    "./input": "./src/input",  }, //或者其余模块的组件 //如果把这一模块当作基座模块的话, //这里应该配置其余子利用模块的入口文件  remotes: {    appB: "appB@http://localhost:3002/remoteEntry.js",  }, //共享依赖,其余模块不须要再次下载,便可应用  shared: ['react', 'react-dom'],})复制代码以上便是我对微利用架构的了解,以及微利用架构技术的演变过程。不难看出,这些技术的演变都朝着易用性和可拓展性的方向演进。其中技术也有其时代的局限性,不过思维和技术总是在不断进步的。这几类技术选型都有其优缺点,各有千秋,咱们能够依据不同的须要抉择不同的技术来构建利用。下列是本文写作时的参考资料:single-spa: zh-hans.single-spa.js.org/docs/gettin…[4]qiankun: qiankun.umijs.org/zh/guide[5]WebComponent: developer.mozilla.org/zh-CN/docs/…[6]micro-app: cangdu.org/micro-app/d…[7]参考资料[1]https://github.com/CanopyTax/single-spa[2]https://developer.mozilla.org/zh-CN/docs/Web/Web_Components#%...[3]https://developer.mozilla.org/zh-CN/docs/Web/Web_Components#%...[4]https://zh-hans.single-spa.js.org/docs/getting-started-overview[5]https://qiankun.umijs.org/zh/guide[6]https://developer.mozilla.org/zh-CN/docs/Web/Web_Components[7]http://cangdu.org/micro-app/docs.html#/ 

September 22, 2023 · 1 min · jiezi

关于前端:一起来学习写一个Cocos热更新模块

引言本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢送大家关注分享珍藏订阅。 在游戏开发中,很难防止游戏中呈现bug,呈现bug不可怕,咱们及时修复它就好,而后引以为戒,防止同类问题的再次出现。说到修复bug,必须给大家提到热更新技术,目标在于不必从新向平台或者渠道从新提交游戏包,实现修复bug的技术,从而防止提审导致的一系列问题。 本文源码和源工程在文末获取,小伙伴们自行返回。 什么是热更新?热更新(Hot Update)在游戏开发中是指在游戏曾经公布并被玩家装置之后,通过网络下载并利用游戏的更新内容,而无需重新安装整个游戏或通过利用商店从新公布游戏的过程。 热更新的次要作用修复谬误和破绽:热更新容许游戏开发者疾速修复游戏中的谬误、破绽或其余问题,而无需期待利用商店审核并公布新版本。增加新性能:开发者能够通过热更新向游戏中增加新的内容、关卡、道具、工作等,而无需公布全新的游戏版本。改良性能和优化:游戏开发者能够通过热更新来改良游戏性能、优化资源,以提供更好的游戏体验。应答紧急情况:如果游戏中呈现紧急问题(如服务器故障),开发者能够通过热更新迅速解决问题,而不用期待利用商店的审批。缩小用户散失:通过及时修复和更新游戏,能够缩小玩家的不满和散失,放弃用户的趣味。热更新的关键步骤热更新通常波及到以下关键步骤: 版本治理:游戏开发者须要治理游戏的版本号,并为每个版本创立一个对应的资源清单(manifest),其中蕴含了游戏资源文件的信息和下载链接。资源服务器:须要一个用于存储游戏资源的服务器,玩家的设施能够从该服务器下载更新的资源。资源查看:游戏在启动时查看是否有新的版本可用,通常通过比拟本地版本号和服务器上的版本号来实现。资源下载:如果有新版本可用,游戏将从服务器下载所需的资源文件,这些资源文件通常是图像、声音、关卡数据等。资源替换:下载实现后,游戏将新资源文件替换旧的资源文件,使游戏在运行时应用更新后的内容。错误处理:热更新须要具备错误处理机制,以应答下载失败、文件损坏、网络谬误等问题,保障游戏的稳定性。版本比拟:有时须要自定义版本比拟逻辑,以确定是否须要更新,并决定下载哪个版本的资源。构建热更新管理器1.申明热更新管理器申明HotUpdateManager,继承cc.Component。外围组件jsb.AssetsManager 是 Cocos Creator 游戏引擎的一部分,用于解决游戏资源的热更新(Hot Update)。它是一个用于治理和执行资源更新的类,通常与近程服务器上的资源进行比拟,并下载须要更新的资源文件。 2.初始化onLoad初始化,获取设置热更新下载的存储门路、加载本地manifest文件、设置热更新中的事件回调。 3.查看热更新比对版本。 查看热更新。 查看更新回调。 4.执行热更新执行热更新。 解决热更新中的回调。 一个好的热更新模块一个好的热更新模块应具备以下性能,小伙伴们能够自行扩大补充: 在线检测版本: 可能在线比对本地和服务器的版本,版本不统一时能拉起更新弹窗,包含强制和非强制的。主动热更重载: 用户抉择进行热更新之后可能启动热更新,热更新实现后可能重载游戏。不重启热更新: 可能反对不重启游戏的状况下,在线进行热更新,让bug在用户不知觉的状况下隐没。最小化热更新: 仅仅热更须要批改的内容并且是最省资源的内容。总结本文的重点内容次要有以下几点,不晓得小伙伴们是否曾经了解: 本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢送大家关注分享珍藏订阅。热更新的简介、次要作用和关键步骤。一个好的热更新模块应具备。源码通过关注微信公众号“亿元程序员”发送"HotUpdateManager"获取。AD:笔者曾经上线的小游戏《贪吃蛇掌机经典》《填色之旅》《重力迷宫球》大家能够自行点击搜寻体验。 感兴趣的小伙伴记得关注微信公众号"亿元程序员"哦,一位有着8年游戏行业教训的主程。学习游戏开发不迷路。感谢您的关注,心愿能给到您帮忙, 也心愿通过您能帮忙到大家。 喜爱的能够点个赞、点个在看哦!请把该文章分享给你感觉有须要的其余小伙伴。谢谢。

September 22, 2023 · 1 min · jiezi

关于前端:低代码引擎-TinyEngine-正式发布

在当今数字化飞速发展的时代,企业对高效、麻利的应用程序需要日益旺盛。为了满足这一需要,越来越多的低代码开发平台开始涌现。这些平台通过提供简略易用的开发工具和优化后的开发流程,帮忙开发者疾速构建高质量、可重复使用的应用程序,同时升高了开发的难度和老本,进步了开发效率和灵活性。这些低代码开发平台的呈现,无疑为企业的数字化转型提供了更疾速、更高效的办法,也将推动整个软件开发行业的提高。 TinyEngine 我的项目介绍随着企业对于低代码开发平台的需要日益增长,急需一个通用的解决方案来满足各种低代码平台的开发需要。正是在这种状况下,低代码引擎应运而生。它是一种通用的开发框架,通过对低代码平台零碎罕用的性能进行解构,将其划分为多个功能模块,并为每个模块定义了相应的协定和开发范式,使得开发者能够依据本身的业务需要,轻松定制开发出本人的低代码开发平台。 TinyEngine 提供了低代码底层能力,并集成了人工智能,从而使用户可能高效开发。TinyEngine 具备弱小的拖拽性能,无论是图元还是简单组件,都能在画布上带来晦涩的体验。它实用于多场景的低代码平台开发,包含资源编排、流程编排、服务端渲染、模型驱动、挪动端、大屏端以及页面编排等低代码平台。 架构 外围亮点能够定制开发低码平台。TinyEngine 采纳灵便的零碎架构,其杰出的整体架构提供了高度的自定义自由度,使用户可能像搭建积木一样抉择不同的模块来构建本人的专属设计器。此外,插件化的架构使得用户能够不便地扩大与业务相干的性能。 在 TinyEngine 中,插件依据地位大抵分为三类:toolbars/plugins/settings,别离对应顶部区域、左侧区域和右侧区域。toolbars 插件次要偏差于无需 UI 或者 UI 较为简单的工具插件,plugins 是业务性能插件,显示在左侧(或下方)抽屉页面,能够通过点击进行开展收起或切换。这些性能都像是独立的积木块,用户能够选择性地保留或删除。同时,用户也能够开发本人的插件或工具,并将其装置到对应的地位。TinyEngine 的灵活性极强,用户能够自在地决定他们想要开发什么样的低代码平台。 TinyEngine 提供了一套欠缺的插件体系,涵盖了插件开发所需的根底 UI 库、工具库、插件面板的显示管制、生命周期治理、公共 API 注册与共享等。这一体系使得开发者只需遵循简略的标准,即可疾速开发出业务所需的插件,从而极大地提高了开发效率和灵活性。通过应用 TinyEngine 提供的插件体系,开发者能够更加轻松地治理和保护简单的插件生态系统,同时升高保护老本。总之,TinyEngine 的插件体系为开发者提供了一个全面、高效、灵便的开发平台,使得疾速开发出高质量的插件成为可能。 插件开发须要遵循肯定的开发标准,次要是文件标准与导出标准: 文件标准,必须蕴含上面几个文件 pluginProject - src 插件源码 - index.js 注册插件入口,须要导出约定的数据结构 - package.json导出标准, index.js 文件须要导出一个对象来申明根底信息 import component, { api } from './src/Main.vue' export default { id: 'pluginId', // 插件id title: 'pluginName', // 插件名 icon: 'js', // 插件 icon align: 'top', // 插件地位,左侧插件可选值:'top' | 'bottom' 工具栏可选值:'right' | 'center' | 'left' component, // 插件面板关上时渲染的组件 api, // 插件裸露的 api,能够提供给其余插件调用 }在此基础上就能够依照业务须要自在开发相干逻辑代码。 ...

September 21, 2023 · 4 min · jiezi

关于前端:如何用一行-CSS-实现-10-种现代布局

古代 CSS 布局使开发人员只需按几下键就能够编写非常有意义且弱小的款式规定。下面的探讨和接下来的帖文钻研了 10 种弱小的 CSS 布局,它们实现了一些不凡的工作。 超级居中:place-items: center对于第一个“单行”布局,让咱们解决所有 CSS 畛域中最大的谜团:居中。我想让您晓得,应用 place-items: center 会让此操作比您设想的容易。首先指定 grid 作为 display 办法,而后在同一个元素上写入 place-items: center。place-items 是同时设置 align-items 和 justify-items 的疾速办法。通过将其设置为 center , align-items 和 justify-items 都将设置为 center。.parent {  display: grid;  place-items: center;}这使得内容可能在父级内完满居中,而不论外部大小。02. 解构煎饼式布局:flex: <grow> <shrink> <baseWidth>接下来咱们有解构的煎饼!这是营销网站的常见布局,例如,可能有一行 3 个我的项目,通常带有图像、题目,而后是一些形容产品某些性能的文本。在挪动设施上,咱们心愿它们可能很好地重叠,并随着咱们减少屏幕尺寸而扩大。通过应用 Flexbox 实现此成果,您不须要在屏幕尺寸发生变化时通过媒体查问来调整这些元素的地位。flex 简写代表:flex: <flex-grow> <flex-shrink> <flex-basis> 。正因为如此,如果您想让您的框填充到它们的 <flex-basis> 大小,放大到更小的尺寸,但不拉伸以填充任何额定的空间,请写入:flex: 0 1 <flex-basis> 。在这种状况下,您的 <flex-basis> 是 150px,所以应该是这样:.parent {  display: flex;}.child {  flex: 0 1 150px;}如果您的确心愿框在换到下一行时拉伸并填充空间,请将 <flex-grow> 设置为 1 ,所以应该是这样:.parent {  display: flex;}.child {  flex: 1 1 150px;}当初,当您减少或缩小屏幕尺寸时,这些 flex 我的项目会放大和增长。03. 侧边栏布局:grid-template-columns: minmax(<min>, <max>) …)此演示对网格布局利用了 minmax 函数。咱们在这里做的是将最小侧边栏大小设置为 150px ,但在更大的屏幕上,让它伸展出 25% 。侧边栏将始终占据其父级程度空间的 25%,直到 25% 变得小于 150px 。将以下值增加为 grid-template-columns 的值:minmax(150px, 25%) 1fr 。在第一列(在这种状况下,侧边栏)的我的项目其 minmax 为 150px(在25% ),第二列我的项目(这里指 main 局部)占据其余的空间作为繁多的 1fr 轨道。.parent {  display: grid;  grid-template-columns: minmax(150px, 25%) 1fr;}04. 煎饼堆栈布局:grid-template-rows: auto 1fr auto与 Deconstructed Pancake 不同,当屏幕尺寸扭转时,本例不会蕴含它的子元素。通常称为粘性页脚,这种布局通常用于网站和应用程序,跨多个挪动应用程序(页脚通常是工具栏)和网站(单页应用程序通常应用这种全局布局)。向组件增加 display: grid 将为您提供一个单列网格,然而主区域的高度将仅与页脚下方的内容一样高。要使页脚粘在底部,请增加:.parent {  display: grid;  grid-template-rows: auto 1fr auto;}1fr页眉和页脚内容设置为主动采纳其子项的大小,并将残余空间 ( 1fr ) 利用于主区域,而auto调整大小的即将采纳其子项的最小内容的大小,以便该内容大小减少,行自身将增长以进行调整。05. 经典圣杯布局:grid-template: auto 1fr auto / auto 1fr auto对于经典的圣杯布局,有页眉、页脚、左侧边栏、右侧边栏和次要内容。相似于以前的布局,但当初有侧边栏!要应用一行代码编写整个网格,请应用 grid-template 属性。这使您能够同时设置行和列。属性和值对为:grid-template: auto 1fr auto / auto 1fr auto 。第一个和第二个以空格分隔的列表之间的斜线是行和列之间的分隔符。.parent {  display: grid;  grid-template: auto 1fr auto / auto 1fr auto;}与上一个示例一样,页眉和页脚具备主动调整大小的内容,这里的左侧和右侧边栏会依据其子项的固有大小主动调整大小。然而,这次是程度尺寸(宽度)而不是垂直尺寸(高度)。06. 12 跨网格:grid-template-columns: repeat(12, 1fr)接下来咱们有另一个经典布局:12 跨网格。您能够应用 repeat() 函数在 CSS 中疾速编写网格。对网格模板列应用 repeat(12, 1fr); 将为每个 1fr 提供 12 列。.parent {  display: grid;  grid-template-columns: repeat(12, 1fr);}.child-span-12 {  grid-column: 1 / 13;}当初您有一个 12 列的轨道网格,咱们能够将子项放在网格上。一种办法是应用网格线搁置它们。例如, grid-column: 1 / 13 将逾越从第一到最初一行(第 13 行)并逾越 12 列。grid-column: 1 / 5; 将逾越前四个列。另一种办法是应用 span 关键字。应用 span ,您能够设置起始线,而后设置从该终点逾越的列数。在这种状况下,grid-column: 1 / span 12 将等效于 grid-column: 1 / 13 ,而 grid-column: 2 / span 6 将等效于 grid-column: 2 / 8 。.child-span-12 {  grid-column: 1 / span 12;}07. RAM (Repeat, Auto, MinMax): grid-template-columns(auto-fit, minmax(<base>, 1fr))对于这第七个示例,联合您曾经理解的一些概念来创立具备主动搁置且灵便的子项的响应式布局。丑陋参差。这里要记住的关键点是 repeat 、 auto-(fit|fill) 和 minmax()' ,能够记住它们的首字母缩写词 RAM。总之,应是这样:.parent {  display: grid;  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));}您再次应用 repeat ,但这次应用 auto-fit 关键字而不是显式数值。这能够主动搁置这些子元素。这些子元素的根本最小值为 150px ,最大值为 1fr ,这意味着在较小的屏幕上,它们将占据整个 1fr 宽度,当它们达到 150px 宽度时,它们将开始流到同一条线上。应用 auto-fit ,当它们的程度尺寸超过 150px 时,框将拉伸以填充整个残余空间。然而,如果您将其更改为 auto-fill ,则当超出 minmax 函数中的根本大小时,它们将不会拉伸:.parent {  display: grid;  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));}08. 排列布局:justify-content: space-between对于下一个布局,这里要次要阐明的是 justify-content: space-between ,它将第一个和最初一个子元素搁置在其边界框的边缘,其余空间均匀分布在元素之间。对于这些卡片,它们被搁置在 Flexbox 显示模式中,应用 flex-direction: column 将方向设置为 column。这会将题目、形容和图像块放在父卡片内的垂直列中。而后,利用 justify-content: space-between 将第一个(题目)和最初一个(图像块)元素锚定到 flexbox 的边缘,并且它们之间的描述性文本以相等的间距搁置到每个端点。.parent {  display: flex;  flex-direction: column;  justify-content: space-between;}09. 放弃我的格调:clamp(<min>, <actual>, <max>)这里,咱们介绍一些只有多数浏览器反对的技术,但这些技术对布局和响应式 UI 设计有十分令人兴奋的影响。在本演示中,您将应用固定工具设置宽度,如下所示:width: clamp(<min>, <actual>, <max>) 。这将设置相对最小和最大尺寸以及理论尺寸。有了值,应该这样:.parent {  width: clamp(23ch, 60%, 46ch);}这里的最小尺寸是 23ch 或 23 个字符单元,最大尺寸是 46ch ,46 个字符。字符宽度单位基于元素的字体大小(特地是 0 字形的宽度)。“理论”尺寸为 50%,代表此元素父宽度的 50%。在这里, clamp() 函数所做的是使该元素放弃 50% 的宽度,直到 50% 大于 46ch (在较宽的视口上)或小于 23ch (在较小的视口上)。您能够看到,当我拉伸和膨胀父尺寸时,这张卡片的宽度会减少到其最大限度点并减小到其限度最小点。而后它放弃在父级的核心,因为咱们曾经利用了其余的属性来将它居中。这能够实现更清晰的布局,因为文本不会太宽(超过 46ch )或太窄(小于 23ch )。这也是实现响应式排版的好办法。例如,您能够编写:font-size: clamp(1.5rem, 20vw, 3rem) 。在这种状况下,题目的字体大小将始终保持在 1.5rem 和 3rem 之间,但会依据 20vw 理论值增大和放大以适应视口的宽度。这是一种很好的技术,能够通过最小和最大尺寸值确保易读性,但请记住,并非所有古代浏览器都反对它,因而请确保您有回退措施并进行测试。10.放弃宽高比:aspect-ratio: <width> / <height>最初要介绍的这一布局工具是最具实验性的工具。它最近在 Chromium 84 中被引入 Chrome Canary,Firefox 正在踊跃努力实现这一点,但目前还没有任何稳固的浏览器版本。不过,我的确想提及这一点,因为这是一个常常遇到的问题。这只是简略地放弃图像的宽高比。应用 aspect-ratio 属性,当我调整卡片大小时,绿色视觉块放弃 16 x 9 的宽高比。咱们通过 aspect-ratio: 16 / 9 放弃此宽高比。.video {  aspect-ratio: 16 / 9;}要在没有此属性的状况下放弃 16 x 9 的宽高比,须要应用 padding-top hack 并为其提供 56.25% 的 padding 以设置顶宽比。咱们很快就会有一个属性来防止黑客攻击和计算百分比的须要。能够应用 1 / 1 的比例制作正方形,应用 2 / 1 制作 2:1 比例。能够设置任何图像缩放比例。.square {  aspect-ratio: 1 / 1;}尽管此性能仍在不断完善中,但它值得理解,因为它解决了许多开发人员面临的抵触,我本人也屡次面临,尤其是在视频和 iframe 方面。论断感谢您急躁实现对这 10 种弱小的 CSS 布局的理解。要理解更多信息,请观看残缺视频,并亲自尝试演示。 ...

September 21, 2023 · 2 min · jiezi

关于前端:8个很棒的Vue开发技巧

1.路由参数解耦 通常在组件中应用路由参数,大多数人会做以下事件。 export default { methods: { getParamsId() { return this.$route.params.id }}}在组件中应用 $route 会导致与其相应路由的高度耦合,通过将其限度为某些 URL 来限度组件的灵活性。正确的做法是通过 props 来解耦。 const router = new VueRouter({ routes: [{ path: /user/:id , component: User, props: true}]})将路由的 props 属性设置为 true 后,组件外部能够通过 props 接管 params 参数。 export default { props: [ id ],methods: { getParamsId() { return this.id }}}您还能够通过性能模式返回道具。 const router = new VueRouter({ routes: [{ path: /user/:id , component: User, props: (route) => ({ id: route.query.id })}]})2.性能组件性能组件是无状态的,它不能被实例化,也没有任何生命周期或办法。创立性能组件也很简略,只需在模板中增加性能申明即可。它个别实用于只依赖于内部数据变动的组件,并且因为其轻量级而进步了渲染性能。组件须要的所有都通过上下文参数传递。它是一个上下文对象,具体属性见文档。这里的 props 是一个蕴含所有绑定属性的对象。 ...

September 21, 2023 · 3 min · jiezi

关于前端:宠物社区如何搭建一个宠物社交平台

随着我国宠物经济的蓬勃发展和市场规模的稳步扩充,只管与一些曾经成熟的发达国家相比,国内宠物行业仍有广大的发展前景,因而宠物行业蕴含着微小的倒退时机; 随着工夫的推移,宠物客人对于宠物的情感需要日益增长,而年轻人对于养宠理念的认可度也在发生变化,他们更加偏向于遵循迷信喂养等养宠观点。宠物的豢养数量逐年减少,而人们对宠物衰弱问题越来越器重,宠物市场逐步升温。宠物客人偏向于将更多的工夫、精力和财力投入到晋升养宠体验上,因而线上购物已成为支流的购物渠道。 接下来我以短说产品为例,分享下如何搭建一个宠物社区平台。咱们能够将网站划分为社区互动,记录日常生活,商品售卖,问答百科等几大块。 (1)社区互动性能 宠物社区平台能够提供多种社交互动性能,包含宠物话题、宠友流动和宠物相亲等,为用户提供了多元化的社交互动体验。 网站流动:宠物社区平台以宠物为媒介,吸引气味相投的用户汇集在一起。宠物社区平台能够公布线上或线下流动,吸引更多的用户参加流动,还能够设置通过流动博得处分,从而激发用户的参加激情,加大用户对社区网站粘性。 社区话题板块:用户可与遍布全国的宠物爱好者独特探讨与宠物相干的热门话题,独特为打造更加柔美的宠物社会环境奉献一份力量。同时,宠物社区平台十分欢送用户将本人喜爱的宠物故事分享在平台,反对互相互动。 私信:反对用户之间能够相互添加为好友,发展私信聊天,不便好友之间的私密交换。 特色版块:可开设多个独具特色的板块,例如帮助同城寻找宠物、闲置交易、宠物婚恋等。 (2)记录日常生活的事项 分享生存:疏导用户在社区中记录宠物的生存点滴,通过视频、照片、文字等多种形式记录宠物成长的点点滴滴,让宠物主在舒适的霎时中留下粗浅的印象,平台还可进行互动交换,相互发表评论、点赞等互动,拉近用户之间间隔。 养宠揭示:宠物社区平台还提供养宠相干的常识分享、揭示等服务,例如帮助整顿宠物注射的月龄等信息,同时还提供宠物玩具等相干好物的举荐服务。 (3)商品售卖 反对平台创立自营商城,实现我的项目的营收。比方能够在商城里划分产品分类:通用商品,猫咪专用和狗专用等类别,也可分为食物类、玩具类和洗护类等,上传宠物相干的周边商品供平台用户抉择。还能够在社区版块分享相干商品的测评,应用形式等常识。 (4)宠物问答 能够开设医生问答、宠物案例、养宠百科版块等版块,传递业余的养宠物的各种日常生活常识以及医疗常识,能够邀请宠物医生或专家入驻答疑、分享宠物常见的病情案例案等。 以上仅是局部场景的举例,具体能够联合本人的品牌或资源状况来搭建宠物平台。 像本文提到的以社区为经营次要方向的网站,主打是趣味内容吸引用户为平台带来流量,而流量并不间接产生收益,然而流量是产生收益的根底,后续具体的如何产生收益,不同的场景有不同的形式,能够联合本身状况来搭建。

September 21, 2023 · 1 min · jiezi

关于前端:HT-for-Web-Hightopo-使用心得2-2D图纸节点连线与基本动画

概括来说,用 HT for Web 做可视化次要分为两局部,也就是 2D 和 3D。这两局部须要独自创立。在它们被创立实现后,咱们再把它们集成到一起。 HT for Web 的 2D 局部次要是指 ht.graph.GraphView (简称 GraphView,也就是 2D 图纸)。所谓 2D 图纸其本质是一个 canvas。咱们能够在下面进行根本图形的绘制和编辑,进行连线布局,或者渲染动画。GraphView 能够脱离开 3D 独自应用,比方用于创立一般网页,组态软件,组织图,流程图等。 本节咱们次要以一个示例阐明一下 2D 图纸的基本概念、性能及用法。其次要包含以下几局部: 创立 2D 图纸 -(GraphView)增加节点 -(ht.Node)坐标系与坐标转换增加连线 - (ht.Edge)动画 - ht.Default.startAnim() 创立2D 图纸 -(GraphView)通过 new ht.graph.GraphView() 便可创立一张图纸。创立完图纸后,对于 HT 视图组件,能够通过 GraphView.addToDOM() 办法将其增加到 DOM 中。addToDOM() 办法自身接管一个参数。如果为空,则默认增加到 body 上面。也能够通过传递一个 div 将 2D 图纸固定到页面的某个地位。 对于新创建的图纸,其默认具备缩放、平移、编辑,以及框选等属性。咱们能够依据须要对其进行启用或禁用。 与其余视图组件一样,如果不指定 DataModel, GraphView 本身也会创立一个空的 DataModel 容器用来治理所有增加到其外面的各种图元。通过 GraphView.getDataModel() 或 GraphView.dm() 能够获取该容器。对于 GraphView,它反对通过 DataModel.setBackground() 来配置图纸的背景色彩。 ...

September 21, 2023 · 3 min · jiezi

关于前端:被难倒了-针对高级前端的8个级JavaScript面试问题

首发于公众号 大迁世界,欢送关注。 每周7篇实用的前端文章 ️ 分享值得关注的开发工具 分享集体守业过程中的趣事JavaScript 是一种功能强大的语言,也是构建古代 Web 的根底之一。这种弱小的语言也有一些本人的怪癖。例如,你晓得 0 === -0 会计算为 true,或者 Number("") 会返回 0 吗? 有时候,这些怪癖会让你百思不得其解,甚至让你狐疑 Brendan Eich 在创造 JavaScript 的那一天是不是状态不佳。但这里的重点并不是说 JavaScript 是一种蹩脚的编程语言,或者如其批评者所说的那样,是一种“邪恶”的语言。所有的编程语言都有某种程度的怪癖,JavaScript 也不例外。 在这篇博客文章中,咱们将深刻解释一些重要的 JavaScript 面试问题。我的指标是彻底解释这些面试问题,以便咱们可能了解背地的基本概念,并心愿在面试中解决其余相似的问题。 1- 仔细观察 + 和 - 运算符console.log(1 + '1' - 1); 你能猜到在下面这种状况下,JavaScript 的 + 和 - 运算符会有什么行为吗? 当 JavaScript 遇到 1 + '1' 时,它会应用 + 运算符来解决这个表达式。+ 运算符有一个乏味的个性,那就是当其中一个操作数是字符串时,它更偏向于执行字符串的连贯。在咱们的例子中,'1' 是一个字符串,因而 JavaScript 隐式地将数字 1 转换为字符串。因而,1 + '1' 变成了 '1' + '1',后果是字符串 '11'。 当初,咱们的等式是 '11' - 1。- 运算符的行为正好相同。它更偏向于执行数字减法,而不思考操作数的类型。当操作数不是数字类型时,JavaScript 会执行隐式转换,将它们转换为数字。在这种状况下,'11' 被转换为数字值 11,表达式简化为 11 - 1。 ...

September 21, 2023 · 3 min · jiezi

关于前端:浅入深出的微前端MicroApp-京东云技术团队

前言:本文是由最近做的一个我的项目有感而发,因为之前做了一些技术栈的对立,为了用ant Design的pro-table,PC对立应用react,然而咱们有一些老的我的项目是vue的,本次新页面较多,老页面的改变较少,除此之外老我的项目想换菜单,因而咱们想借助本次机会用react开发,通过了几番思考,发现本次很适宜用微前端来实现本次需要,最终决定用react搭建一个基座(主利用),将原来的vue我的项目接入到基座,这样咱们不仅实现了新页面react开发,而且老我的项目也能和新我的项目交融一起。 微前端的概念什么是微前端?微前端是借鉴了微服务的架构理念,它既能够将多个我的项目交融为一,又能够缩小我的项目之间的耦合,晋升我的项目扩展性,相比一整块的前端仓库,微前端架构下的前端仓库偏向于更小更灵便。有一个基座利用(主利用),来治理各个子利用的加载和卸载。所以微前端不是指具体的库,不是指具体的框架,不是指具体的工具,而是一种现实与架构模式。微前端的外围三大准则:独立运行、独立部署、独立开发。 何时应用微前端(1)一个十分宏大的我的项目,越来越大,后续难以保护。 (2)在一些大厂,常常会有跨部门和跨团队合作开发我的项目,这样会导致团队效率升高和沟通老本加大,这时咱们能够应用微前端,每个团队或者每个部门独自保护本人的我的项目,咱们只须要一个主我的项目来把扩散的子项目会集到一起即可。 (3)一个十分老旧的我的项目,开发效率低,然而一时半会又不能全副重构,这时咱们就能够新创建一个新技术新我的项目的基座,把老我的项目的页面接入到新我的项目外面,前面新需要都在新我的项目外面开发就好,不必再动老我的项目。 (4)想独立部署每一个单页面利用。 (5)改善初始化加载工夫,提早加载代码。 (6)基于多页的子利用不足治理,标准/规范不对立,无奈对立管制视觉出现、共享的性能和依赖。造成反复工作。 如何创立微前端基座一、微前端框架选型(1)现有框架single-spa是一个将多个单页面利用聚合为一个整体利用的 JavaScript 微前端框架。2.qiankun 是一款基于 single-spa 封装的微前端框架。 MicroApp 京东出品,一款基于WebComponent的思维,轻量、高效、功能强大的微前端框架。咱们本次我的项目应用的是umi+react+ts的技术栈,其实比拟适宜用qiankun,qiankun继承了umi框架,然而这个框架配置起来比拟麻烦,其次就是MicroApp 是京东旗下的。 (2)MicroApp 劣势1、应用起来老本最低,将所有的封装到一个类WebComponent组件中,从而实现在主利用基座中嵌入一行代码即可渲染一个微前端利用。 2、不须要像 single-spa 和 qiankun 一样要求子利用批改渲染逻辑并暴露出办法,也不须要批改webpack配置,是目前市面上接入微前端老本最低的计划。 3、提供了 js沙箱、款式隔离、元素隔离、预加载、数据通信、动态资源补全等一系列欠缺的性能。 4、没有任何依赖,这赋予它玲珑的体积和更高的扩展性。 5、为了保障各个业务之间独立开发、独立部署的能力,micro-app做了诸多兼容,在任何技术框架中都能够失常运行。 (3)MicroApp 概念图 二、场景演示当前台管理系统为例最外层是基座,基座是微前端利用集成的一个重要平台。同时也肩负着治理公共资源、依赖、标准的责任。次要有以下职责: (1)子利用集成,给子利用提供渲染容器 (2)权限治理 (3)会话治理 (4)路由、菜单治理 (5)主题治理 (6)共享依赖 (7)多语言治理(最重要的一点)等 content外面能够任意放不同技术的子利用,咱们只须要开发一个主利用(主利用也能够自由选择语言,目前反对react、vue、vite、angular、next.js、nuxt.js),将一些扩散的利用接进来,主利用还能够通过管制权限,让不同的账号看到的菜单不一样,即看到不同零碎的页面,通过同一个地址拜访到不同的子利用。 三、搭建微前端基座以react基座为例1、创立我的项目(1)首先确保本地node版本>= 14(举荐用nvm来治理 node 版本,windows 下举荐用nvm-windows)(2)通过官网提供命令能够疾速创立一个基于 UMI 的我的项目作为主利用也就是咱们所谓的基座(3)装置依赖npm i @micro-zoe/micro-app --savepackage.json文件外面dependencies外面会多一行代码,看到上面代码祝贺你,我的项目曾经具备micro-app接入能力了。 "@micro-zoe/micro-app": "^1.0.0-alpha.7"(4)在入口引入咱们的micro-app首先在根目录下创立一个global.tsx文件 import microApp from '@micro-zoe/micro-app'microApp.start()(5)在主利用引入子利用a. 调配一个子利用路由 { path: '/yp', name: 'yp', linkHidden: true, linkDisable: true, breadcrumbClose: true, component: '@/pages/yp-app', }b. 子利用的文件 ...

September 21, 2023 · 2 min · jiezi

关于前端:Puppeteer无头浏览器开启自动化之门掌握浏览器世界的无限可能

大略还是入门期,我曾用Puppeteer做爬虫工具以此来绕过某网站的防爬机制。近期有需要要做任意链接网页截图,像这种场景非常适合用Puppeteer实现。无头浏览器我已知的还有Selenium。 实现截图需要踩的最大的坑不是具体的逻辑代码,而是Docker部署Puppeteer到服务器总是短少某个包。踩坑过程我想另外写一篇文章分享,所以这篇就单纯给读者介绍Puppeteer无头浏览器。 什么是Puppeteer?Puppeteer是由Google开发和保护的一款弱小的Node.js库,它为开发人员提供了高级API,以编程形式操控Chromium浏览器。与传统的浏览器自动化工具相比,Puppeteer的独特之处在于它能够运行无头浏览器,即在没有UI界面的状况下运行浏览器实例。这意味着你能够在后盾运行浏览器,执行各种工作,而无需手动操作浏览器界面。 Puppeteer的背地是Chromium浏览器,这是一款开源的浏览器我的项目,也是Google Chrome浏览器的根底。因而,Puppeteer具备了与Chrome雷同的性能和兼容性。 Puppeteer的设计指标是为开发者提供一种简略而直观的形式来自动化浏览器操作。它提供了丰盛的API,能够轻松地进行页面导航、元素查找、表单填写、数据提取等操作。你能够编写脚本来模仿用户在浏览器中的操作,从而实现自动化测试、网页截图、数据爬取等工作。 此外,Puppeteer还反对无头模式,这意味着浏览器在后盾运行,不会显示界面。这使得Puppeteer非常适合在服务器环境中运行,例如自动化测试的CI/CD流水线、数据挖掘和网络爬虫等场景。 Puppeteer的利用场景模仿用户操作:Puppeteer能够模仿用户在浏览器中的各种操作,如点击、输出表单、页面导航等。你能够通过编写代码来自动化执行这些操作,轻松模仿用户行为;屏幕截图和PDF生成:Puppeteer能够帮忙你捕捉网页的屏幕截图或生成PDF文件;网页内容抓取:Puppeteer能够加载网页并提取其中的文本、图像、链接等内容;表单主动填充和提交:Puppeteer能够模仿用户的交互操作,主动填写表单字段并触发提交操作;性能监测和剖析:Puppeteer能够帮忙你评估网页的性能指标,如加载工夫、资源应用状况等。你能够应用这些工具来发现性能瓶颈、进行优化并监测改良成果;网页自动化测试:Puppeteer能够模仿用户的操作并与网页进行交互,你能够编写测试脚本,让Puppeteer主动加载网页、执行操作,并验证网页的行为和后果是否合乎预期。以上是Puppeteer的一些常见的利用场景,因为其弱小的性能和灵活性,你能够应用Puppeteer实现各种与网页操作和自动化相干的工作。 Puppeteer的装置首先,node -v查看本地Node.js版本,官网要求版本在14以上。不满足要求的同学参考Node.js版本管理工具,我抉择n 抉择适合的工具切换Node.js版本。 而后要有心理准备,当咱们npm i puppeteer装置Puppeteer时,它会顺带将Chromium浏览器装置。Chromium浏览器几百MB,下载绝对慢,而且经常性出错下载失败。如果失败,尝试执行些命令再次下载: node node_modules/puppeteer/install.js下载前,倡议将切换npm仓库源至国内: npm config set registry https://registry.npm.taobao.orgPuppeteer的应用不思考简单的网页,简略实现的截图: const puppeteer = require('puppeteer');const path = require('path');const browser = await puppeteer.launch();const page = await browser.newPage();await page.goto(url, { waitUntil: "domcontentloaded" });await page.setViewport({ width: 1280, height: 720 });await page.screenshot({ path: path.resolve(__dirname, `./${Date.now()}.png`), type: 'png', fullPage: true})await browser.close()几行代码,根本就能实现截图,当然没有思考网页图片等异步加载的资源状况。执行它就能失去一张截图。 如果执行报错:Could not find Chrome (ver. 116.0.5845.96). This can occur if either阐明Chromium没有装置。执行上述装置命令node node_modules/puppeteer/install.js 总结Puppeteer是一款无头浏览器工具,它为开发者们提供了一种弱小而灵便的形式来管制浏览器。通过模仿用户行为、截取屏幕截图、拦挡网络申请和进行自动化测试,Puppeteer可能轻松应答各种开发工作。 ...

September 21, 2023 · 1 min · jiezi

关于前端:Rust-开发命令行工具中

生存在不可避免地走向高雅。--王小波大家好,我是柒八九。 前言在上一篇Rust 开发命令行工具(上)中咱们从我的项目配置/参数获取/解析文件内容/处理错误信息/信息输入解决等方面。一步一步写进去能够构建出在本地,兼容谬误提醒,并且有很好的输入模式的本地搜寻工具。 以防大家忘记,咱们把最终的代码贴到上面。 use anyhow::{Context, Result};use clap::Parser;use indicatif::ProgressBar;use std::fs::File;use std::io::{self, BufRead, Write};use std::path::PathBuf;use std::thread;use std::time::Duration;#[derive(Parser)]struct Cli { /// 要查找的模式 pattern: String, /// 要读取的文件的门路 path: PathBuf,}fn main() -> Result<()> { let args = Cli::parse(); // 关上文件并创立一个 BufReader 来逐行读取 let file = File::open(&args.path).with_context(|| format!("无奈关上文件 {:?}", &args.path))?; let reader = io::BufReader::new(file); let stdout = io::stdout(); let stdout_lock = stdout.lock(); let mut handle = io::BufWriter::new(stdout_lock); let pb = ProgressBar::new(100); for line in reader.lines() { do_hard_work(); pb.println(format!("[+] 查找到了 #{:?}项", line)); pb.inc(1); let line = line.with_context(|| "无奈读取行")?; if line.contains(&args.pattern) { writeln!(handle, "{}", line)?; } } Ok(())}fn do_hard_work() { thread::sleep(Duration::from_millis(250));}然而,作为一个性能齐备的我的项目,咱们还须要做单元测试/集成测试和打包公布。所以,明天咱们就从这两面来持续欠缺咱们的Rust我的项目。 ...

September 21, 2023 · 4 min · jiezi

关于前端:Cocos独立游戏开发框架22场景管理器

引言本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢送大家关注分享珍藏订阅。 在游戏开发中,游戏场景是比拟常见的游戏资源,特地是在3d游戏中。往往游戏场景的资源都十分的大,咱们切换场景的时候要正当地解决上一个场景的资源并且正当地预加载下一个场景的资源。本文追随笔者一起来看看如何结构一个繁难的场景管理器。 本文源码和源工程在文末获取,小伙伴们自行返回。 什么是场景管理器?场景管理器是一个负责管理和切换游戏中不同场景的工具,它可能帮忙开发者无效地组织游戏的内容和逻辑,提供晦涩的游戏体验。 每个场景都有本人的资源、角色、物体和规定,而场景管理器的工作就是在这些不同的场景之间进行切换和治理。 场景管理器的次要作用和性能游戏开发中的场景管理器是一个关键性的组件,它的次要作用和性能包含以下几个方面: 场景切换和加载:场景管理器容许游戏在不同的游戏场景之间进行切换。这些场景能够是游戏的主菜单、关卡、角色抉择界面、胜利或失败画面等。通过场景管理器,游戏能够在须要时加载新场景,卸载以后场景,从而实现游戏流程的顺畅过渡。资源管理:每个场景通常须要不同的资源,如纹理、模型、声音文件等。场景管理器负责加载和卸载这些资源,以确保内存的无效应用。它也能够预加载资源,以缩小在游戏中切换场景时的加载工夫。游戏状态治理:场景管理器能够跟踪游戏的以后状态,包含游戏进行中、游戏暂停、游戏完结等。这有助于在不同情境下解决输出、更新游戏逻辑和渲染画面。性能优化:场景管理器能够帮忙进步游戏的性能。它确保只有以后流动的场景被渲染和更新,而其余场景能够暂停或休眠状态,从而加重了 CPU 和 GPU 的累赘,升高了能耗。用户界面治理:游戏的用户界面通常也是一个场景的一部分。场景管理器能够治理用户界面的显示和暗藏,以及与用户界面元素的交互,如按钮点击、文本输出等。事件处理:场景管理器能够解决游戏内产生的各种事件,如碰撞检测、用户输出、触发特殊效果等。它能够将这些事件传递给适当的场景,以触发相应的响应和逻辑。游戏状态保留和加载:一些游戏须要反对游戏状态的保留和加载,以便玩家能够随时退出游戏并在当前持续。场景管理器能够帮助实现这一性能,确保游戏状态在不同场景之间的转换时可能正确保留和还原。构建场景管理器1.申明场景管理器申明SceneManager,继承cc.Component。蕴含loading图节点,和预加载的场景列表。 2.初始化onLoad初始化,把场景管理器的节点设置成始终存在cc.game.addPersistRootNode(this.node);在切换场景时不会被销毁。同时监听场景加载实现回调和预加载须要提前加载的场景。 3.切换场景外围接口是cc.director.loadScene(sceneName),用于加载新场景。其中waitTwoSeconds只是做个演示成果延时秒,没有其余理论用处。 4.编写测试代码增加一个须要加载的指标场景名称和点击办法,点击后加载切换到指标场景。 5.筹备测试资源新增一个SceneManager节点,并且在它上面增加一个loading图和loading标签。 把脚本SceneManager增加下来,并且配置一下预加载的场景。 测试代码配置一下点击后须要加载切换的指标场景helloworld2。 复制筹备一个场景2。 同样配置一下须要加载切换的指标场景helloworld。 7.测试后果点击任意地位,显示loading图并且切换到场景2,再次点击则切换回场景1。 高级的场景管理器一个高级的场景管理器通常还包含以下性能,小伙伴们能够自行扩大: 场景切换成果: 提供场景切换时的淡入淡出、过渡动画等成果,以加强游戏的视觉吸引力。异步加载资源: 可能异步加载场景和场景所需的资源,以确保游戏性能和加载速度。场景堆栈治理: 反对场景的堆栈治理,使得能够回到上一个场景,或者在须要时回到特定的场景。场景数据传递: 在不同场景之间传递数据,以实现场景之间的交互和通信。性能优化: 对资源加载和卸载进行优化,以缩小内存占用和进步游戏性能。主动开释资源: 在不须要的场景中主动开释不再应用的资源,以节俭内存。总结本文的重点内容次要有以下几点,不晓得小伙伴们是否曾经了解: 本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢送大家关注分享珍藏订阅。场景管理器的简介、次要作用和性能。高级的场景管理器的扩大计划。源码通过关注微信公众号“亿元程序员”发送"SceneManager"获取。AD:笔者曾经上线的小游戏《贪吃蛇掌机经典》《填色之旅》《重力迷宫球》大家能够自行点击搜寻体验。 感兴趣的小伙伴记得关注微信公众号"亿元程序员"哦,一位有着8年游戏行业教训的主程。学习游戏开发不迷路。感谢您的关注,心愿能给到您帮忙, 也心愿通过您能帮忙到大家。 喜爱的能够点个赞、点个在看哦!请把该文章分享给你感觉有须要的其余小伙伴。谢谢。

September 21, 2023 · 1 min · jiezi

关于前端:怎样定制开发小程序微商城流程报价OctShop

互联网和5G的疾速倒退,变动速度1天比1天快了,小程序微商城的开发也这在浪潮中失去了蓬勃发展,小程序微商城在咱们的生存当中曾经十分一般了,很多人通过扫描小程序微商城二维码,进入小程序微商城进行购物。随着互联网与5G的倒退,很多企业或商家通过微信生态,如:微信群,朋友圈等来倒退本人企业的业务。如果咱们想通过朋友圈或微信群来进行销售,产生订单。那么,1个电商零碎来承载下单,领取,发货等动作零碎,所以小程序微商城定制开发是减少企业倒退的劣势,为企业带来更多的销售业绩与盈利。 一、小程序微商城定制开发 1)随着小程序的利用越来越宽泛,流量也水涨船高。越来越多的企业或商家都在进行小程序定制与开发,其中,小程序微商城是很青眼的。所以,咱们依据每个企业的特色与共性来定制开发小程序微商城,利用小程序微商城减少企业的竞争劣势,用微信营销,晋升业务业绩。2)在进行小程序微商城定制开发之前,首先,你要明确小程序商城具体需要,以及内容定位,商品分类等等。如果须要在线交易,可依据商品属性、覆盖范围、物流、售后等环节来设计小程序微商城的性能业务业务逻辑以及界面风格。这些能够具体征询业余的电商软件开发公司,让产品经理设计出1个具体迷信的残缺的设计与开发计划,依据你的业务特点优化相应的流程与去掉一些不必要的性能,以节俭开发成本。3)在整个设计开发过程中,你须要认真的梳理与整顿好业务流程,具体的与产品经理沟通,确认制作实现的设计开发计划可能齐全撑持客户的业务逻辑需要。通过后期的具体探讨与沟通,优化与调整好设计开发计划后,软件开发公司外部将开会讨论具体的实现办法与技术计划,在探讨中,确保所有与商城相干的人员都参会,确保开发实现的小程序微商城性能能够满足各业务流程环节人员的需要。 二、小程序微商城,小程序开发定制益处 小程序微商城对于企业文化体现与品牌影响力的帮忙是非常显著的,因为小程序的拜访不受工夫,空间,场地限度,在企业的整个对外宣传非常无利。小程序微商城依靠微信,在用户依赖感以及应用方便性方面非常敌对,更能让用户信赖。小细节可能决定成败,所以,在小程序微商城性能开发上用户体验是相当重要的,方便快捷满足用户多样化购物需要,能力让消费者更有好感。 三、OctShop收费开源小程序微商城 OctShop收费开源小程序微是大型多用户B2B2C+O2O一体化专业级商城零碎 、积分商城零碎。十多年电商零碎技术积淀、业余电商技术供应商、低成本打造大型专业级电商零碎。商城零碎_积分商城_OctShop收费开源大型多用户B2B2C+O2O一体化商城零碎

September 20, 2023 · 1 min · jiezi

关于前端:短说私域社群版本迭代计划公示赋能私域高效运营-促进用户有效增长

短说“私域社群”版本迭代打算公示——赋能私域高效经营 促成用户无效增长 一、引言什么是“私域社群”? 很多短说的客户敌人们可能已经应用过discord这款社群产品。 Discord 是一款专为社群设计的收费网络实时通话软件与数字发行平台,次要针对游戏玩家、教育人士、敌人及商业人士,用户之间能够在软体的聊天频道通过讯息、图片、影片和消息进行交换。 如果平时很少关注国外的音讯,那么QQ频道,Kook(开黑啦)等很多国内的产品您也应该多少有耳闻。 咱们先来一组discord的经营数据: 2022年寰球用户数5.63亿,据第三方统计平台Statista数据显示,Discord在短短两年内就取得了近2亿的新用户。 其中MidjourneyDiscord是最受欢迎的服务器,领有1370万会员。OpenAI排名第二, 领有300万会员。 如果应用传统的短说社区进行对标。那么discord当中的服务器相当于短说的一个版块。换而言之,一个版块就能够领有千万级的成员。这是一个让经营喵何必艳羡的数据啊。 目前discord广泛应用于游戏社区、开源我的项目社区,国外的许多网站广泛与discord有绑定。如果您是程序员,肯定不生疏,毕竟很多驰名开源我的项目都领有discord社群。 为了让短说社区时刻紧跟时代潮流。不在模式上脱节。咱们打算在2023年下半年-2024年这段时间,短说的研发重心落在私域社群版本的更新迭代之上。让咱们放弃对行业的领先地位。 二、Discord的产品模式简介1、服务器 在 Discord 中有一种别于个别通信软体之群组的群体聊天,称作伺服器(相似社团),伺服器拥有者能够在伺服器中发明属于本人的社群。 2、频道 在服务器中能够建设名为频道的聊天管道,分为语音、文字,其中的语音频道能够用来直播游戏与聊天等,频道能够设定与身份组整合各种权限,让 Discord 社群零碎更加多样化 3、子区 用户能够对特定的话题在子区内进行探讨。 4、利用场景 趣味交友:新鲜的用户增长模式 反对汇集超大规模爱好者,并通过社群-分组-话题让趣味圈子放弃细分垂直。 在凋谢的大社群中,为用户提供了关闭的小话题,这样难受的两头地带让用户能够随便抉择话题交换,晋升了成员参加的积极性。 游戏社交:进步用户粘性和活跃度 一个社群内多种话题,可解决玩家的获取资讯、招募队友、探讨剧情、分享攻略等诸多信息需要。玩游戏前能够理解征询,玩游戏中能够随时语音(聊天室永远在线),在游戏完结后还能在话题中持续深刻交换。 粉丝经营:领有一个高效的经营工具 辞别一个又一个独立的分群(取代“深圳用户1群”“深圳用户2群”“广州用户1群”“上海用户1群”等多个群)经营,一个社群不同话题就搞定,不用再放心分身乏术,让粉丝经营更轻松精准! 组织治理:实现一种清晰的分层级沟通形式 组织内所有成员可拉入同一个社群中,再依靠社群的层级性能和权限设置,实现分层沟通。 总结,能够说discord的模式根本包含了传统社区所蕴含的全副场景。并且因为其独特的构造,兼顾实时互动和非实时互动的劣势。在聊天模式和发帖模式之间找到了一个十分好的平衡点。是将来社区产品和聊天产品的发展趋势。 三、短说“私域社群”版本短说作为一款定位于社区社交零碎的业余私域流量产品,咱们始终在不断更新前行。咱们在原有的大二全的社区性能根底之上,将即时聊天减少进来,并进行齐全适配,推出全新的性能体系。咱们目前曾经实现了一部分的社群性能开发。 目前曾经实现的内容包含残缺的实时聊天互动机制。用户能够在零碎中取得相似于QQ、微信的残缺即时沟通体验。并且这还将是跨端的,咱们反对PC端(网页、客户端),手机端APP、小程序等多端的通信能力。 同时咱们曾经反对在社群版本中关上和浏览短说社区内的内容。用户能够在社群聊天的同时,便当地查看社区帖子、进行点赞互动。 在技术层面上,咱们应用socket技术来搭建整个即时通讯体系。大大减少了页面间的跳转,同时大幅度晋升了界面的实时性。用户不须要刷新页面,即可取得实时的性能反馈。不仅晋升了零碎的负载能力,对用户来说,也晋升了用户体验。 接下来,咱们的工作内容将围绕手机端性能的开发适配,将发帖与聊天进行更好的交融,让用户在即时聊天模式和论坛发帖模式进行交融。以保障用户能够紧急问题即刻取得解答。长效内容继续取得展示。用户不仅能够取得陪伴感,又能取得存在感。 此外,社群版本还会退出全新的互动和娱乐机制,包含用户头像框机制,道具商店机制,老手工作机制,全新的社群级排行榜。在增强社群趣味性的同时进一步晋升平台的盈利能力。 除此之外,咱们还开发了小队性能,再次提纯你的外围关系链。用户能够与最严密的敌人组成小队,取得无所不至的沟通体验。 置信随着短说“私域社群”版本的公布,咱们能够喊出那句经典的台词,这一刻,咱们——“遥遥领先”。 感兴趣的敌人能够扫码退出咱们短说“私域社群”版本的企业微信沟通群,也能够加小番茄邀请入群。

September 20, 2023 · 1 min · jiezi

关于前端:大厂为啥都要NODE去写中间层BFF

前言BFF是一种Web架构,全名为Backends For Frontends,即为服务于前端的后端。这个词来源于Sam Newman的一篇文章:Pattern: Backends For Frontends[1]。BFF个别指的是在前端与后端之间加减少一个中间层。为什么要在前端和后端之间减少一个BFF层呢? 计算机科学家David Wheeler已经说过一句话:All problems in computer science can be solved by another level of indirection.计算机科学中的所有问题都能够通过加一层来解决。因而,须要应用BFF的场景,必定是一般的前后端开发模式遇到了局部问题。例如在Sam Newman的文章中就形容了BFF解决多个展现端的场景。 多端性能展现在零碎一开始开发的时候只思考了PC网页端的设计,服务器端API是为了PC网页端而服务的。然而起初随着挪动互联网的衰亡,挪动端开始风行,决定在原有服务端的根底上开发挪动端App,复用之前的API,然而原有API是为了PC端设计的,并不合乎挪动端的需要。 PC端的需要与挪动端并不一定完全相同,现有接口无奈满足所有挪动端的新需要。 PC端电脑性能强,能够并发申请多个接口或进行局部较简单的数据处理,然而挪动端性能低,如果应用同样的多个接口,由前端组装数据,页面展现可能会呈现提早和卡顿景象。 PC端的屏幕较大,展现内容较多且全面。然而挪动端屏幕小,展现内容较少。而且局部数据的获取并不容易,须要后端调用许多服务。如果挪动端复用PC端接口,会获取和传输局部无用数据,不仅耗费服务端资源,还节约网络带宽。 而且随着科技的倒退和用户的需要,不同的展现端越来越多,在不仅在手机上会辨别Android端,IOS端,而且还会有平板电脑端,手机网页端,PC网页端,PC的APP端等等。这些端的页面设计各不相同,对于数据的需要也不雷同。假如咱们复用同一个服务端和API接口,如果呈现不满足需要的场景就加接口加字段,那么随着这些不同客户端的开发和迭代,服务端会变的大而臃肿,效率低下。而且同一个接口提供给太多前端调用,波及到太多的逻辑,复杂性越来越高。 因而,更好的形式是服务端对展现进行解耦,服务端只负责提供数据,有专门的展现端负责前端的展现业务。这里的展现端就是BFF层。 不同业务场景的展现模式差别在某些业务中,客户端的类型只有一种,然而在不同的场景下,展现的模式有差别。比方在美团的BFF实际[2]中,不同行业的团购货架展现模块不同,是两套独立定义的产品逻辑,并且会各自迭代。 在这种业务场景下,尽管是同一个客户端,然而业务不同,需要的数据格式和类型也不同,因而遇到与下面多端展现相似的接口问题。 短生命周期的需要还有一种情景,是闲鱼团队遇到的短生命周期的需要[3]。在一般的业务场景下,服务端失常稳固迭代开发。然而偶然会有一些非凡的经营流动,这种流动工夫较短,可能仅仅继续几天工夫。 如果仅仅为了这些几天的流动,每次都要开新API,联调,甚至批改原有服务端的逻辑,老本较大,而且较为低效。如果加一层BFF,让前端能够间接获取数据,那么开发和联调会变的简略很多。 业务整合须要在某些情景下,业务后端和需要比较复杂,例如这篇文章波及到的场景[4],有一个Moments App,蕴含了像用户治理,关系治理,信息,头像,点赞等多种多种后端微服务。这些服务在前端展现的逻辑耦合性较强。比方有些须要串行解决,例如失去服务1的后果才能够调用服务2;有些则能够并行处理。而数据合并和整顿的逻辑额较为简单。 网易云音乐也应用BFF进行微服务的调度以及数据的组装和适配。 这时候能够设立一个BFF层,作为一个数据整合服务,将调用不同微服务接口,与数据处理的简单逻辑都在BFF端中实现,升高了前端的复杂度,也进步了响应效率。 解决局部展现相干的业务在应用了BFF之后,局部页面展现相干的业务逻辑能够形象进去,交由BFF端解决。 例如数据导出Excel下载服务,输出导入Excel上传服务。BFF层能够接管用导入的Excel,解析并解决表格数据,而后提供给服务端。在导出时,也能够调用服务端API获取数据,由BFF端整合提供给前端下载。在这种情景下,服务端只须要提供一个展现接口,就能够满足页面展现和导出两种不同格局的展现需要。导入也是同理。而且假如表格与页面展现要求的数据格式不同,例如导入时局部字段值须要作转换,那么也能够由BFF端解决这种差别。 BFF的类型BFF自身仅仅是一个概念,实现形式有多种,在理论中咱们要依据不同的场景选取不同的计划。依照大类分,次要有繁多BFF和多端BFF。 繁多BFF繁多的BFF次要对接服务端,依据展现服务的需要组装数据提供给每个端或者每种业务进行展现。 很多繁多BFF都会用到GraphGL,他是由Facebook开发的数据查问工具。通过该工具,能够将不稳固的数据组装局部从稳固的业务数据逻辑中剥离,使数据管制逻辑前移,开发模式由“下发数据”转变成“取数据”的过程。 例如美团,闲鱼,网易云音乐等的BFF,都提供了按需查问能力,一个BFF对接多种客户端或者多种业务的需要。下图是美团应用的BFF架构设计。 多端BFF多端BFF是指每种业务或者每种客户端采纳本人独立的BFF层,这样每种客户端的服务更加灵便,不同的BFF端对于展现服务解耦性更高。 前端BFF与后端BFF从技术上分,BFF又能够分为前端BFF和后端BFF。即BFF层由前端团队主导或者后端团队主导。前端团队的BFF个别应用Node.js,后端团队则会应用Java或者其余服务端语言。 如果应用前端BFF,能够实现谁应用谁开发,肯定程序生防止了前后端实现的上不必要的沟通老本。但须要前端团队有一服务端开发教训,对前端团队的技术建设有较高需要。然而前端也能更深刻的接触业务逻辑,对于重展现的业务需要有肯定劣势。例如淘宝的实际:大淘宝技术行业FaaS化实战经验分享[8]。 传统接口与按需查问传统接口模式即失常开发接口,固定入参和返回数据格式,供前端调用。按需查问模式即前端调用接口时指定须要哪些数据,前端自主进行按需查问。GraphQL即是应用按需查问的模式。 BFF的其余特点与ServerLess集成应用前端BFF时,前端开发可能不足运维教训,而且在高可用,并发性等问题上可能会遇到挑战。如果联合Serverless实现主动扩容,弹性伸缩等性能,能够解决一些BFF的问题。 BFF与网关网关能够提供路由,认证,监控,日志等服务。网关能够与BFF集成在一起,也能够作为独立的一层来实现。如果业务简单,还能够在不同的BFF下层配置不同的网关。 FF的劣势通过下面的的各种问题和场景,置信咱们曾经晓得了BFF能够解决很多场景的问题,这里总结一下BFF的劣势: 服务端对数据展现服务进行解耦,展现服务由独立的BFF端提供,服务端能够聚焦于业务解决。 多端展现或者多业务展现时,对与数据获取有更好的灵活性,防止数据冗余造成耗费服务端资源。 对于简单的前端展现,将数据获取和组装的负责逻辑在BFF端执行,升高前端解决的复杂度,进步前端页面响应效率。 局部展现业务,能够形象进去利用BFF实现,对于服务端实现接口复用。 升高多端业务的耦合性,防止不同端业务开发相互影响。 其余劣势,包含数据缓存,接口平安校验等。

September 20, 2023 · 1 min · jiezi

关于前端:解析Nodejs镜像原理轻松构建高效CICD流程

1. 前言 如果公司我的项目应用容器化部署,那么或多或少理解过nodejs镜像,因为前端我的项目或者基于nodejs的BFF我的项目在构建或者部署的过程中都会依赖nodejs镜像 有同学会有疑难,nodejs镜像有啥好理解的,间接去docker镜像官网搜寻下对应node版本,而后找到对应的版本号,看下有没有不就好了嘛,比方要找16.20.0,如下图所示 编辑 而后在Dockerfile内写上对应的镜像版本,如下所示 javascript 复制代码 FROM node:16.20.0 眼尖的同学可能会看到,同一个版本比方16.20.0、14.19.1有不同的tag,如下图所示 为什么一个node镜像版本会有那么多tag?我该怎么选 为什么14与16的tag,除了版本号之外竟然还有差别?为什么 解析nodejs镜像在理解nodejs镜像之前,如果对linux不太熟,咱们能够先理解debian是什么及Alpine又是什么,如果对这部分很相熟,能够间接跳到nodejs官网镜像形成 2.1 Debian是什么 Linux有十分多的发行版本,从性质上划分,大体分为由商业公司保护的商业版本与由开源社区保护的收费发行版本。商业版本以Redhat为代表,开源社区版本则以Debian为代表。这些版本各有不同的特点,在不同的应用领域施展着不同的作用。 目前的风行发行版如下所示 一般来说Debian作为适宜于服务器的操作系统,它比Ubuntu要稳固得多。Debian整个零碎,只有利用层面不呈现逻辑缺点,基本上不会出问题。Debian整个零碎根底外围十分小,不仅稳固,而且占用硬盘空间小,占用内存小。 更多内容能够查看CentOS、Ubuntu、Debian三个linux比拟异同 Debian 发行版本Debian 始终保护着至多三个发行版本:稳定版(stable),测试版(testing)和不稳定版(unstable)。 稳定版(stable): 稳定版蕴含了 Debian 官网最近一次发行的软件包。作为 Debian 的正式发行版本,它是咱们优先举荐给用户您选用的版本。以后 Debian 的稳定版版本号是 12,开发代号为 bookworm。最后版本为 12.0,于 2023年06月10日 公布,其更新 12.1 已于 2023年07月22日 公布。测试版(testing): 测试版蕴含了那些临时未被收录进入稳定版的软件包,但它们曾经进入了候选队列。应用这个版本的最大好处在于它领有更多版本较新的软件。以后的测试版版本代号是 trixie。不稳定版(unstable): 不稳定版寄存了 Debian 现行的开发工作。通常,只有开发者和那些喜爱过惊险刺激生存的人选用该版本,不稳定版的版本代号永远都被称为 sid。Debian发行生命周期及目录Debian 通常会依照肯定的法则每隔一段时间公布一个新稳定版。对每个稳固发行版本,用户能够失去三年的残缺反对以及额定两年的长期反对。目前的发行工夫线如下图所示 能够看到最新的稳固版本是12 2.2 Alpine又是什么 Alpine 是一个面向平安的轻型 Linux 发行版。它不同于通常 Linux 发行版,Alpine 采纳了 musl libc 和 busybox 以减小零碎的体积和运行时资源耗费,但性能上比 busybox 又欠缺的多,因而失去开源社区越来越多的青眼。在放弃瘦身的同时,Alpine 还提供了本人的包管理工具 apk,能够间接通过 apk 命令间接查问和装置各种软件。 ...

September 20, 2023 · 4 min · jiezi

关于前端:更新JVS各产品916新增功能介绍

规定引擎更新内容新增:1.新增接口调用记录,能够查看调用的接口明细,如下图: 2.复合变量新增条件汇总性能次要用于对一系列业务规定中波及到的条件进行整合、组织和执行,帮忙将这些条件进行对立治理和评估。 优化:1.复合变量字段设置节点操作优化2.条件汇总反对与或关系设置3.数据筛选界面优化4.复合变量范畴区间反对蕴含关系设置 bug:1.修复复合变量构造配置无奈保留问题2.修复复合变量数据拓展后无奈字段设置问题3.修复评分卡权限初始数值展现异样问题 智能bi更新内容新增:1.图表新增散点图和3D组件 散点图:用于展现两个变量之间的相关性和散布关系的一种图表。 3D组件:通常用于数字孪生实现的重要一环,它可能交融GIS底图层和地理信息因素,实现模型层的建构和表白。 2.大屏图层反对快捷名称批改,双击可对图层自定义命名 3.大屏反对素材治理减少素材治理性能,可自行添加所需素材 4.数据集新增数据建模性能次要用于各类数据的形象组织,确定数据库需管辖的范畴、数据的组织模式等 优化:1.大屏组件锁定、暗藏时不同款式展现2.数据集字段设置节点操作优化3.数据集返范畴区间反对蕴含关系设置4.优化数据集预览界面5.优化数据源API设置界面 bug:1.修复报表页面切换菜单异样展现问题2.修复报表页面放大放大异样展现问题3.修复图表地图组件图标展现异样问题4.修复图表示例与数值款式重叠问题 规定引擎在线demo:http://rules.bctools.cn/智能BI在线demo:http://bi.bctools.cn/gitee仓库地址:https://gitee.com/software-minister

September 20, 2023 · 1 min · jiezi

关于前端:面试官说说React服务端渲染怎么做原理是什么

关注公众号关注公众号获取代码以及最新教程和文章,也能够分割作者,获取帮忙 一、SSR在SSR中,咱们理解到Server-Side Rendering ,简称SSR,意为服务端渲染 指由服务侧实现页面的 HTML 构造拼接的页面解决技术,发送到浏览器,而后为其绑定状态与事件,成为齐全可交互页面的过程 其解决的问题次要有两个: SEO,因为搜索引擎爬虫抓取工具能够间接查看齐全渲染的页面减速首屏加载,解决首屏白屏问题二、如何做在react中,实现SSR次要有两种模式: 手动搭建一个 SSR 框架应用成熟的SSR 框架,如 Next.JS这里次要以手动搭建一个SSR框架进行实现 首先通过express启动一个app.js文件,用于监听3000端口的申请,当申请根目录时,返回HTML,如下: const express = require('express')const app = express()app.get('/', (req,res) => res.send(`<html> <head> <title>ssr demo</title> </head> <body> Hello world </body></html>`))app.listen(3000, () => console.log('Exampleapp listening on port 3000!'))而后再服务器中编写react代码,在app.js中进行应援用 import React from 'react'const Home = () =>{ return <div>home</div>}export default Home为了让服务器可能辨认JSX,这里须要应用webpakc对我的项目进行打包转换,创立一个配置文件webpack.server.js并进行相干配置,如下: const path = require('path') //node的path模块const nodeExternals = require('webpack-node-externals')module.exports = { target:'node', mode:'development', //开发模式 entry:'./app.js', //入口 output: { //打包进口 filename:'bundle.js', //打包后的文件名 path:path.resolve(__dirname,'build') //寄存到根目录的build文件夹 }, externals: [nodeExternals()], //放弃node中require的援用形式 module: { rules: [{ //打包规定 test: /\.js?$/, //对所有js文件进行打包 loader:'babel-loader', //应用babel-loader进行打包 exclude: /node_modules/,//不打包node_modules中的js文件 options: { presets: ['react','stage-0',['env', { //loader时额定的打包规定,对react,JSX,ES6进行转换 targets: { browsers: ['last 2versions'] //对支流浏览器最近两个版本进行兼容 } }]] } }] }}接着借助react-dom提供了服务端渲染的 renderToString办法,负责把React组件解析成html ...

September 20, 2023 · 2 min · jiezi

关于前端:降低代码圈复杂度优化技巧

当一个我的项目通过继续迭代,一直减少性能,逐步变成一个简单的产品时,新性能的开发变得绝对艰难。其中一个很大的起因是代码复杂度高,导致可维护性和可读性都很差。本文将从前端JavaScript的角度登程,介绍一些无效的办法和技巧来优化前端代码的圈复杂度。 什么是圈复杂度圈复杂度的计算基于程序中的决策构造,如条件语句(if语句)、循环语句(for、while语句)、分支语句(switch语句)等。每当程序流程图中减少一个决策点,圈复杂度就会减少1。圈复杂度的值越高,示意代码的复杂性越大,代码的可读性、可测性和可维护性也会受到影响。 通常状况下,圈复杂度的推荐值应该在1到10之间。超过10的代码模块可能须要进行重构,以进步代码的可了解性和可测试性,并升高引入谬误的危险。 辅助工具VScode插件Code MetricsVScode插件Code Metrics能够帮忙咱们疾速发现那些须要优化复杂度的代码,装置好插件后如下图所示,在代码上方会呈现对应的复杂度值,依据值的大小能够看出哪些代码是急需优化晋升可读性。 鼠标点击所提醒复杂度数值的中央能够看到具体是哪些代码影响了复杂度,能够进行针对性的优化。 eslint查看能够应用 eslint 帮忙查看代码的圈复杂度,当超出了某个值就会报错。 rules: { complexity: [ 'error', { max: 10 } ]}如下面的配置就是超出了 10 就会呈现报错信息。 圈复杂度的罕用解决办法函数拆分和重构,繁多职责较高的圈复杂度往往意味着函数或办法外部有过多的决策门路。通过将简单的函数分解成多个小而清晰的函数,能够升高每个函数的圈复杂度,并使代码更易于了解和保护。拆分函数时,可依据功能模块或责任进行分类,确保每个函数只负责一项具体的工作。 优化前代码: function handle(arr) { // 去重 let _arr=[],_arrIds=[]; for(let i=0;i<arr.length;i++){ if(_arrIds.indexOf(arr[i].id)===-1){ _arrIds.push(arr[i].id); _arr.push(arr[i]); } } // 替换 _arr.map(item=>{ for(let key in item){ if(item[key]===''){ item[key]='--'; } } }); // 排序 _arr.sort((item1,item2)=>item1.id-item2.id); return _arr;}优化后代码: function removeDuplicates(arr) { const uniqueArr = []; const uniqueIds = []; for(let i = 0; i < arr.length; i++) { if(uniqueIds.indexOf(arr[i].id) === -1) { uniqueIds.push(arr[i].id); uniqueArr.push(arr[i]); } } return uniqueArr;}function replaceEmptyValues(arr) { const processedArr = arr.map(item => { for(let key in item) { if(item[key] === '') { item[key] = '--'; } } return item; }); return processedArr;}function sortById(arr) { const sortedArr = arr.sort((item1, item2) => item1.id - item2.id); return sortedArr;}function handle(arr) { const uniqueArr = removeDuplicates(arr); const processedArr = replaceEmptyValues(uniqueArr); const sortedArr = sortById(processedArr); return sortedArr;}以上将原始函数拆分成了三个函数。removeDuplicates 函数用于去除数组中的反复元素,replaceEmptyValues 函数用于遍历替换空值,sortById 函数用于依据 id 进行排序。每个函数都只负责一个明确的职责。 ...

September 20, 2023 · 4 min · jiezi

关于前端:小心这个陷阱-为什么JS中的-every对空数组总返回-true

首发于公众号 大迁世界,欢送关注。 每周7篇实用的前端文章 ️ 分享值得关注的开发工具 分享集体守业过程中的趣事JavaScript 语言的外围局部足够大,以至于咱们很容易误会其某些局部的工作形式。最近在重构一些应用 every() 办法的代码时,发现实际上并不了解其背地的逻辑。在我的了解中,我认为回调函数必须被调用并返回true , every() 才会返回 true ,但实际上并非如此。对于一个空数组, every() 无论回调函数是什么都会返回 true ,因为那个回调函数从未被调用过。思考以下状况: function isNumber(value) { return typeof value === "number";}[1].every(isNumber); // true["1"].every(isNumber); // false[1, 2, 3].every(isNumber); // true[1, "2", 3].every(isNumber); // false[].every(isNumber); // true在这个例子的每个状况中,对 every() 的调用都会查看数组中的每个我的项目是否为数字。前四次调用相当间接, every() 产生了预期的后果。当初思考以下这些例子: [].every(() => true); // true[].every(() => false); // true这可能更令人诧异:返回 true 或 false 的回调函数具备雷同的后果。这只能产生的惟一起因是如果回调函数没有被调用,而 every() 的默认值是 true 。然而,为什么在没有值来运行回调函数时,空数组会返回 true 给 every() 呢? 要了解为什么,咱们须要认真看看标准是如何形容这个办法的。 实现 every()ECMA-262 定义了一个 Array.prototype.every() 算法,大抵能够翻译成这段JavaScript代码: ...

September 20, 2023 · 2 min · jiezi

关于前端:Web-Woker-与主线程通信场景下对postMessage的简洁封装

在Web Worker与主线程之间进行通信时,应用postMessage是一种常见的形式。然而,在某些业务场景中,postMessage可能会显得不够简洁,因为它波及到手动序列化和反序列化数据,以及通过事件监听器解决音讯。以下是一些常见问题和解决方案,以简化在Web Worker与主线程之间的通信场景中应用postMessage的问题。 结构化克隆问题在Web Worker与主线程之间传输数据时,应用postMessage()办法进行通信,浏览器会对传递的数据进行序列化和反序列化的过程,以便在不同的线程间传递数据。这个序列化和反序列化的过程就是结构化克隆(Structured Cloning)。 结构化克隆是一种浏览器内置的序列化和反序列化算法,它能够将简单的JavaScript对象、数组、字符串、数字、布尔值等数据类型转换成一个能够在不同线程间传递的二进制数据流,而后再将这个二进制数据流反序列化为与原始数据雷同的JavaScript对象。 结构化克隆有一些特点和限度: 反对的数据类型:结构化克隆反对包含对象、数组、字符串、数字、布尔值、日期、正则表达式、Blob、File、ImageData等常见的JavaScript数据类型。但并不反对函数、Map、Set、Symbol等一些非凡的JavaScript数据类型。克隆整个对象:结构化克隆会克隆整个对象,包含对象的所有属性和办法。这可能会导致性能开销较大,尤其是在传输大规模数据时。不共享内存:结构化克隆会生成一份残缺的正本,而不是共享内存。这意味着在主线程和Web Worker之间传递数据时,会产生复制的开销,并且对数据的批改在不同线程中是不共享的。兼容性:结构化克隆在大多数古代浏览器中失去反对,但并不是所有浏览器都反对。一些老旧的浏览器可能不反对结构化克隆或者只反对局部数据类型的结构化克隆。在传输过程中,当应用postMessage()办法传递数据时,浏览器会主动应用结构化克隆对数据进行序列化和反序列化的过程,以便在不同线程间传递数据,但结构化克隆可能会带来性能开销和兼容性问题,须要依据具体情况来抉择适合的解决方案。在不反对结构化克隆的浏览器下,应用postMessage()传输数据须要应用JSON对数据内容进行字符串转化和解析,这也会带来肯定的性能损耗和数据类型限度。 优化计划宰割数据:将大规模的数据宰割成较小的块进行传递,而不是一次性传递整个数据。例如,能够将大型数组切割成多个小块,别离传递给Web Worker,而后在Web Worker中重新组合这些小块,从而缩小单次传递的数据量。应用共享内存:共享内存是一种在Web Worker和主线程之间共享数据的形式,而无需进行复制。这样能够防止结构化克隆的性能开销。共享内存能够通过应用TypedArray和ArrayBuffer来实现,能够在主线程和Web Worker之间间接共享数据的援用,而不须要进行复制。须要留神的是,共享内存可能须要应用锁或其余同步机制来确保对共享数据的拜访是平安的。应用其余序列化形式:除了结构化克隆,还能够思考应用其余的序列化形式,例如JSON.stringify和JSON.parse。尽管JSON序列化和反序列化可能比结构化克隆更慢,但它不会像结构化克隆一样复制整个数据(因仅反对局部数据类型,以及会忽视undefined的字段等),而是将数据转换为JSON字符串,并在接管方解析JSON字符串成JavaScript对象。这样能够肯定的防止复制大规模的数据,从而升高性能开销。应用压缩算法:对于大规模的数据,能够思考应用压缩算法对数据进行压缩,从而减小数据的大小,升高传输的数据量。在接管方进行解压缩后再进行解决。常见的压缩算法有gzip、zlib等,能够在主线程和Web Worker之间应用这些算法对数据进行压缩和解压缩。postMessage 简略封装主过程封装// 定义一个 WorkerMessage 类,用于向 Worker 发送音讯并解决返回后果let canStructuredClone;export class WorkerMessage { constructor(workerUrl) { this.worker = new Worker(workerUrl); this.callbacks = new Map(); canStructuredClone === undefined && this.isStructuredCloneSupported(); // 监听从 Worker 返回的音讯 this.worker.addEventListener('message', event => { const {id, type, payload} = event.data; const callback = this.callbacks.get(id); if (!callback) { console.warn(`未知的音讯 ID:${id}`); return; } switch (type) { case 'SUCCESS': callback.resolve(payload); break; case 'ERROR': callback.reject(payload); break; default: console.warn('未知的音讯类型:', type); } this.callbacks.delete(id); }); } // 发送音讯给 Worker postMessage(payload) { const id = Date.now().toString(36) + Math.random().toString(36).substr(2); const message = canStructuredClone ? {id, payload} : JSON.stringify({id, payload}) this.worker.postMessage(message); return new Promise((resolve, reject) => { this.callbacks.set(id, {resolve, reject}); }); } // 敞开 Worker terminate() { this.worker.terminate(); } // 判断以后浏览器是否反对结构化克隆算法 isStructuredCloneSupported() { try { const obj = {data: 'Hello'}; const clonedObj = window.postMessage ? window.postMessage(obj, '*') : obj; return canStructuredClone = clonedObj !== obj; } catch (error) { // 捕捉到异样,阐明浏览器不反对结构化克隆 return canStructuredClone = false; } }}在下面的代码中,咱们定义了一个名为 WorkerMessage 的类,用于向 Worker 发送音讯并解决返回后果。在该类的构造函数中,咱们首先创立了一个 Worker 实例,并监听了 message 事件。咱们应用一个 Map 对象来保留每个音讯的回调函数,以便后续可能依据音讯 ID 找到对应的回调函数。当从 Worker 返回的音讯中蕴含了 ID 时,咱们从 Map 中找到对应的回调函数,并依据音讯的类型别离调用 resolve 和 reject 办法。在调用这些办法后,咱们须要从 Map 中删除对应的回调函数,以防止内存透露。 ...

September 19, 2023 · 3 min · jiezi

关于前端:Web-Woker-常见使用问题和解决方案

问题汇总new Worker(aURL, options) URL 必须恪守同源策略。同源策略是浏览器的一种平安个性,限度了在不同源(协定、域名、端口)之间的 JavaScript 代码的拜访。这意味着在 Web Worker 中,只能加载与以后页面在同一源下的脚本,否则会触发平安谬误。Web Worker中限度了局部Web API。Web Worker 有一些限度,其中包含无奈间接操作 DOM 和无奈应用 localStorage。这是因为 Web Workers 是在独立的线程中运行的,与主线程拆散,并且没有间接的拜访主线程的 DOM 或 JavaScript 运行环境的能力。Web Worker与主线程的数据通信, 默认状况下Web Worker与主线程或其余Worker不能共享内存。Web Workers 默认状况下是无奈间接共享内存的,因为它们在独立的线程中运行,领有各自的运行环境和内存空间。解决方案利用Blob解决跨域限度Web Workers 是一种在 JavaScript 中创立并在后盾运行的多线程形式,能够用于执行耗时的工作而不会阻塞主线程。然而在应用 Web Workers 时,须要留神一些限度和解决方案,其中包含同源策略。这意味着在 Web Worker 中,只能加载与以后页面在同一源下的脚本,否则会触发平安谬误。 // 获取近程脚本代码fetch('https://example.com/remote-script.js') .then(response => response.text()) .then(scriptText => { // 创立 Blob 对象 const blob = new Blob([scriptText], { type: 'application/javascript' }); // 创立 Blob URL const blobUrl = URL.createObjectURL(blob); // 创立 Web Worker const worker = new Worker(blobUrl); // Web Worker 的音讯解决逻辑 worker.onmessage = function(event) { // 解决 Web Worker 发送的音讯 console.log('Message from Web Worker:', event.data); }; // 向 Web Worker 发送音讯 worker.postMessage('Hello from main thread!'); }) .catch(error => { // 处理错误 console.error('Failed to load remote script:', error); });在这个示例中,通过应用 fetch() 办法获取近程脚本代码,并将其作为 Blob 对象传递给 Worker 构造函数。而后,通过 Blob URL 创立一个 Web Worker,并在 Web Worker 中解决音讯。因为 Blob URL 不受同源策略限度,因而能够加载近程的脚本代码。 ...

September 19, 2023 · 4 min · jiezi

关于前端:zonejs由入门到放弃之五NgZone-ApplicationRef源码分析

啸达同学刚写zone.js系列就说过,NgZone影响着Angular中的变更检测,历时一个多月的笔耕不辍,终于到了他首次下笔时的目的地~zone.js系列zone.js由入门到放弃之一——通过一场游戏意识zone.jszone.js由入门到放弃之二——zone.js API大练兵zone.js由入门到放弃之三——zone.js 源码剖析【setTimeout篇】zone.js由入门到放弃之四——Angular对zone.js的利用初见NgZone其实在上一篇文章中,大家曾经初步窥探过NgZone的芳容了。而且咱们也晓得了,在NgZone中保护了OuterZone和InnerZone两个Zone。明天的这篇文章,咱们次要剖析一下InnerZone,并看一下InnerZone是如何跟Angular的变更检测分割到一起的。 InnerZone四办法NgZone中InnerZone的创立是通过forkInnerZoneWithAngularBehavior实现的,创立过程的简化版如下,其中又能看到很多相熟的勾子函数。这里简略温习一下这几个勾子的意义: onInvokeTask:zone.js会在初始化的时候将异步办法都Pathc成ZoneTask,从而跟踪异步工作的执行状况的。onInvokeTask就是其中的一个勾子函数,它会在异步工作执行回调的时候触发。onInvoke:onInvoke会在咱们手动执行zone.run()的时候执行。onHasTask:是针对整个工作队列状态扭转的监听,当检测工作队列中有工作进入、或是有工作执行完出队列的时候会被执行。onHandleError:当有异样抛出时被执行InnerZone对异步工作的管制精髓基本上就全副稀释在这几个勾子函数中了,与此同时,为了更好地配合对异步工作的跟踪,NgZone中还定义了很多状态监控字段。只有理清这些字段的含意能力持续往下深刻代码。 不相熟zone.js原理的能够回看一下zone.js由入门到放弃之一和zone.js由入门到放弃之二(链接见文首)传送门 function forkInnerZoneWithAngularBehavior(zone: NgZonePrivate) { zone._inner = zone._inner.fork({ name: 'angular', properties: <any>{'isAngularZone': true}, onInvokeTask: (...): any => { ... }, onInvoke: (...): any => { ... }, onHasTask: (...): any => { ... }, onHandleError: (...): any => { ... }, });}InnerZone五状态接下来这几个状态属性会贯通在前面的源码剖析的全副过程中,咱们也会通过对这几个状态的跟踪理解一下InnerZone事件跟踪的原理。 hasPendingMacrotasks: boolean 队列中是否有待执行的宏工作hasPendingMicrotasks: boolean 队列中是否有待执行的微工作_nesting: number 队列中待执行工作的个数isStable: boolean 当工作队列中既没有待执行的宏工作,也没有待执行的微工作时,isStable为ture,示意以后是个稳固的状态。反之则代表非稳固状态。lastRequestAnimationFrameId: number 这个状态有些特地,它是一个延时器,前面会开展解释。代码走读后面在介绍zone.js的时候咱们说过,zone.js把异步工作分为MacroTask、MicroTask和Event三种。明天咱们就别离把这三种工作都按流程剖析一遍。从难易水平上看,MacroTask最简略,Event绝对最简单。接下来,咱们就依照这个程序解说。 MacroTask之前在zone.js由入门到放弃之三中,具体介绍过zone.js对setTimeout的Patch过程,如果不理解具体过程的强烈建议先浏览一下那篇文章。这一次,咱们还是通过个setTimeout事件来跟踪NgZone的处理过程,测试代码很简略,如下所示。 export class AppComponent implements OnInit { title = 'ngzone-process'; ngOnInit(): void { setTimeout(() => { console.log('[setTimeout] run in next 5s'); }, 5000); } ngDoCheck() { console.log('rendering...'); }}因为zone.js能够感知到工作队列的变动状况,所以当setTimeout执行时,它能够晓得以后有一个宏工作来了,同时会触发onHasTask勾子。 ...

September 19, 2023 · 4 min · jiezi

关于前端:什么是DSPM数据安全状况管理的全面概述

随着数据量的生成以及爱护其要害信息的需要,数据安全情况治理 (DSPM) 不再是企业的必需品。DSPM 是一种数据优先方法,用于在数据高度碎片化的一直变动的环境中爱护数据。DSPM 使组织可能通过主动执行动态和动静数据分析来加强其平安情况,以提供数据编目、数据流图、风险管理以及事件检测和响应。通过 DSPM 检测和治理危险,组织能够爱护其数据、防止数据泄露并确保恪守相干法规(如 GDPR)。本文具体介绍了 DSPM、其要害组件及其对组织的重要性。咱们还分享了施行数据安全情况治理的最佳实际。那么,什么是DSPM,为什么它对企业很重要?让咱们来摸索一下。 什么是DSPM?数据安全情况治理 (DSPM) 是一种使企业可能评估和加强其数据安全情况的办法。它提供可见性,并提供对组织内访问控制和数据流的治理见解,同时使其可能检测潜在的危险和破绽。Gartner 将 DSPM 定义为“提供无关敏感数据地位、谁有权拜访该数据、如何应用这些数据以及数据存储或应用程序的平安情况的可见性。这须要数据流剖析来确定数据敏感度。换句话说,DSPM 可帮忙组织理解其数据的敏感性以及如何拜访和应用数据,以便他们能够采取适当的措施来爱护它。DSPM的要害组件包含数据目录这包含发现和编目组织的数据,并依据其敏感度对其进行分组。数据发现在碎片化环境中尤其重要,在这种环境中,数据能够在数千个不同的地位找到。发现后,DSPM 将数据分类到不同的数据敏感度组中。此类敏感数据的示例包含集体衰弱信息 (PHI)、个人身份信息 (PII) 和财务信息,例如与 PCI-DSS 相干的数据和凭据。通过对数据进行编目,您的组织可能深刻理解影响不同类型数据安全性的危险,并确保建设相干的措施和控制措施来爱护它们。数据流映射这涵盖了整个组织的数据流映射。映射可确保组织可能检测潜在的破绽和危险,例如将数据存储在不平安的数据中心或地位,或与未经受权的人员共享数据。在存在大量影子数据资产(存储敏感数据的“未知未知”)的环境中,应用无效的数据流映射十分重要。例如,平安团队不晓得的独立数据存储、数据库的非托管备份、要向其共享数据的第三方等。安全性和合规性风险管理这包含建设措施来治理和缓解应用不同 DSPM 引擎辨认的每个危险。此过程包含避免与第三方意外共享敏感数据、施行加密、建设适当的访问控制以防止对秘密和敏感数据的不必要拜访,以及检测和治理尚未正式编目但面临危险的数据(影子数据)。数据事件检测和响应这包含监督组织的安全性,以检测和响应可能的数据事件。此过程包含实时检测威逼组织数据的歹意流动,例如数据泄露、数据偷盗、勒索软件等。DSPM 解决方案的重要性数据安全态势治理 (DSPM) 在整个企业范畴内施展着重要作用。其发现、可见性和剖析性能使企业可能检测和治理潜在的危险和破绽。这有助于他们爱护敏感和秘密数据,并避免潜在的数据泄露。不仅如此,它还保障恪守相干法规。DSPM 对组织很重要,起因如下:防备网络威逼DSPM 通过实时检测威逼参与者并提供避免歹意参与者拜访敏感数据的性能来爱护组织的要害数据。它还能够避免由工程师的谬误、外部威逼、供应链攻打和其余威逼引起的意外数据泄露。确保恪守法规企业和行业必须恪守某些法规,例如金融行业的支付卡行业数据安全规范 (PCI-DSS)、衰弱行业的衰弱保险流通与责任法案 (HIPAA),当然还有通用数据保护条例 (GDPR)、加州消费者隐衷法 (CCPA) 和加州隐私权法案 (CPRA)。DSPM 确保组织理解其数据的敏感水平,并建设适当的措施来依据这些法规爱护它们。应用 DSPM 工具,组织能够主动执行许多监管流程,从而节俭大量工夫、简化审计并升高罚款危险。升高危险和责任蒙受数据泄露的组织简直不容易复原。结果包含法律责任、名誉侵害、经济损失或客户信赖丢失。借助 DSPM,您的组织能够将这些危险降至最低,并爱护本人免受潜在的罚款和责任。 DSPM 如何工作?数据安全情况治理有几个根本步骤:发现、分类和标记、危险评估、策略管理、监督和保护数据。让咱们具体探讨这些步骤:数据发现这是设置 DSPM 的第一步。组织依据其敏感度级别随时发现和剖析数据。发现不仅对于辨认数据十分重要,而且对于剖析数据的上下文和元数据也很重要,例如确定数据地位、辨认帐户的身份验证以及将数据用于什么业务目标。数据分类和标记在数据发现阶段之后,必须依据敏感度对其进行分类和标记。标记或标签可用于辨别为“敏感”、“秘密”或“受限”,也可用于辨别不同的敏感度组,如 PII、PHI 和 PCI,以使他们可能确定每个数据对危险的敏感性。危险评估对数据进行分类和标记后,下一个口头点是评估相干危险。DSPM平台继续扫描访问控制和数据流中多种类型可能的危险,并依据得出的见解评估网络攻击和数据泄露的可能性。除了危险检测自身之外,DSPM 工具还提供修改这些危险所需的所有信息。该信息包含受影响的数据、业务影响、相干资产、特定配置谬误等。策略管理评估危险后,是时候建设控制措施并制订政策,以确保充沛治理和缓解潜在危险。能够应用敏感数据的预期地位和拜访数据所需的介质的容许列表和阻止列表来设置策略。优先思考实时检测数据泄露并生成有用的见解以保障数据安全也至关重要。监控和保护这是实现 DSPM 的最初一步,波及监督组织的平安情况。在此阶段,平安团队能够利用入侵检测零碎,跟踪实时歹意流动,并设置适当的事件响应措施。必须将监督和保护过程与组织内的底层零碎和流程同步,以实现实时洞察。当初,咱们曾经深刻理解了 DSPM 如何爱护数据,让咱们来看看你的组织如何施行数据安全情况治理。 如何在您的组织中施行 DSPM?定义平安指标您的组织为施行 DSPM 设定了什么目标?这可能是为了避免数据泄露,恪守GDPR和HIPAA等法规或爱护敏感信息和拜访。从一开始就建设指标将帮忙您正确看待施行范畴和所需的控制措施,并为您提供评估 DSPM 施行是否无效的工具。确定环境范畴DSPM 策略应将组织保存的整个数据、存储和应用思考在内。这意味着平安团队须要理解 DSPM 实现的范畴。例如,这项工作是否会包含公共云,本地数据中心,SaaS应用程序和其余数据环境中的所有数据?确定环境范畴将确定要采纳的程序和工具,以使DSPM施行无效。施行适当的管制确定施行范畴后,是时候建设治理平安情况所需的流程和控制措施了。这包含咱们曾经提到的步骤,例如数据发现和分组、数据流映射、建设合规性和安全性的风险管理措施,以及弱小的数据事件检测和响应。这些措施应与数据环境范畴和平安指标保持一致。有一个牢靠的DSPM打算DSPM的实现不是一个事件,而是一个间断体。这里必须是继续的监督、治理和更新。必须制订一个弱小的 DSPM 打算,具体阐明治理数据安全情况的步骤。这应包含一直审查政策和分类,与现有流程和工具的整合,以及员工意识和培训。在施行 DSPM 时利用最佳实际以下是组织在施行 DSPM 时须要遵循的一些行业最佳实际:确保 DSPM 蕴含所有相干数据源、应用程序和零碎的范畴。一直审查DSPM中采纳的政策和分类,以确保更新和精确的后果。将 DSPM 与底层技术、工具和流程集成,以确保无缝运行。定期跟踪和治理平安情况,以检测和被动响应任何威逼或破绽。恪守这些步骤并利用最佳实际将确保您的组织在施行数据安全情况治理 (DSPM) 和加强整体平安情况方面处于领先地位。 ...

September 19, 2023 · 1 min · jiezi

关于前端:2023年前端面试真题之编码篇

人的毕生,总是不免有浮沉。不会永远如旭日东升,也不会永远苦楚潦倒。重复地一浮一沉,对于一个人来说,正是磨难。因而,浮在下面的,不用自豪;沉在底下的,更用不着乐观。必须以率直、虚心的态度,乐观进取、向前迈进。——松下幸之助大家好,我是江辰,在现在的互联网大环境下,想必大家都或多或少且有感触,塌实的社会之下,只有一直的放弃心性,能力感知不同的播种,互勉。 2023年最新的面试题集锦,时刻做好筹备。 本文首发于微信公众号:家养程序猿江辰 欢送大家点赞,珍藏,关注 文章列表2023年前端面试真题之JS篇2023年前端面试真题之CSS篇2023年前端面试真题之HTML篇2023年前端面试真题之React篇2023年前端面试真题之Vue篇实现简易版 Promise以下是一个根本的 Promise 实现: class MyPromise { constructor(executor) { this.status = 'pending'; this.value = undefined; this.onResolveCallbacks = []; this.onRejectCallbacks = []; const resolve = (value) => { if (this.status === 'pending') { this.status = 'fulfilled'; this.value = value; this.onResolveCallbacks.forEach((callback) => callback(this.value)); } }; const reject = (reason) => { if (this.status === 'pending') { this.status = 'rejected'; this.value = reason; this.onRejectCallbacks.forEach((callback) => callback(this.value)); } }; try { executor(resolve, reject); } catch (error) { reject(error); } } then(onFulfilled, onRejected) { if (this.status === 'fulfilled') { onFulfilled(this.value); } else if (this.status === 'rejected') { onRejected(this.value); } else { this.onResolveCallbacks.push(onFulfilled); this.onRejectCallbacks.push(onRejected); } }}// 示例用法const promise = new MyPromise((resolve, reject) => { // 异步操作,比方申请数据 setTimeout(() => { resolve('胜利'); // 或者 reject('失败'); }, 1000);});promise.then( (value) => { console.log('胜利:', value); }, (reason) => { console.log('失败:', reason); });这是一个十分根本的 Promise 实现,仅用于演示目标。在理论利用中,要思考更多的细节和错误处理。古代 JavaScript 曾经内置了 Promise,通常不须要手动实现它。 ...

September 19, 2023 · 5 min · jiezi

关于前端:2023年前端面试真题之CSS篇

人的毕生,总是不免有浮沉。不会永远如旭日东升,也不会永远苦楚潦倒。重复地一浮一沉,对于一个人来说,正是磨难。因而,浮在下面的,不用自豪;沉在底下的,更用不着乐观。必须以率直、虚心的态度,乐观进取、向前迈进。——松下幸之助大家好,我是江辰,在现在的互联网大环境下,想必大家都或多或少且有感触,塌实的社会之下,只有一直的放弃心性,能力感知不同的播种,互勉。 2023年最新的面试题集锦,时刻做好筹备。 本文首发于微信公众号:家养程序猿江辰 欢送大家点赞,珍藏,关注 文章列表2023年前端面试真题之JS篇2023年前端面试真题之编码篇2023年前端面试真题之HTML篇2023年前端面试真题之React篇2023年前端面试真题之Vue篇CSS 选择器的优先级是如何计算的?浏览器通过优先级规定,判断元素展现哪些款式。优先级通过 4 个维度指标确定,咱们假设以 a、b、c、d 命名,别离代表以下含意: a示意是否应用内联款式(inline style)。如果应用,a 为 1,否则为 0。b示意 ID 选择器的数量。c示意类选择器、属性选择器和伪类选择器数量之和。d示意标签(类型)选择器和伪元素选择器之和。优先级的后果并非通过以上四个值生成一个得分,而是每个值离开比拟。a、b、c、d 权重从左到右,顺次减小。判断优先级时,从左到右,一一比拟,直到比拟出最大值,即可进行。所以,如果 b 的值不同,那么 c 和 d 不论多大,都不会对后果产生影响。比方 0,1,0,0 的优先级高于 0,0,10,10。 当呈现优先级相等的状况时,最晚呈现的款式规定会被驳回。如果你在样式表里写了雷同的规定(无论是在该文件外部还是其它款式文件中),那么最初呈现的(在文件底部的)款式优先级更高,因而会被驳回。 在写款式时,我会应用较低的优先级,这样这些款式能够轻易地笼罩掉。尤其对写 UI 组件的时候更为重要,这样使用者就不须要通过非常复杂的优先级规定或应用 !important 的形式,去笼罩组件的款式了。 重置(resetting)CSS 和 标准化(normalizing)CSS 的区别是什么?你会抉择哪种形式,为什么?重置(Resetting): 重置意味着除去所有的浏览器默认款式。对于页面所有的元素,像margin、padding、font-size这些款式全副置成一样。你将必须从新定义各种元素的款式。标准化(Normalizing): 标准化没有去掉所有的默认款式,而是保留了有用的一部分,同时还纠正了一些常见谬误。当须要实现十分个性化的网页设计时,我会抉择重置的形式,因为我要写很多自定义的款式以满足设计需要,这时候就不再须要标准化的默认款式了。 请论述Float定位的工作原理。浮动(float)是 CSS 定位属性。浮动元素从网页的失常流动中移出,然而放弃了局部的流动性,会影响其余元素的定位(比方文字会围绕着浮动元素)。这一点与相对定位不同,相对定位的元素齐全从文档流中脱离。 CSS 的 clear 属性通过应用 left、right、both,让该元素向下挪动(革除浮动)到浮动元素上面。 如果父元素只蕴含浮动元素,那么该父元素的高度将塌缩为 0。咱们能够通过革除(clear)从浮动元素后到父元素敞开前之间的浮动来修复这个问题。 有一种 hack 的办法,是自定义一个 .clearfix 类,利用伪元素选择器 ::after 革除浮动。另外还有一些办法,比方增加空的 <div></div> 和设置浮动元素父元素的 overflow 属性。与这些办法不同的是,clearfix 办法,只须要给父元素增加一个类,定义如下: .clearfix::after { content: ''; display: block; clear: both;}值得一提的是,把父元素属性设置为 overflow: auto 或 overflow: hidden,会使其外部的子元素造成块格式化上下文(Block Formatting Context),并且父元素会扩张本人,使其可能突围它的子元素。 ...

September 19, 2023 · 3 min · jiezi

关于前端:2023年前端面试真题之HTML篇

人的毕生,总是不免有浮沉。不会永远如旭日东升,也不会永远苦楚潦倒。重复地一浮一沉,对于一个人来说,正是磨难。因而,浮在下面的,不用自豪;沉在底下的,更用不着乐观。必须以率直、虚心的态度,乐观进取、向前迈进。——松下幸之助大家好,我是江辰,在现在的互联网大环境下,想必大家都或多或少且有感触,塌实的社会之下,只有一直的放弃心性,能力感知不同的播种,互勉。 2023年最新的面试题集锦,时刻做好筹备。 本文首发于微信公众号:家养程序猿江辰 欢送大家点赞,珍藏,关注 文章列表2023年前端面试真题之JS篇2023年前端面试真题之CSS篇2023年前端面试真题之编码篇2023年前端面试真题之React篇2023年前端面试真题之Vue篇meta viewport 是做什么用的,怎么写?<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1" />目标 是为了在挪动端不让用户缩放页面应用的 解释每个单词的含意 with=device-width 将布局视窗(layout viewport)的宽度设置为设施屏幕分辨率的宽度initial-scale=1 页面初始缩放比例为屏幕分辨率的宽度maximum-scale=1 指定用户可能放大的最大比例minimum-scale=1 指定用户可能放大的最大比例浏览器乱码的起因是什么?如何解决?编码格局不匹配浏览器关上网页时,须要依据网页源代码的编码格局来解码。如果网页的编码格局与浏览器的编码格局不匹配,就会呈现乱码。比方,网页的编码格局为 UTF-8,而浏览器的编码格局是 GB2312,那么就会呈现乱码。 网页编码谬误在编写网页的时候,如果编码呈现谬误,也会导致浏览器关上网页时呈现乱码。比方,在写 HTML 代码时,如果遗记给中文字符指定编码格局,就会呈现乱码。 字体缺失有些网页会应用比拟非凡的字体,如果浏览器中没有这个字体,就会找不到对应的字符,从而呈现乱码。 iframe 有那些长处和毛病?长处能够在页面上独立显示一个页面或者内容,不会与页面其余元素产生抵触。能够在多个页面中重用同一个页面或者内容,能够缩小代码的冗余。加载是异步的,页面能够在不期待 iframe 加载实现的状况下进行展现。不便地实现跨域拜访毛病搜索引擎可能无奈正确解析 iframe 中的内容会阻塞主页面的 onload 事件和主页面共享连接池,影响页面并行加载HTML5 新个性语义化标签增强型表单(如能够通过 input 的 type 属性指定类型是 color 还是 date 或者 url 等)媒体元素标签(video,audio)canvas,svgsvg 绘图天文等位(navigator.geolocation.getCurrentPosition(callback))拖放 API(给标签元素设置属性 draggable 值为 true,可能实现对指标元素的拖动)Web Worker(能够开启一个子线程运行脚本)Web Storage(即 sessionStorage 与 localStorage)Websocket(双向通信协定,能够让浏览器接管服务端的申请)dom 查问(document.querySelector()和 document.querySelectorAll())如何应用HTML5中的Canvas元素绘制图形?Canvas元素容许在网页上应用JavaScript绘制图形和动画。以下是一个简略的绘制矩形的示例: <canvas id="myCanvas" width="200" height="200"></canvas><script> var canvas = document.getElementById("myCanvas"); var ctx = canvas.getContext("2d"); ctx.fillStyle = "red"; ctx.fillRect(50, 50, 100, 100);</script>在这个示例中,应用 document.getElementById() 办法获取 Canvas 元素,并通过 getContext(“2d”) 获取2D绘图上下文。而后,应用 fillStyle 属性设置填充色彩,fillRect() 办法绘制一个矩形。 ...

September 19, 2023 · 1 min · jiezi

关于前端:2023年前端面试真题之React篇

人的毕生,总是不免有浮沉。不会永远如旭日东升,也不会永远苦楚潦倒。重复地一浮一沉,对于一个人来说,正是磨难。因而,浮在下面的,不用自豪;沉在底下的,更用不着乐观。必须以率直、虚心的态度,乐观进取、向前迈进。——松下幸之助大家好,我是江辰,在现在的互联网大环境下,想必大家都或多或少且有感触,塌实的社会之下,只有一直的放弃心性,能力感知不同的播种,互勉。 2023年最新的面试题集锦,时刻做好筹备。 本文首发于微信公众号:家养程序猿江辰 欢送大家点赞,珍藏,关注 文章列表2023年前端面试真题之JS篇2023年前端面试真题之CSS篇2023年前端面试真题之HTML篇2023年前端面试真题之编码篇2023年前端面试真题之Vue篇什么时候应用状态管理器?从我的项目的整体架构来看,要抉择适宜我的项目背景的极速。如果我的项目背景不适宜应用状态管理器,那就没有肯定的必要性去应用,比方微信小程序等,能够从以下几个维度来看 用户的应用形式简单不同身份的用户有不同的应用形式(比方普通用户和管理员)多个用户之间能够合作与服务器大量交互,或者应用了WebSocketView要从多个起源获取数据从组件角度看某个组件的状态,须要共享某个状态须要在任何中央都能够拿到一个组件须要扭转全局状态一个组件须要扭转另一个组件的状态什么渲染劫持?什么是渲染劫持,渲染劫持的概念是管制组件从另一个组件输入的能力,当然这个概念个别和react中的高阶组件(HOC)放在一起解释比拟有明了。 高阶组件能够在render函数中做十分多的操作,从而管制原组件的渲染输入,只有扭转了原组件的渲染,咱们都将它称之为一种渲染劫持。 实际上,在高阶组件中,组合渲染和条件渲染都是渲染劫持的一种,通过反向继承,不仅能够实现以上两点,还能够加强由原组件 render 函数产生的 React元素。 理论的操作中通过操作 state、props 都能够实现渲染劫持 怎么实现React组件的国际化呢?依赖于 i18next 的计划,对于宏大的业务我的项目有个很蛋疼的问题,那就是 json 文件的保护。每次产品迭代都须要减少新的配置,那么这份配置由谁来保护,怎么保护,都会有很多问题,而且如果你的我的项目要反对几十个国家的语言,那么这几十份文件又怎么保护。 所以当初大厂比拟罕用的计划是,应用 AST,每次开发完新版本,通过 AST 去扫描所有的代码,找出代码中的中文,以中文为 key,调用智能翻译服务,去帮我的项目主动生成 json 文件。这样,再也不须要人为去保护 json 文件,所有都依赖工具进行自动化。目前曾经有大厂开源,比方滴滴的 di18n,阿里的 kiwi React如何进行代码拆分?拆分的准则是什么?我认为 react 的拆分前提是代码目录设计规范,模块定义标准,代码设计规范,合乎程序设计的个别准则,例如高内聚、低耦合等等。 在咱们的react我的项目中: 在 api 层面咱们独自封装,对外裸露 http 申请的后果。数据层咱们应用的 mobx 封装解决异步申请和业务逻辑解决。试图层,尽量应用 mobx 层面的传递过去的数据,批改逻辑。动态类型的资源独自搁置公共组件、高阶组件、插件独自搁置工具类文件独自搁置React中在哪捕捉谬误?官网例子: class ErrorBoundary extends React.Component { constructor(props) { super(props); this.state = { hasError: false }; } static getDerivedStateFromError(error) { // 更新 state 使下一次渲染可能显示降级后的 UI return { hasError: true }; } componentDidCatch(error, errorInfo) { // 你同样能够将谬误日志上报给服务器 logErrorToMyService(error, errorInfo); } render() { if (this.state.hasError) { // 你能够自定义降级后的 UI 并渲染 return <h1>Something went wrong.</h1>; } return this.props.children; }}应用 ...

September 19, 2023 · 3 min · jiezi