关于前端:ts类型定义记录

<article class=“article fmt article-content”><h2>Record</h2><blockquote>Record用来定义对象的键和值的类型,也就是<code>key</code>和<code>value</code>。</blockquote><pre><code class=“ts”>// 上面用Record定义了一个对象,键string类型,值为any类型。type query = Record<string, any>;const params: query = { name: ‘Duo’, age: 10, desc: undefined, children: [], target: null,}</code></pre><h2>枚举</h2><pre><code>type Page = “home” | “about” | “contact”;// pageName为Page枚举类型,其值只能为home\about\contact三者其一。const pageName: Page = ‘home’;</code></pre><p>枚举也能够与<code>Record</code>组合应用</p><pre><code>type Page = “home” | “about” | “contact”;// 此时,pages的key只能为home\about\contact三者其一。const pages : Record<Page, string> = { home: ‘首页’,}</code></pre><h2>定义React组件</h2><h3>函数申明</h3><pre><code class=“tsx”>interface TitleProps { name: string;}function Title({ name }: TitleProps) { return ( <div className=“container”> {name} </div> );}</code></pre><h3>函数表达式</h3><pre><code class=“tsx”>import React from ‘react’;interface TitleProps { name: string;}const Title: React.FC<TitleProps> = ({ name }) => ( <div className=“container”> {name} </div>);</code></pre></article> ...

March 5, 2024 · 1 min · jiezi

关于前端:企业如何选择值得信赖的低代码技术平台

<article class=“article fmt article-content”><p>在数字化浪潮的推动下,企业正减速向数字化转型迈进。为了疾速适应市场变动并晋升竞争力,越来越多的企业开始关注低代码技术平台。然而,面对市场上泛滥的低代码平台,企业该如何抉择值得信赖的合作伙伴呢?</p><h2>一、高度的可靠性和稳定性</h2><p>一个值得信赖的低代码技术平台,首先应具备高度的可靠性和稳定性。企业应用是撑持业务运行的要害,任何因平台问题导致的利用故障都可能给企业带来微小的损失。一个优良的低代码平台应通过严格的品质管制和性能测试,确保可能在高并发、大数据量的场景下稳固运行,为企业提供继续、牢靠的技术支持。<br/></p><h2>二、丰盛的性能和灵活性</h2><p>丰盛的性能和灵活性十分重要。企业业务需要千差万别,一个优良的低代码平台应该可能满足企业多样化的利用需要。除了提供根本的拖拽式界面设计、数据模型构建等性能外,平台应该反对多种类型的利用开发,如Web利用、挪动利用、物联网利用等,并且可能轻松集成第三方服务和数据源。此外,平台还应提供丰盛的表单字段和流程节点配置选项,以满足企业复杂多变的业务流程需要。<br/></p><h2>三、扩展性与可定制</h2><p>性随着企业业务的倒退,低代码平台可能须要反对更多的性能和场景。平台应该提供凋谢的API、插件机制和源代码,不便用户依据需要进行二次开发和定制化革新,以便企业可能依据本身业务需要进行灵便定制。同时,平台还应反对与其余企业零碎的集成和协同工作,以实现数据的互通互联。这样,企业不仅可能疾速构建出满足以后需要的利用,还能为将来业务倒退预留足够的扩大空间。<br/></p><h2>四、技术支持与服务</h2><p>值得信赖的低代码技术平台应领有弱小的技术团队和欠缺的售后服务体系。技术是不断进步的,可能紧跟技术潮流,一直进行优化和降级,以满足企业日益增长的技术需要。同时,平台还应提供全方位的售后服务反对,包含技术咨询、故障排查、版本升级等,确保企业在应用过程中可能失去及时、业余的技术支持。<br/></p><h2>五、最初,分享几个低代码实例</h2><p>某能源团体,企业正面临着业务迅速扩张带来的治理挑战。急需一个对立、高效的信息化治理平台来整合各个我的项目的经营数据,晋升管理效率和决策程度。思考到传统软件开发周期长、老本高且不易于依据业务需要进行疾速调整,该企业采纳了JVS低代码平台来搭建信息化治理平台。<br/></p><p>某中型制作企业。他们面临着生产线数据采集和剖析的难题,须要开发一套定制化的生产管理系统。因为企业外部不足业余的开发团队,他们抉择了JVS低代码技术平台进行单干。JVS低代码提供了丰盛的数据模型和可视化剖析工具,使得企业可能轻松构建出满足本身需要的生产管理系统。通过该零碎,企业实现了生产数据的实时采集、监控和剖析,大大提高了生产效率和产品质量。<br/></p><p>某电子产品制作企业,随着业务规模的疾速扩张,日常办公和治理流程逐步变得繁琐,急需一种高效、灵便的形式来优化外部工作流程,晋升管理效率。为了实现这一指标,企业决定引入低代码平台来搭建一套全新的OA(办公自动化)管理系统。在抉择低代码平台时,企业特地重视平台的易用性、稳定性和扩展性。通过深刻调研和比照,他们采纳JVS低代码平台将原有的纸质流程转化为电子流程,大大晋升了审批效率。同时,通过集成各种第三方利用和服务,OA零碎还实现了与企业其余业务零碎的无缝对接,确保了数据的准确性和一致性。<br/></p><p>在线demo:https://frame.bctools.cn<br/>开源框架:https://gitee.com/software-minister/jvs</p></article>

March 5, 2024 · 1 min · jiezi

关于前端:MySQL存储引擎及索引机制

大家好我是咕噜美乐蒂,很快乐又和大家见面了!MySQL 存储引擎是指 MySQL 数据库管理系统中负责存储和检索数据的组件,它们能够影响数据的存储形式、事务反对、并发性能等方面。而索引则是用于减速检索数据库表中数据的数据结构。上面我将别离介绍 MySQL 的常见存储引擎以及索引机制。MySQL 存储引擎 InnoDB特点:提供了对事务的反对,具备较好的并发控制能力和事务安全性,反对行级锁定。实用场景:适宜于须要高并发和事务反对的利用,如大型的在线交易解决零碎。默认存储引擎:从 MySQL 5.5.5 开始成为默认的存储引擎。MyISAM特点:不反对事务,但具备较高的插入和查问速度,适宜于读密集的利用。实用场景:实用于数据仓库、日志剖析等对查问速度要求较高的场景。留神:在 MySQL 5.5 版本后,MyISAM 不再是默认的存储引擎。Memory特点:将数据存储在内存中,速度十分快,但不反对长久化存储,数据库重启后数据失落。实用场景:实用于缓存表、长期表等对速度要求较高、数据不须要长久化的场景。NDB Cluster特点:提供了分布式的集群数据库存储计划,反对高可用、高性能,并提供了事务反对。实用场景:实用于大规模的分布式应用,例如电信畛域的计费零碎等。索引机制在 MySQL 中,索引是用于减速数据检索的数据结构,常见的索引类型包含 B-Tree 索引、哈希索引和全文索引等。B-Tree 索引特点:MySQL 中最常见的索引类型,实用于范畴查找、排序等操作,反对多列联结索引。实用场景:实用于一般的数据检索需要,适宜于 WHERE 条件中有范畴查问的状况。哈希索引特点:适宜于等值查找,不反对范畴查找,查问性能稳固。实用场景:实用于只有等值查问的状况,不适宜范畴查问。全文索引特点:用于全文搜寻,反对对文本内容进行搜寻,能够进行自然语言的全文搜寻。实用场景:实用于须要对文本进行全文搜寻的场景,如博客、新闻等网站的搜寻性能。总结MySQL 存储引擎和索引机制各有特点,抉择适合的存储引擎和索引类型能够依据利用的需要和场景来进行调整和优化,以取得更好的性能和可靠性。在理论利用中,须要依据具体情况进行衡量和抉择,以达到最佳的数据库性能和稳定性。如果您对存储引擎或索引机制有进一步的问题或者须要更多的信息,请随时通知我。好啦,明天美乐蒂就和大家分享到这里啦,小伙伴们有更好的方法能够在评论区打进去哦~~以便大家更不便地操作呢。

March 4, 2024 · 1 min · jiezi

关于前端:Rollup入门学习前端开发的构建利器

<article class=“article fmt article-content”><p>在前端开发畛域,构建工具对于优化我的项目构造和晋升代码效率扮演着至关重要的角色。Rollup作为一款轻量级且功能强大的JavaScript模块打包器,近年来备受开发者青眼。本文将带你走进Rollup的世界,帮忙你疾速入门并把握其外围用法。</p><p><strong>一、Rollup简介</strong></p><p>Rollup是一个玲珑而灵便的JavaScript模块打包工具,专一于ES6模块的打包。与Webpack等其余构建工具相比,Rollup更加轻量级,适宜用于构建库、框架等须要较小体积输入的我的项目。Rollup通过动态剖析的形式,只打包我的项目中理论应用到的代码,从而实现更高效的代码拆分和树摇(Tree Shaking)优化。</p><p><strong>二、Rollup装置与配置</strong></p><p>要开始应用Rollup,首先须要在我的项目中装置它。你能够通过npm或yarn进行装置:</p><pre><code class=“bash”>npm install rollup –save-dev# 或者yarn add rollup –dev</code></pre><p>装置实现后,在我的项目根目录下创立一个名为<code>rollup.config.js</code>的配置文件。该文件用于配置Rollup的打包行为。一个简略的配置示例如下:</p><pre><code class=“javascript”>export default { input: ‘src/main.js’, // 入口文件 output: { file: ‘dist/bundle.js’, // 输入文件 format: ‘cjs’ // 输入格局,可选值为’amd’、‘cjs’、’esm’、‘iife’、‘umd’等 }, plugins: [] // 插件列表,能够在此处配置各种插件来扩大Rollup的性能};</code></pre><p><strong>三、Rollup的根本用法</strong></p><p>配置好Rollup后,就能够开始应用它来打包你的我的项目了。在命令行中运行以下命令:</p><pre><code class=“bash”>npx rollup -c# 或者如果你曾经将Rollup增加到了我的项目的devDependencies中,能够间接应用npm run rollup -c# 如果你在package.json中配置了相应的scripts字段,也能够应用npm run build</code></pre><p>Rollup将依据配置文件中的设置,将入口文件及其依赖打包成指定的输入文件。你能够通过批改配置文件中的<code>input</code>和<code>output</code>字段来指定不同的入口文件和输入格局。</p><p><strong>四、Rollup的插件零碎</strong></p><p>Rollup的弱小之处在于其丰盛的插件零碎。通过装置和配置不同的插件,你能够实现代码压缩、Babel转译、CSS解决等多种性能。例如,要应用Babel转译ES6+代码,你能够装置<code>@rollup/plugin-babel</code>插件:</p><pre><code class=“bash”>npm install @rollup/plugin-babel @babel/core @babel/preset-env –save-dev</code></pre><p>而后在配置文件中增加该插件:</p><pre><code class=“javascript”>import babel from ‘@rollup/plugin-babel’;export default { // …其余配置… plugins: [ babel({ presets: [[’@babel/preset-env’, { targets: { browsers: [’> 1%’, ’last 2 versions’] } }]] }) ]};</code></pre><p>这样,Rollup就会在打包过程中主动调用Babel进行代码转译。相似地,你能够依据须要装置和应用其余插件来扩大Rollup的性能。</p><p><strong>五、总结</strong></p><p>Rollup作为一款轻量级且功能强大的前端构建工具,通过动态剖析和插件零碎提供了高效的代码打包和优化能力。通过本文的介绍,置信你曾经对Rollup有了初步的理解,并把握了其根本的装置、配置和应用办法。在将来的前端开发中,无妨尝试将Rollup利用到你的我的项目中,享受它带来的便捷和高效吧!</p><p>本文由mdnice多平台公布</p></article> ...

March 4, 2024 · 1 min · jiezi

关于前端:如何将合作伙伴变为增长引擎与PartnerShare一起破译增长密码

<article class=“article fmt article-content”><p></p><p> <br/>在这个由连贯构筑成就的时代,一个人的力量渺小,一群人的力量却能够撼动世界。这种个体力量的概念不仅仅实用于动漫或电影中的超级英雄联盟,它也实用于事实世界中企业的增长策略。</p><p>疾速变动的市场需求催生全新的单干策略,<strong>PartnerShare </strong>即是答案——连贯搭档,共享资源,集成增长。PartnerShare 提倡强联盟,落实<strong>全员参加</strong>和<strong>全民营销</strong>,赋能企业迈向共创共赢。</p><p></p><p> </p><h2><strong>| PartnerShare是什么?</strong></h2><p> </p><p></p><p> <br/><strong>PartnerShare</strong> 是<strong>国内首家</strong>针对SaaS产品而推出的合作伙伴关系治理平台(PRM),旨在帮忙SaaS产品轻松治理和扩大其合作伙伴网络,让产品方与合作伙伴<strong>零碎建联、追踪推广体现</strong>。借助PartnerShare零碎,帮忙SaaS产品为其合作伙伴制订激励人心的处分政策、并实现反对随时随地申请现金提现的流程,让推广带来的支出增长可视化。<br/> </p><h3><strong>· 传统的合作伙伴治理形式存在的弊病</strong></h3><p>1.<strong>奖金领取效率低</strong>:个别企业无奈给集体推广者进行推广结算领取,只能企业与企业对公打款。</p><p>2.<strong>推广数据与处分机制信息不清晰</strong>:传统的管理模式可能无奈实现信息与数据的即时共享,导致合作伙伴之间的信息不通明,单干成果不现实。</p><p>3.<strong>过分依赖本地文档</strong>:依赖纸质文档或本地电子文档来治理和追踪与合作伙伴的关系、协定、交易等重要信息,管理效率低下。</p><p>4.<strong>互信缺失</strong>:在传统的单干模式中,可能短少建设互信的机制,以致单干单方在利益调配、指标一致性等方面产生分歧。</p><p>5.<strong>决策艰难</strong>:传统的合作伙伴治理形式通常不足数据反对,企业难以依据合作伙伴的绩效和市场趋势做出精确的决策。这可能导致资源分配不合理,影响企业的业务增长。<br/> </p><h4><strong>· PartnerShare——SaaS品牌合作伙伴营销引领者,助力突破增长瓶颈</strong></h4><p>PartnerShare是专为SaaS打造的自动化举荐处分跟踪零碎,利用PartnerShare帮忙您优化合作伙伴打算以推动可预测的支出,能够帮忙企业实现业务增长、市场拓展和品牌塑造!<br/> <br/><strong>在PartnerShare解锁多种SaaS推广分销场景</strong><br/>在PartnerShare的反对下,您的合作伙伴生态系统将为您带来有限的客户。</p><p></p><p><strong>1.联盟打算-Affiliate Program</strong></p><p>建设一个独自的登录门户,与有影响力的网络推广者、意见首领(KOL)建立联系,让他们轻松获取推广链接并统计推广成果,灵便提取推广所得佣金。</p><p> </p><p></p><p><strong> 2.老带新打算-Referral Progam</strong></p><p>与咱们的API买通对接,将“举荐打算”<strong>内嵌在您的产品利用端内</strong>,激活您现有的虔诚用户,不需从新登录三方利用,即可让您的用户参加推广并赚取现金等处分。</p><p> <br/><strong>PartnerShare外围性能解码,为品牌提供一种更简化的销售形式</strong><br/>借助PartnerShare零碎,仅<strong>一个工程师月付薪资</strong>,<br/>即可<strong>享受全年性能+经营反对</strong><br/> </p><p></p><p> <br/>与传统的PRM平台不同,PartnerShare不仅仅是一个平台,更是一种策略,一个您与合作伙伴独特成长的生态系统。</p><ol><li><strong>委托代付奖励金</strong>:品牌主能够委托PartnerShare代付处分给合作伙伴,反对多种提现形式,如支付宝、PayPal等。</li><li><strong>推广治理</strong>:将推广数据根据设定好的推广规定主动归因、数据分析。并且能够与品牌主用户体系买通(无感登录),充沛让本人既有的用户快捷退出到推广打算中。</li><li><strong>主动降级合作伙伴的处分规定</strong>:品牌主能够通过PartnerShare的触发器性能进行主动升级合作伙伴,依据设定的门槛主动实现升级。</li><li><p><strong>推广市场</strong>:品牌主能够在PartnerShare上线产品,向潜在客户进行宣传和推广,进步品牌知名度和曝光量。合作伙伴能够认领产品,退出推广打算中,赚取佣金处分。<br/> <br/>这些性能能够帮忙品牌主进步市场占有率和竞争劣势,同时让合作伙伴扩充单干支出。<br/> <br/> </p><h2><strong>| 口头号召</strong></h2><p>PartnerShare作为业界当先的伙伴关系治理平台,深受寰球泛滥知名企业和客户的信赖。</p></li></ol><p>平台为企业提供了与合作伙伴建设严密、高效关系的工具,通过数据驱动的洞察和智能激励机制,泛滥企业曾经实现了合作伙伴营销的新冲破。他们都在PartnerShare的帮忙下找到了现实的合作伙伴,实现了业务增长和品牌晋升。<br/> </p><p></p><p>······<br/> <br/>如果您正困扰如何优化合作伙伴治理,晋升业务增长,那么抉择PartnerShare零碎,才是最佳的解决方案!根底版、商业版、企业版任您抉择。具体戳价格计划<br/>如果您正困扰如何优化合作伙伴治理,晋升业务增长,那么抉择PartnerShare零碎,才是最佳的解决方案!<br/>感兴趣的话,能够拜访PartnerShare联盟零碎官方网站理解更多详情,或间接分割咱们的客服人员。<br/> </p><p></p><p> <br/>抉择PartnerShare<br/>让您的合作伙伴营销更具创意和效率<br/>开启企业增长的新篇章!</p></article>

March 4, 2024 · 1 min · jiezi

关于前端:h5登录

可参考(https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html)一、用测试appid1、获取一个测试的appid:https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=sho... (1)扫码测试号二维码,关注公众号 (2)点击网页帐号性能的网页受权用户信息权限进行批改,把本地拜访我的项目门路填写进去,如下:2、判断以后未登录,再执行以下代码第一次执行是获取code,第二次执行是拿到code调用登录办法二、用正式appid 1、把h5登录办法中appid换成你微信公众平台的公众号appid, 2、在以下图片展现地位中写下你线上拜访h5的域名,和本地拜访h5的门路:就像用测试appid的第二点那样(用来本地调试正式appid),

March 4, 2024 · 1 min · jiezi

关于前端:WebRTC拍摄在车主认证中的实现

<article class=“article fmt article-content”><h2>相干介绍</h2><h3>车主认证我的项目背景</h3><p>车主认证主体是以H5模式存在的,目前投放在多端,包含:哈啰App、车主App、货运车主App、支付宝小程序、微信小程序、H5外投页面,存在多端场景调用拍摄能力的需要。</p><p>存在问题:</p><ul><li>多平台适配<br/>确保拍摄性能在各个平台上有良好的适配,包含哈啰App、车主App、货运车主App、支付宝小程序、微信小程序和H5外投页面。</li><li>小程序兼容性<br/>对于支付宝小程序和微信小程序,要确保拍摄性能在小程序环境下可能失常调用。支付宝小程序目前借助小程序自身的拍摄能力,然而微信未提供视频拍摄计划。</li><li>外投页面兼容性<br/>对于H5外投页面,可能会面临不同浏览器和设施的兼容性挑战。确保在各种浏览器中都可能失常加载和运行。</li></ul><h3>WebRTC简介</h3><p>WebRTC (Web Real-Time Communications) 是一项实时通信技术,在不借助两头媒介的状况下,建设浏览器之间点对点(Peer-to-Peer)的连贯,是一组用于在Web浏览器和挪动应用程序中实现实时通信的凋谢规范和协定。它容许浏览器和应用程序之间通过简略的API实现音频、视频和数据的实时传输。</p><p>WebRTC 的典型利用场景包含实时视频通话、视频会议、屏幕共享、音视频录制等。</p><p>WebRTC次要蕴含以下三个外围模块:</p><ul><li>getUserMedia: 用于获取用户的音频和视频流。次要利用在视频和音频录制、视频通话和音频通话、在线会议和近程合作、人脸识别和图像处理等。</li><li>RTCPeerConnection: 用于建设点对点的连贯,反对实时的音频和视频传输。次要利用在实时音视频通话、视频会议、屏幕共享等。</li><li>RTCDataChannel: 用于在两个对等体之间传输任意数据。次要利用在文件传输、实时游戏、即时消息、协同编辑、近程管制等。</li></ul><p>因为其 API 的多样,针对不同的场景,其余贡献者们做了无效封装,recordRTC 就是其中一个。 其基于WebRTC的 getUserMedia API 实现媒体设施拜访, 并对 WebRTC提供的视频流函数进行了封装, 使开发者能够简略函数调用就能实现视频录制。</p><p>本计划的实现借助了WebRTC和RecordRTC的图像采集以及媒体数据流(getUserMedia)的控制能力,WebRTC的外围还包含实时传输、平安传输等等,有趣味的同学能够自行理解。</p><h3>recordRTC简介</h3><p>recordRTC 是一个 JavaScript 库,提供了一些用于录制媒体流(如音频、视频)的性能。 基于 WebRTC 的 getUserMedia API,利用这一API,它能够获取用户的音频和视频流。以下是 recordRTC 利用 getUserMedia 提供的次要能力:</p><ul><li>获取摄像头和麦克风的拜访权限: 通过 getUserMedia,recordRTC 能够申请用户授予对摄像头和麦克风的拜访权限。用户能够抉择容许或回绝这些权限。</li><li>获取媒体流: getUserMedia 返回一个代表用户摄像头和麦克风的媒体流对象。这个媒体流蕴含实时的音频和视频数据。</li><li>媒体流的配置: 通过 getUserMedia 的配置参数,recordRTC 能够指定获取的媒体流的个性,例如抉择前置或后置摄像头、指定视频分辨率、抉择音频输出设施等。</li><li>实时预览: getUserMedia 容许在获取媒体流后进行实时的音视频预览。</li><li>动静更新媒体流: getUserMedia 提供了一些办法,在运行时能够动静更新媒体流的配置,例如切换摄像头、更改分辨率等。</li></ul><p>反对的浏览器:</p><p></p><p>罕用参数:</p><ul><li>type: 承受 video or audio or canvas or gif</li><li>recorderType: 承受 MediaStreamRecorder or StereoAudioRecorder or WhammyRecorder or GifRecorder</li><li>timeSlice: 承受一个毫秒数; 用它来强制基于距离的blob</li><li>ondataavailable: 将此函数与timeSlice一起传递以获取基于距离的blob</li><li>bitsPerSecond: 每秒比特数; 实用于音频和视频的轨道</li><li>audioBitsPerSecond: 每秒比特数; 只实用于音频轨道</li><li>videoBitsPerSecond: 每秒比特数; 只实用于视频轨道</li><li>disableLogs: 承受 true or false; 用它禁用console的日志输入</li><li>frameInterval: 承受一个毫秒数</li><li>previewStream: 是 MultiStreamRecorder 的回调办法</li><li>video: 承受一个相似对象: {width: 320, height: 240}</li><li>canvas: 承受一个相似对象: {width: 320, height: 240}</li></ul><p>办法:</p><ul><li>startRecording(): 启动录制过程。调用此办法将开始捕捉媒体流,并开始录制音频或视频。</li><li>stopRecording(callback): 进行录制过程。能够传递一个回调函数,用于在录制实现后处理录制的数据。</li><li>getBlob(): 获取录制数据的 Blob 对象。能够通过此办法获取录制的音频或视频数据。</li><li>pauseRecording(): 暂停录制。能够在录制过程中调用此办法以暂停录制。</li><li>resumeRecording(): 复原录制。在暂停录制后,能够调用此办法以复原录制过程。</li><li>clearRecordedData(): 革除录制的数据。</li><li>getDataURL(callback): 获取录制数据的 Data URL。通过回调函数获取录制的音频或视频数据的 Data URL。</li><li>setRecordingDuration(milliseconds): 设置录制的时长。能够通过此办法设置录制的最大时长,录制达到指定时长后会主动进行。</li></ul><h2>WebRTC拍摄具体实现</h2><h3>拍摄流程</h3><p></p><h3>具体实现</h3><h4>装置:</h4><p>装置 recordrtc 库,引入 RecordRTCPromisesHandler 类,用于解决WebRTC的视频录制。</p><pre><code>npm install recordrtcimport { RecordRTCPromisesHandler } from ‘recordrtc’;</code></pre><h4>应用:</h4><p>在车主认证我的项目中,将操作js拍摄化封装为一个 video-recorder 组件,在组件外部解决办法调用。</p><p>具体实现步骤大略分为3局部:</p><ul><li>初始化:获取拍摄设施和配置信息;</li><li>拍摄:应用 RecordRTCPromisesHandler 的实例化对象提供的办法;</li><li>上传:视频上传到阿里云OSS,并且进行回显。</li></ul><h5>初始化:</h5><p></p><p>因为目前手机存在多个后置摄像头场景,如果获取到的是广角或者桌面视角摄像头,则会有体验问题,所以在初始化时,将所有后置摄像头全副获取,能够让用户通过 Picker 进行抉择。</p><p></p><p></p><p>getVideoConstraints办法,获取后置拍摄设施配置列表。</p><pre><code>async getVideoConstraints() { let deviceId = ‘’; // 只有第一次时须要遍历镜头列表 if (!this.activeCamera) { // 获取所有设施列表 const deviceList = await navigator.mediaDevices.enumerateDevices(); // 过滤出视频输出设施列表 const videoDeviceList = deviceList.filter((deviceInfo) => deviceInfo.kind === ‘videoinput’).reverse(); // 发送视频设施列表到父组件 this.$emit(‘output-list’, videoDeviceList); // 遍历视频输出设施列表 for (const device of videoDeviceList) { // 获取特定设施的视频流 const stream = await navigator.mediaDevices.getUserMedia({ video: { deviceId: device.deviceId, }, audio: false, }); // 查看摄像头是否为环境(后置)摄像头 const isEnvironment = stream.getVideoTracks()[0].getSettings().facingMode === ’environment’; // 进行获取的视频流上的所有轨道,开释资源 stream.getTracks().forEach((track) => { track.stop(); }); // 如果是环境(后置)摄像头,则记录设施ID,并跳出循环 if (isEnvironment) { deviceId = device.deviceId; break; } } } // 设置视频束缚 const result: MediaTrackConstraints = { frameRate: { ideal: 6, max: 10 }, width: this.env.isAndroid ? { ideal: 960, min: 480, max: 960 } : { ideal: 480, min: 480, max: 960 }, height: this.env.isAndroid ? { ideal: 1280, min: 640, max: 1280 } : { ideal: 640, min: 640, max: 1280 }, facingMode: ’environment’, deviceId: this.activeCamera ? this.activeCamera.deviceId : deviceId, aspectRatio: 3 / 4, }; if (!deviceId && !this.activeCamera) { delete result.deviceId; } // 返回视频束缚 return result;}</code></pre><h5>拍摄:</h5><p>点击录制按钮,通过调用 recorder 对象的 startRecording 办法来开启视频录制。</p><pre><code>async record() { if (this.recorder) { await this.recorder.startRecording(); this.isRecording = true; }}</code></pre><p>在开启录制后,倒计时5s,进行录制,调用 recorder 对象的 stopRecording 进行拍摄,通过 getBlob() 办法获取录制的 Blob对象,肯定要在进行录制之后获取 Blob 对象,否则可能获取的Blob数据有问题。</p><pre><code>// 开始倒计时 startTimer() { if (this.timerText > 1) { this.recording = true; this.timerText -= 1; setTimeout(() => { this.startTimer(); }, 1000); } else { this.resetTimer(); } }// 倒计时完结后重制 resetTimer() { if (this.$refs.videoRecorder) { this.$refs.videoRecorder.stop(); } this.recording = false; this.btnImgUrl = btnImgUrlMapper.DEFALUT; this.timerText = 6; }// 进行拍摄并且上传文件 async stop() { if (this.recorder) { await this.recorder.stopRecording(); this.isRecording = false; this.uploadFile(); } }// 获取视频流 async uploadFile() { const video = await this.recorder.getBlob(); this.$emit(‘recorded’, { video, }); }</code></pre><h5>上传:</h5><p>视频上传是应用 aliyun 的 oss,在获取到 上传视频的 Blob 对象之后,上传到 aliyun 进行存储,通过返回的文件名 videoRes.name 获取视频的预览Url,跳转到Ocr辨认页,进行Ocr辨认。</p><p></p><p>(本文作者:佟健)</p><p></p></article> ...

March 4, 2024 · 2 min · jiezi

关于前端:API接口通过关键词搜索商品数据获取海量优质商品只需要一步

通过API接口,的确能够通过关键词搜寻获取海量优质商品数据。这一过程不仅进步了数据获取的效率,还可能为数据分析和商业决策提供强有力的反对。以下是利用API接口进行关键词搜寻商品数据的一些要害劣势: 疾速检索:用户能够通过输出关键词,疾速获取到与之相干的商品列表,大大提高了购物效率。精准匹配:API关键词搜寻可能依据用户的搜寻用意,智能匹配最合适的商品,进步了搜寻后果的准确性。个性化举荐:基于用户的搜寻历史和偏好,API能够为用户提供个性化的商品举荐,加强购物体验。晋升用户体验:用户能够通过简略的关键词输出,疾速找到所需商品,缩小了浏览和筛选的工夫老本。技术支持:多个电商平台如淘宝、京东等提供了丰盛的API接口,用于查问商品信息,包含商品题目、价格、销量、评估等要害数据。编程实现:开发者能够利用编程语言如Python,联合电商平台提供的API文档,编写代码来实现自动化的商品搜寻和数据获取。数据处理:获取到的商品数据通常为JSON格局,便于开发者解析、存储和利用在各种场景中。监控与保护:定期更新和保护采集策略,确保数据的时效性和准确性,同时监控零碎性能和解决异常情况。法律法规恪守:在应用API接口时,必须恪守相干的法律法规和平台规定,尊重数据所有者的权利。安全性保障:爱护好API密钥和采集到的数据,避免泄露给未经受权的第三方。综上所述,利用API接口通过关键词搜寻商品数据是一个高效且罕用的办法,它可能帮忙开发者或企业疾速获取商品的全面信息。

March 4, 2024 · 1 min · jiezi

关于前端:应用方案-内置ALC的音频前置放大器D2538A和D3308芯片

<article class=“article fmt article-content”><p>一、应用领域 D2538A和D3308是芯谷科技推出的两款内置ALC(音频限幅器)的前置音频放大器芯片,其中D2538A为单通道,D3308为双通道,它特地实用于胎心仪、集体医疗防护、立体声收录机、盒式录音机等波及音频放大与限幅的产品计划。二 、性能介绍 音频前置放大器的性能是把前级输出的音频信号或话筒采集的声音信号进行适当放大,而后作为后级电路的输出信号,这里的信号放大幅度在保障尽量不失真的前提下必须有肯定的限度,能力使后级电路工作在预设的失常范畴内,而ALC音频前置放大器能够使幅度较高的信号不会被始终线性放大。如果自身幅度就比拟高的音频信号放大倍数依然太高的话会至多呈现两个问题:1、信号呈现重大削顶失真;2、后级电路可能因为输出信号幅度太高而工作异样,比方声音太大、重大失真、喇叭损坏、功放芯片工作异样或损坏等。 D2538A和D3308具备音频放大器作用的同时,还内置了ALC电平管制性能,能够实现当输出信号幅度太大的时候,仍能放弃预设的最高输入电平在极低失真的前提下稳固输入,进而保障后级电路的输出信号在预设的幅度范畴内。三、根本个性<br/><br/>四、引脚信息1、D2538A引脚信息<br/></p><p></p><p></p><p><br/> 2、D3308引脚信息<br/></p><p><br/>引出端性能符号(括号内为SOP14的管脚号)<br/><br/>五、参考设计1、D2538A参考设计<br/><br/>2、D3308参考设计<br/></p></article>

March 4, 2024 · 1 min · jiezi

关于前端:什么是编程语言里的-Tag-Interface

<article class=“article fmt article-content”><p>在深入探讨编程语言中的 <code>tag interface</code> 概念之前,咱们须要明确一个前提:编程语言和软件开发的畛域里,充斥了各种设计模式和概念,它们旨在解决特定类型的问题。<code>Tag interface</code>,也称为标记接口,是这些概念中的一个,只管它在表面上仿佛并不简单,但深刻了解其背地的设计哲学和利用场景对于软件开发者而言是十分重要的。</p><p><code>Tag interface</code> 实质上并不提供任何办法实现,它是一个空接口。你可能会问,一个不蕴含任何办法的接口有什么用呢?实际上,<code>tag interface</code> 的作用并不在于它须要被实现的办法,而在于它为实现类提供了一种标识。这种标识能够被其余代码查看,以确定某个对象是否具备某些个性,或者是否能够进行某些操作。</p><p>举一个经典的例子来阐明 <code>tag interface</code> 的用处:在 Java 编程语言中,<code>Serializable</code> 接口就是一个典型的 <code>tag interface</code>。<code>Serializable</code> 接口自身并不蕴含任何办法,然而如果一个类实现了这个接口,这个类的对象就能够被序列化——也就是说,它们能够被转换为一系列的字节,而后这些字节能够被存储或者通过网络传输到另一个零碎上,最初在那里被反序列化,从新组装成原始对象。</p><p>为什么会抉择应用 <code>tag interface</code> 呢?这背地有几个理由。首先,它是一种类型平安的机制。通过显式地让类实现 <code>tag interface</code>,开发者能够在编译时刻就确保某些操作(比方序列化)只会利用于那些的确能够反对这些操作的对象上,这样就防止了运行时的谬误。其次,<code>tag interface</code> 也是一种轻量级的设计抉择,因为它们不强制类去实现任何办法,所以不会减少实现类的累赘。</p><p>在理论利用中,<code>tag interface</code> 的概念并不限于 Java。许多其余的编程语言和框架也采纳了相似的设计模式,以标记接口的模式来提供运行时的类型信息,从而使得代码更加灵便、可扩大。例如,在一些古代的编程语言中,尽管具体的实现形式和术语可能有所不同,但其核心思想——应用一种机制来标记类,并据此使得代码可能在运行时做出决策——是类似的。</p><p>除了 <code>Serializable</code>,还有其余一些 <code>tag interface</code> 的例子。例如,在 Java 中,<code>Cloneable</code> 接口标识一个对象是能够被克隆的,即能够创立一个字段内容完全相同的新对象。只管 <code>clone</code> 办法定义在 <code>Object</code> 类中,但只有实现了 <code>Cloneable</code> 接口的类才不会在调用 <code>clone</code> 办法时抛出 <code>CloneNotSupportedException</code>。</p><p>在设计 <code>tag interface</code> 时,也存在一些争议和考量。一方面,<code>tag interface</code> 提供了一种简略无效的形式来利用类型零碎进行某些操作的安全检查。另一方面,随着工夫的推移和编程语言个性的倒退,一些开发者和语言设计者开始偏向于应用注解(annotations)来代替 <code>tag interface</code>。注解提供了更大的灵活性和更丰盛的元数据表示能力,但同时也须要更简单的解决逻辑,比方通过反射来查看注解。</p><p>无论是应用 <code>tag interface</code> 还是注解,抉择哪一种形式取决于具体的利用场景、语言个性以及开发者的偏好。在一些状况下,<code>tag interface</code> 因其简略性和类型平安的特点而被优先选择;而在其余状况下,注解的灵活性和可能携带更多信息的个性可能更加受到青眼。</p><p>总结起来,<code>tag interface</code> 在软件开发中是一个简略却极其弱小的概念。通过为对象提供一种类型级别的标记,它们使得咱们可能编写出既类型平安又灵便的代码。尽管随着技术的倒退,新的模式和概念可能会呈现,但 <code>tag interface</code> 作为一种设计模式,其背地的思维——即通过最小的语言构造来实现类型的标记和辨认——依然具备宽泛的利用价值。在面对特定的编程挑战时,理解并正当利用 <code>tag interface</code> 能够帮忙开发者更加高效地解决问题,编写出更加强壮、可保护的软件系统。</p></article>

March 4, 2024 · 1 min · jiezi

关于前端:防御性编程真的可以防止被裁吗

部门缺人,前端后端测试岗,base深圳/西安/北京:jinshuju.net/f/o38ijj 疫情之后,大环境始终很低迷,互联网也未幸免,于是,很多公司相继“开猿节流”,可怜的程序猿惶恐不安... 接着,戏剧性的一幕产生了,国内的互联网大厂相继呈现“降本见笑”的名局面,首先暴雷的是阿里云,事变起因:底层服务组件故障... 随后,滴滴又崩了,不晓得那个晚上有多少打工人早退..... 于是,很多人开始调侃“干活的人裁得太多了,都是老板造成的”。做技术的都分明,服务器的稳定性不可能达到100%这种现实状态,因而,调侃诚然有戏虐,但不乏真实性,很多技术岗位平时看起来并不起眼,关键时刻就能体现出他们的价值,而这个“关键时刻”的代价有时候会比拟大。 最初,防御性编程一语双关的梗就润物细无声地传遍了各大技术论坛和网站... 防御性编程本意是指为了代码和零碎的平安,特意在代码中减少了一些晋升代码品质的保障,比方:参数校验,平安校验等等。 而特定环境下,防御性编程就呈现了另一层含意:报复性编程,为了避免被裁,代码被动了手脚,只有自己能力保护。 防御性编程,绝大部分是主观产生的,比方代码中呈现的 bug,但也存在着主观性,常见的一些形式有: 代码不加正文命名间接应用a,b,c等等毫无含意的变量,大大增加了代码保护的难度;代码构造被毁坏,函数间接随便的互相调用,极大的毁坏高内聚低耦合;代码预留后门;BUT,作为技术人员,小L感觉,做人肯定要有本人的职业操守,千万不要违法乱纪,主观性的“防御性编程”,轻则造成线上事变,对公司造成经济损失,重则守法,切莫踩红线。

March 4, 2024 · 1 min · jiezi

关于前端:支付宝小程序入门学习之一如何创建支付宝小程序并在手机上预览

<article class=“article fmt article-content”><p>创立链接:<br/>https://open.alipay.com/develop/mini/create?bundleId=com.alip…</p><p>给小程序取一个名字,我取名 <code>jerrydemo</code>,因为仅仅用于开发用处:<br/></p><p>收到提醒音讯:</p><blockquote>名称过于宽泛,审核时可能被驳回,倡议换一个名称重试,示例:地区+商标/企业名称的关键字+类目(如:杭州之意女装等)。若你有该名称的证实材料,请在“名称辅助材料”上传。证实材料要求详见文档</blockquote><p>这个不要紧,因为只是用来学习小程序开发流程。</p><p>商家账号,抉择本人的支付宝账号就行了。<br/></p><p>而后进入上面的页面:<br/></p><p>我抉择应用云服务,开发工具应用低代码。</p><p></p><p>迭代模式抉择,因为我是老手,所以抉择全流程模式:</p><p></p><p>而后进入这个控制台:<br/>https://open.alipay.com/develop/devops/iteration?iterationKey…</p><p>先去开明云开发环境:<br/></p><p>提醒我须要到支付宝小程序云平台注册:<br/></p><p>小程序云的控制台:https://cloud.alipay.com/main/console</p><p>注册账号之后,立刻应用的按钮就能够点击了。</p><p></p><p>来到上面这个界面,点击新建环境:</p><p></p><p>对于小程序学习人员来说,应用云开发免费版就足够了。</p><p></p><p>确认开明:<br/></p><p></p><p>之后能够通过上面的 url 拜访这个云环境了:</p><p>https://cloudbase.cloud.alipay.com/console/2021004136677040/env</p><p></p><p>而后回到迭代控制台,点击<code>低代码开发</code>的去开发超链接:</p><p></p><p>进入到这个低代码编辑页面。点击 <code>增加组件</code> 按钮:<br/></p><p>增加一个Text 文本控件,把文本属性设置成 Hello World:</p><p></p><p>而后点击保留和预览按钮,会弹出一个二维码,用本人的支付宝扫描,就能在手机上,看到第一个小程序的外观了,是不是很有成就感呢?<br/></p><p></p></article>

March 4, 2024 · 1 min · jiezi

关于前端:JavaScript之structuredClone现代深拷贝

在JavaScript中,实现深拷贝的形式有很多种,每种形式都有其长处和毛病。明天介绍一种原生JavaScript提供的structuredClone实现深拷贝。 上面列举一些常见的形式,以及它们的代码示例和优缺点: 1. 应用JSON.parse(JSON.stringify(obj))代码示例: function deepClone(obj) { return JSON.parse(JSON.stringify(obj));}长处:简单易行,对于大多数对象类型无效。 毛病:不能复制原型链,对于蕴含循环援用的对象可能呈现问题。比方以下代码: const calendarEvent = { date: new Date()}const problematicCopy = JSON.parse(JSON.stringify(calendarEvent))最终失去的date不是Data对象,而是字符串。 { "date": "2024-03-02T03:43:35.890Z"}这是因为JSON.stringify只能解决根本的对象、数组。任何其余类型都没有按预期解决。例如,日期转换为字符串。Set/Map只是转换为{}。 const kitchenSink = { set: new Set([1, 3, 3]), map: new Map([[1, 2]]), regex: /foo/, deep: { array: [ new File(someBlobData, 'file.txt') ] }, error: new Error('Hello!')}const veryProblematicCopy = JSON.parse(JSON.stringify(kitchenSink))最终失去如下数据: { "set": {}, "map": {}, "regex": {}, "deep": { "array": [ {} ] }, "error": {},}2. 应用递归代码示例: ...

March 4, 2024 · 1 min · jiezi

关于前端:知识目录

<article class=“article fmt article-content”><p>1、Excel队列导出<br/>https://juejin.cn/post/7259249904777838629</p></article>

March 4, 2024 · 1 min · jiezi

关于前端:记录一次自己的服务器迁移过程

记录一次本人的服务器迁徙过程记录一次本人的服务器迁徙过程 前言目前我的项目的部署形式开始迁徙 提前准备设置平安组开始初始化装置 docker尝试部署数据库迁徙结尾一些问题 为什么两头没有配置 https?对于数据库备份前言最近阿里云动员了史上最大力度价格战,自称均匀提价超20%。 而我,作为一只哪家便宜,就买哪家的三姓家奴。趁着提价,悻悻然又买了一台阿里云 ECS ,打算用来承接本人一台快过期的 华为云 HECS 的服务。 侥幸的是,我这个服务外面,所有的组件早已容器化,业务镜像也早曾经应用了公有镜像仓库,所以迁徙起来还是很容易的。 让咱们立即开始吧! 目前我的项目的部署形式目前这个我的项目,次要是由多个 Github 公有仓库组成,外面次要有多个后端业务仓库和 1 个部署文件仓库。 其中部署文件仓库,会在指标服务器上进行拉取,并进行部署。同时所有的数据卷,以及日志等等文件,都会写在这个目录内。而那些后端业务仓库,外面实际上就都是一些业务逻辑啥的,CRUD数据库,搞搞 Redis 罢了。 值得一提的是,这些业务仓库都应用了 Github Action 来主动构建镜像,并推送到公有镜像仓库。 其中,我应用 git sha 作为镜像的 Tag,同时在推送实现之后,它们都会触发部署文件仓库的 Action,去批改部署时的环境变量文件。 这样只有每次在服务器上 git pull,拿到的就都是最新版本的镜像了(还能通过备份 tag 来做回滚)。 大略的流程如下图所示: 另外值得一提的是,之前在华为云部署的时候,原本能好好的拉取 Github 的,起初因为网络起因,一段时间后莫名其妙不能了。 起初我就把那个 部署文件仓库,同时同步到我的 gitee 公有仓库,这样就不会呈现拉取失败的问题了。 开始迁徙提前准备首先咱们购买好一台 阿里云 ECS,抉择你最相熟最喜爱的零碎镜像,设置你的专有网络和交换机,而后配置一下你的登陆凭证,下载私钥,付钱即可。 这里我把专有网络,设置在了我的函数计算 FC 网络内,这样当前部署 serverless 函数,就能在内网里,调用服务器资源了。而后到 ECS 控制台进行近程登录,这里我发现阿里云竟然有 Mac arm64 的客户端能够下载,而华为云的 CodeArt 只反对 Win,于是就下载安装了客户端: 装置好了之后,间接通过 ssh 链接服务器,用起来还是挺不便的,还能做文件的治理。 设置平安组而后 ssh 链接服务器,发现连不上,原来是服务器所在的平安组,并没有把端口放进去。 ...

March 3, 2024 · 1 min · jiezi

关于前端:Flex-布局学习总结对齐方式

一、Flex布局是什么Flex布局是一种古代的、弹性的CSS布局模型,个别简称弹性布局,全称为Flexible Box Layout。它提供了一种更加高效、直观的形式来设计、排列和对齐容器中的子元素。Flex布局实用于响应式设计,可能轻松适应不同屏幕大小和设施类型。 二、基本概念容器默认存在两根轴:程度的主轴(main axis)和垂直的穿插轴(cross axis)。主轴的开始地位(与边框的交叉点)叫做main start,完结地位叫做main end;穿插轴的开始地位叫做cross start,完结地位叫做cross end。 我的项目默认沿主轴排列。单个我的项目占据的主轴空间叫做main size,占据的穿插轴空间叫做cross size。 三、配置: 四、容器的对齐形式属性flex-directionflex-wrapflex-flowjustify-contentalign-itemsalign-content4.1 flex-direction该属性决定了 Flex 容器中主轴的方向。主轴是 Flex 我的项目在容器中排列的方向 四个值: row(默认值):主轴为程度方向,终点在左端。row-reverse:主轴为程度方向,终点在右端。column:主轴为垂直方向,终点在上沿。column-reverse:主轴为垂直方向,终点在下沿。 4.2 flex-wrap该属性定义了 Flex 容器中的 Flex 我的项目是否应该换行 nowrap:所有 Flex 我的项目在一行上排列(默认值)。wrap:Flex 我的项目可能会换行,多个行重叠。wrap-reverse:Flex 我的项目可能会换行,然而穿插轴的起始和完结地位会调换。 4.3 flex-flowflex-flow属性是flex-direction属性和flex-wrap属性的简写模式,默认值为row nowrap。 .box { flex-flow: <flex-direction> <flex-wrap>;}4.4 justify-content该属性用于管制 Flex 容器中 Flex 我的项目在主轴上的对齐形式。 flex-start:我的项目在主轴起始地位对齐。flex-end:我的项目在主轴完结地位对齐。center:我的项目在主轴居中对齐。space-between:我的项目在主轴上均匀分布,首尾两个我的项目别离凑近容器起始和完结边界。space-around:我的项目在主轴上均匀分布,我的项目两侧的距离相等。 4.5 align-items有主轴 那么就有穿插轴,该属性用于管制 Flex 容器中 Flex 我的项目在穿插轴上的对齐形式。 flex-start:我的项目在穿插轴起始地位对齐。flex-end:我的项目在穿插轴完结地位对齐。center:我的项目在穿插轴居中对齐。baseline:我的项目在穿插轴上以基线对齐。stretch:我的项目在穿插轴上拉伸以适应容器的高度(默认值)。 4.6 align-contentalign-content属性定义了多根轴线的对齐形式。如果我的项目只有一根轴线,该属性不起作用 flex-start:在穿插轴起始地位对齐。flex-end:在穿插轴完结地位对齐。center:在穿插轴居中对齐。space-between:在穿插轴上均匀分布,首尾两行别离凑近容器起始和完结边界。space-around:在穿插轴上均匀分布,行两侧的距离相等。stretch:在穿插轴上拉伸以适应容器的高度。 总结依据学习与实际,大抵对元素的对齐的形式有了肯定理解。 参考https://css-tricks.com/snippets/css/a-guide-to-flexbox/https://www.runoob.com/w3cnote/flex-grammar.html

March 3, 2024 · 1 min · jiezi

关于前端:audiohacker一个帮你突破网页视频音量和音调的第三方库

audio-hacker介绍你是否想冲破网页中视频的音量的限度?或者还原那些被变声过的声音? audio-hacker 是一个基于谷歌jungle.js封装的ts库,提供了ts类型和音量增益办法,应用形式非常简略。 A magical library for controlling audio pitch and volume, based on jungle.js 装置npm i audio-hackeryarn add audio-hackerpnpm add audio-hacker初始化 Audiohackerimport Audiohacker from 'audio-hacker';const audioCtx = new AudioContext();if (audioCtx.state !== 'running') { await audioCtx.resume();}const video = document.querySelector('video');const source = audioCtx.createMediaElementSource(video);const audioController = new Audiohacker(audioCtx, source);调整音调// best step 0.01audioController.setPitchOffset(0.22);audioController.setPitchOffset(-0.12);调整音量// minimum value is 0;audioController.setVolume(0.3);audioController.setVolume(3.3);断开连接audioController.disconnect();更多If you want to do it in a simpler way, use Video Roll browser extension.

March 3, 2024 · 1 min · jiezi

关于前端:nrmrc和yarnrc配置镜像源

用处应用npm或者yarn装置依赖时,指定依赖的镜像源。 示例应用npm装置依赖# 文件名为:.npmrc# 设置同一个前缀/目录下包的源# 上面的设置将前缀为@babel的包源指向了华为源# 如果@babel前缀的包外部依赖了其余非@babel前缀的包,那么这些非@babel的包将不实用该规定@babel:registry=https://mirrors.huaweicloud.com/repository/npm/# 指定我的项目下所有包的源# 如果下面的前缀规定没有匹配到,则应用这里的源registry=http://mirrors.cloud.tencent.com/npm/应用yarn@2.0以下装置依赖# 文件名为:.yarnrc# 设置同一个前缀/目录下包的源 验证无效# 上面的设置将前缀为@babel的包源指向了腾讯源# 如果@babel前缀的包依赖了其余非@babel前缀的包,那么这些非@babel的包将不实用该规定"@babel:registry" "https://mirrors.huaweicloud.com/repository/npm/"# 如果下面的前缀规定没有匹配到,则应用这里的源"registry" "http://mirrors.cloud.tencent.com/npm/"应用yarn@2.0及以上装置依赖# 文件名为:.yarnrc.yml# 设置同一个前缀/目录下包的源 验证无效# 上面的设置将前缀为@babel的包源指向了华为源# 如果@babel前缀的包依赖了其余非@babel前缀的包,那么这些非@babel的包将不实用该规定"npmScopes": "@babel": "npmRegistryServer": "https://mirrors.huaweicloud.com/repository/npm/"# 如果下面的前缀规定没有匹配到,则应用这里的源"npmRegistryServer": "http://mirrors.cloud.tencent.com/npm/"注意事项

March 3, 2024 · 1 min · jiezi

关于前端:你下个Vite项目能不能用上Lightning-CSS

Vite 自从 4.4 版本开始实验性反对 Lightning CSS,能够让我的项目的 CSS 打包速度更快,构建体积更小,咱们来一起看看在 Vite 中怎么配置应用 Lightning CSS 吧。 Lightning CSS什么是 Lightning CSS援用官网的介绍: An extremely fast CSS parser, transformer, bundler, and minifier. 一个十分快的CSS解析器、转换器、打包器和压缩工具。号称:Lightning CSS 比基于 JavaScript 的同类工具快 100 倍以上。它能够在单个线程上每秒压缩超过 270 万行代码。转换、打包速度比碾压 PostCSS 的 esbuild 还要快,打包格局更加紧凑,应用 rust 编写,性能优异。应用由 Mozilla 创立并由 Firefox 应用的 cssparser(CSS解析器) 和 selectors(CSS选择器) 。这些提供了松软的 CSS 解析根底,在此基础上 Lightning CSS 实现了对所有特定 CSS 规定和属性的反对,背靠 Mozilla 贴近规范。能够理解到 Lightning CSS 的劣势比起传统的 PostCSS 可大太多了,既然这个工具这么优良,该怎么理论利用呢? 在 Vite(4.4+) 中应用 Lightning CSS依据 Vite 的文档形容,从 4.4 开始就曾经开始实验性反对应用 Lightning CSS 解决我的项目中 CSS 的转换和压缩。 ...

March 2, 2024 · 1 min · jiezi

关于前端:淘宝外贸代购系统源码的作用以及接入演示

淘宝外贸代购零碎源码(获取代购零碎演示)的作用是帮忙搭建一个可能接入中国各大电商平台商品的大型网上商城。 这种零碎的次要性能包含: 商品信息同步:通过API接口将淘宝、天猫等电商平台的商品信息实时同步到本人的网站上,使得网站可能展现数亿种产品。多语言反对:零碎能够主动将中文商品信息翻译成多种语言,不便不同国家的消费者浏览和购买。汇率设置:零碎后盾能够设置汇率,以适应不同国家货币的转换需要。国内物流配送:反对国内物流配送,满足海内客户的需要。多平台接入:除了淘宝、天猫,还能够接入拼多多、1688、京东等多个国内电商平台,扩充商品起源。会员中心治理:提供订单治理、包裹跟踪等性能,不便用户治理本人的购物和物流信息。接入演示通常是指提供一个演示站点或者视频教程,向潜在用户展现如何应用这个零碎以及如何通过这个零碎将商品信息从原平台导入到本人的网站上。这通常波及到一些技术操作,比方获取API密钥、配置SDK文件等。 综上所述,淘宝外贸代购零碎源码的作用在于为想要从事跨境电商的集体或企业提供一个疾速搭建在线商城的解决方案,通过技术手段实现商品的疾速导入、信息的主动翻译、价格的实时换算以及国内物流的配送,从而简化了代购流程,升高了进入门槛,使得用户能够轻松地进入跨境电商畛域。

March 2, 2024 · 1 min · jiezi

关于前端:Cannot-find-module-nodefs-报错解决-nuxt

问题形容启动我的项目报错Cannot find module 'node:fs',百度说是node版本问题,试了各种node版本还是不行(最开始是20.10.0,尝试了降级到14、16都不行) 解决办法更新nuxt版本,之前是2.14.6,更新为2.15.8问题解决,启动后报另一个错,减少装置依赖@babel/plugin-proposal-private-property-in-object后问题解决

March 2, 2024 · 1 min · jiezi

关于前端:Vue-34-详细发布说明

欢送关注微信公众号:前端历险记Vue.js,作为一个风行的前端框架,以其响应式数据绑定和灵便的组件零碎而闻名。Vue 3 是 Vue.js 的一个次要版本,它引入了许多新的个性和改良,包含 Composition API、性能优化和更小的体积。当初,随着 Vue 3.4 的公布,这个框架又向前迈进了一大步。 一、性能晋升 渲染优化:Vue 3.4 对其渲染引擎进行了进一步的优化,特地是在解决大量动静节点和简单组件树时。通过缩小不必要的计算和内存调配,新版本可能更高效地更新 DOM,从而进步应用程序的响应速度和流畅性。编译器改良:编译器是 Vue.js 的外围局部之一,负责将模板转换为可执行的渲染函数。在 Vue 3.4 中,编译器进行了一系列优化,包含更无效的代码生成和更少的运行时开销。这意味着开发者能够享受更快的构建工夫和更小的包体积。Props 类型查看:组件之间的数据传递是 Vue.js 应用程序的重要组成部分。在 Vue 3.4 中,对组件的 props 类型查看进行了改良,以提供更精确的类型推断和谬误提醒。这有助于在开发阶段捕捉潜在的问题,并加强应用程序的健壮性。二、性能加强 稳固的 defineModel API:Vue 3.4 正式稳定化了 defineModel API,这使得创立反对 v-model 的自定义组件变得更加简略和统一。当初,开发者能够应用单个 API 来定义组件的双向数据绑定行为,而无需解决简单的 prop 和事件映射。模板语法和组件选项:Vue 3.4 引入了更多灵便的模板语法和组件选项,以反对更简单的用户界面和交互模式。例如,新的指令和修饰符能够帮忙开发者更简洁地实现常见的 UI 模式,而新的组件选项则提供了更多的管制和自定义能力。其余新个性:除了上述次要个性外,Vue 3.4 还蕴含了许多其余有用的新个性和改良。这可能包含新的生命周期钩子、改良的异步组件加载、更好的 TypeScript 反对等。这些个性都是为了帮忙开发者更高效地构建和保护 Vue.js 应用程序。三、易用性改良 文档和教程:Vue 3.4 的公布随同着更新的文档和教程资源。这些资源通过从新组织和优化,以提供更清晰、更易于了解的信息和领导。无论是老手开发者还是经验丰富的 Vue.js 开发者,都能够从这些资源中受害,更疾速地把握新版本的个性和最佳实际。Bug 修复和问题改良:在 Vue 3.4 的开发过程中,开发团队踊跃修复了旧版本中存在的 bug 和问题。这意味着新版本不仅引入了新性能,还进步了应用程序的稳定性和可靠性。开发者能够更加释怀地降级到新版本,享受更好的开发体验和用户满意度。总的来说,Vue 3.4 是一个充斥激动人心的新个性和改良的版本。它通过性能晋升、性能加强和易用性改良,为 Vue.js 开发者提供了更弱小、更灵便的工具集。无论是构建简略的单页应用程序还是简单的企业级利用,Vue 3.4 都是一个值得期待的更新。 本文由mdnice多平台公布 ...

March 2, 2024 · 1 min · jiezi

关于前端:开发UI组件库第一步Vite如何把Markdown转换Vue组件

开发一个 UI 组件库时,将 Markdown 转换成 Vue 组件是一个常见需要,特地是在创立文档或样例展现时,此时咱们须要将它转换为组件咱们先看一下Vue2咱们先看一下,我如何在vue.config.js如何配置把Markdown 转换成 Vue 组件 config.module.rule('md'). test(/\.md/). use('vue-loader'). loader('vue-loader'). options({ compilerOptions: { preserveWhitespace: false, }, }). end(). use('markdown-loader'). loader(require('path'). resolve(__dirname, './build/md-loader/index.js')). // 这外面的代码有很多 end()目录md-loader/index.js 这是一个loader,留神它的加载程序是从右往左,这是开发一个插件的根底,感兴趣的同学能够看一下 Vite如何转换相比webpack转换vite转换则要不便的多,当然得益于社区的弱小和反对的奉献 这是一个转换后的后果 用vite去做转换,好在有人曾经开发好了很多插件,所以只须要咱们装置下即可 pnpm add vite-plugin-doc-preview// vite.config.tsimport { defineConfig } from 'vite'import Vue from '@vitejs/plugin-vue'import Markdown from 'unplugin-vue-markdown/vite'import MarkdownPreview from 'vite-plugin-markdown-preview'export default defineConfig({ plugins: [ Vue({ include: [/.vue$/, /.md$/], }), Markdown({ component: true, previewId: 'vue' }) ],})自定义预览组件如果默认的款式不能满足需要,能够全局注册一个 CodePreview 组件来代替默认组件 ...

March 2, 2024 · 1 min · jiezi

关于前端:Angular-CLI-里打印出来的-TypeScript-版本号是从哪里来的

在探讨 Angular CLI 中 ng version 命令如何解析 TypeScript 版本号的过程中,咱们须要深刻理解 Angular CLI 的工作原理以及它如何与我的项目依赖进行互动。Angular CLI 是一个弱小的前端构建工具,它提供了一系列命令来帮忙开发者初始化、开发、构建和保护 Angular 利用。ng version 命令用于显示 Angular CLI 和我的项目依赖的版本信息,其中就包含 TypeScript 的版本。 Angular CLI 在执行 ng version 命令时,会查看我的项目中的 node_modules 文件夹,以及相干的 package.json 文件。具体到 TypeScript 版本的解析,这一过程次要波及以下几个步骤: 解析过程概览读取 package.json 文件:Angular CLI 首先会在我的项目根目录下查找 package.json 文件。这个文件蕴含了我的项目的元数据和依赖信息,其中就定义了 TypeScript 的版本号,通常位于 devDependencies 或 dependencies 节点下。查找 node_modules 目录:在获取到 TypeScript 的版本号后,CLI 会进一步验证这个版本号与理论装置在 node_modules/typescript 目录下的 TypeScript 版本是否统一。这是因为我的项目可能会通过 npm install 或 yarn add 命令更新依赖,而 package.json 文件中记录的版本号可能与理论装置的版本存在差别。读取 TypeScript package.json 文件:为了获取准确的 TypeScript 版本信息,CLI 会读取 node_modules/typescript/package.json 文件中的 version 字段。这一步骤确保了显示给用户的 TypeScript 版本是准确无误的,反映了以后我的项目理论应用的版本。示例剖析假如一个 Angular 我的项目的根目录下有一个 package.json 文件,其中蕴含了如下的依赖定义: ...

March 1, 2024 · 1 min · jiezi

关于前端:什么是-web-应用的-typeahead-search-help

在 Web 前端设计畛域,type-ahead search help(又称为主动实现或即时搜寻)是一种用户界面性能,它可能在用户输出搜索词的同时,实时提供搜寻倡议或后果。这种性能极大地晋升了用户体验,因为它能够帮忙用户疾速找到他们须要的信息,缩小了打字的工作量,并且在很多状况下,还能纠正用户的拼写错误。 实现原理type-ahead search help 的实现通常依赖于 AJAX(Asynchronous JavaScript and XML)技术,这使得网页能够在不从新加载整个页面的状况下,与服务器替换数据并更新局部网页内容。当用户在搜寻框中输出文字时,前端代码会捕捉到这些输出事件,并且在每次输出后,通过 AJAX 向服务器发送申请。服务器接管到申请后,依据用户输出的关键字,从数据库中检索匹配的记录,而后将后果以 JSON 或其余格局返回给前端。最初,前端代码解析这些数据,并将搜寻倡议以列表的模式展现给用户。 设计要点在设计 type-ahead search help 性能时,须要思考以下几个要点: 响应速度:为了提供晦涩的用户体验,搜寻倡议的生成和显示必须足够快。这通常意味着须要对后端的搜索算法进行优化,并且在前端应用高效的数据结构和算法来解决和显示后果。数据量解决:对于大数据量的解决,须要设计高效的索引和查问策略,以缩小数据库的查问工夫。此外,还能够采纳缓存策略,将热门或常见的搜寻后果缓存起来,以缩小对数据库的查问次数。用户输出解决:须要妥善处理用户的各种输出状况,包含拼写错误、大小写不敏感、关键词倡议的排序和过滤等。界面设计:搜寻倡议的展现形式也十分要害,须要确保列表的展现不会烦扰用户的其余操作,并且选项清晰、易于浏览,用户能够疾速从中抉择或持续输出。利用实例假如咱们正在设计一个在线电商平台的搜寻性能,用户能够在搜寻框中输出商品名称或品牌,平台会实时显示相干的商品或品牌倡议。 用户输出监听:当用户开始在搜寻框中输出文字时,前端代码立刻监听到这一事件。例如,用户输出 Nike,前端代码捕捉到每一个字符的输出。AJAX 申请:依据用户的输出,前端代码通过 AJAX 向服务器发送申请,携带以后的输出值 Nike 作为参数。服务器解决:服务器接管到申请后,立刻在商品名称和品牌的索引中搜寻蕴含 Nike 的记录。这个过程可能波及到文本匹配算法,如含糊搜寻或前缀匹配,以及思考拼写错误的容错解决。返回搜寻倡议:找到匹配的记录后,服务器将后果包装成 JSON 格局,返回给前端。这个 JSON 对象可能蕴含商品的名称、图片、价格等信息。展现后果:前端代码解析服务器返回的 JSON 数据,并将搜寻倡议以下拉列表的模式展现在搜寻框下方。用户能够看到 Nike 相干的商品列表,每个商品旁边可能还会显示商品图片和价格等信息,用户能够间接点击这些倡议中的任何一个,间接跳转到该商品的详情页面。通过这个例子,咱们能够看到 type-ahead search help 性能如何在理论利用中晋升用户体验,帮忙用户更快地找到他们想要的商品。在设计这类性能时,前端开发者须要亲密关注用户的输出和交互行为,以及如何高效地解决和展现大量的数据。此外,还须要思考到各种边缘状况,比方网络提早、数据格式谬误等,确保性能的健壮性和可靠性。

March 1, 2024 · 1 min · jiezi

关于前端:什么是-Web-应用里的-Fuzzy-Search

在 Web 前端设计畛域,fuzzy search(含糊搜寻)是一种十分乏味且实用的性能,它容许用户在进行搜寻时取得更为宽容和灵便的后果。与传统的准确匹配搜寻相比,含糊搜寻可能解决打字谬误、拼写变体以及局部匹配,从而加强用户体验和满意度。这种技术在解决大量数据和信息时尤为重要,因为它能够帮忙用户疾速找到他们须要的内容,即便他们没有准确地记住搜寻项的正确拼写或残缺名称。 举个例子,假如你正在应用一个在线电子商务平台搜寻 Nike 运动鞋。如果你不小心输出了 Nikey,Nik,或者甚至是 Nke,在启用了模犊搜寻的零碎中,它依然可能了解你的用意并返回 Nike 品牌的运动鞋后果。这就是含糊搜寻的魅力所在:它通过算法智能地辨认用户的用意,即便在面对输出谬误或不残缺信息的状况下也能做到。 含糊搜寻的实现通常依赖于几种关键技术,其中包含但不限于:Levenshtein 间隔(也称为编辑间隔)、N-gram 办法、以及声音类似度算法如 Soundex 或 Metaphone。Levenshtein 间隔计算两个字符串之间的差别,通过量化须要多少次编辑(插入、删除、替换)能够将一个字符串转换为另一个字符串。N-gram 办法通过比拟文本片段的小块来寻找相似性,这种办法特地实用于解决拼写错误。声音类似度算法则尝试匹配发音类似的词汇,这对于解决用户的发音谬误特地有用。 在理论利用中,含糊搜寻技术须要与前端界面紧密结合,以提供晦涩和直观的用户体验。为了实现这一点,开发人员通常会采纳古代 JavaScript 框架和库,如 React、Vue 或 Angular,联合专门的搜寻库(例如 Fuse.js、Lunr.js 或 ElasticSearch 的前端接口)来构建响应式且功能强大的搜寻界面。 开发一个高效的含糊搜寻性能不仅须要关注算法的抉择和实现,还须要思考搜寻性能的优化。这包含正当地索引数据、实现高效的查问逻辑、以及采纳缓存机制缩小服务器负载和进步响应速度。此外,一个好的模犊搜寻零碎还应该提供可定制的搜寻参数,比方搜寻容错率、后果排序的权重规定、以及用户界面的交互设计,以满足不同场景和用户需要的多样性。 在用户体验方面,设计一个直观的搜寻界面同样重要。这意味着在用户输出查问时提供实时反馈,如搜寻倡议或主动实现性能,能够大大提高搜寻的效率和准确性。界面设计应该简洁明了,确保搜寻框和后果清晰可见,同时适应不同设施和屏幕尺寸,保障无论在桌面还是挪动设施上都能提供良好的用户体验。 通过以上探讨,咱们能够看到,模犊搜寻在 Web 前端设计中扮演着极其重要的角色。它不仅晋升了用户体验,通过容许输出的灵活性和容错性,还极大地提高了信息检索的效率和准确性。随着技术的一直倒退和优化,咱们期待将来的模犊搜寻性能将变得更加智能和高效,为用户提供更为丰盛和称心的互动体验。

March 1, 2024 · 1 min · jiezi

关于前端:精通-JavaScriptstructuredClone-方法的高级应用

您是否晓得,当初 JavaScript 中有一种原生的形式能够深拷贝对象? 没错,这个内置于 JavaScript 运行时的structuredClone函数就是这样: const calendarEvent = { title: "Builder.io大会", date: new Date(123), attendees: ["Steve"]}// const copied = structuredClone(calendarEvent)您是否留神到在下面的例子中,咱们不仅复制了对象,还复制了嵌套数组,甚至还包含 Date 对象? 所有正如预期工作: copied.attendees // ["Steve"]copied.date // Date: 1969年12月31日16:00:00cocalendarEvent.attendees === copied.attendees // false没错,structuredClone不仅能做到上述性能,还可能: 克隆有限嵌套的对象和数组克隆循环援用克隆宽泛的 JavaScript 类型,例如Date、Set、Map、Error、RegExp、ArrayBuffer、Blob、File、ImageData,以及许多其余类型转移任何可转移对象例如,甚至以下这种疯狂的状况也能如期工作: const kitchenSink = { set: new Set([1, 3, 3]), map: new Map([[1, 2]]), regex: /foo/, deep: { array: [ new File(someBlobData, 'file.txt') ] }, error: new Error('Hello!')}kitchenSink.circular = kitchenSink// ✅ 全副良好,齐全而深刻地复制!const clonedSink = structuredClone(kitchenSink)为什么不仅应用对象扩大?重要的是要留神咱们在议论深度拷贝。如果您只须要进行浅拷贝,也就是不复制嵌套对象或数组的拷贝,那么咱们能够简略地应用对象扩大: ...

March 1, 2024 · 2 min · jiezi

关于前端:浮木云随笔小记8模块设计统计

在SaaS零碎中,统计模块是十分重要的一个性能。对于C端产品,可能会展现用户集体应用数据,比方Keep中的锤炼时长统计。尽管这些数据只是供用户理解本人的应用状况,并非必须。然而,在B端的SaaS零碎中,因为用户泛滥且业务简单,公司管理层须要查看全公司数据和员工绩效状况。因而,SaaS零碎必须具备独立的统计模块,以不便管理人员查看零碎数据。那么作为产品经理,又该如何对统计模块进行设计呢?怎么设计才会更加不便无效呢?接下来我就介绍一个设计统计模块的必备神器---栅格容器。1、概念什么是栅格容器呢?栅格都晓得就一个一个小方块,栅格容器就是将容器进行纵向宰割,反对将页面区域划分成多列,每个列单元格又成为一个独立的根底容器,可包容任意组件。栅格容器个别用于页面的统计块展现,无需本人手动调整间距,即可实现页面统计块的均匀散布。如下图栅格容器的默认款式:2、款式配置栅格容器的款式配置跟之前介绍的弹性容器&布局容器款式配置是一样的,这里不做过多赘述。3、属性配置属性配置包含组件名称、分栏距离、分栏栏数和分栏占比。组件名称:给栅格容器命名,便于后续问题查证和交互编排。分栏距离:列单元格之间的默认间距为零,因而需依据理论需要调整列单元格之间的间距,我这里设置的是10。分栏栏数:栅格容器默认栏数是2,能够依据理论需要抉择相应的栏数。我将原来的2改成4,布局款式如下:分栏占比:对每个列单元格设置相应的占比值其实就是列单元格的宽度。通过图例发现,无论划分成多少栏,默认状况下占比栏的总和是24。调整其中某一个列单元格的占比值,右侧会留出相应的空白。我感觉这个栅格容器好不便啊,能够一键调整间距,也能够对独自的列单元格进行个性化设置,具备肯定的灵活性。4、页面利用真的很拜服他们针对页面不同的需要设置的相应的容器,就像这个栅格容器我感觉就是制作统计卡片一个很好的例子。框架列好,间接在里边填充相应的统计数字,让整个统计卡片的布局更加好看整洁。在发现栅格容器之前,我都是用弹性容器做成的统计块,我仿照模版核心某个零碎页面,如下图,就是利用弹性容器拼接成的,拼接进去的成果是这样的:接下来我就针对统计模块这一部分的设计,将其换成栅格容器来代替,试试成果如何。(1)框架设计我把上述页面的原有的统计块设计删掉,搁置栅格容器,自定义款式height:calc(15% -10px);将分栏栏数设置为3,分栏距离为20,这样简洁的统计块框架设计曾经实现。(2)内容填充在插槽容器搁置一个弹性容器,高度和宽度是插槽容器的宽度和高度,横向对齐和纵向对齐别离设置为居中对齐。在该弹性容器搁置两个弹性容器,一个弹性容器用来搁置图标,一个弹性容器用来填充文字和统计数值。搁置图片的弹性容器高度和宽度别离设置为85px,如图所示:填充文字和统计数值的弹性容器宽度设置为50%,高度是父级容器的高度,外间距设置为30,并将横向对齐和纵向对齐设置为居中对齐,主动换行设置为是,多行排列设置为居中排列。搁置两个文字组件,别离填充文字和数值。填充文字的文字组件外间距的上侧数值设置为5,并在属性配置中填写相应的文字内容,第二个文字组件外间距的上侧数值设置为10,数值内容是“32654”。如下图所示:接下来就简略了,我将做好的统计块内容别离复制到第二个和第三个插槽容器中,并将批改对应的图表、文字和数值,预览成果如下图所示:以上就是利用栅格容器做进去的统计模块,真心感觉好用,而且比之前用弹性容器拼凑进去的统计模块更加方便快捷。

March 1, 2024 · 1 min · jiezi

关于前端:JS中var和let有什么区别详解

JS中let 和 var 的区别和分割前言:置信很多人和我一样,应用js也有一段时间了,然而仍然将不明确在js中 var申明的变量和let 申明的变量到底有什么区别。本文就给各位介绍分明。一,弄清楚共同点要想理分明2者之间的区别,先搞明确它们之间的共同点 JS 中的变量是弱类型能够保留所有类型的数据,即变量没有类型而值有类型。let 和 var 与变量类型无关。var/let/const共同点是全局作用域中定义的变量,能够在函数中应用var name = 'xiaoming';function show() { return name;}console.log(show());函数中申明的变量,只能在函数及其子函数中应用function abc() { var name = "xiaoming"; function def() { console.log(name); } def(); //子函数后果: xiaoming console.log(name); //函数后果: xiaoming}abc();console.log(name); //全局拜访: name is not defined函数外部定义的变量,在内部无奈失常拜访 var name = "lulu";function hd() { var name= "goudan"; console.log(name); //goudan}hd();console.log(name); //lulu当初来通过例子感触区别先运行以下2局部代码:代码1: console.log(a); //undefinedvar a = 1;console.log(a); //1代码2: console.log(a); let a = 1;console.log(a);能够发现,代码1运行不会报错,在没有申明 var a之前就应用变量a,输入undefined,然而代码2运行会间接报错’Cannot access 'a' before initialization‘ ; 这个就是var 和let之间的区别所造成的,为什么呢?这里牵扯到“变量晋升”,解析器会先解析代码,而后把申明的变量的申明晋升到最前,这就叫做变量晋升代码1其实会被解析器解析为: ...

March 1, 2024 · 1 min · jiezi

关于前端:Vue3中的Hooks详解

vue3带来了Composition API,其中Hooks是其重要组成部分。之前我写过一篇对于vue3 hooks的文章比较简单 Vue3从入门到删库 第十一章(自定义hooks) 所以本文将深入探讨Vue3中Hooks,帮忙你在Vue3开发中更加得心应手。 一、Vue3 Hooks实现原理在Vue3中,Hooks是基于Composition API实现的,它容许咱们在组件的逻辑代码中更好地组织和复用代码。Hooks实质上是一组可复用的函数,它们能够“钩入”Vue组件的生命周期,让咱们可能在组件的不同生命周期阶段执行特定的逻辑。 Vue3中的Hooks是通过setup函数来应用的,setup函数是Vue3组件中的一个新的生命周期函数,它在组件实例被创立之前调用,并且接管两个参数:props和context。在setup函数中,咱们能够定义和返回组件中须要应用的响应式数据、办法、计算属性等,而这些都能够通过Hooks来实现。 二、Vue3 Hooks应用场景逻辑复用:当多个组件须要共享雷同的逻辑时,咱们能够将这些逻辑封装成一个Hook,而后在须要的组件中导入并应用它。这样能够防止代码反复,进步代码的复用性。逻辑拆分:对于简单的组件,咱们能够应用Hooks将组件的逻辑拆分成多个独立的函数,每个函数负责解决一部分逻辑。这样能够使组件的代码更加清晰、易于保护。副作用治理:Hooks中的函数能够拜访组件的响应式数据,并且能够在组件的生命周期中执行副作用操作(如定时器、事件监听等)。通过应用Hooks,咱们能够更好地治理这些副作用操作,确保它们在组件卸载时失去正确的清理。三、Vue3 Hooks优缺点长处: 进步了代码的复用性和可维护性。使组件的逻辑更加清晰、易于了解。更好地治理组件的副作用操作。毛病: 学习曲线较平缓,须要相熟新的编程模式和思维形式。对于小型我的项目或简略组件,应用Hooks可能过于简单。在Vue生态中,第三方Hooks的品质和兼容性可能存在差别。四、自定义Hooks示例代码上面是一个简略的自定义Hook示例,用于追踪鼠标地位: import { ref, onMounted, onUnmounted } from 'vue';export function useMousePosition() { const x = ref(0); const y = ref(0); function updatePosition(event) { x.value = event.clientX; y.value = event.clientY; } onMounted(() => { window.addEventListener('mousemove', updatePosition); }); onUnmounted(() => { window.removeEventListener('mousemove', updatePosition); }); return { x, y };}在组件中应用该Hook: <template> <div> Mouse position: X={{ x }}, Y={{ y }} </div></template><script setup>import { useMousePosition } from './useMousePosition';const { x, y } = useMousePosition();</script>五、Hooks书写标准命名标准:自定义Hooks应该以“use”为前缀,以辨别其余函数和变量。例如:useUserInfo、useMousePosition等。同时,命名应清晰明了,精确形容Hooks的性能。参数与返回值:自定义Hooks应该接管明确的参数,并返回须要在组件中应用的响应式数据、办法、计算属性等。返回的对象应该具备清晰的属性名和构造。副作用治理:如果自定义Hooks蕴含副作用操作(如定时器、事件监听等),应确保在组件卸载时正确清理这些副作用。能够应用onMounted、onUnmounted等生命周期钩子来治理副作用的增加和移除。文档正文:为自定义Hooks编写清晰的文档正文是十分重要的,阐明其用处、参数、返回值和应用示例。这将有助于其余开发者了解和应用你的自定义Hooks。类型定义(如果应用TypeScript):为自定义Hooks提供类型定义能够确保更好的类型安全性和编辑器反对。应用TypeScript的泛型性能能够减少Hooks的灵活性和可复用性。测试:为自定义Hooks编写单元测试是确保其正确性和稳定性的重要伎俩。测试应该笼罩各种应用场景和边界状况。六、罕用的第三方Hooks举荐Vueuse:Vueuse是一个基于Vue3 Composition API的实用函数汇合,蕴含了大量有用的自定义Hooks,如useMouse、useKeyboardJs、useLocalStorage等。它是Vue3生态中最受欢迎的第三方Hooks库之一。@vue/reactivity:这是Vue官网提供的响应式库,尽管它不是一个Hooks库,但其中的函数和工具能够与Composition API联合应用,帮忙咱们创立自定义的Hooks来解决响应式数据和副作用。例如,咱们能够应用reactive、ref、computed等函数来创立响应式数据和计算属性。七、总结Vue3中的Hooks为组件开发带来了全新的编程模式和思维形式,使咱们可能更好地组织和复用代码,进步代码的清晰度和可维护性。通过自定义Hooks,咱们能够将组件的逻辑拆分成独立的函数,并在多个组件中共享这些逻辑。 ...

March 1, 2024 · 1 min · jiezi

关于前端:应用方案-D706低功耗微处理器复位检测电路

近年来,微处理器在IT业管制畛域和智能化产品中失去了宽泛的利用。在零碎和产品的开发设计过程中,为了进步其抗干扰能力,应用uP监控是首选技术措施之一。监控芯片可为零碎提供上电、掉电复位性能,也可提供其它性能,如后备电池治理,存储器爱护、低电压告警或看门狗等。二    基本参数三    利用计划A)、利用图B)、测试RESET的温度个性如下  D706微处理器监控芯片具备性能多、功耗低的特点。且工作温度范畴宽(-40℃~+80℃),性价比高,并可与MAXIM、AD等公司的uP监控产品兼容。

March 1, 2024 · 1 min · jiezi

关于前端:都用HTTPS了还能被查出浏览记录

最近,群里一个刚入职的小伙因为用公司电脑拜访奇怪的网站,被约谈了。 他很困惑 —— 拜访的都是HTTPS的网站,公司咋晓得他拜访了啥?部门缺人,可内推,前端后端测试岗:jinshuju.net/f/o38ijj 实际上,因为网络通信有很多层,即便加密通信,仍有很多路径裸露你的拜访地址,比方: DNS查问:通常DNS查问是不会加密的,所以,能看到你DNS查问的观察者(比方运营商)是能够推断出拜访的网站IP地址:如果一个网站的IP地址是举世无双的,那么只需看到指标 IP地址,就能推断出用户正在拜访哪个网站。当然,这种形式对于多网站共享同一个IP地址(比方CDN)的状况不好使流量剖析:当拜访一些网站的特定页面,可能导致特定大小和程序的数据包,这种模式可能被用来辨认拜访的网站cookies或其余存储:如果你的浏览器有某个网站的cookies,显然这代表你曾拜访过该网站,其余存储信息(比方localStorage)同理除此之外,还有很多形式能够间接、间接晓得你的网站拜访状况。

March 1, 2024 · 1 min · jiezi

关于前端:2024目前三种有效加速国内Github

大家好我是咕噜美乐蒂,很快乐又和大家见面了!截至2024年,国内拜访 GitHub 的速度受到多种因素的影响,包含网络封闭、天文间隔、网络带宽等。为了进步国内用户拜访 GitHub 的速度,以下是目前较为无效的三种减速形式:一、 CDN 减速服务CDN(内容散发网络)是一种通过将数据缓存在寰球各地的服务器上,以提供更疾速、牢靠的内容传输服务的技术。国内很多互联网公司和服务商提供了针对 GitHub 的 CDN 减速服务,通过这些服务能够减速 GitHub 仓库的访问速度。劣势:1.进步 GitHub 仓库的访问速度,减速代码下载、克隆等操作。2.缩小因为网络提早导致的拜访速度慢的问题,进步开发效率。应用办法:1.能够通过购买第三方 CDN 减速服务或应用自建 CDN 来减速 GitHub 的拜访。2.在本地 DNS 中设置 CDN 解析地址,将 GitHub 的域名解析到减速节点,实现减速拜访。二、 VPN 服务VPN(虚构专用网络)服务能够通过加密和隧道技术将用户的网络流量转发到其余地区的服务器,从而实现拜访国外网站的目标。通过连贯到境外服务器,用户能够绕过国内网络限度,间接拜访 GitHub,进步访问速度。劣势:1.可能无效绕过国内网络封闭,间接拜访 GitHub 等国外网站。2.反对加密数据传输,加强网络安全性。应用办法:1.购买牢靠的 VPN 服务,配置 VPN 客户端并连贯到境外服务器。2.抉择速度快、稳固的服务器,确保 VPN 连贯畅通。三、 GitHub 镜像站点GitHub 镜像站点是在国内搭建的一个与 GitHub 同步更新的镜像站点,用户能够通过镜像站点拜访 GitHub 上的代码、资源等内容。国内的一些大型互联网公司和社区组织提供了 GitHub 的镜像站点,用户能够抉择就近拜访这些镜像站点来进步访问速度。劣势:1.通过就近拜访镜像站点,缩小了网络提早,进步了访问速度。2.镜像站点与 GitHub 同步更新,保障了数据的实时性。应用办法:1.在浏览器中输出 GitHub 镜像站点的网址,如码云 Gitee 的 GitHub 镜像站点。2.在镜像站点上登录 GitHub 账号,能够查看和克隆 GitHub 上的仓库。通过以上三种无效的减速形式,国内用户能够更疾速地拜访 GitHub 平台,放慢代码的下载、提交等操作,进步开发效率。抉择适合的减速形式能够依据集体需要和理论状况来进行调整和优化,以取得更好的应用体验。如果您有其余相干问题或须要更多详细信息,请随时通知我。好啦,明天美乐蒂就和大家分享到这里啦,小伙伴们有更好的方法能够在评论区打进去哦~~以便大家更不便地操作呢。

March 1, 2024 · 1 min · jiezi

关于前端:植物大战僵尸2宣布启动鸿蒙原生应用开发又一国民级IP游戏加入鸿蒙

近日,拓维信息发表启动《动物大战僵尸2》鸿蒙原生利用开发,基于HarmonyOS NEXT鸿蒙星河版,单方将在游戏场景、玩法和体验上为用户带来更多可能性。截止到目前,累计已有网易游戏、米哈游等60多家游戏搭档退出鸿蒙生态单干,超过70款游戏曾经实现鸿蒙原生利用开发,其中也不乏《开心消消乐》《三国杀》等国民级IP游戏。本次单干中,作为领有超10亿用户的国民级IP,《动物大战僵尸2》退出鸿蒙生态将进一步减速鸿蒙生态游戏内容凋敝,为宽广用户提供前所未有的鸿蒙原生游戏体验。自2013年《动物大战僵尸2》上线华为游戏核心以来,拓维游戏与华为游戏核心单干已有10余年。在继续精细化经营的单干根底上,单方还在摸索全场景游戏的更多可能性上获得了肯定成绩,为用户带来了更加丰盛和多样化的游戏体验。此外,拓维信息早在2020年开始布局鸿蒙生态,目前已在游戏、交通、智慧城市和教育等畛域与华为开展了深层次的鸿蒙生态单干。在本次鸿蒙生态单干中,基于HarmonyOS NEXT鸿蒙星河版颠覆式翻新架构和独特的内核,拓维游戏与华为游戏核心将联结助力游戏要害自研技术冲破与翻新。《动物大战僵尸2》鸿蒙星河版将充分利用鸿蒙零碎的原生互联、原生智能、原生晦涩等劣势,为用户在手机、平板、车机、智慧屏等多终端提供更多游戏场景、更多智能玩法和更晦涩的游戏体验,进一步突破游戏与终端、终端与终端之间的壁垒,带来更沉迷的全场景游戏体验。

March 1, 2024 · 1 min · jiezi

关于前端:11岁的React正迎来自己口碑的拐点

凌晨2点,Dan仍坐在电脑桌前,表情庄重。 作为React社区最出名的布道者,此时正遭逢一场不小的变故 —— 他领有38w粉丝的推特账号被影子封禁了。 所谓影子封禁,是指粉丝无奈在流中刷到被封禁者的任何推文,只能点进被封禁者的账号能力看到新推文 在RSC(React Server Component)个性公布后,Dan常常用这个账号科普各种RSC常识。这次封禁,显然对他的布道事业造成不小打击,不得已只能启用新账号。 尽管新账号粉丝不多,但值得宽慰的是 —— 这篇题为The Two Reacts的RSC布道文数据还不错。 这篇文章通过解释世界上存在2个React: 在客户端运行的React,遵循UI = f(state),其中state是状态,是可变的在服务端运行的React,遵循UI = f(data),其中data是数据源,是不变的来论证RSC的必要性(他为服务端运行的React提供了底层技术支持)。 宁静的夜总是让人思路良多,Dan合上MacBook Pro,回想起当年加入行业会议,在会议开始前一周才实现演讲所需的Demo(也就是Redux的雏形)。也正是以这次参会为契机,他才得以退出Meta伦敦,进入React外围团队。 随后,Dan又回想起在React Conf 2018介绍Hook个性时,台下观众惊喜的欢呼。 想到这里,不禁又感叹 —— 已经并肩战斗的战友们都已各奔东西。 Redux的联结作者Andrew Clark来到了(入职Vercel),Hook的作者sebastian markbåge也来到了(入职Vercel),连本人最终也来到了(入职bluesky)。 尽管React仍是前端畛域最热门的框架,但一些奥妙的货色仿佛在缓缓变动,是什么变了呢? 收费支付卡颂原创React教程(原价359)、退出人类高质量前端群 React正迎来本人口碑的拐点作为一款11岁高龄的前端框架,React正迎来本人口碑的拐点。 近期,有多名包含出名库作者、React18工作组成员在内的社区外围用户公开表白了对React的批评,比方: Increasingly miffed about the state of ReactKind of annoyed at ReactReact, where are you going?The decline of ReactConcatenating text有人会说,React从诞生伊始至今从不乏批评的声音,有什么少见多怪的? 这其中的区别其实十分大。从React诞生伊始至今,批评通常是开发者与React外围团队的理念之争,比方: JSX到底好不好用?这是理念之争用Class Component还是Function Component?这是理念之争要不要应用Signal技术?这还是理念之争尽管开源我的项目都很器重开发者的反馈,但React曾经不能算是一般开源我的项目,而是一个宏大的技术生态。 在这个生态中,开发者的不满实际上并不会波动React的根本盘。因为决定开发者是否在我的项目中应用React的,并不是开发者本身好恶,而是公司考量技术生态后作出的自上而下的抉择。 所以,React的根本盘是技术生态(而非开发者)。而形成技术生态的,则是生态中大大小小的开源作者/开源团队。 这一轮对React的批评,多是核心技术生态的参与者收回的,他们才是撑持React大厦的一根根柱子。 批评的次要起因是 —— React团队将React的倒退与一家商业公司(Vercel)牢牢绑定。 这对于React外围团队成员来说,是从大厂到独角兽的集体职场跃迁。但对宽广React技术生态的开源作者/开源团队来说,则是被动与一家商业公司(Vercel)绑定。 举个例子,RSC中有个叫Server Actions的个性,用于简化在服务端解决前端交互的流程。Vercel是一家云服务公司,旗下的Next.js反对Server Actions能够完满符合自家Serverless服务的场景。 ...

March 1, 2024 · 1 min · jiezi

关于前端:什么是重排如何减少重排

什么是重排?重排:当渲染树的一部分必须更新并且节点的尺寸产生了变动,浏览器会使渲染树中受到影响的局部生效,并从新结构渲染树。 什么时候会产生重排(又叫回流) 这一阶段次要是计算节点的地位和几何信息,当页面布局和几何信息发生变化时,就须要重排。 引起重排的几种状况: 页面初始化的时候DOM构造数的变动:增加或者删除可见的DOM元素DOM元素的几何属性发生变化:外边距、内边距、边框厚度、宽低等内容发生变化:文本的减少或缩小、更换不同尺寸的图片浏览器窗口尺寸扭转(重排是依据视口的大小来计算元素的地位和大小的)窗口属性的获取和尺寸扭转:offsetTop、offsetLeft、 offsetWidth、offsetHeight、scrollTop、scrollLeft、scrollWidth、scrollHeight、 clientTop、clientLeft、clientWidth、clientHeight、getComputedStyle() 一些罕用的缩小重排办法:1.应用类名批量批改款式:将要进行款式更改的元素增加/删除CSS类,而不是间接操作款式属性,能够将多个更改合并到一次重排和重绘中。 2.应用文档片段:如果须要频繁地向页面中增加大量DOM节点,能够先将他们增加到文档片段中,最初再对立插入文档中,这样能够缩小回流的次数。 3.防止频繁查问布局信息:在JavaScript中防止频繁查问布局信息,如‘offsetWidth'和’offsetHeight 4.应用CSS Grid和Flex布局:应用Grid和Flex布局能够缩小对元素地位的频繁调整,从而缩小重排 5.应用CSS动画和过渡:在须要实现动画成果时,应用CSS动画和过渡,而不是JavaScript来操作元素款式。 6.应用GPU减速晋升网站的动画渲染性能:transform:translateZ(0);或transform:translate3d(0,0,0)

March 1, 2024 · 1 min · jiezi

关于前端:rem和em的区别

rem和em都是CSS中用户设置字体大小的绝对单位。次要区别在于参考的对象不同。 rem是绝对于根元素的 font-size(字体大小)属性,r示意root(根),即绝对于 html 标签的 font-size(字体大小)实现的,浏览器默认字号是 1rem=16px。 em是绝对于父元素标签的字号,和百分比(%)相似。百分比(%)也是绝对于父级的,只不过是百分比(%)绝对于父级宽度的,而em是绝对于父级字号的。 rem更适宜全局的字体大小调整,rem不仅能够用于设置字体大小、还反对元素宽、低等属性。 em则更适宜用户部分的。绝对的字体大小调整,em次要是设置字体大小的。

March 1, 2024 · 1 min · jiezi

关于前端:Cocos游戏开发中的金币落袋效果

引言Cocos游戏开发中的金币落袋成果 大家好,不晓得大家有没有被游戏中的一些小细节感动或吸引。 往往游戏就是通过一些不同凡响的细节,去留住玩家。 金币落袋成果正是如此,它比一般的数值变动来得更加形象,给予玩家成就感和满足感。 本文重点给大家介绍一下如何在Cocos游戏开发中实现金币落袋成果。 本文源工程在文末获取,小伙伴们自行返回。 什么是金币落袋成果在游戏开发中,金币落袋成果是指当玩家角色取得金币或其余虚构货币时,游戏中的动画或特效体现。 这种成果通常包含金币从游戏世界中的某个地位(比方敌人身上、宝箱中等)飞向玩家角色,并且落入一个袋子、箱子或其余容器中的动画体现。 这种成果不仅能够减少游戏的视觉吸引力,还可能加强玩家的成就感和满足感,因为他们能够清晰地看到本人取得了多少金币。 金币落袋成果通常会随同着音效,比方金币掉入袋子时的声音,从而进一步加强游戏体验。 金币落袋成果的实现思路实现金币落袋成果的思路能够分为以下几个步骤: 金币生成: 当玩家取得金币时,须要在游戏中生成金币对象。这能够是在敌人被击败、宝箱被关上或者其余触发条件下生成金币。动画成果: 设计金币飞向玩家的动画成果。这能够是金币从其生成地位向玩家角色所在位置挪动的动画。能够应用插值动画或者物理引擎来实现金币的平滑挪动成果。落袋动画: 当金币靠近玩家角色时,触发落袋动画。这包含金币进入袋子、箱子或其余容器的动画成果。你能够设计不同类型的袋子或容器,每种容器都有不同的落袋动画成果。音效: 在金币落入袋子或箱子时播放相应的音效。这能够加强玩家的感官体验,让他们分明地感知到金币被胜利获取的状况。数值更新: 在金币落袋后,更新玩家的金币数量。这样玩家就可能看到本人的金币数量减少了,进而加强游戏的满足感。金币落袋成果的Cocos实例1.资源筹备首先咱们以后面的一篇文章**《Cocos游戏开发中倍率滚动抽奖成果》** 以及另外一篇文章《Cocos游戏开发中的序列帧动画》的工程为模板创立工程。 2.拼UI首先咱们在左上角拼一个容器,用于展现玩家以后所领有的金币数量。 包含一个金币图标、金币数量标签以及它的底框。 而后把上一篇文章带动画的金币做成预制体。 3.写代码首先给金币预制体增加一个脚本CoinDrop。包含以下几个可编辑的属性。 coinCount,金币数量,金币爆开时的总数。minRadius,最小半径,金币爆开的最近间隔。maxRadius,最大半径,金币爆开的最远距离。duration1,着落动画持续时间。duration2,达到指标动画持续时间。 而后通过克隆生成指定数量的金币。用数组存储。 最初通过tween动画,给每个金币别离执行爆开和落袋两段动画。 其中第一段动画的关键在于计算每个金币爆开时的落点。 咱们能够先把以终点为圆心画一个圆,而后均匀分成八份。 而后其中的落点咱们能够通过公式以及随机数产生。 第二段动画则是从落点开始挪动到目标坐标点。 咱们只须要保障达到工夫,以及坐标点雷同即可。 成果的应用办法只须要把脚本加到预制体上。 而后通过输出终点和起点,以及在回调中更新数值显示即可。 4.成果演示 结语本文曾经论述了金币落袋成果的思路与实现。 须要源工程的小伙伴可通过浏览原文(付费)获取,感激大家的反对。 我是"亿元程序员",一位有着8年游戏行业教训的主程。在游戏开发中,心愿能给到您帮忙, 也心愿通过您能帮忙到大家。 AD:笔者线上的小游戏《填色之旅》《方块掌机经典》《贪吃蛇掌机经典》《重力迷宫球》大家能够自行点击搜寻体验。 实不相瞒,想要个赞和在看!请把该文章分享给你感觉有须要的其余小伙伴。谢谢! 举荐专栏: 你晓得和不晓得的微信小游戏罕用API整顿,连忙珍藏用起来~ 100个Cocos实例 8年主程手把手打造Cocos独立游戏开发框架 和8年游戏主程一起学习设计模式 从零开始开发贪吃蛇小游戏到上线系列 常识付费专栏

March 1, 2024 · 1 min · jiezi

关于前端:好物周刊41新一代截图神器

<span align="center"> </span><p align="right"> https://github.com/cunyu1943</p> 村雨遥的好物周刊,记录每周看到的有价值的信息,次要针对计算机领域,每周五公布。一、我的项目1. LiteFlow轻量,疾速,稳固,可编排的组件式规定引擎 / 流程引擎。 领有全新设计的 DSL 规定表达式。 组件复用,同步 / 异步编排,动静编排,反对超多语言脚本,简单嵌套规定,热部署,平滑刷新规定等等性能,让你放慢开发效率! 2. Restful Fast Request一个相似于 Postman 的 IDEA 插件。它是一个弱小的 restful api 工具包插件,能够依据已有的办法帮忙您疾速生成 url 和 params。 Restful Fast Request = API 调试工具 + API 管理工具 + API 搜寻工具。 它有一个丑陋的界面来实现申请、查看服务器响应、存储你的 api 申请和导出 api 申请。插件帮忙你在 IDEA 界面内更快更高效得调试你的 API。 比照于 HTTP Client,Fast Request 不仅领有 HTTP Client 内置的性能,还提供了敌对易懂直观的界面,让使用者调试 API 的时候可能更加不便、简捷。同时各种类型参数也提供了不同的定制形式,更加灵便。而且集成了搜寻、Postman 集成,Swagger 反对等额定的性能。 3. Sa-Token一个轻量级 Java 权限认证框架,次要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式 Session 会话、微服务网关鉴权等一系列权限相干问题。 ...

February 29, 2024 · 1 min · jiezi

关于前端:前端数字图像处理指南

1、图像的基础知识1.1 位图和矢量图图片个别能够分为 位图 和 矢量图 类别位图 Bitmap矢量图 Vector定义由像素点组成的图像,每个像素点都有本人的色彩和地位信息。由数学方程形容的图像,应用直线、曲线、多边形等数学形态来定义图像。常见格局JPEG、PNG、GIF 等SVG、AI 等清晰度具备分辨率的概念,图像清晰度取决于分辨率的大小不依赖于分辨率,无论放大多少倍,图像都能放弃清晰优缺点长处是适宜存储实在场景的图像,如照片;毛病是放大会失真,呈现锯齿或含糊景象长处是无损放大放大,适宜图标、标记、图表等须要放大放大的场景;毛病是无奈精确地表白实在场景1.2 色彩空间色彩模型,是用来示意色彩的数学模型。个别的色彩模型,能够依照如下分类: 面向硬件设施的色彩模型:RGB、CMYK、YCrCb;面向视觉感知的色彩模型:HSL、HSV(B)、HSI、Lab;浏览器反对 RGB 和 HSL 两种色彩模型: RGB 模型 RGB 模型的色彩由红(Red)、绿(Green)、蓝(Blue)三个色彩通道的不同亮度和组合来示意。每个通道的取值范畴是 0-255,通过调整这三个通道的亮度能够失去不同的色彩。RGB 模型 是一种加色混色模型,在叠加混合的过程中,亮度等于色调亮度的综合,混合的越多亮度就越高,三色通道中每个色彩有 256 阶的亮度,为 0 时最暗,255 时最亮。 HSL 模型 HSL 是对色相 (Hue)、饱和度 (Saturation)、亮度 (Lightness) 的解决失去色彩的一种模型。色相:代表人眼所能看到的不同的色彩,实质就是一种色彩。色相散布在一个圆环上,取值范畴则是 0-360°,每个角度代表着一种色彩。 饱和度:是指色彩的强度或纯度,应用 0 ~ 100% 度量。示意色相中色彩成分所占的比例,数值越大,色彩中的灰色越少,色彩越娇艳;亮度:体现色彩的明暗水平,应用 0 ~ 100% 度量。反映色调中混入的黑白两色,数值越小混入的彩色越多;数值越大混入的红色越多,50% 处只有纯色;HSV 模型 HSV 采纳色相 (Hue)、饱和度 (Saturation)、明度(Value) 3个参数来示意色彩的一种形式。 HSV 和 HSL 两个模型都是更偏差于视觉上直观的感觉。 Chrome 的色彩色盘,是基于 HSV 模型 1.3 像素和分辨率 位图放大后,会看到一个个小格子,每个格子为 1*1 的像素点。一张图有多少个像素点,与图片的分辨率无关,即常说的图片宽高尺寸,比方一张图的宽是 1920、高是 1080,则它领有 1920 * 1080 = 2073600 个像素点。1920 * 1080就是图像的分辨率。 像素作为位图的最根本单位,会通过色彩模型来形容,最常见的即是 RGB,加上通明通道是 RGBA。 RGBA 共四个通道重量,每个重量应用 1 个字节来示意。每个字节有 8 个比特位,二进制取值在 00000000-11111111,即有 0-255 共 256 种取值。 1.4 位深度色调深度又叫作位深度,是针对位图的,示意位图中存储 1 个像素的色彩所须要的二进制位的数量。个别色调深度越高,可用的色彩就越多,图片的色调也就会越丰盛,对应的图像数据更多,图像的体积就更大。 例如在 RGB 模型中,共 3 个通道重量,每个重量应用 1 个字节来示意。每个字节有 8 个比特位,因而对应 24 位图。而每个字节的二进制取值在 00000000-11111111之间,即有 0-255 共 256 种取值。那么 RGB = R(8) * G(8) * B(8) = 256 * 256 * 256,共1600多万色。如果多加一个 Alpha 通道,就是 32 位图。 bmp 格局的图片个别不会压缩,约等于原始图片,能够是 1-32位 的多种位深度的图片; 位数色彩数量阐明图片举例12单色二值图,只有一位二进制,0或1,它的每个像素将只有两个色彩:黑(0)和白(255)。41616种颜色8256256种颜色,gif动图个别都是简略的8位图1665536加强色,人眼能满足的视觉2416777216真彩色,人眼视觉上的极限,jpg 不反对通明通道位深度是24;321677721624位色彩+8位透明度,png 反对通明通道则位深度是32; 1.5 压缩形式图片的压缩形式个别是三类: 无压缩 简直不对图片进行压缩解决,尽量以原图的形式出现图片,如 bmp 格局的图片就属于这一类。无损压缩 很多图片都采纳无损压缩的形式,如 png、gif 等。无损压缩采纳对图片数据进行编码压缩,以不升高图片品质的状况下缩小图片的大小,无损压缩只是对像素数据压缩,不会缩小像素,简直没有损耗,所以能够复原到原始图片。有损压缩 有损压缩最常见的就是 jpg 格局的图片,它个别是应用去除人眼无奈辨认的图片像素的办法,升高了图片的品质用以大幅度的缩小图片的大小。这种状况下,有损压缩缩小了图片的像素点,导致图片数据局部失落了,属于不可逆的,所以无奈复原到原始图片。1.6 图片格式目前支流浏览器反对的图片格式个别有 7 种:jpg、png、gif、svg、bmp、ico、webp 格局压缩通明动画其余jpg有损否否色调丰盛、文件小png无损是否apng反对动画gif无损是是256色、文件较小bmp无压缩否否大,约等于原图(raw数据格式)svg无损是是简略图形,矢量图ico无损是否存储单个图案、多尺寸、多色板的图标文件webp无损、有损是是目前绝对最优avif无损是是超压缩,新出,反对少2、Javascript中的图像数据对象用 JS 中解决图像时,大抵有四种不同的图像数据类型: 文件 Blob:该对象示意的是一个不可变、原始数据的类文件对象,实质上是一个二进制对象File:继承自Blob对象,是一种非凡类型的Blob,它扩大了对系统文件的反对能力ArrayBuffer:示意通用的、固定长度的原始二进制缓冲区URL Data-URL:带 Base64 字符串编码的图像资源Object-URL:浏览器存储的Blob对象,并保护生成的一个图像资源Http-URL:存储于服务器上的图像资源本地图像资源:本地图像资源 Image:img (HTMLImageElement),DOM标签 <img> 对应的对象和类型,用于加载图像资源Canvas:canvas (HTMLCanvasElement)、ImageData、ImageBitmap。DOM标签 <canvas> 对应的对象和类型,用于加载图像资源和操作图像数据。2.1 ImageImage 是最常见的对象,次要作用是加载一张图片资源,创立并返回一个新的 HTMLImageElement 实例,领有图像元素的所有属性和事件。 const image = new Image();img.src = 'chrome.png';Image 对象实例的一些罕用的属性和事件: 属性:src、width、height、complete、alt、name等事件:onload、onerror、onabort等src 属性能够取值: 本地图像资源门路HTTP-URLObject-URLBase64 图像字符串new Image() 结构的图像实例,和 document.createElement('img') 创立一个图像对象,简直是一样的。 单张或大量图片的加载性能上,Image() 和 createElement() 简直没区别,都能够应用;但在大批量加载图片资源时,Image() 比 createElement() 略微快一些。 2.2 Canvas ImageDataImageData 对象示意 canvas 元素指定区域的像素数据。后面提过,图片像素数据实际上就是一个个的色彩值,ImageData 应用 RGBA 色彩模型来示意,所以 ImageData 对象的像素数据,长度为 width * height * 4。 new ImageData(array, width, height);new ImageData(width, height);array:Uint8ClampedArray 类型数组的实例,存储的是像素点的色彩值数据,数组元素按每个像素点的 RGBA 4通道的数值顺次排列,该数组的长度必须为 windth * height * 4,否则报错。如果不给定该数组参数,则会依据宽高创立一个全透明的图像。width:图像宽度height:图像高度Uint8ClampedArray 是8位无符号整型固定数组,属于 11 个类型化数组(TypeArray)中的一个,元素值固定在 0-255 区间。这个特点对于存储像素点的色彩值正好,RGBA 四个通道,每个通道的取值都是 0 - 255 间的数字。如[255, 0, 0, 255]示意红色、无通明。 ImageData 在 Canvas中利用ImageData 图像数据,是基于浏览器的 Canvas 环境,利用也都是在 Canvas 操作中,常见的如创立办法 createImageData()、读取办法 getImageData()、更新办法 putImageData() Canvas 操作 ImageData 的办法 createImageData():创立一个全新的空的ImageData对象,与 ImageData() 构造函数作用一样,返回像素点信息数据。 context.createImageData(width, height)context.createImageData(imagedata)getImageData():返回canvas画布中局部或全副的像素点信息数据。 context.getImageData(sx, sy, sWidth, sHeight);putImageData():将指定的 ImageData 对象像素点数据绘制到位图上。 context.putImageData(imagedata, dx, dy [, dirtyX, [ dirtyY, [ dirtyWidth, [dirtyHeight]]]]);应用 ImageData 的栗子 ...

February 29, 2024 · 7 min · jiezi

关于前端:纯新手入门快速跑通环信IM-iOS-Demo十分钟即可搞定

筹备工作1、获取环信Appkey登录环信控制台,获取本人的Appkey 2、创立一个新用户用户治理-创立IM用户,填入用户ID和明码 3、下载Demo 利用环信IM iOS端Demo下载:https://www.easemob.com/download/demo 扫码实现会跳转 TestFlight (保障曾经下载了这个app) 点击承受 关上app会进入手机号验证码登录页面,这个时候须要间断点击版本号(V4.4.0)直到进入开发者页面 点击确定 进入服务器配置,将本人的Appkey填入,其余默认 保留配置并重新启动app在Demo登录页面输出后面控制台创立用的id和明码,即可登录 4、下载Demo源码从官网下载Demo源码,下载之后须要 先pod install 关上我的项目 关上 EMDefines 文件 更改你本人的Appkey 而后运行我的项目 呈现此界面,进入开发者模式 填入控制台创立的id和明码 登录即可 登录之后进 我->开发者服务 能够看见自定义Appkey一栏 显示为替换的Appkey 我的项目跑通!功败垂成!参考文档:注册环信IM:https://console.easemob.com/user/register 环信官网Demo下载:https://www.easemob.com/download/demo IMGeek社区反对:https://www.imgeek.net/

February 29, 2024 · 1 min · jiezi

关于前端:主题风格

简介为了应答不同的展现用户需要和展现,制订高效的格调替换设计机制 入口如以后选中的是浅蓝格调,会给根目录下的次根目录绑定相干的类名:lightBlue 色彩分类文字次要文字(题目) : 红色惯例文字(内文):蓝色主要文字(表格表头,表单题目,表单icon):绿色占位文字(未选中,占位文字,不可选):橙色 图标&图片援用在组件援用css变量style内<style lang="scss">@import "@/assets/scss/color.scss";.box{ color: $font-color-primary;}</style>script内先在color.scss内导出,再在script内引入,如下: src\assets\scss\color.scss$lightBlue-primary: #2F81DF; $darkBlue-primary: #185BD7;:export { lightBlueTheme:$lightBlue-primary; darkBlueTheme:$darkBlue-primary;}组件<script>import themeColor from "@/assets/scss/color.scss";//...// to use</script>

February 29, 2024 · 1 min · jiezi

关于前端:滤波器和缓冲器用于单通道6阶高清视频滤波驱动电路可提高视频信号性能D1675

D1675单电源工作电压为+2.5V到+5V,是一款高清视频信号译码、编码的滤波器和缓冲器。与应用分立元件的传统设计相比,D1675更能节俭PCB板面积,并降低成本以及进步视频信号性能。D1675集成了一个直流耦合输出缓冲器、一个打消带外噪声的视频编码器和一个增益为+6dB可驱动75Ω负载的运放驱动。交换或直流耦合输出缓冲器打消同步挤压、蜿蜒和场歪斜。D1675的输入也能够是直流耦合或交换耦合。典型利用线图如下:A)线路如下:单通道6阶高清视频滤波驱动电路B)测试波形如下(电源VCC=3.3V,1MHz视频输出):理论利用(电源旁路和PCB板)适当的电源旁路在设计中对优化视频性能是很重要的,D1675应用一个0.1F和一个10F电容来旁路电源引脚,这两个电容应尽可能地凑近D1675的电源引脚;为确保最佳的性能,PCB地线尽可能宽;输出端和输入端电阻应尽可能靠近D1675相干引脚,以防止性能进化;在输入端PCB走线有75Ω电阻,与电缆75Ω阻抗相匹配;在PCB设计中,尽量使D1675输出和输入走线最短,这样可减小寄生电容和噪声。

February 29, 2024 · 1 min · jiezi

关于前端:如何在Jupyter-Notebook切换conda虚拟环境

大家好我是咕噜美乐蒂,很快乐又和大家见面了!在 Jupyter Notebook 中切换 Conda 虚拟环境能够通过以下步骤实现。首先,确保您曾经装置了 Conda,并且创立了多个虚拟环境。接下来,我将具体介绍在 Jupyter Notebook 中如何切换 Conda 虚拟环境的操作步骤。步骤一:装置 nb_conda 包1.关上命令行终端(Terminal)或 Anaconda Prompt。2.输出以下命令装置 nb_conda 包:conda install nb_conda步骤二:启动 Jupyter Notebook1.在命令行终端中输出以下命令启动 Jupyter Notebook:jupyter notebook2.这将在浏览器中关上 Jupyter Notebook 的主界面。步骤三:在 Jupyter Notebook 中切换 Conda 虚拟环境1.在 Jupyter Notebook 主界面中,关上一个新的或已有的 Notebook。2.在 Notebook 中的代码单元格中输出以下 Python 代码,用于激活不同的 Conda 虚拟环境:python!conda activate <environment_name>其中 <environment_name> 是您要切换到的 Conda 虚拟环境的名称。执行这段代码后,以后的 Notebook 将应用指定的虚拟环境中的 Python 解释器和包。3.如果您想要列出所有可用的 Conda 虚拟环境,能够应用以下代码:python!conda env list步骤四:验证虚拟环境切换1.在 Notebook 中的代码单元格中输出以下 Python 代码,用于验证以后所应用的 Python 解释器版本及其所属的虚拟环境:pythonimport sysprint(sys.executable)2.执行这段代码后,将会输入以后 Python 解释器的门路,您能够依据该门路来确认以后所处的虚拟环境。注意事项:1.在 Jupyter Notebook 中切换 Conda 虚拟环境时,须要以 ! 结尾执行 Shell 命令。2.在 Windows 零碎上,因为 Conda 不反对间接激活环境,因而在 Windows 上可能须要应用不同的形式来切换虚拟环境,比方应用 !conda activate <environment_name> 或 !activate <environment_name>。通过以上办法,您能够在 Jupyter Notebook 中轻松切换 Conda 虚拟环境,以便在不同的环境中进行 Python 代码的开发和测试。如果您须要进一步理解或有其余问题,请随时通知我。好啦,明天美乐蒂就和大家分享到这里啦,小伙伴们有更好的方法能够在评论区打进去哦~~以便大家更不便地操作呢。 ...

February 29, 2024 · 1 min · jiezi

关于前端:typechallenges-解析系列-一-简单部分

在读完 TypeScript 全面进阶指南 小册后,筹备尝试写一个解读 type-challenges 的系列文章,对所学的内容进行坚固,也心愿能对 typescript 有更宽敞的理解。 该系列文章在大的逻辑上会依据题集的艰难水平进行划分,简略局部波及到的基础知识比拟少,分为一篇文章解析,中等、艰难、天堂系列的题目会依据具体波及的常识篇幅划分。 在小的逻辑上,会依据题目为切入点,先剖析实现思路,同时也会举一反三类似的题目,最初给出解答(解答可能不是最好、最准确的,然而必定能通过测试用例)。 如果感兴趣的话,能够继续关注。 type-challenges 最根底的常识谨严来说,TypeScript 由三个局部组成:类型、语法、工程。 type-challenges 的题目波及到的是类型局部,这部分除了变量、函数等根底类型的标注, 最重要的就是各类类型工具的实现和应用,所以这里再把类型工具波及到的最根底也是最重要的常识复述一下, 其余知识点在题目中再提及。 类型工具在 type-challenges 的题目中绝大部分题目是实现一个合乎 XXX 性能的类型工具,所以理解类型工具很重要。TS 内置了像 Pick Partial Required Record 等类型工具,他们都基于类型别名和泛型实现。 类型别名用于封装一组或者一个特定类型。 type A = string;// 抽离一组联结类型type StatusCode = 200 | 301 | 400 | 500 | 502;type PossibleDataTypes = string | number | (() => unknown);// 申明一个对象类型,就像接口那样type ObjType = { name: string; age: number;}如果在类型别名的根底上增加泛型坑位,就成了类型工具。它的基本功能依然是创立类型,只不过工具类型可能承受泛型参数,实现更灵便的类型创立性能。从这个角度看,工具类型就像一个函数一样,泛型是入参,外部逻辑基于入参进行某些操作,再返回一个新的类型。 type Factory<T> = T | number | string;// 工具类型来做类型标注, 生成一个新的类型别名type FactoryWithBool = Factory<boolean>;const foo: FactoryWithBool = true;在 TS 中,类型工具能够这样划分: ...

February 29, 2024 · 7 min · jiezi

关于前端:云音乐前端国际化多语言探索实践

本文作者:atie,时浅本文深入探讨了云音乐海内我的项目在实现多语言反对过程中的摸索和实际,从最后的手动文案治理到倒退出一套全自动化的多语言管理系统——千语平台的演变过程。文章介绍了云音乐海内团队如何通过技术创新和流程优化,无效晋升了多语言我的项目的开发效率,解决了多语言利用开发中遇到的常见问题,包含但不限于代码中的语义清晰性、文案保护的高效率,以及性能优化等挑战。通过这一系列的改良,云音乐海内我的项目可能为寰球用户提供更加晦涩和响应迅速的应用体验,同时也为多语言利用开发提供了贵重的实践经验和启发。 背景一个国际化的产品,要在不同的国家和地区应用,就必须在设计软件时认真思考如何使产品的文本贴合当地的语种。为每个地区独自开发一个版本当然也是一个抉择,然而这样做势必节约人力,资源。云音乐海内我的项目始终在摸索如何更好更优地渲染不同语种的前端文本,目前得出的一个较优的做法是将软件与特定的语种及地区拆散,使得软件被移植到不同的语种及地区时,其自身不必做外部工程上的扭转或修改就能够将文案,图片等从源码中提取进去,渲染并显示给相应的用户。 本文侧重于分享咱们在开发多语言文案生产端(用户端)时的教训,包含开发效率、我的项目优化的思考与实际。一些风行的语言多语言库在介绍云音乐海内的多语言计划之前,咱们先理解下以后一些风行的多语言库以及一些惯例的做法 i18next及react-i18nexti18next 是一个用于前端国际化的 JavaScript 库。它提供了一个简略易用的 API,能够帮忙开发人员将应用程序本地化到多种语言。它提供了一种简洁的形式来加载翻译资源,并且反对多种资源格局(如 JSON、PO 等)。同时,它还反对动静加载和缓存翻译资源,以进步性能和用户体验。 react-i18next 则是基于 i18next 的一个 React 绑定库,提供了一套用于在 React 应用程序中实现国际化的组件和高阶组件。它可能无缝集成到 React 应用程序中,并且提供了不便的 API 来解决语言切换、翻译文本和解决复数等国际化相干工作 用法 初始化 i18next,并在入口文件引入 // i18n.jsimport i18n from "i18next";import { initReactI18next } from "react-i18next";import LanguageDetector from "i18next-browser-languagedetector";i18n .use(LanguageDetector) // 注入 react-i18next 实例 .use(initReactI18next) // 初始化 i18next .init({ debug: true, fallbackLng: "en", interpolation: { escapeValue: false, }, resources: { en: { translation: { // 这里是咱们的翻译文本 welcome: "Welcome to my website", }, }, zh: { translation: { // 这里是咱们的翻译文本 welcome: "欢送来到我的网站", }, }, }, });export default i18n;// app.jsimport { useTranslation, Trans } from "react-i18next";function App() { const { t } = useTranslation(); return ( <div> <main> <p>{t("welcome")}</p> </main> </div> );}export default App;vue-i18nvue-i18n 是一个用于在 Vue.js 应用程序中实现国际化的库。它同样提供了一种简略易用的形式来解决对多语言的反对,使开发人员可能轻松地将应用程序本地化到不同的语言。vue-i18n 反对多种语言切换策略,包含 URL 参数、浏览器语言设置和自定义逻辑。同时它还反对动静加载和异步加载翻译资源,以进步性能和用户体验。 ...

February 29, 2024 · 4 min · jiezi

关于前端:包管理工具之npm也慌了

npm也慌了?起因因为npm的种种问题,我很早就换成了pnpm和yarn(然而其实npm也在应用),曾经很久没有关注npm的性能更新了。最近无意间进入Node18版本的装置目录,发现其除了惯例的node,npm等默认装置了一个新的包corepack,这个就是明天我要分享的货色了。 注: 我因为18版本的node上发现了这个包,目前最新lts曾经是20了,最新都21了。起初去追溯其历史发现其曾经在14.21.3上就有了,然而14.0.0没有,没再具体去查。 这是一个什么货色呢?来看看官网介绍。 Corepack是一个零运行时依赖的Node.js脚本,用作Node.js我的项目与其开发过程中所需的软件包管理器之间的桥梁。从理论角度来看,Corepack容许您在不装置Yarn、npm和pnpm的状况下应用它们。 在构建软件包时,只需像平时一样应用您的包管理器即可。在Yarn我的项目中运行,在pnpm我的项目中运行,在npm我的项目中运行。Corepack将捕捉这些调用,并依据状况进行解决: 如果本地我的项目已配置您要应用的包管理器,Corepack将静默地下载并缓存最新的兼容版本。如果本地我的项目配置的是不同的包管理器,Corepack将要求您应用正确的包管理器再次运行命令,从而防止毁坏您的安装文件。如果本地我的项目没有配置任何包管理器,Corepack将假设您晓得本人在做什么,并应用作为“已知良好版本”的固定包管理器版本。我之前发过一篇文章说了从npm到yarn,再到pnpm的历史和我集体的一些了解,不理解的能够去看看。简略来说,因为一些大牛不满npm的性能或者不满其模块组织形式,或者不满其它什么中央,造了一个有一个轮子,在持续应用npm仓库源的根底上产生了比拟闻名的yarn以及pnpm。尽管npm感觉到压力,不断改进本人的毛病,学习其它工具的长处,然而用户必定还是被分流不少,而后以下是我的猜想:预计npm发现也阻止不了用户的分流了,打不过就退出,你爱用啥用啥,我间接出一个包管理工具的管理工具,另辟蹊径,我间接去治理npm,pnpm以及yarn。这个工具就是Corepack. Corepack是一种简化Node.js我的项目依赖治理的工具,它提供了一种便捷的形式,使您能够在开发过程中应用不同的包管理器,如Yarn、npm和pnpm,而无需当时装置它们。通过应用Corepack,您能够在我的项目中间接运行相似于yarn install、npm install或pnpm install等命令,而不用放心在开发环境中装置和配置这些包管理器。 总结一下: npm又造轮子了,这个轮子用来治理npm,yarn和pnpm,联合package.json配置,咱们能够限定我的项目要应用的工具。对立包管理器,不必手动保护包管理器,间接应用反对的包管理器命令即可。看官网介绍那段文字,咱们不须要装置yarn和pnpm状况下也能用yarn和pnpm? Corepack启用咱们上边官网介绍那一段,有一句话容许您在不装置Yarn、npm和pnpm的状况下应用它们。这句话其实通知咱们很重要的事,以前咱们装置完node,而后须要应用pnpm或者yarn,那么须要顺次装置一遍。而从node引入Corepack后,看意思不须要再去装置了(当然不是node默认曾经装置了,而是用的时会去静默下载安装到Corepack模块外部)。那么怎么用呢? 因为Corepack可能还处于Experimental阶段,所以性能默认是敞开的,须要咱们明确开启能力应用,它将在二进制文件旁边设置环境中的符号链接 (并在必要时笼罩现有的符号链接)。 #开启corepack enablecorepack enable npm #npm须要独自开启,不倡议开启#敞开corepack disablecorepack disable npm #npm须要独自敞开,不倡议开启,如果开启了,敞开也无奈还原初始状态,而是删除了corepack外面的链接留神: corepack enable开启后默认会装置yarn和pnpm的最新版,如果您的node版本是14,yarn或者pnpm的最新版可能要求会比14高,这就陷入一个你启用了,应用时又说你版本太低的问题。我是间接18上装置的。这里留神一下,npm还是比拟无耻的,它要治理yarn和pnpm,然而npm有点特权(兴许是因为处于测试阶段或者本人npm的版本兼容问题),npm也要启用须要独自执行corepack enable npm,去替换图中的全局npm的软链,不然咱们后边应用它治理时就会发现,yarn和pnpm都能够阻止,它本人畅行无阻。(这外面还有个大坑,这个命令审慎操作,请看前面问题1)倡议不要开启corepack enable npm。起因有上面问题1,还有一个问题就是如果你应用nvm或者一些进入目录,可能你设置了一些默认执行npm命令的一些脚本,例如nvm主动切换等等,一旦你配置的包管理器是pnpm或者yarn,那么npm必定会执行报错。可能还有其它各种各样的奇怪问题。我以Node v18.0.0为例,在咱们未开启时,就是下面第一张图。当咱们执行完开启命令: 发现主动链接了pnpm和yarn的执行脚本,而后你应用yarn或者pnpm命令时,会主动在corepack目录下载对应工具版本。 咱们也发现npm还是原来的模块地址,它不会被动更换链接,除非你执行corepack enable npm。 我也能了解为啥官网手动装置提醒外面,让先卸载本人装置的yarn和pnpm,因为它会本人下载(然而要留神网络)。 下载和缓存反对的包管理器最新版(全局环境) corepack prepare --all切换到指定版本 corepack prepare pnpm@<version> --activate在 node16.17 后,反对 latest 下载最新版本 corepack prepare pnpm@<version> --activate应用这一步,咱们才开始真正应用Corepack的能力。 咱们当初某个我的项目想只应用pnpm,然而有时候包管理器太多,忘了进去就yarn或者npm,导致产生了不同的依赖构造以及lock文件等等。那么请在package.json中增加packageManager字段。(packageManager后边工具必须指定版本且如同必须指定语义化版本,即x.y.z模式,这就比拟坑了,我看issis有人提这个问题了,看看官网会不会放开) 例如: { "name": "test", "version": "3.8.6", "description": "test", "author": "DLLCNX", "private": true, "packageManager": "pnpm@7.23.0", "scripts": { "dev": "vite", "build:prod": "vite build", "preview": "vite preview" }, "dependencies": { "pinia": "2.0.22", "vue": "3.2.45", "vue-cropper": "1.0.3", "vue-router": "4.1.4" }, "devDependencies": {}}而后咱们在此我的项目下应用npm和yarn以及pnpm: ...

February 29, 2024 · 2 min · jiezi

关于前端:防抖节流-的概念

防抖(Debounce)和节流(Throttle)是两种常见的编程概念,次要用于优化高频率触发的事件处理函数,以进步程序的性能和响应速度。 防抖(Debounce)的概念: 防抖的根本思维是在一个事件被频繁触发的状况下,只在事件触发完结后的一段时间内执行一次事件处理函数。如果在这段时间内事件再次被触发,那么就会从新计算执行工夫。这种技术罕用于输入框实时搜寻、窗口大小调整等场景。实现防抖的罕用办法是应用定时器。当事件被触发时,设置一个定时器,如果在定时器执行前事件再次被触发,则革除之前的定时器并从新设置。当定时器执行时,执行事件处理函数。节流(Throttle)的概念和实现: 节流的根本思维是在肯定工夫内只执行一次事件处理函数,无论事件被触发多少次。这种技术罕用于滚动加载、鼠标挪动等场景。实现节流的罕用办法也是应用定时器。当事件被触发时,首先判断定时器是否存在,如果存在则不执行事件处理函数,否则设置定时器并在定时器执行时执行事件处理函数。同时,在事件处理函数执行后革除定时器,以便下一次事件触发时能够从新设置。须要留神的是,防抖和节流尽管都能够优化高频率触发的事件处理函数,但它们的实用场景和成果有所不同。防抖更适宜于事件触发距离较短、须要准确管制执行工夫的场景,而节流更适宜于事件触发频率较高、须要限度处理函数执行次数的场景。在理论利用中,须要依据具体场景和需要抉择适宜的技术进行优化。

February 28, 2024 · 1 min · jiezi

关于前端:关于前端配置Nginx的知识你可能需要略知一二

在前端开发中,Nginx不仅仅是一款高效的Web服务器,更是一个弱小的工具,可能显著晋升Web利用的性能和用户体验Nginx简介Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在BSD-like协定下发行。因为其高性能、稳定性、丰盛的功能集、简略的配置以及低资源耗费而被宽泛应用 个别罕用的Nginx配置具体阐明#定义Nginx运行的用户和用户组user www www;#nginx过程数,倡议设置为等于CPU总外围数。worker_processes 8;#全局谬误日志定义类型,[ debug | info | notice | warn | error | crit ]error_log /var/log/nginx/error.log info;#过程文件pid /var/run/nginx.pid;#一个nginx过程关上的最多文件描述符数目,理论值应该是最多关上文件数(零碎的值ulimit -n)与nginx过程数相除,然而nginx调配申请并不平均,所以倡议与ulimit -n的值保持一致。worker_rlimit_nofile 65535;#工作模式与连接数下限events{#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD下面,就用kqueue模型。use epoll;#单个过程最大连接数(最大连接数=连接数*过程数)worker_connections 65535;}#设定http服务器http{ include mime.types; #文件扩展名与文件类型映射表 default_type application/octet-stream; #默认文件类型 #charset utf-8; #默认编码 server_names_hash_bucket_size 128; #服务器名字的hash表大小 client_header_buffer_size 32k; #上传文件大小限度 large_client_header_buffers 4 64k; #设定申请缓 client_max_body_size 8m; #设定申请缓 sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输入文件,对于一般利用设为 on,如果用来进行下载等利用磁盘IO重负载利用,可设置为off,以均衡磁盘与网络I/O处理速度,升高零碎的负载。留神:如果图片显示不失常把这个改成off。 autoindex on; #开启目录列表拜访,适合下载服务器,默认敞开。 tcp_nopush on; #防止网络阻塞 tcp_nodelay on; #防止网络阻塞 keepalive_timeout 120; #长连贯超时工夫,单位是秒 #FastCGI相干参数是为了改善网站的性能:缩小资源占用,进步访问速度。上面参数看字面意思都能了解。 fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; #gzip模块设置 gzip on; #开启gzip压缩输入 gzip_min_length 1k; #最小压缩文件大小 gzip_buffers 4 16k; #压缩缓冲区 gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请应用1.0) gzip_comp_level 2; #压缩等级 gzip_types text/plain application/x-javascript text/css application/xml; #压缩类型,默认就曾经蕴含text/html,所以上面就不必再写了,写上去也不会有问题,然而会有一个warn。 gzip_vary on; #limit_zone crawler $binary_remote_addr 10m; #开启限度IP连接数的时候须要应用 upstream blog.ha97.com { #upstream的负载平衡,weight是权重,能够依据机器配置定义权重。weigth参数示意权值,权值越高被调配到的几率越大。 server 192.168.80.121:80 weight=3; server 192.168.80.122:80 weight=2; server 192.168.80.123:80 weight=3; } #虚拟主机的配置 server { #监听端口 listen 80; #域名能够有多个,用空格隔开 server_name www.ha97.com ha97.com; index index.html index.htm index.php; root /data/www/ha97; location ~ .*.(php|php5)?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } #图片缓存工夫设置 location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ { expires 10d; } #JS和CSS缓存工夫设置 location ~ .*.(js|css)?$ { expires 1h; } #日志格局设定 log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; #定义本虚拟主机的拜访日志 access_log /var/log/nginx/ha97access.log access; #对 "/" 启用反向代理 location / { proxy_pass http://127.0.0.1:88; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; #后端的Web服务器能够通过X-Forwarded-For获取用户实在IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #以下是一些反向代理的配置,可选。 proxy_set_header Host $host; client_max_body_size 10m; #容许客户端申请的最大单文件字节数 client_body_buffer_size 128k; #缓冲区代理缓冲用户端申请的最大字节数, proxy_connect_timeout 90; #nginx跟后端服务器连贯超时工夫(代理连贯超时) proxy_send_timeout 90; #后端服务器数据回传工夫(代理发送超时) proxy_read_timeout 90; #连贯胜利后,后端服务器响应工夫(代理接管超时) proxy_buffer_size 4k; #设置代理服务器(nginx)保留用户头信息的缓冲区大小 proxy_buffers 4 32k; #proxy_buffers缓冲区,网页均匀在32k以下的设置 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 } # 部署Vue单页利用的资源,须要配置Nginx以将所有非动态文件申请重定向到`index.html` location / { root /path/to/vue-app/dist; try_files $uri $uri/ /index.html; } #设定查看Nginx状态的地址 location /NginxStatus { stub_status on; access_log on; auth_basic "NginxStatus"; auth_basic_user_file conf/htpasswd; #htpasswd文件的内容能够用apache提供的htpasswd工具来产生。 } #本地动静拆散反向代理配置 #所有jsp的页面均交由tomcat或resin解决 location ~ .(jsp|jspx|do)?$ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:8080; } #所有动态文件由nginx间接读取不通过tomcat或resin location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ { expires 15d; } location ~ .*.(js|css)?$ { expires 1h; } }}咱们先理解一下它的个性 ...

February 28, 2024 · 2 min · jiezi

关于前端:Uniapp在IOS系统打包测试流程

大家好我是咕噜美乐蒂,很快乐又和大家见面了!UniApp 是一种基于 Vue.js 的跨平台利用开发框架,能够用于疾速构建同时反对多个平台(包含iOS、Android、Web 等)的应用程序。在 iOS 零碎上打包和测试 UniApp 利用的流程能够分为如下几个步骤:1.环境搭建:在开始打包和测试 UniApp 利用之前,首先须要确保您的开发环境曾经搭建实现。在 macOS 零碎上,您须要装置 Xcode 开发工具和 Node.js 环境。确保您的设施能够连贯到互联网,并具备开发 iOS 利用的根本条件。2.创立 UniApp 我的项目:如果您还没有一个 UniApp 我的项目,能够通过官网文档或命令行工具创立一个新的 UniApp 我的项目。应用命令行工具能够更疾速地进行我的项目初始化,并抉择适宜 iOS 平台的模板。3.配置利用信息:在 UniApp 我的项目中,您须要编辑 manifest.json 文件,配置利用的根本信息,如利用名称、图标、启动页等。确保这些信息合乎 iOS 利用的要求,并可能正确显示在设施上。4.调试和测试:在开发过程中,您能够应用 HBuilderX 或其余编辑器工具进行代码编写和调试。UniApp 提供了丰盛的开发工具和调试性能,帮忙您疾速定位和解决问题。您能够在浏览器中进行实时预览,并通过模拟器或真机进行调试。5.编译打包:当利用开发实现后,您须要进行编译打包操作,生成可在 iOS 设施上装置的利用包。通过命令行工具或 HBuilderX 工具,抉择 iOS 平台并进行打包操作。UniApp 反对生成原生的 iOS 利用,并提供了丰盛的配置选项。6.Xcode 配置:在打包生成的 iOS 利用中,会蕴含 Xcode 我的项目文件。您须要应用 Xcode 关上该我的项目,并进行一些配置操作。例如,配置利用的签名证书、利用标识符、权限设置等。确保 Xcode 中的配置与您的开发者账号和利用信息统一。7.设施连贯:在进行测试之前,您须要将 iOS 设施连贯到计算机,并在 Xcode 中进行相干设置。确保设施已启用开发者模式,并在 Xcode 中正确辨认设施。您能够抉择在真机上测试利用,以确保利用在理论设施上的运行状况。8.测试和调试:在 Xcode 中,您能够抉择在连贯的 iOS 设施上运行利用进行测试。通过 Xcode 提供的调试工具,查看利用的日志输入、性能状况等信息。确保利用在 iOS 设施上的运行稳固,并没有呈现重大的问题。9.公布上架:当利用通过测试并达到公布规范时,您能够筹备将利用提交到 App Store 上架。在苹果开发者核心中,依照指引逐渐提交利用信息、截图、形容等内容。通过审核后,您的利用将在 App Store 中上架,供用户下载安装应用。总的来说,UniApp 在 iOS 零碎上的打包测试流程波及到环境搭建、我的项目创立、配置信息、调试测试、打包编译、Xcode 配置、设施连贯、公布上架等多个步骤。通过逐渐实现这些步骤,您能够胜利将 UniApp 利用在 iOS 设施上进行打包测试,并最终公布到 App Store 中。如果您须要进一步理解某个步骤的具体操作,请随时通知我。好啦,明天美乐蒂就和大家分享到这里啦,小伙伴们有更好的方法能够在评论区打进去哦~~以便大家更不便地操作呢。 ...

February 28, 2024 · 1 min · jiezi

关于前端:立体声耳机功率放大器电路D7000静态电流低且电源纹波抑制比高

立体声耳机功率放大器电路-D7000,动态电流低,电源纹波克制比高,内置节电模式开关和静噪开关,次要利用于便携式视盘播放器(DISCMAN),便携式迷你播放器(MD),Disc-Man,MP3 播放器,CD-ROM以及其它便携式Disc风扇马达驱动器等畛域。 二、次要特点: ·动态电流低 ·电源纹波克制比高 ·工作电压低 ·内置节电模式开关和静噪开关 ·外接元件少所需外围元件少 ·封装模式:SSOP10 三、利用: ·便携式视盘播放器(DISCMAN) ·便携式迷你播放器(MD) ·Disc-Man ·MP3 播放器 ·CD-ROM ·其它便携式Disc风扇马达驱动器

February 28, 2024 · 1 min · jiezi

关于前端:欢迎参与2024年-OpenTiny-开源项目用户调研

欢送参加 OpenTiny 开源我的项目的用户调研 调研背景 随着 OpenTiny 开源我的项目的一直倒退,咱们始终致力于为开发者提供高质量的 Web 前端开发解决方案。为了更好地满足用户需要,晋升我的项目的实用性和易用性,咱们决定发动一项用户调研流动,诚挚邀请您参加。 调研目标 理解用户需要:收集您在应用 OpenTiny 开源我的项目过程中的需要、问题和倡议,以便咱们更好地改良和优化。晋升用户体验:通过您的反馈,咱们将找出我的项目中的有余,并致力晋升我的项目的性能、稳定性和易用性。促成社区倒退:您的参加和倡议将有助于 OpenTiny 开源我的项目的成长和倒退,独特构建一个凋敝的开源社区。 调研内容 您目前应用的开发框架(如React、Vue、Angular等)。您在应用 OpenTiny 我的项目时遇到的问题和挑战。您对 OpenTiny 我的项目的冀望和改良倡议。您心愿咱们在将来版本中减少或优化的性能。 如何参加 填写问卷:进入https://www.wjx.cn/vm/YdhiOJB.aspx (或扫描二维码)填写咱们的调研问卷,分享您的想法和倡议。 参加探讨:退出咱们的开源社区[增加小助手:opentiny-official],在指定的讨论区发表您的认识和倡议。 处分机制 所有参加调研的用户都将取得 OpenTiny 官网颁发的电子感激证书。局部优良倡议的提交者并参加奉献的敌人将取得 OpenTiny 我的项目的特地贡献者荣誉。 联系方式 如有任何疑难或倡议,请随时通过以下形式与咱们分割: 邮箱:opentiny@huawei.comGitHub仓库:https://github.com/opentiny退出社区:opentiny-official 感谢您的参加 您的宝贵意见对于 OpenTiny 开源我的项目的成长至关重要。咱们期待收到您的反馈,并共同努力打造一个更加优良的开源 Web 前端开发解决方案! 同时期待您一起参加 OpenTiny 前端 Web 利用开发挑战赛赢取30W奖金~ 报名入口: https://competition.atomgit.com/competitionInfo?id=341b80d53f... 对于 OpenTiny OpenTiny 是一套企业级 Web 前端开发解决方案,提供跨端、跨框架、跨版本的 TinyVue 组件库,蕴含基于 Angular+TypeScript 的 TinyNG 组件库,领有灵便扩大的低代码引擎 TinyEngine,具备主题配置零碎TinyTheme / 中后盾模板 TinyPro/ TinyCLI 命令行等丰盛的效率晋升工具,可帮忙开发者高效开发 Web 利用。 欢送退出 OpenTiny 开源社区。增加微信小助手:opentiny-official 一起参加交换前端技术~更多视频内容也可关注B站、抖音、小红书、视频号 OpenTiny 也在继续招募贡献者,欢送一起共建 ...

February 28, 2024 · 1 min · jiezi

关于前端:关于前端实现文件下载功能

在Web开发中,前端下载文件是一个常见的需要。依据文件起源和下载方式的不同,前端下载文件能够采纳多种计划。上面将介绍几种常见的前端下载文件计划。 1、通过 window.open() 关上新页面下载文件window.open(`url`, "_self");应用场景:下载 excel 文件,后端提供接口,接口返回的是文件流,能够间接应用 window.open(),最简略的形式。 长处:最简洁;弊病:当参数谬误时,或其它起因导致接口申请失败,这时无奈监听到接口返回的错误信息,须要保障申请必须是正确的且能正确返回数据流,不然关上页面会间接输入接口返回的错误信息,体验不好。2、通过 a 标签关上新页面下载文件export const exportFile = (url, fileName) => { const link = document.createElement("a"); const body = document.querySelector("body"); link.href = url; link.download = fileName; // fix Firefox link.style.display = "none"; body.appendChild(link); link.click(); body.removeChild(link);};通过 a 标签下载的形式,同 window.open()是一样的,惟一的长处是能够自定义下载后的文件名,a 标签里有 download 属性能够自定义文件名。 弊病:同 window.open()形式一样,无奈监听错误信息。 问题:以上两种形式,当在下载.mp3 格局,或者视频文件时,浏览器会间接播放该文件,而达不到间接下载的性能,此时,当下载音视频文件时无奈应用以上两种形式。 3、通过文件流的形式下载为了解决.mp3 文件下载所带来的问题,通过 ajax 申请返回 Blob 对象,或者 ArrayBuffer 对象。 获取文件如下:通过原生 ajax 申请返回 Blob 对象 const getBlob = (url) => { return new Promise((resolve) => { const xhr = new XMLHttpRequest(); xhr.open("GET", url, true); xhr.responseType = "blob"; xhr.onload = () => { if (xhr.status === 200) { resolve(xhr.response); } }; xhr.send(); });};同样,也能够通过 axios 返回 ArrayBuffer 对象来解决 ...

February 28, 2024 · 3 min · jiezi

关于前端:web端屏幕截屏生成自定义海报

在一些社群网站,常常会碰到问题、流动、商品的信息分享,这种分享通常是以海报的模式发送给好友或保留到本地。在这种场景下,海报必定是动态变化的,所以咱们要动静的渲染内容并生成图片,海报其实就是图片。官网:html2canvas海报示例: 介绍理解 html2canvas,它是如何工作的以及它的一些局限性。在你开始应用这个脚本以前,这里有些帮忙你更好的理解脚本的益处及其的一些局限性。 对于html2canvas 是一个 HTML 渲染器。该脚本容许你间接在用户浏览器截取页面或局部网页的“屏幕截屏”,屏幕截图是基于 DOM,因而生成的图片并不一定 100% 统一,因为它没有制作理论的屏幕截图,而是依据页面上可用的信息构建屏幕截图。 它是如何工作的该脚本通过读取 DOM 以及利用于元素的不同款式,将以后页面出现为 canvas 图像。它不须要来自服务器的任何渲染,因为整个图像是在客户端上创立的。然而,因为它太依赖于浏览器,因而该库不适宜在 nodejs 中应用。它也不会神奇地躲避任何浏览器内容策略限度,因而出现跨域内容将须要代理来将内容提供给雷同的源。 开始筹备工作装置依赖 npm install html2canvas在须要的页面引入依赖 import html2canvas from 'html2canvas'而后就能够应用html2canvas相干API了。 定义海报构造在应用之前咱们要先定义好页面,咱们先在页面上写好海报的html <view class="html2canvas"> <view class="poster_title"> 海报题目 </view> <view class="img_box"> <img class="img_case" src="http://image.gwmph.com/weican/2024/02/27/695aa1d4c2394be48925a6858dd68e9d.jpg" alt="" /> </view> <view class="poster_title" @click="getPoster()"> 确定分享 </view></view> .html2canvas{ padding: 20rpx; .poster_title{ text-align: center; } .img_box{ display: flex; justify-content: space-around; margin: 10rpx 0; .img_case{ width: 300rpx; height: 300rpx; } } }script局部在这里咱们要辨别两种script类型,一种失常的,一种是renderjs在一个页面中script能够有多个,它也能够写在任意地位,如果咱们做失常的逻辑操作,能够在一般的script中编码;如果咱们要对页面进行交互,请应用renderjs。 renderjs是一个运行在视图层的js。它比WXS更加弱小。它只反对app-vue和web。renderjs的次要作用有2个: 大幅升高逻辑层和视图层的通信损耗,提供高性能视图交互能力在视图层操作dom,运行 for web 的 js库<script module="html2canvas" lang="renderjs">import html2canvas from 'html2canvas'; // 引入html2canvasexport default { methods: { async getPoster() { try { const dom = document.querySelector('.html2canvas'); const canvas = await html2canvas(dom,{ width: dom.offsetWidth,//设置canvas尺寸与所截图尺寸雷同,避免白边 height: dom.offsetHeight,//避免白边 logging: true, // 是否尝试记录日志 useCORS: true, // 是否尝试应用CORS从服务器加载图像,解决图片跨域 scale: 4, // 缩放比例,解决含糊问题,数值越大越高清 dpi: 600, // 分辨率,,解决含糊问题,数值越大越高清 }); const base64 = canvas.toDataURL('image/jpeg', 1); console.log('生成的图片',base64); } catch(error){ console.log(error) } } }}</script>点击确定分享,咱们则会调用getPoter来生成图片,canvas.toDataURL生成的图片为base64格局,上面是生成后的内容: ...

February 28, 2024 · 2 min · jiezi

关于前端:使用JavaScript手写一个简单的快捷键库

背景前端开发中,有时我的项目会遇到一些快捷键需要,比方绑定快捷键,展现快捷键,编辑快捷键等需要,特地是工具类的我的项目。如果只是简略的绑定几个快捷键之类的需要,咱们个别会通过监听键盘事件(如keydown 事件)来实现,如果是略微简单点的需要,咱们个别都会通过引入第三方快捷键库来实现,比方罕用的几个快捷键库mousetrap, hotkey-js等。 接下来,我将会通过对快捷键库mousetrap第一次提交的源码进行简略剖析,而后实现一个简略的快捷键库。 前置常识首先,咱们须要理解一些快捷键相干的基础知识。比方,如何监听键盘事件?如何监听用户按下的按键?键盘上的按键有哪些?是如何分类的?只有晓得这些,能力更好的了解mousetrap这种快捷键库实现的思路,能力更好地实现咱们本人的快捷键库。 如何监听键盘事件实现快捷键须要监听用户按下键盘按键的行为,那就须要应用到键盘事件API。 罕用的键盘事件有keydown, keyup,keypress事件。一般来说,咱们会通过监听用户按下按键的行为,来判断是否要触发对应的快捷键行为。通常来说,在用户按下按键时,就会判断是否有匹配的绑定过的快捷键,即通过监听keydown事件来实现快捷键。 如何监听键盘上按下的键咱们能够通过键盘事件来监听用户按键行为。那如何晓得用户具体按下了哪个/哪些按键呢? 比方,用户绑定的快捷键是s,那如何晓得以后按下的按键是s?咱们能够通过键盘事件对象keyboardEvent上的code, keyCode, key这些属性来判断用户以后按下的按键。 键盘按键分类有些按键会影响其余按键按下后产生的字符。比方,用户同时按下了shift和/按键,此时产生的字符是?,然而实际上如果只按shift按键不会产生任何字符,只按/按键产生的字符本应该是/,最终产生的字符?就是因为同时按下了shift按键导致的。这里的shift按键就是影响其余按键按下后产生字符的按键,这种按键被称为润饰键。相似的润饰键还有ctrl, alt(option), command(meta)。 除了这几个润饰键以外,其余的按键称为非润饰键。 快捷键分类罕用的快捷键有单个键,键组合。有的还会用到键序列。 单个键故名思义,单个键是只须要按下一个键就会触发的快捷键。比方罕用的音视频切换播放/暂停快捷键Space,游戏中管制挪动方向快捷键w,a,s,d等等。 键组合键组合通常是一个或多个润饰键和一个非润饰键组合而成的快捷键。比方罕用的复制粘贴快捷键ctrl+c,ctrl+v,保留文件快捷键ctrl+s,新建(浏览器或其余app)窗口快捷键ctrl+shift+n(command+shift+n)。 键序列顺次按下的按键称为键序列。比方键序列h e l l o,须要顺次按下h,e,l,l,o按键才会触发。 mousetrap源码剖析以下将以mousetrap第一次提交的源码为根底进行简略剖析,源码链接如下:https://bit.ly/3TdcK8u 简略来说,代码只做了两件事,即绑定快捷键和监听键盘事件。 代码设计和初始化首先,给window对象增加了一个全局属性Mousetrap,应用的是IIFE(立刻执行函数表达式)对代码进行封装。 该函数对外裸露了几个公共办法: bind(keys, callback, action): 绑定快捷键trigger(): 手动触发绑定的快捷键对应的回调函数。最初当window加载后立刻执行init()函数,即执行初始化逻辑:增加键盘事件监听等。 // 以下为简化后的代码window['Mousetrap'] = (function () { return { /** * 绑定快捷键 * @param keys 快捷键,反对一次绑定多个快捷键。 * @param callback 快捷键触发后的回调函数 * @param action 行为 */ bind: function (keys, callback, action) { action = action || ''; _bindMultiple(keys.split(','), callback, action); _direct_map[keys + ':' + action] = callback; }, /** * 手动触发快捷键对应的回调函数 * @param keys 绑定时的快捷键 * @param action 行为 */ trigger: function (keys, action) { _direct_map[keys + ':' + (action || '')](); }, /** * 给DOM对象增加事件,针对浏览器兼容性的写法 * @param object * @param type * @param callback */ addEvent: function (object, type, callback) { _addEvent(object, type, callback); }, init: function () { _addEvent(document, 'keydown', _handleKeyDown); _addEvent(document, 'keyup', _handleKeyUp); _addEvent(window, 'focus', _resetModifiers); }, };})();Mousetrap.addEvent(window, 'load', Mousetrap.init);绑定快捷键一般来说,快捷键库都会提供一个绑定快捷键的函数,比方bind(key, callback)。在mousetrap中,咱们能够通过调用Mousetrap.bind()函数来实现快捷键绑定。 ...

February 28, 2024 · 6 min · jiezi

关于前端:vue3组件常用的通信方式父传子子传父父直接获取子pinia

1.父传子: 属性传递(Props):这是从父组件向子组件传递数据的最罕用形式。 在父组件的模板中,你能够应用子组件标签并增加属性来传递数据。 子组件通过 props 选项来接管这些数据。父组件代码 <template> <div> 父组件 <Son :par="arr"></Son> </div> </template> <script setup lang="ts"> import Son from './son.vue' const arr='我是张三' </script> <style scoped > </style>子组件代码子组件承受数据 <template> <div> 子组件 </div></template><script setup lang="ts"> import {defineProps} from 'vue' const {par}=defineProps(['par']) console.log(par,'父组件传来的'); </script><style scoped ></style>成果展现 2.子传父:事件发射(defineEmits):子组件能够应用‘defineEmits定义一个自定义事件,并传递数据给父组件。父组件监听这个事件并解决数据。子组件代码 <template> <div> <div @click="btn" class="box"> </div> </div> </template> <script setup lang="ts"> import {defineEmits} from 'vue' // 定义一个自定义事件 const emit=defineEmits(['up']) const value ='我是子组件' const btn=()=>{ //向父组件传值 emit('up',value) } </script> <style> .box{ width: 100px; height: 100px; border: solid 1px red; } </style>父组件代码 ...

February 27, 2024 · 2 min · jiezi

关于前端:Promise拆解计划手写Promise并通过官方全部测试用例

大家好,欢送来到前端研习圈的今日分享。 前言本系列上期带着大家一起拆解了 Promises/A+ 标准。从概念,术语,束缚条例等方面理解了标准 那么本期咱们要做的就是从标准到实现,并且通过官网的所有测试用例。为了和原生的 Promise 有所区别,咱们就把这一版实现命名为 _Promise。齐全状态曾经上传到 github,须要的同学自取 提醒:_Promise 仅关注具体实现,不关注成员办法具体应该是公有还是私有等设计细节 源码地址 ->https://github.com/Mumujianguang/_promise接下来咱们就进入主题,首先咱们大略整顿一下 todo list 定义 Promise 的状态枚举定义 Promise 的类构造实现构造函数实现 then 办法结构设计首先,咱们先定义一个枚举对象,将 Promise 的三种状态定义进去 const PromiseState = { pending: 'pending', fulfilled: 'fulfilled', rejected: 'rejected'}而后简略设计一下类构造,同时将 state 初始化为 pending 状态 class _Promise { state = PromiseState.pending; value; reason; fulfilledQueue = []; rejectedQueue = []; constructor(executor) {} resolve(value) {} reject(reason) {} then(onFulfilled, onRejected) {}}因为 then 能够调用屡次,所以咱们设计 fulfilledQueue 和 rejectedQueue 两个数组来别离存储 then 所注册的 胜利的回调 和 失败的回调 ...

February 27, 2024 · 4 min · jiezi

关于前端:程序员必读的职业规划书读后感

一、程序员职业的四大象限: 详情请查看: 《程序员必读的职业规划书》读后感

February 27, 2024 · 1 min · jiezi

关于前端:-就因为这道题面字节差点儿就寄了

兴许你我素未谋面,但很可能相见恨晚,我是前端胖头鱼 前言金三银四大潮如期到来,在这个裁员、降薪、开张无处不在的凛冽节令里,咱们都没有太多抉择的余地。唯有努力提高本身能力,能力在寒风凛冽中站住脚跟,抵挡随时到来的危险。 最近有个敌人在面字节时遇到了一道有意思的题,依照他的话说,差点就因为这个题寄了,不过好在他在最初几分钟,充分调动体内的洪荒之力,解出了答案,朝字节又迈进了一步。 要不要一起来做做这道题!!! 1.# 62进制的大数相加// 实现两个62进制数的大数加法// 输出:两个 62 进制数,String 类型,仅思考整数// 输入:两数之和,String 类型// 62 进制数:依照 1-9,a-z,A-Z 递增function sum (a, b) {}不晓得你们看到这道题时是什么感触!!! 我过后的想法是:“如同只听过2进制、8进制、16进制、32进制,62进制是什么鬼? ” 终于在看到这段信息后豁然开朗:62 进制数:依照 1-9,a-z,A-Z 递增, 我掰着手加脚指头数了数... 0 ~ 9 是10个数a ~ z 是26个字母A ~ Z 是26个字母加起来就是62个数,刚好凑齐62进制。 1.1 10进制大数相加(整数)忽然看到求62进制的两数之和,我心田多少是有点懵逼的,懵逼的点在哪? 就是字母咋相加啊?比方 1a(10进制的72) + 2 = 1c(10进制的74) 不过作为承受过9年义务教育的社会主义接班人,一年级咱们就学会了加法(也就是所谓的10进制加法)。 回顾一下小学常识: 19 + 23? 1. 个位数相加:9 + 3 = 12。写下 2,进位 1。 19+ 23----- 2 2. 十位数相加并加上进位:1 + 2 + 1(进位)= 4。 19+ 23----- 42非常简单是不是?咱们尝试一下用程序来计算两个10进制数的加法。 ...

February 27, 2024 · 4 min · jiezi

关于前端:使用原生-cookieStore-方法让-Cookie-操作更简单

前言对于前端来讲,咱们在操作cookie时往往都是基于document.cookie,但它有一个毛病就是操作简单,它并没有像localStorage那样提供一些get或set等办法供咱们应用。对与cookie的操作一切都是基于字符串来进行的。为了让cookie的操作更简便, Chrome87率先引入了cookieStore办法。 document.cookiedocument.cookie能够获取并设置以后文档关联的cookie 获取cookieconst cookie = document.cookie在下面的代码中,cookie 被赋值为一个字符串,该字符串蕴含所有的 Cookie,每条 cookie 以"分号和空格 (; )"分隔 (即, key=value 键值对)。 但这拿到的是一整个字符串,如果你想获取cookie中的某一个字段,还须要本人解决 const converter = { read: function (value) { if (value[0] === '"') { value = value.slice(1, -1); } return value.replace(/(%[\dA-F]{2})+/gi, decodeURIComponent) }, write: function (value) { return encodeURIComponent(value).replace( /%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g, decodeURIComponent ) }}function getCookie (key) { const cookies = document.cookie ? document.cookie.split('; ') : []; const jar = {}; for (let i = 0; i < cookies.length; i++) { const parts = cookies[i].split('='); const value = parts.slice(1).join('='); try { const foundKey = decodeURIComponent(parts[0]); jar[foundKey] = converter.read(value, foundKey); if (key === foundKey) { break } } catch (e) {} } return key ? jar[key] : jar}console.log(getCookie('name')) // 前端南玖比方下面这段代码就是用来获取单个cookie值的 ...

February 27, 2024 · 3 min · jiezi

关于前端:实现炫酷的多Tab互动效果

本文翻译自https://dev.to/notachraf/sharing-a-state-between-windows-without-a-serve-23an最近,社交网络上呈现了一张 gif 动图,展现了比约恩·斯塔尔 (Bjorn Staal) 制作的一件令人惊叹的艺术作品。动图我想从新创立它,但不足球体、粒子和物理的 3D 技能,我的指标是理解如何使一个窗口对另一个窗口的地位做出反馈。实质上,在多个窗口之间共享状态,我发现这是 Bjorn 我的项目中最酷的方面之一!因为无奈找到无关该主题的好文章或教程,我决定与您分享我的发现。让咱们尝试依据 Bjorn 的工作创立一个简化的概念验证 (POC)!动图我做的第一件事就是列出我所晓得的在多个客户端之间共享信息的所有办法: 呃:服务器显然,领有服务器(带有轮询或 Websocket)能够简化问题。然而,因为 Bjorn 在没有应用服务器的状况下实现了他的后果,所以这是不可能的。 localStoragelocalStorage实质上是浏览器键值存储,通常用于在浏览器会话之间保存信息。尽管通常用于存储身份验证令牌或重定向 URL,但它能够存储任何可序列化的内容。您能够在这里理解更多信息。我最近发现了一些乏味的本地存储 API,包含storage每当本地存储被同一网站的另一个会话更改时就会触发的事件。想发现新的 API 吗?订阅我的时事通信(收费!)咱们能够通过将每个窗口的状态存储在本地存储中来利用这一点。每当一个窗口扭转其状态时,其余窗口将通过存储事件进行更新。这是我最后的想法,这仿佛是 Bjorn 抉择的解决方案,因为他在这里分享了他的 LocalStorage 管理器代码以及与 ThreeJs 一起应用它的示例。然而当我发现有代码能够解决这个问题时,我想看看是否还有其余办法……剧透正告:是的,有! WebWorker简略来说,工作线程实质上是在另一个线程上运行的第二个脚本。尽管它们无法访问 DOM(因为它们存在于 HTML 文档之外),但它们依然能够与您的主脚本进行通信。它们次要用于通过解决后台作业来卸载主脚本,例如预取信息或解决不太要害的工作(例如流日志和轮询)。共享工作线程是一种非凡类型的 WebWorkers,它能够与同一脚本的多个实例进行通信,这使得它们对咱们的用例很乏味!好吧,让咱们间接进入代码!设置工人如前所述,工作人员是具备本人的入口点的“第二脚本”。依据您的设置(TypeScript、捆绑程序、开发服务器),您可能须要调整 tsconfig、增加指令或应用特定的导入语法。我无奈涵盖应用 Web Worker 的所有可能办法,但您能够在 MDN 或互联网上找到信息。如果须要,我很乐意为本文撰写前传,具体介绍设置它们的所有办法!就我而言,我应用 Vite 和 TypeScript,因而我须要一个worker.ts文件并将其装置@types/sharedworker为开发依赖项。咱们能够应用以下语法在主脚本中创立连贯:new SharedWorker(new URL("worker.ts", import.meta.url));基本上,咱们须要:辨认每个窗口跟踪所有窗口状态一旦窗口扭转其状态,揭示其余窗口重绘咱们的状态将非常简单:type WindowState = { screenX: number; // window.screenX screenY: number; // window.screenY width: number; // window.innerWidth height: number; // window.innerHeight};当然,最重要的信息是window.screenX它们window.screenY通知咱们窗口绝对于显示器左上角的地位。咱们将有两种类型的音讯:每个窗口,每当其状态发生变化时,都会公布windowStateChangedmessage其新状态。工作人员将向所有其余窗口发送更新,以揭示他们其中一个窗口已更改。工作人员将发送syncmessage蕴含所有窗口状态的信息。咱们能够从一个看起来有点像这样的普通工人开始: // worker.ts let windows: { windowState: WindowState; id: number; port: MessagePort }[] = [];onconnect = ({ ports }) => { const port = ports[0]; port.onmessage = function (event: MessageEvent<WorkerMessage>) { console.log("We'll do something"); };};咱们与 SharedWorker 的根本连贯如下所示。我有一些根本函数能够生成 id,并计算以后窗口状态,我还对咱们能够应用的称为 WorkerMessage 的音讯类型进行了一些输出: // main.ts ...

February 27, 2024 · 3 min · jiezi

关于前端:Vue2和Vue3基础入门对比

1.在Vue2中咱们通过通过用 Vue 函数创立一个新的 Vue 实例,例如:var vm = new Vue({ // 选项})留神:一个 Vue 利用由一个通过 new Vue 创立的根 Vue 实例,以及可选的嵌套的、可复用的组件树组成1.1在Vue2中咱们挂载实例:<div id="app"></div>new Vue({ el: '#app'})1.2在Vue2中生命周期钩子:beforeCreate 组件实例被创立之初created 组件实例曾经齐全创立beforeMount 组件挂载之前mounted 组件挂载到实例下来之后beforeUpdate 组件数据发生变化,更新之前updated 组件数据更新之后beforeDestroy 组件实例销毁之前destroyed 组件实例销毁之后activated keep-alive 缓存的组件激活时deactivated keep-alive 缓存的组件停用时调用errorCaptured 捕捉一个来自子孙组件的谬误时被调用2.在Vue3中通过 createApp 函数创立一个新的 利用实例,例如:import { createApp } from 'vue'const app = createApp({ /* 根组件选项 */})2.1 在Vue3中挂在实例:<div id="app"></div>app.mount('#app')利用实例必须在调用了 .mount() 办法后才会渲染进去。该办法接管一个“容器”参数,能够是一个理论的 DOM 元素或是一个 CSS 选择器字符串 2.2在Vue3中生命周期钩子:onBeforeMount – 在挂载开始之前被调用:相干的 render 函数首次被调用。onMounted – 组件挂载时调用onBeforeUpdate – 数据更新时调用,产生在虚构 DOM 打补丁之前。这里适宜在更新之前拜访现有的 DOM,比方手动移除已增加的事件监听器。onUpdated – 因为数据更改导致的虚构 DOM 从新渲染和打补丁,在这之后会调用该钩子。onBeforeUnmount – 在卸载组件实例之前调用。在这个阶段,实例依然是齐全失常的。onUnmounted – 卸载组件实例后调用。调用此钩子时,组件实例的所有指令都被解除绑定,所有事件侦听器都被移除,所有子组件实例被卸载。onActivated – 被 keep-alive 缓存的组件激活时调用。onDeactivated – 被 keep-alive 缓存的组件停用时调用。onErrorCaptured – 当捕捉一个来自子孙组件的谬误时被调用。此钩子会收到三个参数:谬误对象、产生谬误的组件实例以及一个蕴含谬误起源信息的字符串。此钩子能够返回 false 以阻止该谬误持续向上流传。

February 27, 2024 · 1 min · jiezi

关于前端:苹果ios开发者ipa文件包内测签名数量满了应该怎么做

大家好我是咕噜美乐蒂,很快乐又和大家见面了!明天咱们一起来理解一下苹果ios开发者ipa文件包内测签名数量满了应该怎么做?当苹果iOS开发者IPA文件包内测签名数量满了时,您能够依照以下更具体的步骤进行操作:理解内测签名限度:1.每个苹果开发者账号在一年内只能容许最多100个设施装置应用内测版本的利用。2.若超过这一限度,您将无奈为新设施散发内测版本的利用。删除不必要的设施:1.登录到苹果开发者账号,进入"Certificates, Identifiers & Profiles"页面,抉择"Devices"选项卡。2.查看已注册的设施列表,并删除那些不再须要参加内测的设施。3.删除不必要的设施将开释签名名额,为新设施的内测提供空间。清理有效设施:1.在设施列表中查看是否有有效设施(如报废或无奈应用)。2.将这些有效设施从列表中删除,以开释签名名额。分割苹果开发者反对:1.如果删除设施后仍无奈腾出足够的签名名额,能够分割苹果开发者反对团队申请帮忙。2.通过苹果开发者网站上的联系方式或电子邮件,向他们阐明状况并申请减少或重置签名名额。应用第三方散发服务:1.思考应用第三方散发服务如TestFlight。2.在苹果开发者账号创立利用测试版本,并通过TestFlight邀请更多用户参加测试,无需耗费开发者账号内测签名名额。购买更多的开发者打算:1.如需更多内测签名名额,能够思考降级开发者打算。2.不同类型的开发者打算提供不同的签名名额限度,通过降级打算能够取得更多签名名额。通过以上具体步骤,您应该可能无效地解决苹果iOS开发者IPA文件包内测签名数量满了的问题,并持续进行利用的内测和测试工作。请依据理论状况抉择适宜您的解决方案,并确保恪守苹果的规定和政策。如果您须要更多帮忙或有其余问题,请随时通知我。好啦,明天美乐蒂就和大家分享到这里啦,小伙伴们有更好的方法能够在评论区打进去哦~~以便大家更不便地操作呢。

February 27, 2024 · 1 min · jiezi

关于前端:前后端联调测试

一:什么是前后端联调前后端接口联调就是在咱们开发的过程中,发送申请的ajax数据都不是返回的真数据,而是咱们本人通过接口mock模仿的假数据,以后端的代码编写实现后,后端的接口也写好后,咱们就须要把mock数据换点,尝试应用后端提供的数据进行一个前后端的调试。二:为什么须要联调1.联调就是前后端一起见证靠谱的测试后果2.给需求方提供一个正确的需要验证环境3.尽量裸露前后端实现的问题三:如何无效联调1.自测2.疾速定位问题f12查看,排查问题3.责任边界判断尽量放到后端做,数据格式化都能做。4.及时反馈后端数据库外面肯定要有测试数据,前端肯定要依据当初约定好的数据格式要求后端。四:测试流程1.前端发动申请:前端依据测试用例,调用相应的接口地址,发送申请2.后端承受申请并解决:后端承受到申请后,依据申请参数进行相应的业务解决,并返回后果3.前端承受并解决返回后果;前端接管到后端返回的后果后,进行后果解析和展现五:bug1.现阶段的bug根本分类性能逻辑和用户体验2.bug分类(1)功能型bug指产品实现过程中具体逻辑的实现谬误(2)需要型bug指在软件项目管理的过程中,需要阶段就埋下了隐患,如未依照需要实现,需要了解谬误或需要未形容分明等状况(3)性能型bug指软件在很多人同时应用或长时间运行时呈现了响应慢,甚至解体的场景(4)常识型bug在过来一段时间,用户始终是这样认为的,曾经造成一种默认的约定,但软件设计或开发人员不依照约定俗成的规定来。3.发现bug的方法论(1)罕用等价类划分法边界值分析法谬误揣测法因果法(2)不罕用断定表驱动法正交试验法性能图法场景法4.bug解决(1)bug辨认(2)bug定位(3)bug修复(4)回归测试六:软件测试1.目标(1)进步软件品质:软件测试的首要指标是确保软件的品质,通过发现和修复软件中的谬误和缺点,从而提供高质量的软件产品。(2)保障软件平安:软件测试还能够确保软件的安全性,特地是对于那些波及敏感数据或资金解决的软件,如银行零碎的APP。通过测试,能够确保软件在上线后不会呈现安全漏洞,从而爱护用户的数据和资金平安。(3)升高软件开发老本:在软件开发过程中,晚期发现并修复谬误能够大大降低开发成本。如果在产品上线或行将实现开发时才发现错误,可能须要付出更大的代价来修复,甚至可能导致产品的大改变,从而节约之前的投入。(4)升高企业危险:软件测试能够升高企业的危险。如果软件存在大量谬误或问题,可能会侵害企业的名誉,导致单干企业缩小,从而间接影响企业的收益。(5)为用户承受软件提供无力根据:软件测试是在用户应用软件之前进行的品质保障工作。只有通过软件测试,能力确保软件的品质,从而让用户更有信念承受并应用软件。(6)建立用户对软件的信念:用户对于通过测试的软件和未经测试的软件在品质上的信念是有很大差异的。通过软件测试,能够为用户提供更牢靠、更稳固的软件产品,从而建立用户对软件的信念。2.进行软件测试的常用工具(1)Selenium:Selenium是一个宽泛应用的自动化测试工具,特地实用于Web应用程序的测试。因为它可能模仿实在用户的操作,因而在功能测试、回归测试和UI测试中十分受欢迎。(2)JUnit:对于Java开发人员来说,JUnit是单元测试的规范工具。它提供了丰盛的断言办法和测试执行框架,使得编写和运行单元测试变得简略而高效。(3)JIRA:JIRA不仅是一个缺点跟踪工具,还宽泛用于项目管理。它提供了弱小的工作流和自定义字段性能,使得团队能够高效地跟踪和治理缺点、工作和我的项目。(4)Jenkins:Jenkins是一个继续集成和继续部署工具,它自动化了构建、测试和部署的过程。通过Jenkins,团队能够疾速地发现软件中的缺点,并进行迭代改良。(5)Postman:对于API测试来说,Postman是一个十分受欢迎的工具。它提供了直观的界面来发送HTTP申请、验证响应,并提供了丰盛的测试性能,如断言、脚本和测试数据治理等。七:常见的软件开发模型1.边做边改模型(Build-and-Fix Model):这是一种非正式的模型,通常是在没有明确需要或设计的状况下开始开发,而后依据用户反馈进行一直的批改和改良。这种模型往往会导致开发过程凌乱,难以管制,且软件品质难以保障。2.瀑布模型(Waterfall Model):这是一种线性的、程序的开发模型,它将软件开发过程划分为若干个阶段,每个阶段都有明确的工作和指标,并且前一个阶段的输入作为后一个阶段的输出。这种模型有利于项目管理和管制,但不利于适应需要变更。3.疾速原型模型(Rapid Prototype Model):这种模型强调疾速构建软件的原型,以便在晚期阶段就能获取用户反馈并进行调整。通过迭代的形式逐步完善软件,最终失去合乎用户需要的产品。这种模型适宜需要不明确或需要变更频繁的我的项目。4.增量模型(Incremental Model):这种模型将软件划分为若干个增量,每个增量都蕴含一部分性能或业务逻辑。每个增量都依照瀑布模型的办法进行开发,并在实现后进行集成和测试。这种模型能够逐渐交付软件,从而升高项目风险,但也可能导致软件结构复杂,难以保护。5.螺旋模型(Spiral Model):这种模型联合了瀑布模型和疾速原型模型的特点,强调在软件开发过程中进行危险评估和治理。它容许在我的项目的晚期阶段就进行原型构建和用户反馈收集,而后依据反馈进行迭代开发。这种模型适宜规模宏大、简单且高风险的我的项目。6.喷泉模型(Fountain Model):喷泉模型是一种以用户需要为能源,以对象为驱动的模型,次要用于形容面向对象的软件开发过程。喷泉模型认为软件开发过程自下而上周期的各阶段是互相迭代和无间隙的个性。7.v模型单元测试:是模块测试,验证软件的根本组成单位的正确性,是白盒测试集成测试:是模块间的测试,测试接口(软件各模块之间的接口和软件与硬件之间的接口)是否正确,是灰盒测试(白盒和黑盒联合)零碎测试:零碎测试包含:冒烟测试 零碎测试 回归测试(1)冒烟测试:骨干流程测试,确认软件的基本功能失常,能够进行后续的测试工作(2)零碎测试:是检测零碎的性能、品质、性能是否满足零碎的要求,包含性能、性能、界面、可靠性、兼容性等等,是黑盒测试(3)回归测试:批改了旧代码之后从新进行测试,确认批改后的代码没有引入新的谬误或导致其余代码产生新的谬误验收测试:是确保软件的实现是否满足用户的需要或合同的要求局限性:V模型是基于瀑布模型的,V模型有一个毛病,就是将测试放在整个开发的最初阶段,没有让测试今早染指开发,没有在需要阶段就进入测试;测试与开发串行

February 27, 2024 · 1 min · jiezi

关于前端:深入解析gitGiteeGitHub与GitLab

一、git:分布式版本控制的基石 外围概念:git是一个分布式版本控制系统,意味着每个开发者都领有残缺的代码仓库正本,能够在本地进行提交、分支和合并操作,无需依赖地方服务器。这种分布式架构进步了代码的可用性和灵活性。特点与劣势: 速度快:git采纳了先进的数据结构和算法,使得代码的版本控制十分高效。灵活性高:反对非线性开发,能够轻松创立和切换分支,不便进行并行开发和测试。安全性好:通过SHA-1哈希算法确保数据的完整性和安全性。二、Gitee(码云):中国开发者的首选代码托管平台 定位与特色:Gitee是中国当先的代码托管平台,致力于为中国开发者提供稳固、高效、平安的代码托管服务。它反对git作为版本控制工具,并提供了丰盛的项目管理、团队合作和代码审查性能。劣势与性能: 本地化反对:针对中国开发者提供优化的访问速度和本地化服务。企业级服务:反对公有仓库、团队合作、权限治理等企业级性能。社区反对:领有沉闷的开发者社区,不便交换和分享教训。三、GitHub:寰球当先的开源代码托管平台 定位与特色:GitHub是寰球最大的开源代码托管平台之一,以开源我的项目和集体开发者为次要服务对象。它提供了弱小的代码托管、合作和社区交换性能。劣势与性能: 丰盛的开源我的项目:汇聚了泛滥出名的开源我的项目和开发者,不便学习和交换。弱小的合作性能:反对多人合作、代码审查、问题跟踪等性能。沉闷的社区生态:领有宏大的用户群体和沉闷的社区,为开发者提供了贵重的资源和机会。四、GitLab:一站式的企业级DevOps平台 定位与特色:GitLab是一个全面的企业级DevOps平台,旨在提供从我的项目打算、代码治理到继续集成、继续部署等残缺的软件开发生命周期治理。它集成了版本控制、项目管理、自动化测试等多种性能。劣势与性能: 一站式解决方案:提供残缺的DevOps工具链,无需集成多个第三方服务。弱小的自定义能力:反对高度自定义的工作流程和规定,满足企业特定的需要。安全性高:提供严格的安全控制和审计性能,确保企业数据的平安。五、总结与实用场景 git:实用于所有须要版本控制的软件开发我的项目,无论是集体开发者还是大型企业。Gitee:特地适宜中国开发者应用,尤其是那些须要本地化反对和优化的我的项目。GitHub:适宜开源我的项目和集体开发者,也实用于须要寰球合作和社区反对的企业我的项目。GitLab:实用于须要残缺DevOps解决方案的企业级用户,特地是那些对安全性、自定义能力和一站式服务有较高要求的企业。通过深刻理解这四个代码管理工具的差别和性能,您能够依据您的具体需要和场景抉择最合适的工具来进步团队合作和开发的效率。 本文由mdnice多平台公布

February 27, 2024 · 1 min · jiezi

关于前端:智能充电桩案例分析交流充电桩

随着电动汽车的倒退,充电桩也成为当下的一个很热门的工业产品。咱们初步接触充电桩,有了点滴的感触。    先简略说说容易一点的交换充电桩。就是通过市电(220V,50赫兹)给电动汽车提供充电的能源起源。很容易了解,交换充电桩是给电动汽车充电只有有接口,就是电缆插头插座就能够了。和您本人拿一个挪动的用电设施要找一个电源插座一样。甚至说连功率也不是问题,因为个别的小轿车(电动)也仅仅是3000KW。咱们洗澡的热水器、取暖的暖风机、电暖气,甚至大一点的熨斗都和这个靠近。上面就简略的介绍一下一个残缺的充电桩外面蕴含什么芯片吧。如图所示,这是一个交换充电桩所会用的到的货色。这里 漏电爱护芯片咱们采纳的是D54123, DCDC转换芯片B34063(主板降压电源/升压电源), 基准稳压芯片D431/WL431, LDO降压芯片D1117/78L05/78M05(LDO稳压/MCU及外围芯片供电), 高精度单/双运放采纳D8541/D8542, RTC实时时钟芯片采纳D1302/D8563, RS232通信芯片采纳D232, S485通信芯片采纳D3485

February 27, 2024 · 1 min · jiezi

关于前端:多用户小程序商城源码net-core-COctShop

现在电商行业的发展趋势,如果企业须要向客户提供方便快捷的线高低单,在线领取,交易查问等服务,那么,领有一个独立的小程序商城是必不可少的。而抉择应用.net core小程序商城源码打造本人的商城平台则是最佳的抉择之一,那么,如何疾速高效的搭建本人的小程序商城呢?一、netcore小程序商城是什么netcore小程序商城是以.net core为框架应用C#语言进行开发商城零碎,具备如:商品详情展现、购物车、结算、订单治理、售后零碎等性能的电商零碎。应用.net core小程序商城源码,能够搭建一个真正属于本人的小程序商城平台,能够在商城上公布本人的产品和服务,公布促销流动信息,客户能够间接在小程序商城中下单购买领取等。二、怎么抉择适宜本人的netcore小程序商城源码在市场上泛滥的小程序商城源码中,如何抉择一款适宜本人的源码呢?次要从以下几个方面着手:1、功能丰富水平一个成熟功能强大的源码能够更好的满足日常平台的经营需要,能够为日后的经营省下很多的二次开发的费用,一个大型并且成熟的小程序商城零碎,性能零碎个别都是成体系化的,每个零碎紧密配合,互相协调,实现高效稳固的运行。2、技术积攒与实力在抉择netcore多用户小程序商城的时候,要留神开发厂商的研发能力,零碎是不是百分百自主研发,版权是否残缺。如果零碎应用了第三方的插件是否存在版本的问题等。源码是否易用,零碎运行是否稳固,售后服务是否到位,这些都是须要思考的。3、价格的合理性咱们在抉择netcore多用户小程序商城源码时,也不能一为的抉择价格低的,软件是有开发、销售、售后老本的,赔本的生意不会有人做的,除非,对方压根就不想好好服务客户。4、售后服务netcore小程序商城源码只是一个产品,最终还是要用户去经营起来,在经营的过程中,必定会碰到各种疑难,这时开发商的售后就显得分外的重要了,比方,你买了一条流水线,出了问题却没有人及时售后解决,每延时一分钟损失都是微小的,特地是对于这种须要24小时在线的电商平台来讲更是如此。三、应用netcore小程序商城搭建商城平台抉择好了适宜本人的netcore小程序商城源码后,接下来就是利用源码搭建本人的商城零碎平台啦,个别用户会依据本人企业的产品和品牌形象对页面进行肯定的定制化革新。次要有以下几个方面:1、依据企业品牌形象进行配色,LOGO、商品属性等进行界面设计优化。2、依据理论的业务需要进行相应性能与业务模块的增减。3、第三方零碎的接入,如:微信领取、支付宝领取、快递物流查问等等。四、OctShop大型.net core多用户小程序商城源码源码下载,开发文档,搜索引擎搜寻OctShop。

February 27, 2024 · 1 min · jiezi

关于前端:说说xss与csrf怎么防止

XSS(Cross-site scripting)CSRF(Cross-site request forgery)都是Web应用程序的安全漏洞,可能会导致用户的个人信息泄露、账户被盗或数据被篡改等问题。xss:跨站脚本攻打,如果不过滤执行了js代码,可能导致cookie泄露等。避免:过滤XSS攻打是指攻击者通过注入恶意代码到Web页面中,来获取用户的Cookie、Session ID等敏感信息。这些攻打通常通过JavaScript脚本实现,攻击者能够创立虚伪的表单或链接,诱骗用户点击并执行恶意代码。为避免XSS攻打,能够采取以下措施: 对所有输出数据进行过滤和验证,特地是对用户提交的数据进行严格的过滤和本义。应用HTTPOnly和Secure标记来限度Cookie的拜访范畴,防止Cookie被窃取或篡改。应用CSP(Content Security Policy)来限度网站资源的起源和应用形式,能够避免某些类型的XSS攻打。CSRF攻打是指攻击者利用用户已登录的身份,在用户不知情的状况下发送歹意申请,比方在用户点击某个链接时主动向指标网站发送申请。这些攻打通常会导致用户的账户被盗或数据被篡改。为避免CSRF攻打,能够采取以下措施: 在每个申请中退出随机的Token,能够验证申请是否来自非法的起源。应用验证码或其他人机验证技术来避免自动化攻打。对所有用户操作进行严格的权限管制,确保只有受权的用户能力进行敏感操作。总的来说,为了保障Web应用程序的平安,须要对所有输出数据进行严格的过滤和验证,同时采纳多层次、多种类别的安全措施,以确保应用程序的健壮性和可靠性。csrf:跨站申请伪造,挟制用户在以后已登录的Web应用程序上执行非本意的操作。避免:设置token、写操作用post、JSON API禁用CORS、禁用跨域申请、查看referrer

February 27, 2024 · 1 min · jiezi

关于前端:unsubscribeAngular-项目中常见场景以及是否需要-unsubscribe

本文由庄汇晔同学编写~ 在 Angular 我的项目中,常常会应用到 observable subscribe,然而 subscribe 读取了数据之后,真的就是高枕无忧了吗?这个问题的答案或者是,或者不是。有些 observable 须要 unsubscribe,而有些并不必。在接下来的文章里,我会介绍: observable 的品种:何种 observable 须要 unsubscribe,以及没有 unsubscribe 会造成什么样的问题。在 angular 我的项目中,可能会遇到的observable 的场景,以及他们是否须要 unsubscribe,为什么须要/不须要?unsubscribe 的办法。一、observable 的品种:何种 observable 须要 unsubscribe,以及没有unsubscribe 会造成什么样的问题。从 observable 是否完结(complete)的角度来看,observable 分为两类:finite observable(无限事件流)和 infinite observable(有限事件流)。辨别他们的办法很简略:即 finite observable 只能 emit 一个值(或是一个谬误),随即完结。而 infinite observable 会 emit 多个值,而不会完结。 finite Observable 的例子有:http client request,infinite Observable 的例子有:DOM eventListener。如果不勾销订阅,将会呈现内存透露,执行意料之外回调函数的问题。所以,肯定须要 unsubscribe 的是 infinite observable(有限事件流),而 finite observable(无限事件流)个别不须要 unsubscribe。 二、在 angular 我的项目中,可能会遇到的 subscribe 的场景,他们须要 unsubscribe 吗?为什么须要/不须要?1、Http Client 申请(this.httpClient.get(...).subscribe)fetchFromBackend() {  let subscription$ = this.http.get(`http://example.com`).subscribe(...)}是否须要 unsubscribe:视状况而定。 ...

February 27, 2024 · 2 min · jiezi

关于前端:2024年令人眼前一亮的Web框架

本文翻译自 https://dev.to/wasp/web-frameworks-we-are-most-excited-for-in-2024-4d15 感谢您的浏览!介绍2024年正向咱们走来,咱们怀着满腔热情为新的一年制订打算,摸索将来一年能够学习或实现的指标。此时此刻,正是探寻来年值得学习的框架、了解其性能和特色的最佳时刻。咱们以2023年JS 新星名单为指引,力求放弃主观公正的态度。对于每一个特色框架,咱们都将突出其最大的劣势,使您可能全面了解它们的长处,从而抉择适宜本人的框架进行尝试! HTMX - 返璞归真 为谁而设: 你心愿缩小JavaScript的编写量你心愿代码更简略,以超媒体为核心HTMX在2023年迅速走红,过来一年间在GitHub上博得了大量星标。HTMX并非一般的JS框架。如果你应用HTMX,你将大部分工夫都花在超媒体的世界中,以与咱们通常对古代Web开发的JS密集型视角齐全不同的视角对待Web开发。HTMX利用HATEOAS(Hypermedia作为应用程序状态的引擎)的概念,使开发人员可能间接从HTML拜访浏览器性能,而不是应用Javascript。 此外,它还证实了通过公布令人惊叹的表情符号并以口碑作为次要营销伎俩,你能够取得人气和认可。不仅如此,你还可能成为HTMX的CEO!它吸引了许多开发人员尝试这种构建网站的办法,并从新思考他们以后的实际。所有这些都使2024年对于这个库的将来倒退充斥了激动人心的可能性。 Wasp - 全栈,开箱即用 为谁而设: 你心愿疾速构建全栈利用你心愿在一个杰出的一体化解决方案中持续应用React和Node.js,而无需手动筛选堆栈的每一部分你心愿取得一个为React和Node.js预配置的收费SaaS模板—— Open SaaS对于心愿简略轻松地全面管制其堆栈的工具的用户,无需再寻找!Wasp是一个有主意的全栈框架,利用其编译器以疾速简便的形式为你的利用创立数据库、后端和前端。它应用React、Node.js和Prisma,这些都是全栈Web开发人员正在应用的一些最驰名的工具。 Wasp的外围是main.wasp文件,它作为你大部分需要的一站式服务。在其中,你能够定义: 全栈身份验证数据库架构异步作业,无需额定的基础设施简略且灵便的部署全栈类型平安发送电子邮件(Sendgrid、MailGun、SMTP服务器等)等等……最酷的事件是?通过编译器步骤后,你的Wasp应用程序的输入是一个规范的React + Vite前端、Node.js后端和PostgreSQL数据库。从那里,你能够应用单个命令轻松将所有部署到Fly.io等平台。 只管有些人可能会认为Wasp的有主意立场是负面的,但它却是Wasp泛滥全栈性能的驱动力。应用Wasp,单个开发人员或小型团队启动全栈我的项目变得更加容易,尤其是如果你应用预制的模板或OpenSaaS作为你的SaaS终点。因为我的项目的外围是定义明确的,因而开始一个我的项目并可能在几天内创立本人的全栈SaaS变得非常容易! 此外,还有一点很酷的是,大多数Web开发人员对大多数现有技术的事后存在的常识依然在这里实用,因为Wasp应用的技术曾经成熟。 Solid.js - 一流的reactivity库 ↔️ 适宜人群: 如果你心愿代码具备高响应性现有的React开发人员,心愿尝试一种对他们来说学习曲线较低的高性能工具Solid.js是一个性能很高的Web框架,与React有一些相似之处。例如,两者都应用JSX,采纳基于函数的组件办法,但Solid.js不应用虚构DOM,而是将你的代码转换为纯JavaScript。然而,Solid.js因其利用信号、备忘录和成果实现细粒度响应性的办法而更加闻名。信号是Solid.js中最简略、最出名的根本元素。它们蕴含值及其获取和设置函数,使框架可能察看并在DOM中的确切地位按需更新更改,这与React从新渲染整个组件的形式不同。 Solid.js不仅应用JSX,还对其进行了加强。它提供了一些很酷的新性能,例如Show组件,它能够启用JSX元素的条件渲染,以及For组件,它使在JSX中更轻松地遍历汇合变得更容易。另一个重要的是,它还有一个名为Solid Start的元框架(目前处于测试版),它使用户可能依据本人的爱好,应用基于文件的路由、操作、API路由和中间件等性能,以不同的形式渲染应用程序。 Astro - 动态网站之王 适宜人群: 如果您须要一款优良的博客、CMS重型网站工具须要一个可能集成其余库和框架的框架如果您在2023年构建了一个内容驱动的网站,那么很有可能您抉择了Astro作为首选框架来实现这一指标!Astro是另一个应用不同架构概念来怀才不遇的框架。对于Astro来说,这是岛屿架构。在Astro的上下文中,岛屿是页面上的任何交互式UI组件,与动态内容的大海造成鲜明对比。因为这些岛屿彼此独立运行,因而页面能够有任意数量的岛屿,但它们也能够共享状态并互相通信,这十分有用。 对于Astro的另一个乏味的事件是,他们的办法使用户可能应用不同的前端框架,如React、Vue、Solid来构建他们的网站。因而,开发人员能够轻松地在其以后常识的根底上构建网站,并利用能够集成到Astro网站中的现有组件。 Svelte - 简略而无效 适宜人群: 您心愿学习一个简略易上手的框架谋求简洁且代码执行速度快的开发体验Svelte是另一个尝试通过尽可能间接和初学者敌对的形式来简化和减速Web开发的框架。它是一个很容易学习的框架,因为要使一个属性具备响应性,您只需申明它并在HTML模板中应用它。 每当在JavaScript中程序化地更新值时(例如,通过触发onClick事件按钮),它将在UI上反映进去,反之亦然。 Svelte的下一步将是引入runes。runes将是Svelte解决响应性的形式,使解决大型应用程序变得更加容易。相似于Solid.js的信号,符文通过应用相似函数的语句提供了一种间接拜访应用程序响应性状态的形式。与Svelte以后的工作形式相比,它们将容许用户准确定义整个脚本中哪些局部是响应性的,从而使组件更加高效。相似于Solid和Solid Start,Svelte也有其本人的框架,称为SvelteKit。SvelteKit为用户提供了一种疾速启动其由Vite驱动的Svelte应用程序的形式。它提供了路由器、构建优化、不同的渲染和预渲染形式、图像优化等性能。 Qwik - 十分快 适宜人群: 如果您想要一个高性能的Web利用现有的React开发人员,心愿尝试一种高性能且学习曲线平缓的框架最初一个但同样重要的框架是Qwik。Qwik是另一个利用JSX和函数组件的框架,相似于Solid.js,为基于React的开发人员提供了一个相熟的环境,以便尽快上手。正如其名字所表白的,Qwik的次要指标是实现您应用程序的最高性能和最快执行速度。 Qwik通过利用可恢复性(resumability)的概念来实现其速度。简而言之,可恢复性基于在服务器上暂停执行并在客户端上复原执行而无需从新播放和下载全副利用程序逻辑的想法。这是通过提早JavaScript代码的执行和下载来实现的,除非有必要解决用户交互,这是一件十分棒的事件。它使整体速度进步,并将带宽升高到相对最小值,从而实现近乎霎时的加载。 论断在咱们所提及的所有框架和库中,最大的共同点是它们的相熟度。每个框架和库都试图以构建在以后常识根底上的形式吸引潜在的新开发者,而不是做一些全新的事件,这是一个十分棒的理念。 当然,还有许多咱们未在整篇文章中提及但值得一提的库和框架。例如,Angular 除了新的标记和文档外,还包含信号和新的控制流。还有 Remix,它减少了对 Vite、React Server Components 和新的 Remix SPA 模式的反对。最初,咱们不能遗记 Next.js,它在过来几年中已成为 React 开发者的默认抉择,为新的 React 性能铺平了路线。

February 27, 2024 · 1 min · jiezi

关于前端:Service-Worker离线应用与后台同步的解决方案

前端罕用缓存技术前端罕用缓存技术个别分为http缓存和浏览器缓存。 HTTP缓存ExpiresHTTP1.0的内容,服务器应用Expires头来通知Web客户端它能够应用以后正本,直到指定的工夫为止; Cache-ControlHTTP1.1引入了Cathe-Control,它应用max-age指定资源被缓存多久,次要是解决了Expires一个重大的缺点,就是它设置的是一个固定的工夫点,客户端工夫和服务端工夫可能有误差; Last-Modified / If-Modified-SinceLast-Modified是服务器通知浏览器该资源的最初批改工夫,If-Modified-Since是申请头带上的,上次服务器给本人的该资源的最初批改工夫。而后服务器拿去比照。若Last-Modified大于If-Modified-Since,阐明资源有被改变过,则响应整片资源内容,返回状态码200;若Last-Modified小于或等于If-Modified-Since,阐明资源无新批改,则响应HTTP 304,告知浏览器持续应用以后版本。 Etag / If-None-MatchEtag是服务器依据每个资源生成的惟一标识符,当文件内容被批改时标识符就会从新生成。服务器存储着文件的Etag字段,能够在与每次客户端传送If-none-match的字段进行比拟。如果相等,则示意未修改,响应304;反之,则示意已批改,响应200状态码,返回数据。 浏览器缓存Storage简略的缓存形式有cookie,localStorage和sessionStorage,都是浏览器内置贮存性能。 mainfesthtml5引入的新规范,能够离线缓存动态文件。 Service WorkerServiceWorker 介绍什么是ServiceWorker Service Worker实质上是充当web应用程序与浏览器之间的代理服务器,也能够在网络可用时作为浏览器和网络间的代理。它们的目标是创立无效的离线体验、拦挡网络申请并依据网络是否可用采取适当的操作,以及更新服务器上的资产。它们还容许拜访推送告诉和后盾同步 API。 ServiceWorker个性Service Worker实质上是一个Web Worker,它独立于Javascript主线程,因而它不能间接拜访DOM,也不能间接拜访window对象,然而能够拜访navigator对象,也能够通过消息传递的形式(如postMessage)与Javascript主线程进行通信。Service Worker独立于Javascript主线程,所以不会造成阻塞。它设计为齐全异步,同步API(如XHR和localStorage不能在Service Worker中应用。Service Worker是基于 HTTPS 的,因为Service Worker中波及到申请拦挡,所以必须应用HTTPS协定来保障平安。如果是本地调试的话,localhost是能够的。Service Worker领有独立的生命周期,与页面无关(关联页面未敞开时,它也能够退出,没有关联页面时,它也能够启动)。注册Service Worker后,浏览器会默默地在背地装置Service Worker。ServiceWorker生命周期 Service Worker 的生命周期能够分为6个阶段:解析(parsed)、装置(installing)、装置实现(installed)、激活(activating)、激活实现(activated)、闲置(redundant)。 Parsed当咱们第一次尝试注册 Service Worker 时,用户代理会解析脚本并获取入口点。如果解析胜利(并且满足其余一些要求,例如 HTTPS),咱们将能够拜访 Service Worker 注册对象。其中蕴含无关 Service Worker 的状态及其作用域的信息。 if ('serviceWorker' in navigator) { navigator.serviceWorker.register('./sw.js') .then(function(registration) { console.log("Service Worker Registered", registration); }) .catch(function(err) { console.log("Service Worker Failed to Register", err); })}Service Worker注册胜利并不意味着它已装置结束或处于激活状态,而只是意味着脚本已胜利解析,它与文档处于同一源上,且源为 HTTPS。注册实现后,服务 Worker 将进入下一个状态。 ...

February 27, 2024 · 4 min · jiezi

关于前端:ArkUI服务卡片postCardAction方法action为call时不触发指定的ability方法回调

问题官网demohttps://developer.harmonyos.com/cn/docs/documentation/doc-gui... 失常注册,失常调用,然而就是无奈调用call办法,运行后果如下: 代码 解决增加ohos.permission.KEEP_BACKGROUND_RUNNING权限 在module.json5文件里增加如下代码: "requestPermissions": [ { "name": "ohos.permission.KEEP_BACKGROUND_RUNNING", "reason": "$string:app_name", "usedScene": { "abilities": [ "EntryAbility" ], "when": "inuse" }, } ],如下图所示: 运行后果:

February 27, 2024 · 1 min · jiezi

关于前端:现代-CSS-解决方案accentcolor-强调色

accent-color 是从 Chrome 93 开始被失去反对的一个不算太新属性。之前始终没有好好介绍一下这个属性。直到最近在给一些零碎整体切换主题色的时候,更深刻的理解了一下这个属性。 简略而言,CSS accent-color 反对应用几行简略的 CSS 为表单元素着色,是的,只需几行代码就能够将主题色彩利用到页面的表单输出。 表单元素始终被吐槽很难自定义。而 accent-color 就是标准十分大的一个扭转,咱们开始能更多的自定义原生的表单的款式了! 如何应用 accent-colorOK,咱们一起来学习一下,咱们应该如何应用 accent-color。 首先,咱们来实现这么一个简略的表单界面: <div class="wrapper"> <form action=""> <fieldset> <legend>Accent-color Demo</legend> <label> Strawberries <input type="checkbox" id="berries_1" value="strawberries"> </label> <label> Radio Buttons <div> <input type="radio" name="accented-demo" checked> <input type="radio" name="accented-demo"> <input type="radio" name="accented-demo"> </div> </label> <label> Range Slider <input type="range"> </label> <label> Progress element <progress max="100" value="50">50%</progress> </label> </fieldset> </form></div>只须要最简略的布局 CSS,与 accent-color 关系不大,我就不列出来了,这样,咱们的 DEMO 大抵如下: 能够看到,表单控件的主题色彩是蓝色,在之前,咱们是没方法批改这个色彩的。 而当初,咱们能够简略的借助 accent-color,批改表单的主题色: :root { accent-color: rgba(250, 15, 117);}其中,rgba(250, 15, 117) 示意粉色,此时,整体的成果就变成了: 当然,这个 accent-color 也反对传入 CSS 变量,配合更多的其余色彩一起进行批改。 ...

February 27, 2024 · 2 min · jiezi

关于前端:航空航天三维可视化合集-图扑数字孪生

"数字孪生"这一概念最早就是在航空航天畛域应用,目标在于解决航天器的衰弱保护和爱护问题。图扑软件依靠自主研发的 HT for Web 产品,实现对民航机场、民航飞机、火箭发射、科技展馆的数字孪生展现。 图扑 HT 数字孪生技术助力航空航天数字孪生场景,在验证、设计、制作、测试以及经营保护等阶段出现多元化的数据模式。通过提供全方位和立体化的反对,升高经营老本和危险。 智慧航空数字孪生民航机场图扑软件 HT 智慧机场高度集成航站楼、跑道、维修中心、货运核心及客运核心等要害区域。实现了设施设施、事件产生以及人员动静的精准监管。通过构建数字孪生场景和接入实时数据流,解决机场资源配置复杂性、服务响应缓慢、兼顾协调有余等挑战。高效晋升数字化管理水平,实现对机场经营的全面优化与高效管制。 (1)停机位治理 作为机场运输外围区域的停机位,承当着乘客登机、货物装卸、飞机停放与培修等重要高空工作。图扑 HT 智慧机场零碎可实时剖析出现廊桥应用、机坪运作、进出港航线等次要运行数据,无效促成用户对机位实况的实时洞察,为机场资源调度和治理提供强力的数据反对。 廊桥可视化 停机坪 进出港路线 (2)高空作业服务 图扑 HT 的高空作业服务,精准聚焦乘客治理、高空声援作业,以及货物装卸等的关键环节。基于对接的实时数据,全面展示每架飞机的作业进度和状态。场景中零碎为每架航班的高空作业进度构建了对应的动静动画展现,辅助直观出现现场作业状态。无效防止机坪车辆作业无序统计和危险事件无据可查的难题,也优化了机务治理宏观层面的综合经营监管与兼顾指挥。 登机离港飞机夜降泊位 (3)测验查验治理 民航安检部门推广着”一码通关”、“OneID”刷脸过检等数字化建设。图扑 HT 智慧机场零碎针对自助值机、安检、边检、海关防疫以及行李跟踪等环节,构建了“一脸一码”残缺伺机体验的可视化解决方案。通过对接现场先进设备的运行数据,实时展现了旅客自助打印、测验控制台、安检合规等的操作流程,前后端数据的互融互通,缩小多环节的身份查验和近身查看,进步通关的舒适感和自在感,晋升对游客的服务和对机场的治理。 自助值机海关防疫 行李跟踪 (4)运维巡检可视化 因为机场人群较多、设施数量繁多、性能分区简单,且对消防、电力、水力、空调等零碎的治理要求较高。图扑 HT 智慧机场可联合“安防+AI”技术,基于部署先进的机器人设施、人员热力扫描等技术,数字孪生全域空间及设施,多视角感性整合个分区运行状态及周边情。当监测到危险情境时,将通过平台感知、辨认、定位追踪事发源头。突破传统现场往返治理的作业模式,造成航站楼各部门全生命周期监管体系。 客流剖析热力求 机器人定位 水火电气管控 图扑智慧机场以人、事、物开展多元可视化出现,从机场服务能力、运维程度、建设能力、全域协同运行等维度,推动航站楼服务智能化、飞行区少人化、旅客联程联运以及货物联运的数字化管理模式,助推民航"四型机场"建设。 民航飞机图扑基于自研 HT 弱小的渲染引擎,以写实与科幻格调相结合的展现模式,数字孪生飞机形状、客舱治理、机舱设施、发动机、驾驶室。建设起具备场景化、智能化、人性化的智慧飞机综合管控平台,确保对民用航空器的高效治理。 (1)根本信息 基于图扑 HT 数字孪生技术,构建渲染多种机型的成果,模仿飞机实时航行状态与定位状况等。联合二三维可视化面板,对航空器机翼、机身、尾翼、起落安装、操纵零碎和动力装置、烦扰阻力、货舱满载率,载油耗油等要害指标全方位可视化监管,实现数据实时共享。 (2)客货仓治理 场景内反对点选查看每层舱内的布局、设施设施,每个局部均与其在事实中的确切地位和编号相匹配,确保虚构展现与理论飞机舱内场景放弃完全一致。 (3)航行零碎与设施 飞机操纵场景内采纳整机模型为根底,以驾驶舱为焦点,精确映射航行零碎及其设施的内在联系,并在模型上准确表明设施具体位置。从而使飞行员和工程师能够在虚拟环境中具体理解舱内布局、控制系统、导航设施和其余要害组件的性能和相互作用。 不仅为航行训练和模仿提供了一个高度真切的环境,还能在飞机设计和测试阶段用于故障检测、性能优化和保护预测。通过实时数据的融入,它为机组人员操作决策与飞机保护治理提供了贵重反对,从而加强了航行平安和效率。 航线数据图扑 HT 航线信息可视化,基于航空大数据,通过利用 HT 2D、3D 图形组件,简化展现航线态势等要害信息。帮忙空管人员监控空域应用、预测流量变动,及时捕捉到各种变动和突发状况,进步航行效率、升高延误率。 智慧航天数字孪生依据国内航天联盟统计,目前寰球运载火箭发射次数排名,中国位居第一。在探月打算和建设空间站等重大项目上,中国已跻身世界前列。 图扑软件应用自主研发的 HT for Web 可视化引擎与航天产业利用深度交融,数字孪生了火箭发射全过程与飞船太空运行的可视化场景。将各类监控需要集中实现,构建以流程和数据驱动的管理模式,推动航天技术利用降级。 载人航天图扑 HT 通过搭建三维场景、联合二维数据面板,展现了从火箭升空到卫星轨道航行的全过程。 ...

February 27, 2024 · 1 min · jiezi

关于前端:CSS图像边框Interop-2023的一个重点领域

本文翻译自 Border images in CSS: A key focus area for Interop 2023,作者:Dipika Bhattacharya, 略有删改。Interop 2023是一项进步Web的互操作性为指标,以达到每种技术在各浏览器中完全相同的状态。(起源:Interop 2023) 在Interop 2023中,CSS图像边框被确定为一个要害的重点畛域。这个个性容许您应用图像来设置元素边框的款式,浏览器曾经反对这个个性很多年了。然而浏览器之间的行为差别导致Web开发人员不违心齐全应用此性能。随着Interop 2023中蕴含图像边框,从新承诺解决行为差别并激励宽泛采纳。这一动作强调了可能创立在不同浏览器之间保持一致的视觉吸引力的网页设计的重要性。 图像边框的每个方面都能够应用特定的border-imageCSS属性进行管制,这些都在MDN的参考页面上进行了具体的解释。在这篇文章中,咱们将提供与边框图像相干的所有属性的概述,并摸索如何在边框中自定义图像。 开始应用边框图像CSS中的边框图像容许您应用自定义图像作为网站上元素的边框,取代规范边框。这为您提供了一种独特而弱小的形式来设计和增加您的集体创意格调到您的网站。例如,设想一下你正在经营一家在线花店。您能够应用花卉或天然图像作为网站上各种元素的边界,以减少整个网站的主题格调。 本文总结了应用图像作为元素边框的所有步骤。第一步是指定您喜爱的图像的起源。而后将图像切片以指定要在边框中应用的局部。接下来调整图像的宽度,这将管制图像在边框区域内的缩放形式。如果您心愿图像延长到元素的边界之外,则能够抉择定义终点。最初决定图像如何在边框四周拟合或反复。这将定义图像是否反复、拉伸或调整以适应边界区域。通过遵循这些步骤,您能够无效地应用自定义图像作为网页设计中的元素边框。 咱们将应用上面的天然主题图像(由pixabay提供)来演示如何将其用作边框图像。 作为参考,上面的框示意咱们要增加边框图像的元素。厚的绿色边界区域是咱们将用图像替换的区域。浅黄色背景色示意内容框和填充框。 指定边框图像您能够应用border-image-source属性指定边框图像的源。与background-image相似,此属性承受图像文件的URL或突变,并将其利用于框的边框。您能够应用各种图像格式,如PNG,JPG或SVG。 .box { border: 30px solid transparent; border-image-source: url("https://developer.mozilla.org/en-US/blog/border-images-interop-2023/nature.png");}在这个阶段,您会留神到图像只呈现在方框的四角。不是咱们所期待的,这只是第一步,离定制边框中图像的外观还须要几个步骤。图像须要应用其余border-image属性值进行进一步解决,以出现最终的边框外观,当初咱们短少无关如何在边框上切片或散布图像的阐明。 在下面的代码中你会留神到border-width和border-style都是应用border快捷方式属性定义的。这是因为border-image属性只有在元素具备定义的边框时才可见。border-width属性设置边框图像的可用空间,border-style属性确保边框图像正确显示。如果没有border-width和border-style,则无论您设置的border-image属性如何,边框图像都不会显示。 图像切片切片能够帮忙咱们定义图像的各个局部,这些局部将显示在元素边框的角落和侧面。这就像把蛋糕切成片,每一块都有它的地位。 您能够应用border-image-slice属性对图像进行切片。此属性应用四条假想线对图像进行切片,这四条假想线与相应的边缘相距指定的切片间隔。四条切片线将图像无效地划分为九个区域:四个角、四个边缘和两头。这些线确定将用于边框的图像区域的大小。 例如,所有边的切片值为30,切片区域将如下图所示: 应用30的切片值下面显示的切片区域没有从图像中捕捉足够的局部,至多不是咱们真正想要在边界中显示的局部。大部分的叶子和花都被剪掉了。在上面的代码中,让咱们应用一个更高的值,比方70,对图像进行切片,看看成果如何。 .box { border: 30px solid transparent; border-image-source: url("https://developer.mozilla.org/en-US/blog/border-images-interop-2023/nature.png"); border-image-slice: 70;}这是看起来的成果要更好。正如你所看到的,这一步的后果将取决于你应用的图像。所以肯定要摸索不同的切片设置。 你能够应用border-image-slice值指定另一个选项。默认状况下,切片操作会抛弃图像的两头局部。如果你想保留它,你能够在值上加上fill,就像这样border-image-slice: 70 fill。这也将在两头区域的背景上绘制边框图像,此时的边框图像成果就像背景图一样了。 调整宽度在下一步中咱们调整图像边框的款度。这将确定边框图像在边界区域内的缩放形式。咱们应用border-image-width属性设置边框图像的宽度。它定义图像边框从边界边缘向内的偏移。 你能够从上面的图片中看到设置宽度为10px的成果。在这个宽度上,边框中的图像变得十分拉伸。 让咱们尝试将图像的宽度减少到30px。 .box { border: 30px solid transparent; border-image-source: url("https://developer.mozilla.org/en-US/blog/border-images-interop-2023/nature.png"); border-image-slice: 70; border-image-width: 30px;}在这个宽度下,边框图像看起来更好。 ...

February 27, 2024 · 1 min · jiezi

关于前端:一个收录独立开发者出海技术栈和工具的开源库短短时间斩获24k-Star

大家好,我是程序员凌览。 本文给大家介绍一个零代码的开源库,它只收录独立开发者出海技术栈和工具;帮忙独立开发者更好地应答出海挑战。 从短短一周工夫斩获2.4k Star的数据看,领有本人的产品并可能凭借它实现经济自力更生真的是很多程序员的一个幻想。 仓库地址:https://github.com/weijunext/indie-hacker-tools 在线导航站:https://chuhai.tools/ Web 开发模板模板个性链接smart-excel-ai(收费)Next.js。集成了登录、领取(lemon squeezy)、AI性能https://github.com/weijunext/smart-excel-aiOpensaas(收费)React + Node.js。集成了登录、领取(stripe)、邮件、AI性能https://github.com/wasp-lang/open-saas/Shipfast(付费)Next.js。集成了登录、领取(stripe)、邮件、AI性能https://shipfa.st/Chrome 插件开发模板模板个性链接Plasmo反对 React、Vue 等多种前端框架https://www.plasmo.com/wxt.dev反对 Vue、Svelte 等多种前端框架https://wxt.dev/技术栈举荐前端技术栈备注链接Next.js基于 Reacthttps://nextjs.org/Remix基于 React,Next.js最大竞争对手https://remix.run/Nuxt基于 Vuehttps://nuxt.com/后端技术栈备注链接Nest.js基于 Node.jshttps://docs.nestjs.com/Midway.js基于 Node.jshttps://midwayjs.org/数据库技术栈备注链接Supabase反对数据库、文件存储、登录鉴权https://supabase.com/Upstash反对 Redis、kafka、向量数据库https://console.upstash.com https://realm.io/MongodbMongodb 官网提供一个收费数据库https://www.mongodb.com/products/platform/cloudRealmSQLite 的疾速、可扩大的代替计划,具备从挪动到云的数据同步性能,能够轻松构建实时、反馈灵活的挪动应用程序。https://realm.io/ORM技术栈备注链接Prisma https://prisma.io/TypeORM用于 TypeScript 和 JavaScript 的 ORM。反对MySQL、PostgreSQL、MariaDB、SQLite、MS SQL Server、Oracle、SAP Hana、WebSQL数据库。实用于 NodeJS、Browser、Ionic、Cordova 和 Electron 平台。https://github.com/typeorm/typeorm款式与UI库技术栈备注链接Tailwind CSS https://tailwindcss.com/Shadcn/ui https://ui.shadcn.com/原型设计技术栈备注链接[v0]()Text to UI, 收费用户有 200 Credits / 每月https://v0.dev/usegalileoText to UI, 收费用户有 200 Creditshttps://www.usegalileo.ai/vx.devText to UI, v0.dev的开源替代品https://github.com/Yuyz0112/vx.dev登录鉴权技术栈备注链接Clerk https://clerk.com/SupabasePostgreSQL数据库、文件存储、登录鉴权https://supabase.com/Lucia登录鉴权https://github.com/lucia-auth/luciaNext-Auth v4 https://next-auth.js.org/Next-Auth v5v5 配置和 v4 不同,请留神辨别 v5 Demohttps://authjs.dev/getting-started/introduction领取技术栈备注链接Lemon Squeezy反对集体香港卡、虚构卡,国内开发者首选https://www.lemonsqueezy.com/Stripe须要企业资质https://stripe.com/邮件技术栈备注链接Resend https://resend.com/Nodemailer https://github.com/nodemailer/nodemailerReact Mail https://react.email/网站剖析技术栈备注链接Google Analytics https://analytics.google.com/analytics/web/Plausible https://plausible.ioUmami开源可自部署https://umami.is/Clarity微软出的剖析工具https://clarity.microsoft.com/在线客服技术栈备注链接Tawk中国地区可注册https://tawk.to/部署与托管技术栈备注链接Vercel首选https://vercel.com/dashboardAircode字节跳动出品https://aircode.io/Zeabur国内出海团队出品,作者:@MichaelYuhehttps://zeabur.com/Railway https://railway.app/Netlify https://www.netlify.com/Github Pages https://pages.github.com/Cloudflare Pages https://developers.cloudflare.com/pages/域名购买技术栈备注链接Namesilo主动屏蔽whoishttps://www.namesilo.com/Namecheap据说比拟便宜https://www.namecheap.com/Godaddy狗爹,懂的都懂https://www.godaddy.com/Cloudflare https://cloudflare.com/阿里云 腾讯云 字节火山引擎国内平台,cn域名首选平台https://wanwang.aliyun.com/domain文档治理技术栈备注链接Notion https://notion.so/VitePressVite & Vue 驱动的动态站点生成器https://vitepress.vuejs.org/Astro Starlight建设在 Astro 框架之上的全功能文档主题https://starlight.astro.build/图片视频解决工具技术栈备注链接Tinypng图片压缩https://tinypng.com/Tinify图片压缩 - 国内版https://tinify.cn/video-to-gif视频转 GIFhttps://ezgif.com/video-to-gif录屏技术栈备注链接focusee https://gemoo.com/focusee/Screen Studio https://www.screen.studioOBS Studio开源、windows、mac、linuxhttps://obsproject.com/短链技术栈备注链接dub收费用户每个月能够创立25个链接https://github.com/dubinc/dub往期举荐盘点2023前端技术,谁才是当红炸子鸡 ...

February 27, 2024 · 1 min · jiezi

关于前端:kosaraju-算法

以前学习了算法,然而因为没有记录下来,最近又要从新开始学习了,这次就将我的学习经验汇总成文章,记录下来。 科萨拉朱算法(英语:Kosaraju's algorithm),也被称为科萨拉朱—夏尔算法,是一个在线性工夫内寻找一个有向图 "图 (数学)")中的强连通重量的算法。首先咱们须要晓得几个概念 有向图边为有方向的图称作有向图(英语:directed graph或digraph)。有向图的一种比拟严格的定义是这样的:一个二元组\( G=(V,E) \),其中 \( V \)是节点的汇合;\( {\displaystyle E\subseteq {(x,y)\mid (x,y)\in V^{2}\wedge x\neq y}} \)是边(也称为有向边,英语:directed edge或directed link;或弧,英语:arcs)的汇合,其中的元素是节点的有序对。下图是一个简略的有向图: 强连通重量有向图中,尽可能多的若干顶点组成的子图中,这些顶点都是互相可达到的,则这些顶点成为一个强连通重量。 其实求解强连通重量的算法并不止一种,除了Kosaraju之外还有赫赫有名的Tarjan算法能够用来求解。但相比Tarjan算法,Kosaraju算法更加==直观==,更加==容易了解==。 DFS 生成树先来理解 DFS 生成树,咱们以上面的有向图为例: 有向图的 DFS 生成树次要有 4 种边(不肯定全副呈现): 树边(tree edge):示意图中以彩色边示意,每次搜寻找到一个还没有拜访过的结点的时候就造成了一条树边。反祖边(back edge):示意图中以红色边示意(即 \( 7 \rightarrow 1 \)),也被叫做回边,即指向先人结点的边。横叉边(cross edge):示意图中以蓝色边示意(即 \( 9 \rightarrow 7 \)),它次要是在搜寻的时候遇到了一个曾经拜访过的结点,然而这个结点 并不是 以后结点的先人。前向边(forward edge):示意图中以绿色边示意(即 \( 3 \rightarrow 6 \)),它是在搜寻的时候遇到子树中的结点的时候造成的。这是应用 js 实现的一个简略的 DFS: const depth1 = (dom, nodeList) => { dom.children.forEach((element) => { depth1(element, nodeList) }) nodeList.push(dom.name) }咱们思考 DFS 生成树与强连通重量之间的关系。 ...

February 27, 2024 · 2 min · jiezi

关于前端:基于SpringBootVue实现的小白博客开源了牛逼

✨ 简介小白博客是2022年12月份疫情期间自己居家时设计开发的一款社区博客零碎,过后二心只想着开发一款本人的零碎,历时3个月左右,零零散散,总算是将小白博客开发进去,尽管有些性能尚未欠缺,但也是小白的心血,现将此零碎开源,供有须要的小伙伴交流学习。 ✨ 性能文章采纳了比拟火的Markdown编辑器。系统集成了邮件发送性能。零碎能够自定义友情链接。零碎主页举荐文章 / 热门文章(展现最近n天用户访问量最多的10篇文章)。集成了百度IP定位API,记录用户的登陆地址及IP归属地展现。用户公布博客附带文件实现了目录文件构造的树形展现。零碎注册新用户履行邮箱绑定制、单个邮箱注册账号不得超过3个。零碎履行积分制,下载资源须要扣除相应积分,同样被下载资源的用户会失去肯定积分的处分。用户能够通过每日签到获取收费积分,单日签到次数不超过1次。集成了支付宝领取性能,零碎曾经实现了支付宝沙箱环境的对接。零碎尽可能实现可配置,前台信息管理端可自定义配置。零碎实现了对博客的点赞、珍藏、评论等性能,也可对本人心仪的博主进行打赏。零碎实现了匿名预览性能,匿名账号领有零碎最高查看权限(除DMML操作,该账号止咳查看、无奈进行增删改操作、不会对系统造成影响)前后端通过token进行交互,token30分钟内继续操作无感知续时(只有用户在操作,永不过期)✨ 运行环境及技术介绍开发工具:Idea2020.3、WebStorm2020.3 数据库:MySQL5.7、Redis 构建工具:Maven3.6.0 前端运行环境:nodejs14.21.3 服务端采纳SpringBoot框架搭建,Mybatis—Plus做为长久层框架,SpringSecurity技术进行认证权限管制数据库采纳MySQL前端采纳了Vue2.x、Element-UI、axios、echarts等技术、管理系统采纳vue-element-admin✨ 成绩展现零碎截图简略放几个,全副放太多了 前台零碎 前台首页 登录页 零碎能够匿名拜访,包含浏览文章、给博主打赏等,匿名状态下进行下载文件、点赞、评论、珍藏等操作时,会自动弹出登录页面,如下图 留神:服务端做了环境配置,开发环境验证码不做验证,轻易输出即可 文章详情页 用户点击文章列表进入文章详情页,能够进行点赞、珍藏、打赏(前提是博主已开明并上传打赏收款二维码)、下载(前提是该文章附带文件材料) 举报文章 用户可对其余用户公布的文章进行举报,为避免歹意举报,单个用户每日下限举报3次 文章发布页 用户登录后可公布文章、如未编写结束,可临时保留草稿,下次可间接编辑 公布后由管理员审核并设置资源下载所需积分 留神:公布胜利后会有<5分钟的提早,首页缓存,影响不大,能够通过搜寻获取到文章 集体核心->个人资料 用户可在此处查看并批改集体的用户信息 集体核心-个性化设置 用户可在此处进行积分余额是否展现、告诉、博文打赏的配置(未配置不可被打赏) 管理员登录页 管理员首页 用户治理 权限:超级管理员能够设置单个用户的权限、包含用户的文件上传权限、发言评论权限、打赏性能权限、文章公布权限、申请友链权限、用户反馈权限、用户举报权限等 受权:超级管理员可对用户进行角色受权 禁用:禁止用户登陆零碎 重置:充值用户登录明码 删除:删除用户 定时工作治理 配置我的项目中用到的一些的定时工作,也能够查看定时工作的执行日志 对于本站 管理员可设置零碎的题目、Logo、零碎简介等配置项 首页治理 次要配置首页的链接、标签、技术分类、导航链接等配置 博客审核 如果博客带有材料文件,能够设置下载积分,如果没有,则不能设置 举报治理 解决用户的举报,有以下几种惩办措施 对于博客 1、举报不实、不做解决 2、删除该帖子 3、删除该帖子,禁止该用户公布文章权限 4、禁止用户上传文件权限 禁止权限可设置对应时长,单位分钟,能够设置是否邮件揭示用户 ...

February 26, 2024 · 1 min · jiezi

关于前端:如何从零实现一个词云效果

词云是一种文本数据的可视化模式,它富裕表现力,通过大小不一,五光十色,随机紧挨在一起的文本模式,能够在泛滥文本中直观地突出呈现频率较高的关键词,给予视觉上的突出,从而过滤掉大量的文本信息,在理论我的项目中,咱们能够抉择应用wordcloud2、VueWordCloud等开源库来实现,然而你有没有好奇过它是怎么实现的呢,本文会尝试从0实现一个简略的词云成果。 最终成果领先看:https://wanglin2.github.io/simple-word-cloud/。 基本原理词云的根本实现原理非常简单,就是通过遍历像素点进行判断,咱们能够顺次遍历每个文本的每个像素点,而后再顺次扫描以后画布的每个像素点,而后判断这个像素点的地位是否包容以后文本,也就是不会和曾经存在的文本重叠,如果能够的话这个像素点的地位就是该文本显示的地位。 获取文本的像素点咱们能够通过canvas的getImageData办法。 最终渲染你能够间接应用canvas,也能够应用DOM,本文会抉择应用DOM,因为能够更不便的批改内容、款式以及增加交互事件。 计算文字大小如果咱们接管的源数据结构如下所示: const words = [ ['字节跳动', 33], ['腾讯', 21], ['阿里巴巴', 4], ['美团', 56],]每个数组的第一项代表文本,第二项代表该文本所对应的权重大小,权重越大,在词云图中渲染时的字号也越大。 那么怎么依据这个权重来计算出所对应的文字大小呢,首先咱们能够找出所有文本中权重的最大值和最小值,那么就能够失去权重的区间,而后将每个文本的权重减去最小的权重,除以总的区间,就能够失去这个文本的权重在总的区间中的所占比例,同时,咱们须要设置词云图字号容许的最小值和最大值,那么只有和字号的区间相乘,就能够失去权重对应的字号大小,基于此咱们能够写出以下函数: // 依据权重计算字号const getFontSize = ( weight, minWeight, maxWeight, minFontSize, maxFontSize) => { const weightRange = maxWeight - minWeight const fontSizeRange = maxFontSize - minFontSize const curWeightRange = weight - minWeight return minFontSize + (curWeightRange / weightRange) * fontSizeRange}获取文本的像素数据canvas有一个getImageData办法能够获取画布的像素数据,那么咱们就能够将文本在canvas上绘制进去,而后再调用该办法就能失去文本的像素数据了。 文本的字体款式不同,绘制进去的文本也不一样,所以绘制前须要设置一下字体的各种属性,比方字号、字体、加粗、斜体等等,能够通过绘图上下文的font属性来设置,本文简略起见,只反对字号、字体、加粗三个字体属性。 因为canvas不像css一样反对单个属性进行设置,所以咱们写一个工具办法来拼接字体款式: // 拼接font字符串const joinFontStr = ({ fontSize, fontFamily, fontWeight }) => { return `${fontWeight} ${fontSize}px ${fontFamily} `}接下来还要思考的一个问题是canvas的大小是多少,很显著,只有能包容文本就够了,所以也就是文本的大小,canvas同样也提供了测量文本大小的办法measureText,那么咱们能够写出如下的工具办法: ...

February 26, 2024 · 10 min · jiezi

关于前端:Git高频指令详记

1.初始配置:git config [--global] user.name "[name]"git config [--global] user.email "[email address]"2.启动:git init [project-name]:创立或在当前目录初始化一个git代码库git clone url:下载一个我的项目和它的整个代码历史3.分支操作:git branch 查看本地所有分支git branch -r 查看近程所有分支git branch -a 查看本地和近程所有分支git merge <分支名> 合并分支git merge --abort 合并分支呈现抵触时,勾销合并,所有回到合并前的状态git branch <新分支名> 基于以后分支,新建一个分支git checkout --orphan <新分支名> 新建一个空分支(会保留之前分支的所有文件)git branch -D <分支名> 删除本地某个分支git push <近程库名> :<分支名> 删除近程某个分支git branch <新分支名称> <提交ID> 从提交历史复原某个删掉的某个分支git branch -m <原分支名> <新分支名> 分支更名git checkout <分支名> 切换到本地某个分支git checkout <近程库名>/<分支名> 切换到线上某个分支git checkout -b <新分支名> 把基于以后分支新建分支,并切换为这个分支4.近程同步:git fetch [remote] 下载近程仓库的所有变动git remote -v 显示所有近程仓库git pull [remote] [branch] 拉取近程仓库的分支与本地以后分支合并git fetch 获取线上最新版信息记录,不合并git push [remote] [branch] 上传本地指定分支到近程仓库git push [remote] --force 强行推送以后分支到近程仓库,即便有抵触git push [remote] --all 推送所有分支到近程仓库5.撤销:git checkout [file] 复原暂存区的指定文件到工作区git checkout [commit] [file] 复原某个commit的指定文件到暂存区和工作区git checkout . 复原暂存区的所有文件到工作区git reset [commit] 重置以后分支的指针为指定commit,同时重置暂存区,但工作区不变git reset --hard 重置暂存区与工作区,与上一次commit保持一致git reset [file] 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变git revert [commit] 后者的所有变动都将被前者对消,并且利用到以后分支6.存储:git stash 临时将未提交的变动移除git stash pop 取出储备中最初存入的工作状态进行复原,会删除储备git stash list 查看所有储备中的工作git stash apply <储备的名称> 取出储备中对应的工作状态进行复原,不会删除储备git stash clear 清空所有储备中的工作git stash drop <储备的名称> 删除对应的某个储备简易版流程:git init 初始化仓库,默认为 master 分支git add . 提交全副文件批改到缓存区git add <具体某个文件门路+全名> 提交某些文件到缓存区git diff 查看以后代码 add后,会 add 哪些内容git diff --staged查看当初 commit 提交后,会提交哪些内容git status 查看以后分支状态git pull <近程仓库名> <近程分支名> 拉取近程仓库的分支与本地以后分支合并git pull <近程仓库名> <近程分支名>:<本地分支名> 拉取近程仓库的分支与本地某个分支合并git commit -m "<正文>" 提交代码到本地仓库,并写提交正文git commit -v 提交时显示所有diff信息git commit --amend [file1] [file2] 重做上一次commit,并包含指定文件的新变动

February 26, 2024 · 1 min · jiezi

关于前端:TNTWeb团队一些开源项目分享

腾讯TNTWeb团队是一支领有较丰盛教训和技术实力的前端团队,在Web前端、NodeJS开发、UI设计以及挪动APP等大前端畛域都有较多的实践经验和技术积淀。团队始放弃着谦虚和低调的态度,并终踊跃投身于前端基础设施的建设与欠缺。通过继续的技术创新和流程优化,一直晋升业务开发的效率,为产品翻新提供松软的技术撑持。 上面整顿了一些TNTWeb前端团队主导开发的开源我的项目,这些我的项目宽泛波及低代码、音视频解决、H5开发以及微前端等多个技术畛域。咱们深知,在这些我的项目中仍存在诸多待欠缺之处。因而咱们心愿能以此为契机,抛砖引玉,吸引宽广开发者与咱们携手共建,独特推动前端技术的不断进步与翻新。 1. TNT-Weeklygithub: https://github.com/tnfe/TNT-Weekly\相干文章: https://juejin.cn/post/7020678748307456007前端行业正以惊人的速度倒退,新技术如潮水般源源不断地涌现,相干的信息和文章也如繁星般遍布在各个领域。在这信息爆炸的时代,咱们往往感到迷茫,难以分别哪些信息对本人真正具备价值。鉴于此,TNTWeb 团队精心策划并启动了这个周刊我的项目,旨在为宽广前端开发人员会集小程序以及其余 web 前端技术畛域的优质内容,提供一个常识的宝库,帮忙他们在信息的陆地中迅速找到有价值的信息,紧跟行业倒退的步调。 2. FFCreatorgithub: https://github.com/tnfe/FFCreator\相干文章: https://juejin.cn/post/7046653290422992927、https://juejin.cn...FFCreator是一个基于node.js的轻量、灵便的视频制作工具库。它让每个人都能轻松制作视频。只需几张图片或视频片段,加上一段背景音乐,即可迅速生成炫酷的视频短片。在短视频日益风行的明天,FFCreator为解决用户疾速生产短视频或平台批量合成视频提供了简略高效的解决方案。它依赖少、配置低,轻松上手,让视频制作变得简略又快捷。 3. Helgithub: https://github.com/Tencent/hel\相干文章: https://juejin.cn/post/7176646667729371196、https://juejin.cn...Hel是腾讯TNTWeb团队开源的轻量微前端框架,它是一种用于构建古代 Web 应用程序的架构,它提供了一种在运行时动静加载和集成近程模块的办法。这些模块能够部署在 CDN 上,当近程模块公布更新后,无需从新构建和公布整个应用程序,即可立刻失效。这种形式进步了应用程序的开发效率和灵活性,使得开发人员可能更加高效地构建和保护简单的 Web 应用程序。 4. tdesign-react-startergithub: https://github.com/Tencent/tdesign-react-starter\相干文章: https://juejin.cn/post/7078854497396588580 TDesign React Starter 是以 TDesign React 组件库为根底构建的中后盾模板,它蕴含了丰盛且全面的组件示例。通过借鉴社区的最佳实际,并联合咱们的业务模式,咱们精心提炼出了一套即开即用的解决方案,旨在帮忙 React 技术栈的开发者进步研发效率。 该产品具备以下个性: 提供便捷的开发体验,无需额定配置即可上手。全面反对 TypeScript,晋升开发的类型安全性和效率。领有简洁明了的我的项目构造,方便管理和保护。具备好看的款式,反对多种主题切换,满足个性化需要。具备欠缺的零碎架构和开发工具链,晋升开发效率和品质。5. vue3-infinite-listgithub: https://github.com/tnfe/vue3-infinite-list\相干文章: https://juejin.cn/post/7079632420177362974、https://juejin.cn...一个专为Vue设计的短小精悍的有限滚动加载库,不仅体积玲珑——gzip压缩后仅占3kb——而且齐全零依赖,展现出弱小的独立性。无论是渲染百万级别的列表,还是轻松应答各种滚动需要,它都能熟能生巧地实现。你能够应用它滚动到指定的条目,或者设定初始的滚动偏移量。同时,它还反对固定或可变的宽度与高度,以及垂直或程度方向的列表展现,为你的我的项目提供极大的灵活性和便利性。https://juejin.cn/post/7079632420177362974 6. wp2vitegithub: https://github.com/tnfe/wp2vite\相干文章: https://juejin.cn/post/6953145736095596558、https://juejin.cn...\一款前端我的项目主动转换工具,旨在让您的Webpack我的项目轻松升级为反对Vite的我的项目。wp2vite不仅保留了您原有的Webpack配置,还会向我的项目中注入Vite所需的配置信息。通过应用wp2vite,您将体验到比Webpack快大概80%的开发速度,以及比Webpack快约50%的构建速度,从而大幅晋升您的工作效率。 7. shidagithub: https://github.com/tnfe/shida\相干文章: https://juejin.cn/post/7056611911776862215《视搭》是一款视频可视化搭建的便捷工具,让您通过轻松拖拽的操作形式,即可迅速制作出精彩的短视频。其应用之简便,与易企秀、百度H5等风行的H5搭建平台并驾齐驱。在以后行业中,对于视频可视化搭建的开源我的项目并不多见,而《视搭》正是其中一项绝对欠缺且独具特色的成绩。咱们诚挚地将其出现给您,冀望可能为您的创作之旅带来灵感与便当。 8. clean-stategithub: https://github.com/tnfe/clean-state\相干文章: https://juejin.cn/post/7005500716278087693 Clean-State是一款整洁且紧凑的React状态管理工具。它摒弃了React的历史包袱,利用原生钩子实现,并解决了Redux在状态更新时呈现的有效渲染问题。在架构层面,它通过非常简单的API实现了主动组织。 如果您不是在建造一艘航空母舰,而是厌倦了宏大、简单且难以使用的状态治理库,那么请尝试应用Clean-State。它玲珑粗劣,极致的性能定能满足您的需要。 9. csijsgithub: https://github.com/tnfe/csijs\相干文章: https://juejin.cn/post/7037700281420742693CSI.JS是一个前端日志零碎,它将错误信息记录于本地localStorage中。无任何依赖、无入侵性。应用非常简单,很容易引入你的零碎中,而且不会造成任何影响。 它能够帮你疾速重建犯罪现场。 10. manage-tablegithub: https://github.com/tnfe/manage-table\相干文章: https://juejin.cn/post/7067041231376744461在日常业务场景中,antd的table组件被宽泛应用。起初,它可能只展现几行字段,但随着时间推移,须要展现的字段数量一直减少,并且不同用户心愿看到的字段也各有差别。为了解决这个问题,咱们封装了名为manage-table的组件。该组件外部仍然基于antd构建,但减少了对显示列的灵便操作解决逻辑。 manage-table组件内置了一个性能,行将用户设置的展现列存储在localStorage中。为了保障存储的唯一性,咱们应用了参数name作为惟一标识进行存储。因而,在应用manage-table时,请确保在繁多域名内,所需展现列的设置放弃唯一性,以防止数据抵触或笼罩。这样,不同用户能够依据本人的需要,灵便地定制和保留表格的展现列设置。 11. FEDiagramgithub: https://github.com/tnfe/FEDiagram\相干文章: https://juejin.cn/post/7087826037433712671前端技术畛域涵盖的知识点极为丰盛,其中不乏形象且难以了解的内容。这些知识点仅凭文字往往难以直观表白,导致许多开发者对其了解模糊不清。为了解决这个问题,Diagram我的项目致力于通过图形化的形式,将前端技术中的简单知识点以直观、易懂的模式展示进去,帮忙开发者深刻了解和把握前端技术的外围因素。咱们置信,通过Diagram的图形化展现,开发者们将可能更加轻松地领悟前端技术的精华,并在实践中熟能生巧地利用这些知识点。 ...

February 26, 2024 · 1 min · jiezi

关于前端:canvas排版的实践

demo放在首位: https://dante.jdtj.top/gent/ 我依赖pixijs,编写了一个用于canvas排版的库。 这里的排版不同于 html2canvas 之类的库,它们是生成一张图片,这里的排版是要整个页面用 canvas 绘制,包含动画、交互等等(相似 react-canvas,外国小红书搞进去的货色,曾经凉了) 做这个货色,次要是优化长列表和加强交互成果。长列表的dom计划有虚构列表只渲染可视区的节点,然而在疾速滚动的时候,高低会留白。然而如果用canvas来解决,能够失去一个简直完满的成果。举个例子:https://chart.caihongduoduo.com/chart?lotteryId=1000&lotteryL...(在手机上关上)。能够看到,canvas解决后的长列表十分晦涩。 页面都用canvas排版后,能实现什么成果:外部自带优化计划,解决海量节点渲染的性能问题。 两种优化方法: 其一:不在可视区的内容,跳过渲染。不影响它的节点对象,在它不被渲染时也能够对其属性进行操作 其二:对页面部分进行缓存,在页面重排重绘时,缩小渲染 页面成果更丰盛 一、封装补间动画办法,实现相似css动画的成果 /** * * @param params * name 动画名称 * duration 动画执行时长 ms * delay 提早多久执行 * func 补间动画执行的 贝塞尔办法名 或者 动画模板名称 * attr{} 动画操作的属性 * callback 动画执行结束后的回调 */regKeyFrames(params) 二、在节点上调用 ```regCustomRender(canvas: HTMLCanvasElement) ```后,会用传入的canvas笼罩节点自身的渲染,在联合 ```getSnapshoot('base64') ```获得节点的渲染后果能够实现炫酷的成果。 这是demo的录屏:https://dante.jdtj.top/gent/demo.mp4原滋原味的截图,不会有兼容问题和失真。但也要留神图像的跨域问题页面如何便捷排版节点 想要齐全实现dom的排版体验比拟艰难。我目前实现了一套简略的排版形式: Graph 裸露一个pixiJS的Graphics对象,充当"canvas"的角色Text 文本Image 图片Input 输入框,对input进行包装,反对type = ['text', 'password', 'number'] Video 视频渲染Select 下拉框Option 下拉框的选项ScrollY 纵向滚动容器,主动计算内容高度和滚动条ScrollX 横向向滚动容器,主动计算内容宽度和滚动条HorLinearLayout 横向线性布局,外部元素都是程度排列VerLinearLayout 纵向线性布局,外部元素都是垂直排列AbsoluteLayout" 相对定位布局,外部元素基于AbsoluteLayout定位,AbsoluteLayout基于父级定位FixedLayout 固定定位布局,外部元素基于FixedLayout定位,FixedLayout基于app挂载对象定位 这些个布局容器能够互相嵌套,尽管写法比拟啰嗦,但曾经能够实现大部分的页面布局。 ...

February 26, 2024 · 1 min · jiezi

关于前端:金三银四你的面试利器一站式资源导航

你是不是也遇到过以下下问题 换工作就发愁? 想跳槽了,简历不会写? 面试题不会咋办? 收集了很多面试题网站,鼓起很大的勇气想看一会题,而后一关上发现网站挂掉了? 或者关上后发现外面的题库是三四年前的老掉牙的问题,当初面试官都不问,新题哪里去找呢? 来这里 interview-nav,找到最新最全的面试刷题网站! 金三银四行将到来,又开始有少量的人开始找工作了,刷题网站是必不可少的。 这个仓库收集 IT 行业各个岗位的优质面试题网站和简历编写指南,这些网站能够帮忙大家找到称心的工作,如对您有帮忙请点一个 Star。 仓库有严格的收集规范: 只收集能够失常拜访题库网站只收集两年内继续题库更新的题库网站只收集优质资源: 优质简历资源优质刷题网站优质面试教训如何写简历很多人都不会写简历,收集一些写简历的宝藏教训。 教你如何写初/高级前端简历:知乎高赞如何写一份无效的技术简历?:来自阮一峰的博客程序员简历模板系列:包含 PHP 、iOS 、Android 、Web 前端、Java 、C/C++、NodeJS 、架构师简历模板以及通用程序员简历模板简历模版一个好的简历模版能够让你事倍功半,上面是几个不错的模版网站,能够间接导出 PDF。 木及简历冷熊简历一页简历面试刷题网站前端因为自己也是前端,所以材料以前端面试材料为主。 这些年也收集远远不止这些,有些网站关停了,有些网站题太老,这些被我挑出来的都是比拟优质的材料。 前端小册剑指前端 offer前端内参前端面试木易杨前端进阶每天五分钟,半年大厂中。重学前端前端面试题宝典:微信小程序搜寻程序员工具前端面试题:微信小程序搜寻Java我这边对 Java 的面试材料网站收集不多,有资源的敌人能够提交 PR,一起来保护这个仓库。 JavaGuide 「Java 学习 + 面试指南」一份涵盖大部分 Java 程序员所须要把握的外围常识。筹备 Java 面试,首选 JavaGuide!Java interview Java 口试、面试 常识整顿learning-note Java 开发及面试(集体面试、工作总结、材料收集站)Java 面试+Java 学习指南 一份涵盖大部分 Java 程序员所须要把握的外围常识。Java-Interview 经验 BAT 面试后总结的【高级 Java 后盾开发面试指南】,污浊干货无废话,针对高频面试点Java 八股文『Java 八股文』Java 面试套路,Java 进阶学习,突破内卷拿大厂 Offer,升职加薪算法刷题网站这这些网站的算法如果都刷完了,妥妥大厂收割机了~ labuladong 的算法笔记用动画的模式出现解 LeetCode 题目的思路算法通过之路最初仓库地址:interview-nav 仓库继续更新中,立志做最新最全的面试资源导航,欢送关注Star。

February 26, 2024 · 1 min · jiezi

关于前端:如何用二维码高效收集信息表单功能轻松实现

表单作为草料二维码的高级性能之一,可用于收集格局对立的数据。你能够通过组合姓名、图片、查看项等组件搭建出电子表单,关联到二维码中,扫码填写表单即可更疾速、标准的收集数据。 上面为大家介绍下表单的制作教程。 1、新建表单新建表单可通过 在后盾新建 和 在二维码编辑器中新建 两种形式实现。 形式一:在后盾新建 进入后盾 -【高级性能】-【表单列表】-【新建表单】先建表单,基于表单生成二维码。 形式二:在二维码编辑器中新建 进入二维码编辑器 - 增加操作面板 - 抉择操作面板款式 - 增加操作项--【填写表单】- 【新建表单】在二维码的根底上,抉择新建表单进行关联。 2、制作教程表单编辑器由增加组件区域(左)、表单预览区域(中)、单个组件设置区域(右)形成。 2.1 制作表单 制作表单分为两个步骤:增加组件、设置组件。 第一步:增加组件从左侧区域抉择所需组件,点击或拖拽该组件以增加至表单。想要收集什么格局的信息,就抉择相应格局的组件。 第二步:设置组件点击选中已增加的组件,即可在右侧组件设置区域中,设置该组件的题目、是否为必填项、是否主动填充上次填写的内容等。 2.2 将表单增加至二维码中 形式一:增加至已生成的二维码 进入二维码编辑器,增加【操作面板】- 抉择款式 - 【填写表单】- 抉择须要增加的表单。1个二维码可增加多个表单,1个表单也可被增加至多个码中应用。 形式二:由表单快捷生成二维码 这是由表单间接生成二维码的快捷方式。底层逻辑与形式一统一,仍是生成二维码后将表单增加至二维码中,两种形式生成的码没有任何差别。 该形式举荐报名、签到等简略信息收集/注销场景应用,且一个二维码中只需增加一张表单。不举荐一物一码场景应用。 进入后盾,【高级性能】-【表单设置】-【生成二维码】 2.3 表单设置 在二维码编辑器中,设置操作面板 - 抉择相应表单 -【设置表单】 通过对表单进行设置,能够达成不同的成果或性能,如设置填写权限、设置提交页、音讯揭示、数据审核等。 3、进阶教程3.1 调整表单在码中的显示款式、地位 将表单增加到二维码后,表单就成为了该二维码中操作面板的一个操作项。通过对操作面板的展现款式和地位设置,能够实现表单的不同展示成果。 3.2 开启动静档案 开启二维码的【动静档案】性能,可能实现扫码者扫码查看该码的所有表单数据。动静档案反对设置查看权限、显示成果等。

February 26, 2024 · 1 min · jiezi

关于前端:探索亚信安慧AntDB的数据库管理之道

大家好我是咕噜美乐蒂,很快乐又和大家见面了!亚信安慧AntDB是一款由国内出名的信息技术服务公司亚信科技推出的开源分布式关系型数据库管理系统(DBMS)。AntDB以其高度可扩展性、高性能和高可靠性等特点,成为了越来越多企业在大数据畛域抉择的现实数据库解决方案。在本文中,咱们将深刻摸索亚信安慧AntDB的数据库治理之道,包含其架构设计、数据分片、分布式事务处理、性能优化、安全性等方面。一、架构设计亚信安慧AntDB的架构设计致力于实现高可用、高性能和高扩展性。其架构次要包含:1.分布式架构:AntDB采纳分布式架构,将数据程度分片存储在多个节点上,实现数据的分布式存储和解决。这种架构可能进步零碎的扩展性和负载平衡能力。2.共享存储和消息传递:AntDB采纳共享存储和消息传递的形式实现节点之间的通信和合作,确保数据的一致性和可靠性。同时,它还反对音讯队列等机制,用于异步通信和工作解决。3.高可用性和容错性:AntDB通过数据复制和正本机制实现高可用性和容错性。它反对同步复制和异步复制,在节点故障时可能疾速切换到备用节点,确保零碎的继续可用性。二、数据分片与分布式事务处理1.数据分片:AntDB将数据程度分片存储在多个节点上,每个节点负责管理局部数据片段。这种数据分片的形式能够进步查问性能和并发解决能力,同时加重繁多节点的压力。2.分布式事务处理:AntDB反对分布式事务处理,实现跨多个节点的事务一致性。它采纳两阶段提交协定(2PC)来治理分布式事务,确保事务的原子性和一致性。三、性能优化1.查问优化:AntDB通过优化查问执行打算、并行查问和索引设计等形式来进步查问性能。它可能智能地抉择最优的查问门路,缩小查问工夫和资源耗费。2.并行处理:AntDB反对并行查问和并行计算,充分利用多核处理器和多节点资源,减速数据处理和计算过程。四、安全性1.访问控制:AntDB提供灵便的访问控制机制,管理员能够依据需要设置用户权限和角色,限度用户对数据库的拜访和操作。2.数据加密:AntDB反对数据加密技术,爱护数据在传输和存储过程中的安全性,避免数据泄露和窃取。3.审计日志:AntDB记录所有数据库操作和事件的审计日志,管理员能够随时查看和监控数据库的流动,及时发现异常情况和平安威逼。五、监控与治理1.性能监控:AntDB提供了丰盛的性能监控工具,能够实时监测数据库的性能指标、资源利用率和运行状态,帮忙管理员及时发现性能问题和瓶颈。2.自动化治理:AntDB反对自动化治理性能,包含主动备份、主动故障转移和主动负载平衡等,升高管理员的治理老本和工作量。结语综上所述,亚信安慧AntDB作为一款当先的分布式关系型数据库管理系统,以其弱小的架构设计、数据分片、分布式事务处理、性能优化、安全性和监控治理等方面的特点,曾经成为泛滥企业在解决大数据和高并发场景下的首选数据库解决方案。通过一直的技术创新和性能优化,AntDB将为用户提供更加稳固、高效和平安的数据库治理体验,助力企业实现数字化转型和业务倒退。好啦,明天美乐蒂就和大家分享到这里啦,小伙伴们有更好的方法能够在评论区打进去哦~~以便大家更不便地操作呢。

February 26, 2024 · 1 min · jiezi

关于前端:D54123AC-型漏电流保护专用电路高输入-灵敏度-满足-JIS-C8371-标准要求功耗低

D54123是一款高速对地漏电爱护电路,内置蕴含差分放大器、锁存器和稳压器。它连贯到零电流互感器(ZCT),用于检测差分放大器的两个输出端。差分放大器与一个外接电容相结合,并且连贯到锁存电路的输出端子,输入适宜高速漏电断路器的个性。锁存电路在输出电压达到规定值前放弃低电平输入,当漏电流大于规定值时输入变高,触发与输入相连的可控硅。 D54123采纳SOP8和SIP8的封装模式封装。 次要特点: ● 输出灵敏度高(典型VT=6.0mV)● 工作温度范畴宽 ( Ta=-20℃~80℃ )● 抗干扰、防冲击能力强● 功耗低(典型PD=5mW),可用于110V和220V电网● 所需内部器件少

February 26, 2024 · 1 min · jiezi

关于前端:JavaScript中的包装类型详解

JavaScript中的包装类型详解在 JavaScript 中,咱们有根本类型和对象类型两种数据类型。根本类型包含 String,Number,Boolean,null,undefined 和 Symbol。然而,当咱们须要在这些根本类型上调用办法时,就须要用到 JavaScript 的包装类型。什么是包装类型?包装类型是 JavaScript 中的一种非凡对象,它们将根本类型的值“包装”在对象中,使咱们可能在根本类型上调用办法。JavaScript 提供了三种包装类型:String,Number 和 Boolean。例如,当咱们在一个字符串上调用办法时,JavaScript 会长期将其转换(或者说“包装”)为一个对象,这样就能够调用办法了。var str = 'hello';console.log(str.toUpperCase()); // 输入 "HELLO"在这个例子中,str 是一个字符串根本类型,但咱们能够在它下面调用 toUpperCase 办法。这是因为 JavaScript 在后盾长期将 str 包装成了一个 String 对象,而后在这个对象上调用了 toUpperCase 办法。包装类型的个性值得注意的是,这种包装只是长期的,调用办法后,根本类型值会复原到原来的状态。这就是所谓的包装类型。此外,尽管 null 和 undefined 也是根本类型,但它们没有对应的包装类型,也没有能够调用的办法。包装类型的注意事项尽管包装类型在 JavaScript 中十分有用,但在应用时也须要留神一些问题。例如,尽管 Boolean 对象是一个包装类型,但它在布尔上下文中总是被视为 true,无论它包装的值是 true 还是 false。这可能会导致一些意想不到的后果。var bool = new Boolean(false);if (bool) { console.log('run?'); // 会进到 if 条件外面吗?}在这个例子中,bool 是一个 Boolean 对象,其包装的值为 false。然而,因为 bool 是一个对象,所以在 if 语句中,它被视为 true,所以 console.log 语句总是会执行。所以打印出 run?。总的来说,包装类型是 JavaScript 中一个重要的概念,它让咱们可能在根本类型上调用办法,极大地加强了 JavaScript 的灵活性和功能性。然而,在应用时,咱们也须要留神它的一些个性和潜在问题。面试题有可能会是面试题,先看以下代码:var a = new Boolean(false);if (!a) { console.log('run?'); // 会进到 if 条件外面吗?}看了下面对于包装类型的介绍,那会执行到 if 外面吗? ...

February 26, 2024 · 1 min · jiezi

关于前端:基于GitHub的Electron自动发布与更新

前言公众号:【可乐前端】,分享前端面试与web实战常识在后面曾经实现了咱们本人的Markdown编辑软件,首次装置必定是要手动下载安装的,然而在后续的迭代更新中,如果还须要一次次的去手动下载安装替换的话,那么体验必定是不太好的。 本文介绍了如何在 Electron 中主动公布到 GitHub 以及自动更新的实现计划,话不多说,让咱们立即开始。 主动公布咱们能够依靠 GitHub 作为安装包的托管平台,对于每一次的版本公布,都能够在对应的仓库里新建一个 release ,并把对应的安装包资源传输到 release 中。 打包的时候能够应用 electron-builder 这个库,在根目录下创立 electron-builder.yml 配置文件。写入如下配置: publish: provider: github owner: '你的账户名' repo: '你的仓库名' token: '你的token' releaseType: 'release'如何生成 GitHub Token 曾经在上一期文章中介绍过,感兴趣的同学能够在下面链接中点开查看。而后批改打包的命令如下: "build:mac": "npm run build && electron-builder --mac --config --publish always"这样在咱们在咱们执行完打包命令之后,会主动把产物推送到 GitHub 对应的 release 中。这里须要留神的一点是,版本号都是基于 package.json 的 version 字段,所以在每一次打包公布之前记得先批改这里的值。 能够看到在打包实现之后,会主动把产物推送到 GitHub 中,咱们能够在 GitHub 对应的公布分支上看到对应的内容。 publish 中 provider 的可选值在 electron-builder 中,publish 局部的 provider 字段用于指定公布提供者。以下是一些常见的 provider 取值: ...

February 26, 2024 · 2 min · jiezi

关于前端:浮木云随笔小记7布局容器弹性容器

自从发现浮木云这个宝藏级别的原型设计平台,我几乎对它爱不释手,因为他能让我在短时间内疾速搭建一个原型页面,这对于产品的初学者无疑是一个福音。之前针对浮木云搭建的页面做了一些简略的记录,然而在页面设计过程中波及的一些更加粗疏化的货色还须要深刻去钻研,接下来我将针对组件库出一个系列性的文章,帮忙我来加深对浮木云的理解,同时也心愿对大家对浮木云的理解有所帮忙。本次针对组件库的弹性容器&布局容器进行简略的记录。1、弹性容器「浮木云」中的「弹性容器」采纳「弹性布局」,「弹性布局」使父容器可能调节子组件的宽度/高度和排列程序,从而可能更好地填充可用空间。1.1 款式配置(1)布局款式:弹性容器的布局款式包含宽度、高度、定位形式、是否主动换行、横向对齐、纵向对齐、程度溢出、垂直溢出、内外边距。宽度&高度:弹性容器的默认宽、高度别离是百分之百和200px,他这里的示意单位有三种形式:百分比、px和自适应,百分比就是容器的宽度或者高度占据页面的比例,自适应是容器自身适应容器内的内容填充,随着内容的增多容器也会在高度和宽度上产生相应的变动。定位形式:定位形式包含绝·对定位和绝对定位。绝对定位的参考物是容器的初始地位,绝·对定位的参考物包裹容器的容器的左上顶点。如下图,我别离在两个弹性容器中搁置了一个文字组件和一个弹性容器,对于这个内嵌的弹性容器的定位形式别离设置为绝对定位和绝·对定位。会发现两个内嵌的弹性容器的地位有所不同。从这个图例就能够看出绝对定位和绝·对定位的区别。确定好定位形式依据需要确定偏移量。主动换行:主动换行管制弹性容器的内容是搁置在一行还是多行。横向对齐:是容器中的组件内容横向方向的对齐形式,包含左对齐、右对齐、居中对齐、两端对齐、等距对齐、等外边距对齐。纵向对齐:是容器中的组件内容纵向方向的对齐形式,包含靠上对齐、靠下对齐、居中对齐、底线对齐。程度溢出:容器的组件内容宽度超过了容器的宽度,程度溢出设置“暗藏”,内容超出的局部将不会被看到,设置为“滚动”,页面横向会产生滚动。垂直溢出:同程度溢出,容器的组件内容高度超出了容器的高度,设置“暗藏”,超出的内容会被暗藏,设置为“滚动”,页面纵向会产生滚动。内外边距:外间距是设置容器外侧跟父级容器的间距,内间距是设置容器内侧的组件内容之间的间距。(2)背景款式:弹性容器的背景款式包含背景暗影,背景图片,背景色彩,显示边框,显示色彩,盒子边框背景暗影:背景暗影其实就是给容器设置暗影,让整个内容布局更有立体感,包含根底投影和浅色投影。背景图片:通过上传适合的图片设置对应的图片背景。显示边框:默认状况下是不显示边框的,能够依据理论需要让容器的边框是否显示在页面上。下图是弹性容器显示边框的例子。边框款式:当显示边框时,对容器的边框设置合乎需要的款式,能够是实线、点状、双线、虚线。边框色彩:不言而喻,就是对容器的边框设置适合的色彩。盒子边框:内层的数值是设置容器边框线的粗细,四角的数值是设置容器的圆角,可依据本人的理论需要调整相应的数值。1.2 属性配置属性配置包含组件名称和是否暗藏。组件名称:给弹性容器命名,这里要强调一下,因为咱们的页面会蕴含多个容器,因而务必肯定要给容器命名,便于后续疾速定位相应的容器进行相应的款式批改或属性批改,同时在交互编排时也便于查找。是否暗藏:依据须要决定容器是暗藏还是显示,若暗藏,容器内的内容全副被暗藏。2、布局容器「浮木云」中的「布局容器」采纳「块级布局」,无论子组件尺寸如何,它都会独占一行的空间;一般来说,当须要外部子组件纵向排列时应用「布局容器」。布局容器的款式配置和弹性的容器的款式配置和属性配置简直无差别,只是弹性容器的款式配置多了一个是否主动换行,所以这里对弹性容器的款式配置不过多介绍。3、区别在原型设计过程中是抉择弹性容器还是布局容器呢?我做了一个示例图,大家就能够看出他们区别。上图我搁置了两个容器,一个是布局容器,一个是弹性容器,在不同容器中别离搁置了文字、面包屑和头像三个根底组件,在布局容器中组件呈纵向散布,弹性容器中组件呈横向散布。在弹性容器的【款式配置】中将“主动换行”改成是,弹性容器中的组件出现模式跟布局容器的组件模式是一样的。看到这里大家是不是感觉布局容器有些多余,其实不然,布局容器能够强制每个组件纵向排列,而弹性容器即便你设置了主动换行,如果搁置的组件宽度没有达到容器的理论宽度,组件内容是无奈满足主动换行的。如下图:我将容器设置为主动换行,然而两个文字组件仍然在同一行,所以,大家在制作页面时肯定要依据本人的理论需要抉择适合的容器,从而确保页面简洁好看。只有框架定义好了,后续才不会呈现大谬误。

February 26, 2024 · 1 min · jiezi

关于前端:查漏补缺盘点和toggle相关的几个API

欢送关注我的公众号:前端侦探toggle的意思很简略,示意“切换”,实用于两个状态之间的变动,不会呈现第三者,就像这样 web 中也有很多相似的api,一起看看有哪些吧 一、toggle首先是最罕用的DOMTokenList.toggle办法,这里的的DOMTokenList示意一组空格分隔的标记,最常见的就是Element.classList,比方 除了classList还有relList,不过应该更少见了<div class="a b c"></div>通过el.classList能够获取到 class 的详细信息 看着像一个数组一样,而后咱们能够通过toggle办法去切换某个class,比方 el.classList.toggle('a'); // 移除 ael.classList.toggle('a'); // 增加 a此时会动静去判断,如果存在就移除,如果不存在就增加,再也不须要去判断以后状态了 比方要切换页面主题,能够间接这样 // 深浅切换btn.onclcik = () => { document.body.classList.toggle('dark')}// 无需像这样if (以后是深色) { 设置为浅色} else { 设置为深色}另外,toggle还反对第二个参数,示意强制,是一个布尔值,为 true示意增加,反之为移除,而不论以后是什么状态 el.classList.toggle('a', force); 比方 // 设置为浅色btnLight.onclcik = () => { document.body.classList.toggle('dark', false)}// 设置为深色btnDark.onclcik = () => { document.body.classList.toggle('dark', true)}是不是十分不便呢? 二、toggleAttribute还有一个和toggle比拟相似的是toggleAttribute,顾名思义,这个是用来切换属性的,语法和后面统一 toggleAttribute(name)toggleAttribute(name, force)这个应用场景更为宽泛,例如管制一个输入框的禁用与开启 input.toggleAttribute('disabled')当然对于表单元素,还能够用.的形式间接设置 input.disabled = !input.disabled;然而,对于一般自定义属性,就不能用这种形式了,比方光明模式,用属性来管制 document.body.toggleAttribute('dark');第二个参数也是相似的 document.body.toggleAttribute('dark', ture); //增加dark属性document.body.toggleAttribute('dark', false);//移除dark属性当然你还能够用更惯例的形式 document.body.setAttribute('dark', ''); //增加dark属性document.body.removeAttribute('dark');//移除dark属性集体感觉不如toggleAttribute优雅,你感觉呢? ...

February 26, 2024 · 1 min · jiezi

关于前端:零难度指南手把手教你如何通过在线Excel实现资产负债表

前言 作为财务剖析中的三大报表之一,资产负债表的作用是展现一个企业在特定工夫点上的财务状况。明天小编就为大家介绍一下如何应用葡萄城公司的纯前端在线表格控件SpreadJS实现一个资产负债表。 环境筹备 SpreadJS在线Excel体验地址:https://demo.grapecity.com.cn/SpreadJS/WebDesigner/index.html 操作步骤 1)填报 先将本地excel模板导入至SpreadJS中。对于共计类单元格,进行简略公式计算的,并且这里的公式是固定的,并设计好背景色彩。如果是间接填报,在对应科目年初/期末数单元格间接编辑数据就好。在理论业务中,数据往往是由此前的业务逻辑汇总而来的,所以小编筹备了一个数据源表,便于后续取数。数据源: 接下来就是将对应数值填写到科目单元格中了,这里咱们能够借助 sumifs 公式。对于sumifs 公式的具体介绍能够点击这里查看。以货币资金为例,如果想获取2021年货币资金科目的金额,能够设置下方公式:对于填报用户来说,手动抉择区域来顺次设置公式还是有些繁琐,且如果数据源格局固定,填报用户也无需关注数据区域。所以,能够借助命名信息,进一步将公式简化。 命名信息,即能够给一个单元格、区域、函数,常量,表格定义一个别名,后续能够间接通过这个别名进行援用。增加的命名信息如下: 公式能够批改为如下(制表年份-1 即为期初数据对应财年)。 对于期末数,公式为:=SUMIFS(金额,科目,B5,年份,2) 科目值输出结束后,共计局部公式就能够主动计算了: 2)权限管制 资产负债表制作实现后,紧接着就进入审批流程了,在数据流转过程中,为了保证数据的完整性和准确性,往往会对编辑权限做肯定的限度。比方,审批人只能审阅,无奈批改原始数据。原始数据只能由制表者进行批改。这里咱们能够联合SpreadJS 表单爱护+单元格锁定 性能,实现上述需要。 对于制表者,能够编辑各科目年初数、期末数单元格,因而将其设置为锁定,并开启表单爱护。 如果尝试批改其余单元格,则会弹窗提醒: 当然,这里的弹窗文本也是能够自定制的,更灵便地满足不同我的项目的格调需要。具体形式可参考下方的教程:https://gcdn.grapecity.com.cn/showtopic-162002-1-1.html 在流转至审批阶段时,审批单元格编辑权限关上,其余单元格处于只读状态,所以能够将B42:E42单元格设置为未锁定,其余单元格设置为锁定。 同样开启表单爱护,使编辑限度失效。对于原始数据表单,审批者其实是不关注的,所以能够将此sheet进行暗藏。SpreadJS提供了深度暗藏性能,使用户无奈从UI界面进行勾销,从而保障了数据的安全性。 填报工作实现后,紧接着就是须要做打印、导出pdf等业务。 3)打印和导出pdf 在打印时,能够间接应用设计器自带的打印性能,点击打印按钮即可唤起浏览器的打印窗口。如果须要调整布局、边距等,能够通过页面布局按钮进行相应设置。 同样地,设计器也提供了类Excel的导出pdf性能。 总结 以上就是应用SpreadJS实现一个资产负债表的全过程,如果您想理解更多有对于资产负债表的信息,欢送点击这里查看。 扩大链接: 【干货放送】财务报表勾稽剖析要点,一文读尽! 为什么你的财务报表不杰出?举荐你理解这四个设计要点和SpreadJS! 纯前端类 Excel 表格控件在报表勾稽剖析畛域的利用场景解析

February 26, 2024 · 1 min · jiezi

关于前端:Cocos游戏开发中倍率滚动抽奖效果

引言Cocos游戏开发中倍率滚动抽奖成果 大家好,在小游戏开发中,咱们通常会设计在游戏取得处分的中央通过观看激励视频去取得额定的处分。 在设计的过程中,会退出一些缓和刺激的抽取成果,例如滚动抽奖、转盘抽奖、老虎机等等。 本文重点给大家介绍一下如何在Cocos游戏开发中实现倍率滚动抽奖成果。 本文源工程在文末获取,小伙伴们自行返回。 什么是倍率滚动抽奖倍率滚动抽奖是一种常见的抽奖机制,其核心思想是在抽奖过程中,随着工夫的推移,滚动速度会逐步减慢,直到最终进行在一个确定的地位上。与一般的滚动抽奖相比,倍率滚动抽奖具备以下特点: 减速滚动: 初始阶段,滚动速度较快,以减少紧张感和期待感。这会让参与者感觉到抽奖过程是充满活力和刺激的。逐步加速: 随着工夫的推移或者滚动次数的减少,滚动速度会逐步减慢。这种逐步加速的过程能够给参与者提供更多的期待和焦虑感,减少抽奖的缓和气氛。最终进行: 当滚动速度减慢到肯定水平或者达到肯定的工夫点时,抽奖过程会进行,指针或者滚动元素会停留在一个确定的地位上,这个地位就是最终的抽奖后果。倍率滚动抽奖罕用于各种抽奖流动和游戏中,其目标是为了减少抽奖过程的趣味性和刺激感,吸引更多的参与者并晋升用户体验。 实现滚动抽奖成果的要害实现滚动抽奖成果的要害通常包含以下几个方面: 动画成果: 应用适合的动画成果来模仿滚动的过程。确保动画晦涩天然,给用户带来良好的体验。随机性: 在抽奖过程中,确保后果的随机性。这能够通过编程语言中的随机数生成器来实现。随机性对于抽奖游戏至关重要,因为用户冀望后果是齐全随机的,而不是受到内部因素的影响。进行机会: 决定何时进行滚动,以展现最终后果。能够依据工夫、动画次数或其余因素来确定进行的机会。通常在动画达到肯定工夫或次数后,会逐步加速并最终进行在某个地位上。展现后果: 当进行滚动时,展现最终的抽奖后果。这可能波及到显示获奖物品或显示获奖信息等操作。反馈: 提供适当的反馈,让用户晓得抽奖过程正在进行中,并在最终后果呈现时进行适当的庆贺或揭示。实现倍率滚动抽奖成果1.资源筹备首先从美术妹子那里拿到资源,如果没有的话能够去菜市场看看。 创立新的工程,并将资源放入。 2.拼UI而后咱们简略的拼一下UI,拼UI是传统手艺,不能丢。 次要有以下三局部组成。 根底处分局部:这部分次要是展现根底的处分局部。倍率局部:通过抽取倍率能够让根底处分翻倍。其中滚动的要害是通过ScrollView组件实现。按钮局部:通过观看视频能够进行抽奖。 3.写代码首先创立一个MultipleLottery脚本。 通过@property增加并引入要害的几个组件。 抽奖按钮Node。实现滚动的ScrollView。倍率标签Label。 而后在start中初始化标签数组。 把Mask去掉能够看到成果如下: 最初给按钮增加一下点击事件。 其中的要害API是ScrollView组件的scrollToBottom和scrollToTop办法。 视图内容将在规定工夫内滚动到视图底部和顶部,造成一个抽取滚动的成果。 4.成果演示 结语本文源工程可通过私信发送MultipleLottery获取。 更多实用源码可通过浏览原文搜寻"亿元程序员"获取,感谢您的反对。 我是"亿元程序员",一位有着8年游戏行业教训的主程。在游戏开发中,心愿能给到您帮忙, 也心愿通过您能帮忙到大家。 AD:笔者线上的小游戏《填色之旅》《方块掌机经典》《贪吃蛇掌机经典》《重力迷宫球》大家能够自行点击搜寻体验。 实不相瞒,想要个赞和在看!请把该文章分享给你感觉有须要的其余小伙伴。谢谢! 举荐专栏: 你晓得和不晓得的微信小游戏罕用API整顿,连忙珍藏用起来~ 100个Cocos实例 8年主程手把手打造Cocos独立游戏开发框架 和8年游戏主程一起学习设计模式 从零开始开发贪吃蛇小游戏到上线系列 常识付费专栏

February 26, 2024 · 1 min · jiezi

关于前端:ReactNode全栈无死角解析吃透文件上传的各个场景

前言公众号:【可乐前端】,期待关注交换,分享一些有意思的前端常识文件上传在平时的开发过程中很常常会遇到,本文总结了如下罕用的文件上传场景,包含前后端的代码实现,心愿你下次遇到上传文件的场景能够间接秒杀。文章稍稍有点长,倡议点赞珍藏食用。 上传形式 点击上传拖拽上传粘贴上传上传限度单、多文件上传文件夹上传上传进度oss上传大文件上传 切片断点续传秒传 上传形式上面先来介绍三种常见的上传形式: 点击上传拖拽上传粘贴上传点击上传<div onClick={() => inputRef.current.click()} className={styles.uploadWrapper}> 点击、拖拽、粘贴文件到此处上传 <input onClick={(e) => e.stopPropagation()} onChange={hanldeChange} multiple type="file" ref={inputRef} /></div>点击上传代码非常简略,就是利用input[type="file"]的能力唤起文件抉择框,而后做一个本人喜爱的容器,把input框藏起来,点击容器的时候模仿input框点击即可,multiple属性是用来做多文件上传的。 拖拽上传 const handleDrop = (event) => { event.preventDefault(); const files = event.dataTransfer.files; uploadFiles(files); }; const handleDragOver = (event) => { event.preventDefault(); }; return ( <div className={styles.container}> <div onDrop={handleDrop} onDragOver={handleDragOver} className={styles.uploadWrapper} ref={uploadRef} onClick={() => inputRef.current.click()} > 点击、拖拽、粘贴文件到此处上传 <input onChange={hanldeChange} multiple type="file" ref={inputRef} /> </div> </div> );拖拽上传次要是实现了容器的drop事件,当鼠标松开时从event.dataTransfer.files获取到拖拽的文件 粘贴上传 useEffect(() => { const container = uploadRef.current; const pasteUpload = (event) => { event.preventDefault(); const items = (event.clipboardData || event.originalEvent.clipboardData) .items; let files = []; for (const item of items) { if (item.kind === "file") { files.push(item.getAsFile()); } } if (files.length > 0) { uploadFiles(files); } }; container.addEventListener("paste", pasteUpload); return () => { container.removeEventListener("paste", pasteUpload); }; }, []);粘贴上传的形式就是在容器中监听paste事件,把属于文件的粘贴内容过滤出来。 ...

February 25, 2024 · 7 min · jiezi

关于前端:自定义属于你的脚手架并发布到NPM仓库

前言公众号:【可乐前端】,期待关注交换,分享一些有意思的前端常识咱们在开发的过程中经常会应用到一些脚手架来帮咱们疾速构建我的项目模版,罕用的脚手架命令有如下这些: create-react-appvue-clicreate-vite咱们同样也能够依据本人罕用的、习惯的技术栈去自定义一个属于本人的脚手架,让本人用的更难受。所以我依据本人的开发习惯,实现了一个基于vite和react的脚手架。本文次要实现的性能有: 交互式命令行创立动静模板生成公布到npm仓库GitHub地址:https://github.com/jayyliang/vite-react-cli 整体流程大略看一下整个我的项目的构造 bin 咱们要实现的命令行命令src 具体的代码实现template 模版文件上面简略介绍一下生成过程的整体流程,次要包含以下几点 获取命令行参数动静生成文件代码丑化//bin/create.js#!/usr/bin/env nodeconst { PROMPT } = require("../src/constants");const { copyFolderSync,format } = require("../src/exec");const { getPrompt } = require("../src/interactive")const path = require('path');const run = async () => { const prompts = await getPrompt() //获取目录 const projectName = prompts[PROMPT.NAME] const projectPath = path.join(process.cwd(), projectName) //生成模版 copyFolderSync(path.join(__dirname, "../template"), projectPath, prompts) // 代码丑化 await format(projectPath) console.log(` 我的项目地址:${projectPath}`)}run()交互式命令行这里次要用到的是inquirer这个库,它非常弱小,能够很容易的帮咱们创立一个交互式的命令行。比方咱们心愿创立的时候输出项目名称,抉择Javascript/Typescript。就能够如下实现: const inquirer = require("inquirer");const prompts = [ { type: "input", name: PROMPT.NAME, message: "项目名称", }, { type: "list", name: PROMPT.LANG, message: "JS/TS", choices: [ENUMS[PROMPT.LANG].JavaScript, ENUMS[PROMPT.LANG].TypeScript], },];const commandRes = await inquirer.prompt(prompts); ...

February 25, 2024 · 3 min · jiezi

关于前端:️Electron实现录屏软件二指定区域录制

前言公众号:【可乐前端】,期待关注交换,分享一些有意思的前端常识在上一期咱们应用Electron实现了一个本人的录屏软件,评论区有小伙伴说如何反对区域录制。诚然区域录制也是一个非常常见的需要,所以明天咱们就来实现一下录屏软件的区域录制。 上一期的文章链接在这,感兴趣的敌人们能够返回观看:Electron打造你本人的录屏软件 前置优化在开始区域录制之前,先优化一下之前的一些实现形式,以及从新定义一些概念。不便咱们更好地开始实现前面的逻辑。 从新定义清晰度在上一期中咱们定义了几种清晰度规范: 超清:3840x2160分辨率高清:1280x720分辨率标清:720x480分辨率而后通过ffmpeg指定分辨率去录制不同品质的视频,但其实这样的实现是有一些问题的。试想一下你的录制硬件设施最高的分辨率都没达到超清的分辨率,那么设置超清的分辨率也是没有意义的。 所以录制的时候我会不指定分辨率,这样ffmpeg就会采纳最高分辨率来录制,录制实现之后再把视频转成指定的分辨率。这里的分辨率我也从新定义了一下,当初是以百分比来设置。 const DEFINITION_LIST = [ { label: '100%', value: '1' }, { label: '75%', value: '0.75' }, { label: '50%', value: '0.5' }, { label: '25%', value: '0.25' }] 录制命令就改成了上面的样子 const ffmpegCommand = `${ffmpegPath} -f avfoundation -r ${frameRate} -i "1" -c:v libx264 -preset ultrafast ${fileName}`视频格式转换录制实现之后,再调用ffmpeg的视频格式转换性能,这个时候顺便把分辨率一起设置一下。录制实现后对应的子过程就会退出,此时监听子过程的退出事件,调用转码办法。 ffmpegProcess.on('exit', (code, signal) => { console.log(`Recording process exited with code ${code} and signal ${signal}`) afterRecord() })上面是afterRecord的局部实现,解释一下实现流程: ...

February 25, 2024 · 3 min · jiezi

关于前端:JS使用Wasm为你的文件MD5计算装上火箭引擎

前言公众号:【可乐前端】,期待关注交换,分享一些有意思的前端常识之前在一个本人的我的项目中尝试做一个web视频转码性能,打算用的是ffmpeg这个弱小的库。过后就理解到了wasm把ffmpeg移植到浏览器中应用。然而等真正要公布到生产的时候还是遇到一些问题, 比如说ffmpeg体积比拟大,加载速度迟缓;还有sharedArrayBuffer与ffmpeg.wasm的一些关系,简略来说就是如果须要应用多线程版的ffmpeg,就须要设置COOP/COEP这两个新的跨域策略,然而设置这两个货色就会毁坏OAuth的集成;或者能够抉择应用单线程的ffmpeg,然而效率感人。。 然而这并不影响将C/C++/Rust等语言编译成Wasm移植到浏览器仍旧是一种很有魅力的解决方案,明天一起来走进它吧! Wasm简介WebAssembly(Wasm)是一种凋谢规范,旨在提供一种可移植、高性能的二进制格局,用于在web浏览器中运行。它不是特定于任何语言的,而是为多种编程语言设计,包含C、C++、Rust等。通过将代码编译为Wasm格局,开发人员能够实现在不同平台和浏览器上运行的一致性性能。 Wasm的次要指标之一是提供比传统的JavaScript更高效的执行速度。它容许开发人员应用其余语言编写局部应用程序,而后将这些局部集成到web应用程序中,实现更好的性能和更宽泛的语言选择。 此外,Wasm还提供了安全性、可移植性和版本控制等方面的劣势。它在web浏览器中作为一个虚拟机执行,与浏览器的JavaScript引擎严密集成,使得web应用程序能够更高效地利用底层硬件资源。 Hello RustRust是一种零碎级编程语言,重视内存平安、并发性和性能。由Mozilla开发,应用它能够高效地管制硬件,同时放弃高级语言的安全性。具体有以下比较突出的特点: 内存平安: Rust通过所有权零碎、生命周期检查和借用机制,无效地避免了空指针援用、数据竞争和内存透露等内存平安问题,使得编写平安的并发代码更为容易。性能: Rust提供了靠近底层语言(如C和C++)的性能,同时放弃了高级语言的形象个性。零老本形象的设计意味着你能够高效地管制硬件,而不会损失性能。并发性: Rust通过所有权零碎和借用机制,反对并发编程,同时防止了常见的并发谬误。这使得开发者可能编写线程平安的代码,而不须要额定的锁或同步原语。生态系统: Rust领有一个一直壮大的生态系统,有丰盛的库和工具,涵盖了各种利用场景。这使得开发者可能更容易地构建各种类型的利用,从零碎级利用到Web服务。开发者敌对: Rust的语法清晰、现代化,领有敌对的文档和社区反对。它激励编写易读易保护的代码,同时提供了丰盛的工具链和调试反对。Rust的具体装置形式能够参考这个文档:Rust装置,如果你是Mac用户,看到下图的时候示意Rust曾经装置结束: 装置Rust的时候个别状况下会自带装置cargo,它是Rust的库管理工具,相似于npm。咱们能够应用 cargo new hello_rust来创立一个Rust我的项目。 我的项目装置好之后构造目录大抵如上,如果你是应用vscode进行开发的话,倡议装置rust-analyzer这个插件,它提供了代码的语法分析、主动实现、谬误剖析等性能,能够大大的晋升咱们的开发效率。 上面执行一下cargo run命令,就能够把咱们的Rust我的项目跑起来: 计算文件MD5首先应用cargo new 来创立一个Rust我的项目,在Cargo.toml中填入以下的内容 [package]name = "rust_md5"version = "0.1.0"edition = "2021"[lib]crate-type = ["cdylib"][dependencies]md-5 = "0.9.0"js-sys = "0.3.50"wasm-bindgen = "0.2.73"[profile.release]opt-level = 3lto = truestrip = truepanic = "abort"解释一下下面的字段: package:包的相干信息 name:指定了你的我的项目的名称。每个 Rust 我的项目都有一个惟一的名称。version:指定了你的我的项目的版本号。这遵循语义化版本标准(Semantic Versioning),通常包含主版本号、次版本号和订正号。edition:指定了 Rust 编译器所应用的语言版本。在这里,它指定了我的项目应用 Rust 2021 Edition。lib crate-type:这里指定了生成的 crate 的类型为动态链接库(.cdylib),这通常用于构建 WebAssembly 模块。dependencies 依赖项[profile.release] :对于 release 模式的配置。 ...

February 25, 2024 · 2 min · jiezi

关于前端:Electron打造你自己的录屏软件

前言公众号:【可乐前端】,期待关注交换,分享一些有意思的前端常识录屏软件对于咱们来说都不生疏了,明天咱们要做的事件是实现本人的录屏软件。载体应用Electron,因为它更适宜录制桌面的场景。咱们明天实现的录屏软件会包含上面的性能 分辨率调节帧率调节反对保留为webm、mp4、gif格局本文用到的技术包含: electronffmpegviteantd上面话不多说,咱们马上进入实战环节 环境搭建我集体习惯的技术栈是React+Vite,所以这次搭建这个Electron脚手架的时候我也往这方面去搭建。搭建过程中发现了一个很好的脚手架工具——electron-vite。须要搭建Electron我的项目的兄弟们也能够思考用这个。性能还是非常弱小的,用起来非常难受,很多货色都预设好了 间接上面的一条命令就能够搭建一个根底框架: npm create @quick-start/electron搭建完框架之后,上面当初写一下简略的配置页面,因为咱们是配置录制的各种参数的。配置页面如下: 就是应用了antd下了几个下拉框,还是比较简单的。 这里写的是渲染过程的代码,所以咱们写在了renderer/src/App.jsx里。做Electron开发心里须要分明,这种页面相干的,就写在渲染过程里,跟咱们平时写web页面无异。 另外,咱们的配置必定是要长久化存储的,所以我会把这些配置存储在localStorage里。 useEffect(() => { //清晰度 setLocal(DEFINITION, definition) }, [definition]) useEffect(() => { // 帧率 setLocal(FRAME_RATE, frameRate) }, [frameRate]) useEffect(() => { // 产物拓展名 setLocal(EXT, ext) }, [ext])以下是三个下拉框的选项配置,能够略微看一下,后续会作为参数应用到录屏性能中 const DEFINITION_LIST = [ { label: '超清', value: '3840x2160' }, { label: '高清', value: '1280x720' }, { label: '标清', value: '720x480' }]const FRAME_RATE_LIST = [ { label: '高', value: '60' }, { label: '中', value: '30' }, { label: '低', value: '15' }]const EXT_LIST = [ { label: 'webm', value: 'webm' }, { label: 'mp4', value: 'mp4' }, { label: 'gif', value: 'gif' }]IPC通信在Electron中,包含渲染过程跟主过程。渲染过程就是咱们写的页面,主过程就是跟Electron窗体相干的,或者是须要调用一些node模块的逻辑。在主过程跟渲染过程是须要互相通信的,这里的通信形式就是IPC。 ...

February 25, 2024 · 3 min · jiezi

关于前端:龙年大吉AIGC生成龙年春联

前言公众号:【可乐前端】,期待关注交换,分享一些有意思的前端常识工夫过得好快,一眨眼2024年就来了。这两年对互联网冲击最大的想必就是大语言模型的AIGC能力了。从国外的GPT到国内的文心一言、混元、盘古等等,AIGC的呈现大大的晋升了咱们的生产力,当初GPT逐步也变成了我每天都会应用到的工具。 那趁着新年即将来临,咱们明天就应用AIGC去生成春节必不可少的元素——春联。 注册对于大模型接口来说,我这边抉择的是国产的讯飞星火大模型。抉择它的起因相对不是它当初能够支付收费的token,而是我感觉咱们须要反对国产软件自主化(手动狗头),如果你不喜爱用这个也能够应用别的,思路都是一样的。 首先关上它的官网 https://xinghuo.xfyun.cn/sparkapi 注册一个账号,而后点击支付token就好了 支付到了之后就能够对着它的文档来应用API了。 结构鉴权API咱们是通过websocket去应用星火的大模型api,在连贯之前则须要结构一个鉴权参数。这个参数次要是为了平安以及用户身份的鉴权吧,这里次要还是要依据它的文档外面的规定去结构,实现代码如下: const getWebsocketUrl = () => { var apiKey = APIKey; var apiSecret = APISecret; var url = "wss://spark-api.xf-yun.com/v3.1/chat"; var host = location.host; var date = new Date().toGMTString(); var algorithm = "hmac-sha256"; var headers = "host date request-line"; var signatureOrigin = `host: ${host}\ndate: ${date}\nGET /v3.1/chat HTTP/1.1`; var signatureSha = CryptoJS.HmacSHA256(signatureOrigin, apiSecret); var signature = CryptoJS.enc.Base64.stringify(signatureSha); var authorizationOrigin = `api_key="${apiKey}", algorithm="${algorithm}", headers="${headers}", signature="${signature}"`; var authorization = btoa(authorizationOrigin); url = `${url}?authorization=${authorization}&date=${date}&host=${host}`; return url;};生成春联在拿到下面的鉴权URL之后,咱们就能够应用大模型的接口来生成春联了。 ...

February 25, 2024 · 2 min · jiezi

关于前端:前端分页加载懒加载预览PDF

前言公众号:【可乐前端】,期待关注交换,分享一些有意思的前端常识在开发过程中,咱们常常会遇到预览PDF的需要。这个时候咱们个别是会有一个PDF的地址,而后通过一些伎俩将PDF文件预览在页面上。比如说以下的形式或者第三方库: embed标签iframe标签pdf.jsreact-pdf然而当PDF比拟大的时候,加载速度迟缓以及占用内存过大会是一个比较严重的问题。PDF体积较大时,网络传输的工夫必然会较长,这样用户的体验会比拟差;当关上较大的PDF时,会占用较多的内存,可能会导致标签页/浏览器卡死或者解体。 惯例预览形式先来看看惯例的PDF预览形式,这里简略提两种预览形式,都是非常简略的,代码如下: import { PDF_URL } from "./constant"const Normal = () => { return ( <div> <embed src={PDF_URL} type="application/pdf" width="100%" height="600px"></embed> <iframe width={'100%'} height={600} src={PDF_URL} /> </div> )}export default Normal一种应用embed标签去预览,另一种是用iframe标签去预览,这里都是借助于浏览器自带的PDF渲染引擎去把PDF预览进去。也是平时咱们用的比拟多的一种形式。 但我这是一个15M左右,100页+的PDF,在我4M带宽的服务器下,传输工夫须要大略30秒左右,工夫还是相当长的。 所以上面要介绍的是PDF的分页加载和渲染。旨在解决大PDF网络传输过慢以及占用内存过大的问题。 按图片宰割既然一次性加载整个PDF文件太过迟缓,那咱们能够思考把它拆分成一个个更细的单元去进行预览。这里我能够先把一整个PDF文件按页码转成一张张图片,1页PDF对应1张图片。那么通过这样的预处理之后,咱们就很容易可能做到按需加载、或者分片加载,而不是一次性加载一整个PDF文件。这样用户的首屏等待时间会大大降低,能够晋升用户体验。 PDF转图片这里须要先预处理一下数据,将PDF文件转换为图片。我这里应用的是 pdf-image 这个库,具体的装置教程能够点击链接查看。 装置完之后能够用node写一个这样的预处理脚本,将所须要解决的PDF文件的每一页都转换成一张图片: const PDFImage = require("pdf-image").PDFImage;const path = require("path");const fs = require("fs");const FILE_PATH = path.join(__dirname, "../public/files/test.pdf");const outputDirectory = path.join(__dirname, "../public/files/tmp");const pdfImage = new PDFImage(FILE_PATH, { convertOptions: { "-density": 250, // 进步分辨率,依据须要调整 "-quality": 100, "-trim": null, }, outputDirectory,});const run = async () => { const info = await pdfImage.getInfo(); for (let i = 0; i < Number(info.Pages); i++) { try { await pdfImage.convertPage(i); } catch (error) { console.log("error", error); } }};run(); ...

February 25, 2024 · 3 min · jiezi

关于前端:前端使用Lottie实现炫酷的开关效果

前言公众号:【可乐前端】,期待关注交换,分享一些有意思的前端常识在平时的开发过程中,前端或多或少都会遇到实现动画成果的场景。手写动画是一件相当麻烦的事件,调来调去不仅费时费力,可能还会被产品/UI吐槽:这动画成果也不难呀,为什么就不能实现呢?/为什么就没有还原成我想要的样子呢。 比如说产品让咱们实现这样的一个开关动效 明天咱们就用动画的实现形式——Lottie,来百分百还原设计师的动画成果,并且能够大大提高咱们的工作效率(摸鱼工夫)。 Lottie简介首先咱们先来看一下,平时咱们实现动画都有哪些形式,它们别离有什么优缺点: 动画类型长处毛病CSS 动画应用简便,通过@keyframes和transition创立动画;浏览器原生反对,性能较好管制无限,不适用于简单动画;简单动画可能须要大量 CSS 代码,简短JavaScript 动画提供更高水平的管制和灵活性;实用于简单和精密动画成果引入库减少页面累赘,可能须要学习曲线;使用不当容器对页面性能造成影响,产生卡顿 GIF 动画制作和应用简略,无需额定代码;简直所有浏览器原生反对无限色彩深度,不适用于所有场景;清晰度与文件尺寸成正比,无奈适应所有分辨率Lottie反对矢量动画,放弃清晰度和流畅性 ;跨平台应用,实用于 iOS、Android 和 Web在一些较旧或性能较低的设施上,播放较大的 Lottie 动画可能会导致性能问题;对设计师要求较高Lottie是由Airbnb开发的一个开源库,用于在挪动端和Web上出现矢量动画。它基于JSON格局的Bodymovin文件,能够将由设计师在AE中创立的动画导出为可在Lottie库中播放的文件。 绝对于手写CSS/JS动画而言,它能够大大减少前端开发的工作量,绝对于GIF文件来说,它能够在一个正当的文件体积内保障动画的清晰度以及晦涩水平。上面咱们就介绍一下如何播放一个Lottie动画,并实现一个炫酷的开关成果。 Hello Lottie假如咱们当初曾经有一个Lottie的json文件,那么当初装置一些依赖 npm i react-lottie prop-types装置完之后咱们就能够这样子来播放一个Lottie动画: import animationData from "../../assets/switch-lottie.json";const LottieSwitch = () => { const playing = useRef(false); const options = { loop: true, autoplay: true, animationData: animationData, rendererSettings: { preserveAspectRatio: "xMidYMid slice", }, }; return ( <Lottie options={options} height={20} width={40} /> );}; 来解释一下下面的options参数外面各个字段是什么意思: loop:是否循环播放autoplay:是否自动播放animationData:Lottie动画json资源rendererSettings.preserveAspectRatio:指定如何在给定容器中渲染Lottie动画 ...

February 25, 2024 · 2 min · jiezi