关于前端:大出所料9月1号前上线的小游戏却收到了补充备案材料的通知

引言前阵子工信部公布了《工业和信息化部对于发展挪动互联网应用程序备案工作的告诉》,为此,微信公众平台ICP代备案管理系统提供新增备案、变更备案、登记备案等服务,帮助开发者更好更不便地实现微信小程序备案,届时所有9月1号后筹备首次上线的小游戏都须要通过备案之后才能够上线。然而笔者9月1号前下限的小游戏也收到了补充备案资料的告诉。 备案告诉笔者在9月2号的时候收到了官网的要求补充备案资料的告诉: 依据后面小程序备案的告诉能够看到,9月1号前已上架的小程序能够在2024年3月31日前实现备案: 这样就有点匪夷所思了,给笔者杀了个措手不及。尽管这能够了解官网为了尽快让开发者的小程序进入备案流程,然而这也太过紧急了。为了保障小游戏可能失常在线上经营,笔者连夜筹备了备案资料。 补充备案资料备案资料1:著作权自我申明 备案资料2:授权书 资料还须要捺指印,因为事态紧急,不得不动用老婆的大红色唇膏: 备案对新上小游戏的影响依据小程序备案和公布流程指引,须要开明虚构领取的小游戏须要22-24个工作日,不须要开明虚构领取的小游戏须要28-35个工作日。 这样能够了解集体的小游戏至多须要28-35个工作日才可能进行下一个操作流程,因为集体小游戏是无奈开明虚构领取的。 因而备案对新上小游戏的影响最重要的就是缩短的上线工夫。 依据官网文档提醒,会在首页上方有小程序须要补充备案信息的告诉,然而笔者尚未发现: 备案对已上线的小游戏影响目前笔者在微信公众平台还未发现小游戏备案的入口,不晓得是笔者没找到还是说平台对已上线的小游戏还在进一步解决中。 这是还没上线的小游戏的备案入口:在小程序后盾首页-小程序公布流程-小程序备案。 备案流程1.关上小游戏后盾在小程序后盾首页-小程序公布流程-小程序备案-点击去欠缺: 2.抉择游戏状况集体开发者抉择状况二:不须要开明虚构领取,点击确认 3.备案前提目前能够看到小程序须要先实现资质提交、游戏内容介绍和版本提交审核通过后才能够进行小程序备案,在审核通过后将收到站内信告诉: 4.收到告诉在收到告诉之后即可在步骤4提交小程序所需的备案信息,流程至多22个工作日。 总结无论什么状况,咱们必须踊跃应答平台的治理和要求,踊跃配合官网实现备案,这样能力保障咱们的小游戏更好更衰弱地在线上经营。 本文的重点内容次要有以下几点,不晓得小伙伴们是否曾经了解: 本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢送大家关注分享珍藏订阅。备案告诉。备案所需资料。备案对已上线的小游戏的影响。备案流程。AD:笔者曾经上线的小游戏《填色之旅》《贪吃蛇掌机经典》《重力迷宫球》大家能够自行点击搜寻体验。 感兴趣的小伙伴记得关注"亿元程序员"哦,一位有着8年游戏行业教训的主程。学习游戏开发不迷路。感谢您的关注,心愿能给到您帮忙, 也心愿通过您能帮忙到大家。 喜爱的能够点个赞、点个在看哦!请把该文章分享给你感觉有须要的其余小伙伴。谢谢。

September 5, 2023 · 1 min · jiezi

关于前端:计算机网络面试题

参照: https://yihuiblog.top/browser-working/L2.html https://mp.weixin.qq.com/s/-IOy2hXd-AcuIQ02saf6Rw https://www.cnblogs.com/yaochunhui/p/14175396.html https://blog.csdn.net/weixin_39829073/article/details/112907168 基础知识1. OSI与TCP/IP 模型OSI七层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 TCP/IP五层:物理层、数据链路层、网络层、传输层、应用层 七层网络体系结构各层的次要性能: 应用层:为应用程序提供交互服务。在互联网中的应用层协定很多,如域名零碎DNS, 反对万维网利用的HTTP协定,反对电子邮件的SMTP协定等。表示层:次要负责数据格式的转换,如加密解密、转换翻译、压缩解压缩等。会话层:负责在网络中的两节点之间建设、维持和终止通信,如服务器验证用户登录便是由会话层实现的。运输层:有时也译为传输层,向主机过程提供通用的数据传输服务。该层次要有以下两种协定:TCP:提供面向连贯的、牢靠的数据传输服务;UDP:提供无连贯的、尽最大致力的数据传输服务,但不保障数据传输的可靠性。网络层:抉择适合的路由和替换结点,确保数据及时传送。次要包含IP协定。数据链路层:数据链路层通常简称为链路层。将网络层传下来的IP数据包组装成帧,并再相邻节点的链路上传送帧。物理层:实现相邻节点间比特流的通明传输,尽可能屏蔽传输介质和通信伎俩的差别。2. 常见网络服务分层应用层:HTTP、DNS、FTP、SMTP 传输层:TCP 、UDP 网络层:IP、ICMP 、路由器、防火墙 数据链路层:网卡、网桥、交换机 物理层:中继器、集线器 3. TCP三次握手<img src="https://mc-web-1259409954.cos.ap-guangzhou.myqcloud.com/MyImages/202204111232193.jpeg" alt="图片" style="zoom: 80%;" /> 三次握手过程: 客户端——发送带有SYN标记的数据包——服务端 一次握手 客户端进入syn_sent状态服务端——发送带有SYN/ACK标记的数据包——客户端 二次握手 服务端进入syn_rcvd客户端——发送带有ACK标记的数据包——服务端 三次握手 连贯就进入Established状态为什么三次: 次要是为了建设牢靠的通信信道,保障客户端与服务端同时具备发送、接收数据的能力。 为什么两次不行? 避免已生效的申请报文又传送到了服务端,建设了多余的链接,浪费资源。两次握手只能保障单向连贯是畅通的。(为了实现牢靠数据传输, TCP 协定的通信单方, 都必须保护一个序列号, 以标识发送进来的数据包中, 哪些是曾经被对方收到的。三次握手的过程即是通信单方 互相告知序列号起始值, 并确认对方曾经收到了序列号起始值的必经步骤;如果只是两次握手, 至少只有连贯发起方的起始序列号能被确认, 另一方抉择的序列号则得不到确认)。4. 四次挥手过程:客户端——发送带有FIN标记的数据包——服务端,敞开与服务端的连贯 ,客户端进入FIN-WAIT-1状态服务端收到这个 FIN,它发回⼀ 个 ACK,确认序号为收到的序号加1,服务端就进入了CLOSE-WAIT状态服务端——发送⼀个FIN数据包——客户端,敞开与客户端的连贯,客户端就进入FIN-WAIT-2状态客户端收到这个 FIN,发回 ACK 报⽂确认,并将确认序号设置为收到序号加1,客户端进入TIME-WAIT状态<img src="https://mc-web-1259409954.cos.ap-guangzhou.myqcloud.com/MyImages/202204111232185.jpeg" alt="图片" style="zoom:80%;" /> 为什么四次:因为须要确保客户端与服务端的数据可能实现传输。 CLOSE-WAIT: 这种状态的含意其实是示意在期待敞开。 TIME-WAIT: 为了解决网络的丢包和网络不稳固所带来的其余问题,确保连贯方能在工夫范畴内,敞开本人的连贯。 5. 为什么连贯的时候是三次握手,敞开的时候却是四次握手?服务器在收到客户端的FIN报文段后,可能还有一些数据要传输,所以不能马上敞开连贯,然而会做出应答,返回ACK报文段。 接下来可能会持续发送数据,在数据发送完后,服务器会向客户端发送FIN报文,示意数据曾经发送结束,申请敞开连贯。服务器的ACK和FIN个别都会离开发送,从而导致多了一次,因而一共须要四次挥手。 6. 如何查看TIME-WAIT状态的链接数量?netstat -an | grep TIME_WAIT | wc -l //查看连接数期待time_wait状态连接数7. 为什么会TIME-WAIT过多?解决办法是怎么的?可能起因:高并发短连贯的TCP服务器上,当服务器解决完申请后立即依照被动失常敞开连贯 ...

September 4, 2023 · 3 min · jiezi

关于前端:9个对Web开发人员有用的CSS工具

微信搜寻 【大迁世界】, 我会第一工夫和你分享前端行业趋势,学习路径等等。本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试残缺考点、材料以及我的系列文章。快来收费体验ChatGpt plus版本的,咱们出的钱 体验地址:https://chat.waixingyun.cn 能够退出网站底部技术群,一起找bug,另外新版作图神器已上线 https://cube.waixingyun.cn/home 在这篇文章中, 介绍一些前端开发人员都能够应用的工具列表,让你的生存变得更轻松、更高效。 1.Transition 生成器在 CSS 属性中,过渡属性具备多种可能性,因而很难从头到尾记住所有属性。 当你不确定本人想要什么样的转场成果,或者只是想尝试多种转场成果时,这个工具就十分有用。通过该工具,咱们能够轻松混合不同的转场成果,如持续时间和延迟时间。这样,就能分明地看到每种不同的过渡成果是如何工作的。 地址:https://webcode.tools/generators/css/transition 2. Transfonter地址:https://transfonter.org/ Transfonter 是一款用于转换字体的工具,这样你就能够在网络上应用它们了。它反对多种不同格局,如 TTF、EOT、WOFF、WOFF2 和 SVG。 3. Flip Switch Generator 地址:https://www.cssportal.com/css3-flip-switch/ 每隔一段时间,咱们可能须要为正在构建的新应用程序实现一个 switch 开关。与其一遍又一遍地从新创造轮子,咱们能够应用此工具生成代码。 4. Flexbox.help 地址:https://flexbox.help/ Flexbox.help 是一款杰出的工具,只有我偿须要无关柔性方框的帮忙,就能够应用它。如果对柔性方框还比拟生疏,这将是一个很好的后果。应用该工具,能够尝试所有可用的柔性选项。CSS 会依据您抉择的选项为咱们生成,因而咱们不用亲自键入所有代码。 5. SASS to CSS 地址:https://jsonformatter.org/sass-to-css 应用该工具,你能够将 SASS 代码转换回 CSS。当您须要将编写的 SASS 代码用于网络时,这将十分有用。 6.纯 CSS 图像成果 地址:https://angrytools.com/css-generator/filter/ 通过 CSS 过滤器属性,能够在元素显示前在元素渲染中应用含糊或色彩偏移等成果。本工具可让你尝试滤镜属性提供的所有可能性。 7.生成配色计划 地址:https://coolors.co/ 有时,你在为某个设计或网站寻找最佳色调时会不足灵感。每当你不足灵感时,你就应该应用这个工具。它是一款十分优雅且易于应用的工具,能为你提供最丑陋的配色计划。 8.格调指南生成器 地址:https://atomicdocs.io/ 如果你在一个团队中工作,有多人负责前端工作,那么这个工具就十分受欢迎。它能够让你生成格调指南,这样就不会对某些元素的格调产生误解。 9.变暗或变亮某种色彩 地址:https://www.cssfontstack.com/oldsites/hexcolortool/ 最初一个工具能够让你加深或减淡任何色彩。在很多状况下,当你失去一种色彩时,你会想让它变得更深或更浅一些。例如,在为按钮寻找背景色时。 最初,感谢您的浏览! ...

September 4, 2023 · 1 min · jiezi

关于前端:Web-Components-中使用生命周期回调函数

在 custom element 的构造函数中,能够指定多个不同的回调函数,它们将会在元素的不同生命期间被调用。这是 Web Components 技术中的一个重要个性,它可能让开发者更加灵便地管制元素的行为 connectedCallback:当 custom element 首次被插入文档 DOM 时,被调用。disconnectedCallback:当 custom element 从文档 DOM 中删除时,被调用。adoptedCallback:当 custom element 被挪动到新的文档时,被调用。attributeChangedCallback: 当 custom element 减少、删除、批改本身属性时,被调用。其中,connectedCallback 是在 custom element 首次被插入文档 DOM 时被调用的。这个回调函数通常用于执行一些初始化操作,比方增加事件监听器、申请数据等等。在这个时候,元素曾经被增加到了文档中,能够拜访到 DOM 和其余元素。 disconnectedCallback 是在 custom element 从文档 DOM 中删除时被调用的。这个回调函数通常用于清理一些资源,比方勾销事件监听器、进行定时器等等。在这个时候,元素曾经不再被文档所蕴含,无法访问到 DOM 和其余元素。 adoptedCallback 是在 custom element 被挪动到新的文档时被调用的。这个回调函数通常用于解决一些文档级别的操作,比方从新计算布局(重排)、批改款式等等。在这个时候,元素曾经从原来的文档中移除,并被增加到了新的文档中。 attributeChangedCallback 是在 custom element 减少、删除、批改本身属性时被调用的。这个回调函数通常用于解决一些属性相干的逻辑,比方依据属性值的变动更新元素的款式、从新渲染元素等等。在这个时候,元素的属性曾经被批改,能够通过新的属性值来进行相应的解决。 须要留神的是,这些回调函数都是可选的,开发者能够依据理论需要来抉择应用哪些回调函数。另外,这些回调函数只能在 custom element 的构造函数中进行定义,不能在元素实例中进行批改。 用法示例咱们来看一下它们的一下用法示例。上面的代码出自life-cycle-callbacks示例(查看在线示例)。这个简略示例只是生成特定大小、色彩的方块。custom element 看起来像上面这样: <custom-square l="100" c="red"></custom-square>这里,类的构造函数很简略 — 咱们将 shadow DOM 附加到元素上,而后将一个<div>元素和<style>元素附加到 shadow root 上: var shadow = this.attachShadow({ mode: "open" });var div = document.createElement("div");var style = document.createElement("style");shadow.appendChild(style);shadow.appendChild(div);示例中的要害函数是 updateStyle()—它承受一个元素作为参数,而后获取该元素的 shadow root,找到<style>元素,并增加width,height以及background-color款式。 ...

September 4, 2023 · 2 min · jiezi

关于前端:10-个-效果不错的值得收藏的-css-代码片段

10 个 css 代码片段以下这 10 个罕用的 css 代码片段值得珍藏,都能够用于平时的业务代码当中。 1. 点点点加载中成果这是一个兼容性不错的用户体验很棒的点点点加载成果,实现思路如下: 应用自定义的标签元素 dot。将 dot 元素设置为内联元素(display:inline-block),并设置溢出暗藏(overflow:hidden),高度设置为 1em。应用:before 伪元素联合\AUnicode 字符插入内容,并且应用 white-space:pre-wrap 保留换行成果,应用 css 动画。应用 transform 和 translate 为...增加动画成果。html 代码如下: <div class="loading">正在加载中<dot>...</dot></div>css 代码如下: .loading { /**这里写本人自定义的款式 */}.loading > dot { height: 1em; overflow: hidden; display: inline-block; text-align: left; vertical-align: -0.25em; line-height: 1;}/* 外围代码 */.loading > dot:before { display: block; /* 这行代码最重要 */ content: '...\A..\A.'; /* 值是Pre也是一样的成果 */ white-space: pre-wrap; animation: dot 3s infinite step-start both;}@keyframes dot { 33% { transform: translateY(-2em); } 66% { transform: translateY(-1em); }}成果如下所示: ...

September 4, 2023 · 6 min · jiezi

关于前端:uniapp-项目实践总结九自定义分享组件

这篇文章次要是讲述自定义分享组件的方放,兼容网页 H5 端、微信小程序端和 App 端。目录筹备工作原理剖析组件实现H5 和 App小程序案例展现筹备工作首先咱们从图标图库网站下面找一些罕用的分享图标并下载下来;在components新建一个q-share文件夹,并新建一个q-share.vue的组件;依照前一篇所说的页面构造,编写好预约的分享页面;原理剖析自定义分享组件就是采纳各端反对的 API 办法进行封装设置,利用条件编译的语法进行分而实现。 H5 端剖析H5 端次要有两种分享办法: 一般浏览器自带分享按钮;微信内嵌浏览器,可调用js-sdk进行分享;第三方平台网页利用:在第三方分享平台申请增加本人的利用,以便调用第三方的分享 API 进行分享;网上公共分享链接:这里就应用网上公开的分享地址进行分享了。以下列举了几个罕用的第三方分享平台的地址,感兴趣的能够珍藏看一下。 罕用开放平台: QQ 互联平台微信开放平台微博开放平台支付宝开放平台百度开放平台抖音开放平台小程序端剖析小程序端的分享目前 uniapp 不反对 API 调用,只能用户被动点击触发分享,可应用自定义按钮形式<button open-type="share">或监听系统右上角的分享按钮onShareAppMessage 进行自定义分享内容。 在这里能够查看微信小程序的分享 API进行小程序分享性能开发。 小程序文档: 微信小程序支付宝小程序百度智能小程序APP 端剖析APP 端的分享能够自主管制分享的内容、模式及平台,提供了以下两种办法: 应用uni.shareAPI 形式调用社交 sdk 分享;应用plus.share.sendWithSystem呼起手机零碎的分享菜单;开发者官网: 安卓开发者官网苹果开发者官网快利用官网: 华为快利用小米快利用OPPO 快利用vivo 快利用组件实现筹备工作和原理剖析实现后,接下来写一个简略的自定义分享组件。 模板局部<view class="q-share" v-if="shares.show"> <view :class="{'q-share-mak': true, 'active': shares.showMask}" @click="close('mask')"></view> <view :class="{'q-share-inner': true, [shares.options.dir]: true, 'active': shares.showBox}" :style="{'width': `${['left', 'right'].includes(shares.options.dir) ? shares.options.width + 'rpx' : '100%'}`, 'height': `${['up', 'down'].includes(shares.options.dir) ? shares.options.height + 'rpx' : '100%'}`, borderRadius: shares.options.radius+'rpx'}"> <slot name="box"> <view class="q-share-box"> <view class="q-share-title"> 零碎分享 </view> <scroll-view :scroll-x="true" class="q-share-content"> <view class="q-share-list" :style="{'width': shareList.length*145+'rpx'}"> <view class="q-share-item" v-for="item in shareList" :key="item.id" @click="shareSet(item)"> <q-icon class="q-share-item-icon" :name="item.val" :size="20" /> <text class="q-share-item-txt">{{item.name}}</text> </view> </view> </scroll-view> <view class="q-share-cancel" @click="close('cancel')"> 勾销分享 </view> </view> </slot> </view></view>款式局部.q-share { position: fixed; left: 0; top: 0; width: 100%; height: 100vh; z-index: 199; .q-share-mak { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.45); transition: background 2s; z-index: 90; &.active { background: rgba(0, 0, 0, 0.35); } } .q-share-inner { position: absolute; max-width: 100%; max-height: 100%; background: rgba(255, 255, 255, 0.95); transition: all 0.5s; z-index: 95; .q-share-box { display: flex; flex-direction: column; justify-content: center; align-items: center; box-sizing: border-box; padding: 15rpx 25rpx; width: 100%; height: 100%; .q-share-title { width: 100%; line-height: 3; font-size: 28rpx; color: $uni-text-color; text-align: center; } .q-share-content { flex: 1; box-sizing: border-box; padding: 20rpx; width: 100%; height: calc(100% - 140rpx); .q-share-list { display: flex; flex-flow: row nowrap; box-sizing: border-box; padding: 25rpx 0; height: 100%; .q-share-item { display: flex; justify-content: center; align-items: center; flex-direction: column; width: 145rpx; height: 100%; .q-share-item-icon { padding: 0; } .q-share-item-txt { margin-top: 10rpx; font-size: 24rpx; } } } } .q-share-cancel { width: 100%; line-height: 2; font-size: 28rpx; color: $uni-text-color-grey; text-align: center; } } &.down, &.up { left: 0; } &.down { bottom: 0; border-bottom-left-radius: 0 !important; border-bottom-right-radius: 0 !important; transform: translateY(100%); &.active { transform: translateY(0); } } &.up { top: 0; border-top-left-radius: 0 !important; border-top-right-radius: 0 !important; transform: translateY(-100%); &.active { transform: translateY(0); } } &.left, &.right { top: 0; width: 0; } &.left { left: 0; border-top-left-radius: 0 !important; border-bottom-left-radius: 0 !important; transform: translateX(-100%); &.active { transform: translateX(0); } } &.right { right: 0; border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; transform: translateX(100%); &.active { transform: translateX(0); } } }}脚本局部引入依赖包和属性设置import { ref, reactive, computed } from "vue";// 属性const showTimer = ref(null); // 显示提早const showTime = ref(100); // 显示延迟时间const showCloseTimer = ref(null); // 显示敞开提早const showCloseTime = ref(300); // 显示敞开延迟时间const shares = reactive({ show: false, // 显示分享框 showMask: false, // 显示模态框 showBox: false, // 显示内容动画 options: { // 父组件音讯 dir: "down", // 内容方向 radius: 0, // 圆角角度 width: 200, // 内容宽度 height: 300, // 内容高度 }, list: [ { id: 1, name: "QQ", val: "qq", url(url, title) { return `https://connect.qq.com/widget/shareqq/iframe_index.html?url=${url}&title=${title}`; }, }, { id: 2, name: "QQ空间", val: "qzone", url(url, title) { return `http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=${url}&title=${title}&site=${url}`; }, }, { id: 3, name: "微博", val: "weibo", url(url, title) { return `http://service.weibo.com/share/share.php?url=${url}&title=${title}&language=zh_cn`; }, }, { id: 4, name: "微信", val: "wechat", url() { return ""; }, }, { id: 5, name: "百度", val: "baidu", url() { return ""; }, }, { id: 6, name: "贴吧", val: "tieba", url() { return ""; }, }, { id: 7, name: "朋友圈", val: "friend", url() { return ""; }, }, { id: 8, name: "淘宝", val: "taobao", url() { return ""; }, }, { id: 9, name: "支付宝", val: "alipay", url() { return ""; }, }, { id: 10, name: "钉钉", val: "dingtalk", url() { return ""; }, }, { id: 11, name: "快手", val: "gifks", url() { return ""; }, }, { id: 12, name: "Whatsapp", val: "whatsapp", url() { return ""; }, }, { id: 13, name: "Messenger", val: "messenger", url() { return ""; }, }, { id: 14, name: "Youtube", val: "youtube", url() { return ""; }, }, { id: 15, name: "Instagram", val: "instagram", url() { return ""; }, }, { id: 16, name: "Twitter", val: "twitter", url() { return ""; }, }, { id: 17, name: "Telegram", val: "telegram", url() { return ""; }, }, { id: 18, name: "复制链接", val: "link", url() { return location.href; }, }, { id: 19, name: "更多", val: "more", url() { return ""; }, }, ], info: { title: "", // 分享题目 url: "", // 分享地址 },});const emits = defineEmits(["close", "share"]);分享办法定义// 办法// 分享列表const shareList = computed(() => { let newList = [], mnp = ["qq", "qzone", "wechat", "friend"]; // #ifdef H5 newList = shares.list.filter((s) => s.val != "more"); // #endif // #ifdef MP-WEIXIN newList = shares.list.filter((s) => mnp.includes(s.val)); // #endif // #ifdef APP-PLUS newList = shares.list; // #endif return newList;});// 关上function open(options) { let defaultOptions = { dir: "down", radius: 0, width: 500, height: 300, title: "", url: "", }; let params = { ...defaultOptions, ...options }; shares.show = true; shares.options = { ...params }; shares.info = { title: params.title, url: params.url, }; showTimer.value = setTimeout(() => { shares.showMask = true; shares.showBox = true; clearTimeout(showTimer.value); }, showTime.value);}// 敞开function close(from = "") { shares.showBox = false; emits("close", from); showTimer.value = setTimeout(() => { shares.showMask = false; clearTimeout(showTime.value); }, showTime.value); showCloseTimer.value = setTimeout(() => { shares.show = false; clearTimeout(showCloseTimer.value); }, showCloseTime.value);}// 分享进来function shareSet(info) { // 告诉父组件 emits("share", info); // 分享内容 let url = shares.info.url, title = shares.info.title; // 网页分享 // #ifdef H5 url = url || location.href; title = title || document.title; // #endif // 分享提醒 if (info.val == "more") { // #ifdef APP-PLUS uni.shareWithSystem({ type: "text", summary: title, href: url, success() { uni.showToast({ title: "分享胜利!", icon: "success", }); }, fail() { uni.showToast({ title: "分享失败!", icon: "error", }); }, }); // #endif } else if (info.val == "link") { uni.setClipboardData({ data: url, success() { uni.showToast({ title: "复制胜利!", icon: "success", }); }, }); } else { let shareUrl = info.url(url, title); if (shareUrl) { // #ifdef H5 window.open(shareUrl); // #endif // #ifdef APP-PLUS if (plus) { plus.runtime.openURL(shareUrl, (res) => { console.log("shareUrl res:", res); }); } // #endif } else { // #ifdef APP-PLUS const scene = "WXSceneSession", params = { href: "https://blog.example.com", title: "列表页面", summary: "我正在应用HelloApp,连忙跟我一起来体验!", imageUrl: "https://blog.example.com/img/03.png", }; // 分享到聊天界面 if (info.val == "wechat") { appShareWx(scene, params); } // 分享到朋友圈 if (info.val == "friend") { scene = "WXSceneTimeline"; appShareWx(scene, params); } // #endif uni.showToast({ title: "分享胜利!", icon: "success", }); } } // 敞开分享 close();}// #ifdef APP-PLUS// 分享到聊天界面或朋友圈function appShareWx(scene = "WXSceneSession", info) { let { href, title, summary, imageUrl } = info; uni.share({ provider: "weixin", scene, type: 0, href, title, summary, imageUrl, success: function (res) { console.log("success:" + JSON.stringify(res)); }, fail: function (err) { console.log("fail:" + JSON.stringify(err)); }, });}// #endifdefineExpose({ open, close,});H5 和 App写好分享组件后,能够在 H5 和 App 外面应用了,上面是页面模板和脚本应用办法。 ...

September 4, 2023 · 7 min · jiezi

关于前端:服务器发送事件Serversent-events详解与示例

Server-sent events服务端进行数据推送除了WebSocket之外,还能够应用Server-Send-Event计划。 与 WebSocket不同的是,服务器发送事件是单向的。数据音讯只能从服务端到发送到客户端(如用户的浏览器)。这使其成为不须要从客户端往服务器发送音讯的状况下的最佳抉择。 Server-Sent-Events(SSE)是一种HTML5 API,用于在服务器和客户端之间实时推送数据流。 SSE能够用于实现实时告诉、实时聊天、实时数据更新和实时监控等性能。 服务器发送事件API蕴含在EventSource接口中 EventSourceEventSource 接口是 web 内容与服务器发送事件通信的接口。 一个 EventSource 实例会对HTTP服务器开启一个长久化的连贯,以 text/event-stream 格局发送事件,此连贯会始终放弃开启直到通过调用EventSource.close()敞开。 创立一个EventSource实例创立一个EventSource对象,开启与服务器的连贯并接管事件 const evtSource = new EventSource("ssedemourl")如果生成事件的代码不同源,须要创立一个新的蕴含url和options参数的EventSource对象 const evtSource = new EventSource("//api.example.com/ssedemourl", { withCredentials: true,})事件流格局事件流是一个简略的文本数据流,文本应该应用 UTF-8格局的编码。事件流中的音讯由一对换行符离开。以冒号结尾的行为正文行,会被疏忽。 每个字段由字段名示意,前面是冒号,而后是该字段值的文本数据。 字段有以下几个 event 用于标识事件类型的字符串。如果指定了这个字符串,浏览器会将具备指定事件名称的事件分派给相应的监听器;客户端应该应用 addEventListener() 来监听指定的事件。如果一个音讯没有指定事件名称,那么能够调用onmessage 处理程序。 data 音讯的数据字段。当 EventSource 接管到多个以 data: 结尾的间断行时,会将它们连接起来,在它们之间插入一个换行符。开端的换行符会被删除。 id 事件 ID,会成为以后 EventSource 对象的外部属性“最初一个事件 ID”的属性值。 retry 从新连贯的工夫。如果与服务器的连贯失落,浏览器将期待指定的工夫,而后尝试从新连贯。这必须是一个整数,以毫秒为单位指定从新连贯的工夫。如果指定了一个非整数值,该字段将被疏忽。 所有其余的字段名都会被疏忽。 示例: 纯数据messagee data: some text命名事件 event:usermessagedata: {"username": "bobby", "age": "22"}混合事件,在一个事件流中同时应用命名事件和未命名事件 data: some textevent:usermessagedata: {"username": "bobby", "age": "22"}监听open事件EventSource接口的onopen属性是一个事件处理器,它在收到 open 事件时被调用,在那时,连贯刚被关上。 ...

September 4, 2023 · 2 min · jiezi

关于前端:面试官说说TypeScript类型兼容协变和逆变

小册这是我整顿的学习材料,十分零碎和欠缺,欢送一起学习古代JavaScript高级小册深入浅出Dart古代TypeScript高级小册linwu的算法笔记类型兼容:协变和逆变引言在类型零碎中,协变和逆变是对类型比拟(类型兼容)一种形式化形容。在一些类型零碎中,例如 Java,这些概念是显式嵌入到语言中的,例如应用extends关键字示意协变,应用super关键字示意逆变。在其余一些类型零碎中,例如 TypeScript,协变和逆变的规定是隐式嵌入的,通过类型兼容性查看来实现。 协变和逆变的存在使得类型零碎具备更大的灵活性。例如,如果你有一个Animal类型的数组,并且你有一个Dog类型的对象(假如Dog是Animal的子类型),那么你应该可能将Dog对象增加到Animal数组中。这就是协变。反过来,如果你有一个解决Animal类型对象的函数,并且你有一个Dog类型的对象,你应该能够应用这个函数来解决Dog对象。这就是逆变。 协变和逆变还能够帮忙咱们创立更通用的代码。例如,如果你有一个能够解决任何Animal的函数,那么这个函数应该可能解决任何Animal的子类型。这意味着,你能够编写一段只依赖于Animal类型的代码,而后应用这段代码解决任何Animal的子类型。 协变(Covariance)协变形容的是如果存在类型A和B,并且A是B的子类型,那么咱们就能够说由A组成的复合类型(例如Array<A>或者(a: A) => void)也是由B组成的相应复合类型(例如Array<B>或者(b: B) => void)的子类型。 让咱们通过一个例子来了解协变。假如咱们有两个类型Animal和Dog,其中Dog是Animal的子类型。 type Animal = { name: string };type Dog = Animal & { breed: string };let dogs: Dog[] = [{ name: "Fido", breed: "Poodle" }];let animals: Animal[] = dogs; // OK because Dog extends Animal, Dog[] is a subtype of Animal[]这里咱们能够将类型为Dog[]的dogs赋值给类型为Animal[]的animals,因为Dog[]是Animal[]的子类型,所以数组是协变的。 协变:类型的向下兼容性协变是类型零碎中的一个基本概念,它形容的是类型的“向下兼容性”。如果一个类型A能够被看作是另一个类型B的子类型(即A能够被平安地用在冀望B的任何中央),那么咱们就说A到B是协变的。这是类型零碎中最常见和直观的一种关系,例如在面向对象编程中的继承就是协变的一种体现。 在TypeScript中,所有的类型都是本身的子类型(即每个类型到本身是协变的),并且null和undefined类型是所有类型的子类型。除此之外,接口和类也能够通过继承来造成协变关系。 class Animal { name: string;}class Dog extends Animal { breed: string;}let myDog: Dog = new Dog();let myAnimal: Animal = myDog; // OK,因为Dog是Animal的子类型这个例子中,咱们能够将一个Dog对象赋值给一个Animal类型的变量,因为Dog到Animal是协变的。 ...

September 4, 2023 · 1 min · jiezi

关于前端:网易低代码引擎Tango正式开源

一、Tango简介Tango 是一个用于疾速构建低代码平台的低代码设计器框架,借助 Tango 只须要数行代码就能够实现一个根本的低代码平台前端零碎的搭建。Tango 低代码设计器间接读取前端我的项目的源代码,并以源代码为核心,执行和渲染前端视图,并为用户提供低代码可视化搭建能力,用户的搭建操作会转为对代码的批改。借助 Tango 能够实现 源码进,源码出的成果,无缝与企业外部现有的研发体系进行集成。 如上图所示,Tango 低代码引擎反对可视化视图与源码双向同步,双向互转,为开发者提供 LowCode+ ProCode 无缝连接的开发体验。 1.1 外围个性以下是Tango提供的一些外围个性: 经验网易云音乐内网生产环境的理论测验,可灵便集成利用于低代码平台,本地开发工具等基于源码 AST 驱动,自私有 DSL 和协定提供实时出码能力,反对源码进,源码出开箱即用的前端低代码设计器,提供灵便易用的设计器 React 组件应用 TypeScript 开发,提供残缺的类型定义文件1.2 架构概览Tango 低代码引擎在实现上进行了分层解藕,使得下层的低代码平台与底层的低代码引擎能够独立开发和保护,疾速集成部署。另一方面,Tango 低代码引擎定义了一套凋谢的物料生态体系,开发者能够自在的奉献扩大组件配置能力的属性设置器,以及扩大低代码物料的二方三方业务组件。整体架构如下图所示。 1.3 引擎设计器概览Tango 低代码引擎设计器用于低成本初始化一个根本的低代码平台,其前端局部次要包含如下几个局部: 设计器主框架:进行外框架初始化,状态治理,拖拽引擎绑定等外围逻辑。侧边栏面板:提供可扩大的侧边面板,除了内置通用的面板,用户还能够任意增加自定义的面板。属性设置面板:属性设置器面板,反对用户进行属性配置。运行时沙箱:用于设计器运行时视图的渲染。Web IDE:用于进行在线源代码编辑。  1.4 基于源码的低代码搭建计划Tango 低代码引擎不依赖公有搭建协定和 DSL,而是间接应用源代码驱动,引擎外部将源码转为 AST,用户的所有的搭建操作转为对 AST 的遍历和批改,进而将 AST 从新生成为代码,将代码同步给在线沙箱执行。与传统的借助 Schema 驱动的低代码计划 相比,不受到公有 DSL 和协定的限度,可能完满的实现低代码搭建与源码开发的无缝集成。 并且,与基于公有 Schema 的低代码搭建计划相比,Tango 低代码引擎具备如下劣势: 比照项基于 Schema 的低代码搭建计划Tango(基于源码 AST 转换)实用场景面向特定的垂直搭建场景,例如表单,营销页面等面面向以源码为核心的利用搭建场景语言能力依赖公有协定扩大,不灵便,且难以与编程语言能力对齐间接基于 JavaScript 语言,能够应用所有的语言个性,不存在扩展性问题开发能力LowCodeLowCode + ProCode源码导出以 Schema 为核心,单向出码,不可逆以源码为核心,双向转码自定义依赖须要依据公有协定扩大封装,定制老本高原有组件能够无缝低成本接入集成研发设施定制老本高,须要额定定制低成本接入,能够间接复用原有的部署公布能力  1.5 源码进,源码出因为引擎内核齐全基于源代码驱动实现,Tango 低代码引擎可能实现源代码进,源代码出的可视化搭建能力,不提供任何公有的两头产物。从而使得,Tango 构建的线上研发能力能够与团队现有的研发服务(代码托管、构建、部署、CDN)无缝连接与集成。 ...

September 4, 2023 · 1 min · jiezi

关于前端:从小白到大白-如何开发-VSCode-插件

前言欢送关注同名公众号《熊的猫》,文章会同步更新,也可疾速退出前端交换群!因为之前的国际化的我的项目中总是要统计老我的项目中待翻译的内容,而后再交由业务进行翻译,如果总是人为统计不仅相当消耗精力和工夫,而且还不能保障是否有脱漏,因而想通过编写一个 i18n-helper 插件来实现这个性能。 然而,大家的需要总是出奇的类似(因为曾经有很多相似的插件存在了),因而没必要反复造轮子了,然而 如何开发 vscode 插件 的过程能够记录下来,分享给大家! 心愿本文对你有所帮忙!!! 跑通官网插件示例好了,话不多说,咱们先按着 官网文档 跑一下它的插件用例吧! 生成插件目录装置脚手架npm install -g yo generator-code 初始化插件目录终端运行 yo code,依照提醒生成目录即可。 调试插件因为官网文档短少一些细节,很容易导致小白调试插件失败,再常见的有如下状况。 找不到 Hello World 命令进入对应我的项目目录后,依照官网文档的批示可通过如下两种形式进行调试: 按快捷键 F5点击编辑器左下方的 Run Extension 接着按下 Ctrl + Shift + P,并输出 Hello World 命令,发现无奈找到对应的命令: 这个起因次要是因为 vscode 版本不统一造成的:package.json 文件中指定的 vscode 版本号 以后理论的 vscode 版本号: 解决方案天然就是放弃版本的一致性降级 vscode 版本 实用于以后版本号低于 package.json 文件中指定的版本号【留神】 当初 vscode 版本的更新模型曾经调整为 “默认” 模式,所以当初不会收到 vscode 须要更新的信息,也无奈进行通过 “查看更新” 按钮来进行更新 ...

September 4, 2023 · 3 min · jiezi

关于前端:jvslogic执行控制篇逻辑的三种执行控制方式

逻辑的执行管制分为三种管制形式,串行执行、并行分支、循环执行,通过这三种执行管制形式,与泛滥的原子服务节点联结起来能够拼装成各种的服务性能。 执行判断组件与组件之间通过链接线进行程序关联,在线条上可设置公式进行执行判断,当公式为真时,能够依照线条的方向进行步骤化执行上来。 串行执行串行执行是指依照程序一一执行的模式。在串行执行中,每个工作顺次执行,以后一个工作实现后才会执行下一个工作。这种模式实用于须要依照特定的程序执行工作的场景,确保每个工作的后果被依赖的后续工作正确处理。 并行/抉择分支并行分支是指同时执行多个工作的模式。在并行分支中,工作被分成多个并行的分支执行方向,每个分支可独立执行、可条件判断执行等,这种形式下能够去实现通过条件判断执行满足条件的 原子服务,也能够实现多个并行可独立执行的原子服务,可设置分支判断/执行优先级的程序。 执行循序管制,如下图所示,在线条上右键点击时,可设置执行程序的管制。 并行执行判断的根据是当线条上的公式后果为真时,即往下执行。 循环执行循环执行是指反复执行一组工作的模式。在循环执行中,一组工作被重复执行,直到满足特定条件才进行。循环执行通常应用条件语句或计数器来管制循环的终止条件。这种模式实用于须要屡次执行雷同工作的场景如下图所示: ①:循环变量的管制②:循环条件的设置③:具体循环体的配置jvs-logic的循环通过循环组件来实现,实质上是通过引入循环组件,在画布上会造成第二层执行的画布,点击循环画布,如下图所示: 在线demo:https://frame.bctools.cn/gitee地址:https://gitee.com/software-minister/jvs-logic 逻辑引擎相干介绍独立服务编排逻辑引擎:jvs-logic服务原子组件介绍可独立服务编排的jvs-logic逻辑引擎相干配置介绍低代码外围工具,jvs-logic逻辑引擎的背景及核心作用

September 4, 2023 · 1 min · jiezi

关于前端:test

sdf sdf

September 4, 2023 · 1 min · jiezi

关于前端:现代-CSS-解决方案数学函数-Round

在 CSS 中,存在许多数学函数,这些函数可能通过简略的计算操作来生成某些属性值,例如在古代 CSS 解决方案:CSS 数学函数一文中,咱们具体介绍了 calc():用于计算任意长度、百分比或数值型数据,并将其作为 CSS 属性值。min() 和 max():用于比拟一组数值中的最大值或最小值,也能够与任意长度、百分比或数值型数据一起应用。clamp():用于将属性值限度在一个范畴内,反对三个参数:最小值、推荐值和最大值。在 古代 CSS 解决方案:CSS 原生反对的三角函数 一文中,给大家介绍了从 Chrome 111 开始也逐步开始原生反对的三角函数: sin()cos()tan()而本文,咱们将介绍另外一个十分有意思的数学函数 - round()。 何为 round()?简略来说,round() CSS 函数的作用就是依据选定的舍入策略返回舍入数。 举个例子,在 JavaScript 中,咱们能够应用 Math.round() 返回一个数字四舍五入后最靠近的整数。 譬如: x = Math.round(20.49); //20x = Math.round(20.5); //21x = Math.round(-20.5); //-20x = Math.round(-20.51); //-21当初,CSS 借助 round() 函数也有了雷同的能力: line-height: round(2.2, 1); /* 2 */line-height: round(14.82, 1); /* 15 */line-height: round(5.5, 1); /* 6 */也就是说,round(2.2, 1) 中的 2.2 四舍五入后,最初的计算值是 2。 ...

September 4, 2023 · 3 min · jiezi

关于前端:一文搞懂JavaScript-运算符-–-逻辑比较三元和更多-JS-运算符

依据这些 JS 运算符执行的操作类型,咱们能够将它们分为七组: 算数运算符赋值运算符比拟运算符逻辑运算符三元运算符运算符的类型按位运算符算术运算符算术运算符用于执行数学运算,如加法和减法。 这些运算符常常与数字数据类型一起应用,因而它们相似于计算器。上面的示例演示如何应用运算符将两个变量相加:+ let x = 3;let y = 8;console.log(x + y); // 11您能够间接对值应用运算符,而无需将它们调配给任何变量: console.log(2 + 1); // 3console.log(4 + 1); // 5在 JavaScript 中,咱们总共有 8 个算术运算符。它们是: 加法+减法-乘法*除法/取余%幂**减少++递加--咱们能够混合这些运算符来执行简单的数学方程。 console.log(5 + 2 * 3); // 11JavaScript 中的运算程序与数学中的操作程序雷同。乘法、除法和幂的优先级高于加法或减法 能够应用括号更改操作的程序。包装要首先执行的操作,如下所示:() console.log((5 + 2) * 3); // 21将递增或递加运算符与其余运算符一起应用时,须要将运算符放在前缀地位,如下所示: let x = 5;console.log(2 + ++x); // 2 + 6 = 8让咱们尝试一些练习。你能猜出这些操作的后果吗? console.log(5 * 3 - 2);console.log((3 * 6) % 2);console.log(5 + 7 - 1);console.log((4 + 9) * 4);let x = 5;console.log(++x);console.log(x++ / 3);赋值运算符let x = 5;在根本赋值运算符之后,还有 5 个赋值运算符将数学运算与赋值相结合。这些运算符可用于使代码洁净而简短。 ...

September 4, 2023 · 3 min · jiezi

关于前端:想让你的工作轻松高效吗揭秘Java-React导出ExcelPDF的绝妙技巧

前言 在B/S架构中,服务端导出是一种高效的形式。它将导出的逻辑放在服务端,前端仅需发动申请即可。通过在服务端实现导出后,前端再下载文件实现整个导出过程。服务端导出具备许多长处,如数据安全、实用于大规模数据场景以及不受前端性能影响等。 本文将应用前端框架React和服务端框架Spring Boot搭建一个演示的Demo,展现如何在服务端导出Excel和PDF文件。当然,对于前端框架,如Vue、Angular等也能够采纳相似的原理来实现雷同的性能。 在服务端导出过程中,须要依赖额定的组件来解决Excel和PDF文件。对于Excel相干操作,能够抉择POI库,而对于PDF文件,能够抉择IText库。为了不便起见,本计划抉择了GcExcel,它原生反对Excel、PDF、HTML和图片等多种格局的导出性能。这样一来,在实现导出性能的同时,也提供了更多的灵活性和互操作性。 实际 本文将演示如何创立一个简略的表单,其中包含姓名和电子邮箱字段,这些字段将作为导出数据。同时,前端将提供一个下拉选择器和一个导出按钮,通过下拉选择器抉择导出的格局,而后点击导出按钮发送申请。期待服务端解决实现后,前端将下载导出的文件。 在服务端,咱们须要实现相应的API来解决提交数据的申请和导出申请。咱们能够定义一个对象,在内存中保留提交的数据。而后利用GcExcel库构建Excel对象,并将数据导出为不同的格局。 前端 React 1.创立React工程 新建一个文件夹,如ExportSolution,进入文件夹,在资源管理器的地址栏里输出cmd,而后回车,关上命令行窗口。 应用上面的代码创立名为client-app的react app。 npx create-react-app client-app进入创立的client-app文件夹,应用IDE,比方VisualStudio Code关上它。 2.设置表单局部 更新Src/App.js的代码,创立React app时,脚手架会创立示例代码,须要删除它们。如下图(红色局部删除,绿色局部增加)。 在Src目录下,增加一个名为FormComponent.js的文件,在App.js中增加援用。 在FormComponent.js中增加如下代码。其中定义了三个state, formData和exportType,count用来存储页面上的值。与服务端交互的办法,仅做了定义。 import React, { useEffect, useState } from 'react';export const FormComponent = () => { const [formData, setFormData] = useState({ name: '', email: '', }); const [exportType, setExportType] = useState('0'); const [count, setCount] = useState(0); useEffect(() => { fetchCount(); },[]); const fetchCount = async () => { //TODO } const formDataHandleChange = (e) => { setFormData({ ...formData, [e.target.name]: e.target.value }); }; const exportDataHandleChange = (e) => { setExportType(e.target.value); }; const handleSubmit = async (e) => { //TODO }; const download = async (e) => { //TODO } return ( <div class="form-container"> <label>信息提交</label> <br></br> <label>已有<span class="submission-count">{count}</span>次提交</label> <hr></hr> <form class="form" onSubmit={handleSubmit}> <label> 姓名: <input type="text" name="name" value={formData.name} onChange={formDataHandleChange} /> </label> <br /> <label> 邮箱: <input type="email" name="email" value={formData.email} onChange={formDataHandleChange} /> </label> <button type="submit">提交</button> </form> <hr /> <div className='export'> <label> 导出类型: <select class="export-select" name="exportType" value={exportType} onChange={exportDataHandleChange}> <option value='0'>Xlsx</option> <option value='1'>CSV</option> <option value='2'>PDF</option> <option value='3'>HTML</option> <option value='4'>PNG</option> </select> </label> <br /> <button class="export-button" onClick={download}>导出并下载</button> </div> </div> );}CSS的代码如下: ...

September 4, 2023 · 4 min · jiezi

关于前端:抖音两个旋转小球的loading实现

抖音的小圆球加载成果置信大家都见识过,也对其中的实现原理应该有肯定的好奇心吧,上面就让我带大家来摸索一下小圆球加载成果的实现原理吧。 要实现两个小圆球,咱们能够思考两种计划的实现,第一种就是css计划,画两个小圆球,而后应用css动画来实现,而第二种则是应用canvas计划。咱们首先来尝试第一种计划,首先必定是要画出两个小圆球,这不就是相当于画两个圆嘛,所以应用宽高加圆角属性即可实现。 html代码如下: <div class="rotate-ball"> <div class="small-ball small-left-ball"></div> <div class="small-ball small-right-ball"></div></div>首先是一个旋转的容器元素,接着就是左右两个小圆球,我的思路也很简略,既然两个小球是相互旋转的,那也就是说我给它们的父元素旋转不就达到了两个小球相互旋转的成果吗? 接下来咱们来看款式代码: .small-ball { width: 11px; height: 11px; border-radius: 50%;}.small-ball.small-left-ball { background-color: #e94359;}.small-ball.small-right-ball { background-color: #74f0ed;}.rotate-ball { width: 22px; animation: rotate 5s ease-in infinite forwards; transition: 2s; display: flex; align-items: center; justify-content: space-between;}@keyframes rotate { 0% { transform: rotateY(0deg); } 100% { transform: rotateY(360deg); }}款式代码很简略,就是设置两个小圆球的宽高和圆角,而后别离设置不同的背景色,而后给父元素增加旋转动画,这看起来仿佛很容易就实现了,接下来咱们来看成果。 https://code.juejin.cn/pen/7231520565935210500 嗯功败垂成,等等,这个成果差的太远了吧,没那么简略,好吧很显然这个计划不太适合,让咱们换一种形式来实现,也就是第二种计划canvas计划。 应用canvas计划实现咱们次要分为两个步骤,第一步即应用canvas画出两个小圆球,第二步则是让两个小圆球进行翻转,也就是增加翻转动画。 首先第一步当然是画小圆球,每个小圆球咱们都能够看作是一个类,咱们把它叫做ball,好的,接下来咱们来看代码如下: class Ball { // 这里写外围代码}既然小圆球是一个类,那么咱们小圆球就会有属性,思考一下,咱们会有哪些属性呢?总结如下: 圆心X坐标圆心Y坐标半径开始角度完结角度顺时针,逆时针方向指定是否描边是否填充缩放X比例缩放Y比例首先小圆球有一个圆心坐标,既x和y坐标,其次还有半径,而后旋转的角度会有开始和完结,并且还会有旋转的方向,而后就是画小圆球是否有描边,是否可能填充,最初就是缩放比例(次要用于小球静止时,咱们依据实际效果能够看到小球旋转的时候显著有缩放成果,所以这里须要一个缩放比例的属性)。 剖析了属性之后,很显然咱们第一步要做的就是初始化这些属性,代码如下: class Ball { x: number; y: number; r: number; startAngle: number; endAngle: number; anticlockwise: boolean; stroke: boolean; fill: boolean; scaleX: number; scaleY: number; lineWidth: number; fillStyle: string | CanvasGradient | CanvasPattern; strokeStyle: string | CanvasGradient | CanvasPattern; constructor(o: AnyObj) { this.x = 0; // 圆心X坐标 this.y = 0; // 圆心Y坐标 this.r = 0; // 半径 this.startAngle = 0; // 开始角度 this.endAngle = 0; // 完结角度 this.anticlockwise = false; // 顺时针,逆时针方向指定 this.stroke = false; // 是否描边 this.fill = false; // 是否填充 this.scaleX = 1; // 缩放X比例 this.scaleY = 1; // 缩放Y比例 this.init(o); } init(o: AnyObj): void { Object.keys(o).forEach(k => (this[k] = o[k])); }}初始化属性之后咱们要干什么?那当然是渲染小圆球啦,写一个render办法就能够了。 ...

September 3, 2023 · 4 min · jiezi

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

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

September 3, 2023 · 4 min · jiezi

关于前端:uniapp项目实践总结八自定义加载组件

有时候一个页面申请接口须要加载很长时间,这时候就须要一个加载页面来告知用户内容正在申请加载中,上面就写一个简略的自定义加载组件。目录筹备工作逻辑思路实战演练成果预览筹备工作在之前的全局组件目录components下新建一个组件文件夹,命名为q-loading,组件为q-loading.vue。 再找几个成果不错的 css 加载动画,而后批改一下款式。 逻辑思路编写模板局部要求具备扩展性,因而能够应用slot插槽来插入内容,也不便前期批改自定义。 应用class和style绑定一些父组件传过来的值,更加个性化。 这个页面分为图标和文本提醒两局部,各自能够自定义显示、大小、色彩。 编写款式局部这部分就是图标和文本的款式以及一些加载动画的内容。 编写脚本局部这部分次要是父组件传递过去的参数,通过props进行制订格局。 实战演练上面就简略实现一个加载组件。 模板局部<view class="q-loading" :style="{'backgroundColor': props.bgColor}" v-if="props.show"> <view class="q-loading-inner"> <slot name="load"> <!-- 图标局部 --> <view :class="{'q-loading-icon': true, 'pause': !props.show && !props.showIcon}" v-if="props.showIcon" > <slot name="icon"> <!-- 圆环 --> <view class="q-loading-item q-loading-circle" :style="{'width': props.borSize +'rpx', 'height': props.borSize +'rpx', 'borderWidth': props.borWin + 'rpx', 'borderColor': props.borColor, 'borderLeftColor': props.bordActiveColor}" v-if="props.iconName == 'circle'" > </view> <!-- 呼吸 --> <view class="q-loading-item q-loading-circle-breath" v-if="props.iconName == 'circle-breath'" > </view> <!-- 旋转 --> <view class="q-loading-item q-loading-circle-round" v-if="props.iconName == 'circle-round'" > <view class="loading-round" :style="{'backgroundColor': props.bordActiveColor}" ></view> <view class="loading-round" :style="{'backgroundColor': props.bordActiveColor}" ></view> <view class="loading-round" :style="{'backgroundColor': props.bordActiveColor}" ></view> <view class="loading-round" :style="{'backgroundColor': props.bordActiveColor}" ></view> <view class="loading-round" :style="{'backgroundColor': props.bordActiveColor}" ></view> <view class="loading-round" :style="{'backgroundColor': props.bordActiveColor}" ></view> <view class="loading-round" :style="{'backgroundColor': props.bordActiveColor}" ></view> </view> </slot> </view> <!-- 提醒文本 --> <view class="q-loading-text" v-if="props.showText" :style="{'color': props.textColor, 'fontSize': props.textSize + 'rpx'}" > <slot name="text"> {{ props.text }} </slot> </view> </slot> </view></view>款式局部这部分就是页面的款式以及三个对应的动画。 ...

September 3, 2023 · 3 min · jiezi

关于前端:六函数

前言上篇博客,咱们理解了javascript函数执行过程,本篇章次要讲述函数,如参数、回调、同/异步、箭头函数等,并论述了对ES6中class类的意识以及继承。面试答复1.ES6新个性:新增了一种值类型Symbol以及Set和Map的数据结构。减少了块级作用域,比方let,const。减少了变量的解构赋值。新增了扩大运算符。提供了类的语法糖class。新增了箭头函数。函数参数容许设置默认值,引入了rest参数,新增了一些API,比方isArray、keys()。 2.异步编程史:异步编程有四个阶段,别离是回调函数、Promise、Generator、async/await,回调函数的毛病在于容易呈现回调天堂,不能用try/catch捕捉谬误,不能return。Promise构造函数内的代码是同步执行,then办法中的代码是异步执行的,能够通过构造函数的参数reslove进入then回调中,不过毛病是无奈勾销,谬误须要回调来捕捉。Generator能够用来管制函数,比方暂停、复原执行。async/await是Promise的语法糖,它是为优化then链而开发进去的,解决了then链过长的问题,await的性能根本等同于then,它能实现的成果都能用then来实现,只不过then办法是微工作,属于异步工作,而await后的办法等同于Promise的构造函数,这个办法之后的代码等同于then回调。 3.箭头函数:箭头函数没有原型,所以不能作为构造函数。它的this指向为以后所在环境的this,且箭头函数不反对重命名参数,也没有arguments对象。 4.闭包:闭包可能使外部函数读取内部函数的变量,让变量长期驻扎在内存当中,从而让该变量不被垃圾回收机制回收,当不再须要闭包时,把外部函数赋值为null即可。益处是可能防止因为作用域问题而把变量定义在全局作用域外面,造成全局变量的净化。闭包的原理是利用了函数作用域链的个性,外部函数会将内部函数的流动对象增加到作用域链里,当内部函数执行结束,作用域链会被销毁,但流动对象因为仍被外部函数的作用域链援用,所以不会被销毁。当初闭包很少用到,以前的话会用闭包解决封装模块以及循环中作用域的问题。 5.手写Promise:Promise有状态、构造函数、then办法、catch办法、finally办法、all等办法,首先定义三个状态,pending、resolved、rejected以及一些变量,比方status、data、reason、callback用来贮存状态、resolve返回、reject返回和then办法的回调。而后实现构造函数以及reject、resolved两个办法,构造函数个别用try/catch办法间接接管或抛出,reject、resolved这两个办法是创立实例的时候作为构造函数的参数传入,且两个办法都蕴含对状态的判断以及批改,并且解决回调。接着实现then办法,因为then办法是微工作且最初会返回一个Promise,所以咱们要new一个新实例而后判断状态,再执行queueMicrotask办法,最初就是一些catch办法、finally等办法的解决,这两个都能够通过间接返回之前实现的then办法实现,只不过finally不接管参数。Promise的all办法,同样最初会返回一个Promise,不同的是Promise.all办法接管的参数是数组,可能蕴含多个申请,须要用let...of...对参数进行遍历,遍历后判断它是否为Promise对象,如果是则间接调用then办法,如果不是则将参数保留到后果变量中,最初一起返回这个后果变量。 6.闭包:闭包可能使外部函数读取内部函数的变量,让变量长期驻扎在内存当中,从而让该变量不被垃圾回收机制回收,当不再须要闭包时,把外部函数赋值为null即可。益处是可能防止因为作用域问题而把变量定义在全局作用域外面,造成全局变量的净化。闭包的原理是利用了函数作用域链的个性,外部函数会将内部函数的流动对象增加到作用域链里,当内部函数执行结束,作用域链会被销毁,但流动对象因为仍被外部函数的作用域链援用,所以不会被销毁。当初闭包很少用到,比拟典型的就是vue中的data数据,以前的话会用闭包解决封装模块以及循环中作用域的问题。 知识点1.参数JavaScript 函数有个内置的对象,arguments对象,argument对象蕴含了函数调用时的由所有参数组成的数组,arguments对象能够利用于函数调用时参数太多(超过申明)的情景。 function test() { let arg = arguments if(arg.length !== 0) console.log(arg)}test(1, 123, 500, 115, 44, 88)参数默认值 function test(x, y = 10) { return x + y;} test(0, 2) // 2test(5) //15rest参数(...) function test(a, ...b) { console.log(a) console.log(b)} test(1, 2, 3, 4, 5)//1//[ 2, 3, 4 ,5]2.Generator函数yield是JS为了解决异步调用的命令。示意程序执行到这里会交出执行权,期待后果返回。它须要在Generator函数中运行,与一般function的区别就是函数名后面多了一个星号*,这里只做最简略的用法,有趣味的同学能够持续钻研~ function *generatorForLoop(num) { for (let i = 0; i < num; i += 1) { yield console.log(i); }}const genForLoop = generatorForLoop(5);genForLoop.next(); // 0genForLoop.next(); // 1genForLoop.next(); // 2genForLoop.next(); // 3genForLoop.next(); // 43.箭头函数箭头函数没有原型,自身没有this,在箭头函数中应用this,它的指向为以后所在环境的this,所以不能够当作构造函数,new一个箭头函数也会抛出一个谬误。箭头函数不反对重命名函数参数,对于箭头函数的this指向问题曾经在上一篇博客中了解过了,这边就不着重形容了,咱们分为部分函数环境、全局环境来看。 ...

September 3, 2023 · 5 min · jiezi

关于前端:基于状态模式-没有实践再多的理论都是扯淡

基于状态模式: 没有实际的实践都是扯淡!!! 定义状态模式是一种面向对象的设计模式,它容许一个对象在其外部状态扭转时扭转它对应的行为。状态模式的关键在于如何辨别事物外部的状态,事物外部状态的扭转往往会带来事物的行为的扭转。通常咱们谈到封装,个别都会优先封装对象的行为(比方,某个函数),而不是对象的状态。但在状态模式中恰好相反,状态模式的要害是把事物的每种状态都封装成独自的类,跟状态无关的行为会被封装在这个类的外部。之前读耗子叔文章时,看到过有句话说没有实际的实践都是扯淡,集体很同意。那接下来让咱们用代码谈话,在理论利用中实际一下吧。例子1:订单解决零碎在订单解决零碎中,每个订单都能够处于不同的状态(待处理,已确认,已发货,已实现, 已勾销),且在每个状态下可执行不同的操作。// 状态接口class OrderState { constructor(order) { this.order = order; } // 定义状态办法 confirm() { throw new Error("confirm() method must be implemented."); } cancel() { throw new Error("cancel() method must be implemented."); } ship() { throw new Error("ship() method must be implemented."); }}// 具体状态类:待处理状态class PendingState extends OrderState { confirm() { console.log("订单已确认"); this.order.setState(new ConfirmedState(this.order)); } cancel() { console.log("订单已勾销"); this.order.setState(new CancelledState(this.order)); } ship() { console.log("无奈发货,订单未确认"); }}// 具体状态类:已确认状态class ConfirmedState extends OrderState { confirm() { console.log("订单已确认"); } cancel() { console.log("订单已勾销"); this.order.setState(new CancelledState(this.order)); } ship() { console.log("订单已发货"); this.order.setState(new ShippedState(this.order)); }}// 具体状态类:已发货状态class ShippedState extends OrderState { confirm() { console.log("无奈确认,订单已发货"); } cancel() { console.log("无奈勾销,订单已发货"); } ship() { console.log("订单已发货"); }}// 具体状态类:已实现状态class CompletedState extends OrderState { confirm() { console.log("无奈确认,订单已实现"); } cancel() { console.log("无奈勾销,订单已实现"); } ship() { console.log("无奈发货,订单已实现"); }}// 具体状态类:已勾销状态class CancelledState extends OrderState { confirm() { console.log("无奈确认,订单已勾销"); } cancel() { console.log("无奈勾销,订单已勾销"); } ship() { console.log("无奈发货,订单已勾销"); }}// 上下文类:订单class Order { constructor() { // 初始化状态 this.currentState = new PendingState(this); } // 设置以后状态 setState(state) { this.currentState = state; } // 执行确认操作 confirm() { this.currentState.confirm(); } // 执行勾销操作 cancel() { this.currentState.cancel(); } // 执行发货操作 ship() { this.currentState.ship(); }}// 示例用法const order = new Order();order.confirm(); // 输入: 订单已确认order.ship(); // 输入: 无奈发货,订单未确认order.cancel(); // 输入: 订单已勾销order.confirm(); // 输入: 订单已确认order.ship(); // 输入: 订单已发货order.confirm(); // 输入: 无奈确认,订单已发货order.cancel(); // 输入: 无奈勾销,订单已发货order.ship(); // 输入: 订单已发货order.confirm(); // 输入: 无奈确认,订单已实现好了,咱们能够来看下订单状态的流转过程: ...

September 3, 2023 · 3 min · jiezi

关于前端:可扩展的Blender插件开发汇总

成熟的 Blender 3D 插件是令人惊奇的事件。作为 Python 和 Blender 的老手,我常常发现自己被社区中的人们发明的弱小的货色弄得目瞪口呆。坦率地说,其中一些包看起来有点神奇,当自我狐疑或冒名顶替综合症的唠叨声音被突破时,很容易想到“如果有人能做出能够做xxx的货色就好了” 。 而后我记得,通过将好奇心和执著与良好的文档相结合,某人能够是任何人,X能够成为X、Y 和 Z。即便是艰难的局部也能够弄清楚——尤其是因为所有执著和好奇的人确保 Blender 的 Python文档和stackexchange与它让咱们创立的 gee whiz 图形一样好。 同样的形式,曾经存在的文档和模型为从头开始编写 Blender 插件奠定了平滑的根底,在开始时为该插件提供可扩大的构造有助于展现 Python API 的各个局部如何更多地组合在一起分明地。换句话说,它使新编写的代码比原来更好,同时也使现有代码更容易学习。 在本文的最初,咱们将创立一个功能齐全且已装置的插件,它提供了一个自定义 UI 元素来将Standoff 增加到 Blender 场景中,并带有界面控件来调整创立的网格的直径和高度。   一、文件构造本文开端将存在的残缺目录和文件构造,咱们能够应用mkdir和touch形式进行创立,本示例是一个填空游戏。我正在调用我的项目DemoRack并将其设置为我用于 Python 我的项目的文件夹中的顶级目录名称:它不肯定必须是 Blender 特定的任何中央。上面是DemoRack我的项目的文件构造: DemoRack|-- README.md |-- DemoRack.zip <-- will (re)compile via 'zip -r DemoRack.zip src'|-- src|-- |-- __init__.py|-- |-- standoff_mesh.py <-- from Part 2, not modified in this post |-- |-- standoff_operator.py|-- |-- standoff_panel.py|-- |-- standoff_props.py上面咱们简略介绍下这些文件的作用: DemoRack.zip:已编译src,装置在 Blender 中的文件。__init__.py:为附加组件注册所有必要的信息和类。standoff_mesh.py:用于生成指标几何/网格数据的模块。standoff_operator.py:将提供给 UI 应用的“do-er”。standoff_panel.py:在 UI 元素上增加插件将......增加。standoff_props.py:定义Panel 和 Operator所需的数据对象简而言之,每个新standoff_模块都将蕴含register()和unregister()函数。该__init__模块将导入这些模块,并将两种类型的函数捆绑到单个迭代器中。Blender Python 文档形容了这些函数所表演的角色: ...

September 3, 2023 · 4 min · jiezi

关于前端:推荐一个非常有趣的动画库

1. 根本介绍AutoAnimate 是一个零配置的嵌入式动画实用程序,可为您的 Web 应用程序增加平滑的过渡。您能够将它与 React、Solid、Vue、Svelte 或任何其余 JavaScript 应用程序一起应用。AutoAnimate 的指标是在不影响开发人员的施行工夫或性能估算的状况下大幅改善应用程序的用户体验。 2. 和其余动画库的区别之前的动画库根本都是开发者要在哪里加上动画,须要咱们本人决定或者配置才行,而 AutoAnimate 能够帮忙咱们主动在整个利用增加适合的动画。AutoAnimate 应用一行代码即可实现增加适合的动画,咱们不须要在编写时列表组件时思考到 AutoAnimate。 AutoAnimate 能够追溯利用到代码库中的任何标记,包含第 3 方代码 - 只需提供父 DOM 节点,而后让 AutoAnimate 实现剩下的工作。 3. 使用指南3.1 装置yarn add @formkit/auto-animate ornpm install @formkit/auto-animate3.2 用法AutoAnimate 实质上是一个 autoAnimate 承受父元素的函数。主动动画将利用于父元素及其间接子元素。当产生以下三个事件之一时,会专门触发动画: 一个子级被增加到 DOM 中。DOM 中的子级被删除。一个孩子在 DOM 中挪动。3.3 注意事项应用其余类型的过渡依然能够。例如,如果您仅应用 CSS 进行款式更改(例如悬停成果),则能够应用规范 CSS 过渡来进行此类款式调整。 autoAnimate仅当增加、删除或挪动父元素(您传递给的元素)的间接子元素时,才会触发动画。position: relative如果父元素是动态定位的,它会主动接管。编写款式时请记住这一点。有时,Flexbox 布局不会立刻调整其子布局的大小。具备属性的子级flex-grow: 1会在捕捉到其残缺宽度之前期待四周的内容。AutoAnimate 在这些状况下成果不佳,但如果您为元素指定更明确的宽度,它应该会像魅力一样工作。4. 原理介绍4.1 IntersectionObserver异步察看指标元素与先人元素或具备顶级文档的视口的相交的变动。 function observePosition(el: Element) { const oldObserver = intersections.get(el) oldObserver?.disconnect() let rect = coords.get(el) let invocations = 0 const buffer = 5 if (!rect) { rect = getCoords(el) coords.set(el, rect) } const { offsetWidth, offsetHeight } = root const rootMargins = [ rect.top - buffer, offsetWidth - (rect.left + buffer + rect.width), offsetHeight - (rect.top + buffer + rect.height), rect.left - buffer, ] const rootMargin = rootMargins .map((px) =>`${-1 * Math.floor(px)}px`) .join(" ") const observer = new IntersectionObserver( () => { ++invocations > 1 && updatePos(el) }, { root, threshold: 1, rootMargin, } ) observer.observe(el) intersections.set(el, observer)}4.2 MutationObserver监听DOM树的变动,比方减少、删除、挪动等DOM操作。 ...

September 3, 2023 · 2 min · jiezi

关于前端:button标签和div模拟按钮的区别

button标签和div模仿按钮的区别蛮有意思的,之前面试某厂的时候遇到了这个问题,答得不是很好,专门整顿一波~ 表单应用上如果button在form表单外部,则能够不必JavaScript绑定onclick属性就能够提交表单内容(type = 'submit'),而如果不在form表单外部,又不思考语义化,那么作为按钮,用div和button来写按钮就没什么太多的区别,只存在一些外观上和语义化的轻微区别。 button 的 type 属性实际上,它还能与menu产生联动,如MDN对button 的 type 属性形容: submit: 此按钮将表单数据提交给服务器。如果未指定属性,或者属性动静更改为空值或有效值,则此值为默认值。reset: 此按钮重置所有组件为初始值。button: 此按钮没有默认行为。它能够有与元素事件相干的客户端脚本,当事件呈现时可触发。menu: 此按钮关上一个由指定<menu>元素进行定义的弹出菜单。SEO 以及语义化语义化就是说,HTML 元素具备相应的含意,而对于SEO来说,就是让机器能够读懂网页的内容。它用于形容元素的内容或者跟其余元素的关系。在 HTML 里,除了<div>和<span>,基本上都是语义化的元素。 转言之,<div>是非语义化元素,<div>没有给内容附加任何含意,它只是个<div>,那么你所模仿的button和其余用<div>包裹的内容没有区别,甚至会被抓取模仿button的内容。另外,大部分搜索引擎并不对button和input做过多解决(不感兴趣),如果你想实现分享、页面锚点or链接到别的页面并须要由搜索引擎抓取,应用<a>标签对SEO更有意义。 外观差别div的默认box-sizing属性为content-box,而button默认为border-box,因而其余款式属性雷同的状况下,div会比button看上去大一些;button的cursor属性默认值相似于default,鼠标悬停在button上方为默认模式。而div的cursor则是text类型,并且div的user-select为text属性,即能够外部文本能够被选中,而button的默认为none,不可选中外部文本; 对于默认cursor属性可千万不要被组件库的默认款式误导了哦,因为通常<Button>组件的cursor会被解决为pointer,也就是和链接一样的小手。如果不给button设置background-color或border属性,则它存在一个默认的点击动画,鼠标点击时背景色彩或边框会动态变化以呈现出点击的动画成果,而div则不会,然而如果给button设置了background-color和border属性,这些默认的点击动画将会隐没。参考: 用div与button标签作为按钮的一些区别 MDN 文档 [SEO: \<button> vs \<a> HTML tags [closed]](https://stackoverflow.com/questions/19201420/seo-button-vs-a-html-tags)

September 3, 2023 · 1 min · jiezi

关于前端:Web-Components-教程-初学者版

原文:https://www.robinwieruch.de/web-components-tutorial/ 原题目:Web Components Tutorial for Beginners 作者:ROBIN WIERUCH 本教程将教你如何构建你的第一个Web Components以及如何在应用程序中应用它们。在咱们开始之前,让咱们花点工夫理解一下Web Components的个别状况:近年来,Web Components(也称为自定义元素)已成为几个浏览器的规范API,容许开发人员只应用HTML、CSS和JavaScript来实现可重用的组件。这里不须要React、Angular或Vue。相同,自定义元素为你提供了将所有构造(HTML)、款式(CSS)和行为(JavaScript)封装在一个自定义HTML元素中的性能。例如,设想一下,你能够领有一个像以下代码片段中的HTML下拉组件: <my-dropdown label="Dropdown" option="option2" options='{ "option1": { "label": "Option 1" }, "option2": { "label": "Option 2" } }'></my-dropdown>在本教程中,咱们将应用Web Components从头开始逐渐实现此下拉组件。之后,你能够在整个应用程序中持续应用它,将其作为开源Web Components装置在其余中央,或者应用像React这样的框架中,在Web Components的坚实基础上构建React应用程序。 为什么选 Web Components一个集体故事,用来阐明如何从Web Components中受害:当我有一个客户,他有很多跨职能团队,想要基于一个款式指南创立一个UI库时,我开始接触Web Components。两个团队开始依据款式指南实现组件,但每个团队应用了不同的框架:React和Angular。只管这两个实现在构造(HTML)和款式(CSS)上与款式指南有些类似,但行为的实现(例如关上/敞开下拉菜单,在下拉菜单中抉择我的项目)由各个团队依据他们所抉择的框架来实现。此外,如果款式指南在组件的款式或构造上呈现谬误,每个团队都会独自修复这些谬误,而不会随后调整款式指南。不久之后,这两个UI库在外观和行为上开始一致。 留神:与Web Components无关,这是款式指南的一个常见缺点,如果它们不被踊跃应用(例如作为流动款式指南)在代码中,而只是作为逐步过期的文档。 最终,两个团队走到了一起,探讨如何解决问题。他们请我钻研Web Components,看看它们是否能解决他们的问题。事实上,Web Components 提供了一个令人信服的解决方案:两个团队能够依据款式指南实现独特的Web Components。像下拉菜单、按钮和表格这样的组件只需应用HTML、CSS和JavaScript来实现。此外,他们不用强制应用Web Components来实现他们后续的个别应用程序,而是能够在他们的React或Angular应用程序中应用这些组件。如果款式指南的要求发生变化,或者须要修复一个组件,两个团队能够在他们共享的Web ComponentsUI库上进行单干。 开始应用Web Components如果你须要以下教程的入门我的项目,能够从 GitHub 克隆此我的项目。你应该查看dist/和src/文件夹,以便依据教程进行调整。本教程的实现我的项目能够在 GitHub 上找到。 让咱们开始应用咱们的第一个 Web 组件。咱们不会从一开始就实现下拉组件,而是一个简略的按钮组件,稍后会在下拉组件中应用。应用 Web 组件实现一个简略的按钮组件没有多大意义,因为你能够应用<button>带有一些 CSS 的元素,然而,为了学习 Web 组件,咱们将从这个按钮组件开始。因而,以下代码块足以为具备自定义构造和款式的单个按钮创立 Web 组件: const template = document.createElement('template');template.innerHTML = ` <style> .container { padding: 8px; } button { display: block; overflow: hidden; position: relative; padding: 0 16px; font-size: 16px; font-weight: bold; text-overflow: ellipsis; white-space: nowrap; cursor: pointer; outline: none; width: 100%; height: 40px; box-sizing: border-box; border: 1px solid #a1a1a1; background: #ffffff; box-shadow: 0 2px 4px 0 rgba(0,0,0, 0.05), 0 2px 8px 0 rgba(161,161,161, 0.4); color: #363636; } </style> <div class="container"> <button>Label</button> </div>`;class Button extends HTMLElement { constructor() { super(); this._shadowRoot = this.attachShadow({ mode: 'open' }); this._shadowRoot.appendChild(template.content.cloneNode(true)); }}window.customElements.define('my-button', Button);让咱们逐渐进行所有步骤。自定义元素(Web Components)的定义是通过一个继承自HTMLElement的JavaScript类来实现的,该类能够帮忙你实现任何自定义HTML元素。通过继承自它,你将能够拜访各种类办法,例如组件的生命周期回调(生命周期办法),这些办法有助于你实现Web Components。稍后你将看到咱们如何利用这些类办法。 ...

September 3, 2023 · 7 min · jiezi

关于前端:Cocos独立游戏开发框架中的日志模块Bug无所遁形

引言本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢送大家关注分享珍藏订阅。 在Cocos独立游戏开发框架中,一个弱小的日志模块是不可或缺的组成部分。日志不仅仅是记录应用程序的运行状态,还能够用于故障排除、性能监测和平安审计。本文将探讨如何设计和实现一个高效的自定义日志模块,以满足开发框架的须要。 本文源码和源工程在文末获取,小伙伴们自行返回。 为什么须要自定义日志模块?为什么不间接应用现有的日志库,如Cocos中的cc.log?只管这些库在大多数状况下可能满足需要,但在自定义开发框架中,通常有一些非凡需要,须要更多的管制和定制化。以下是一些可能的理由: 集成性: 自定义日志模块能够更好地与开发框架的其余局部集成,以提供更统一的用户体验。性能优化: 某些框架须要高性能的日志记录,而通用的日志库可能无奈满足这些需要。自定义模块能够依据框架的性能要求进行优化。定制化需要: 框架可能须要特定的日志格局、存储形式或级别,这些在通用库中可能无奈轻松实现。设计自定义日志模块1. 确定需要和指标在设计日志模块之前,首先须要明确框架的需要和指标。这些需要可能包含: 日志级别: 确定框架须要哪些日志级别,如DEBUG、INFO、WARNING、ERROR等。日志格局: 定义日志记录的格局,包含工夫戳、日志级别、音讯内容等。日志存储: 确定日志存储的形式,例如文件、数据库、近程服务器等。性能要求: 确定框架对日志记录性能的要求,以便进行相应的优化。2. 架构设计设计日志模块的架构时,能够思考以下要害组件: Logger: 这是次要的日志记录器,负责接管日志音讯并将其散发到不同的输入指标。能够依据日志级别来过滤音讯。Handler: 处理程序是负责将日志音讯发送到不同输入指标的组件。能够有多个处理程序,如文件处理程序、控制台处理程序、网络处理程序等。Formatter: 格式化器负责将日志音讯格式化为指定的格局,以便记录或展现。能够依据须要创立不同的格式化器。3. 实现外围性能在实现自定义日志模块的外围性能时,须要思考以下步骤: 定义日志级别: 创立枚举或常量来示意不同的日志级别,并在Logger中实现相应的办法来解决每个级别的日志音讯。处理程序: 实现处理程序,依据配置将日志音讯发送到不同的输入指标。例如,文件处理程序能够将音讯写入文件,控制台处理程序能够将音讯打印到控制台。格式化器: 实现不同的格式化器,以满足框架的需要。格式化器能够包含工夫戳、日志级别、音讯内容等信息。性能优化: 依据性能需求进行优化,能够应用缓冲区、异步日志记录等技术来进步性能。4. 配置和集成为了使日志模块易于应用和集成到开发框架中,能够思考以下方面: 配置选项: 提供配置选项,容许开发人员依据须要调整日志模块的行为,如日志级别、输入指标等。集成: 确保日志模块能够轻松集成到开发框架的其余局部,例如异样解决、事件记录等。Log模块演示1.定义Log模块申明一下logLevel,这样咱们就能够在不同的状况开启不同的log等级,比如说开发的时候是DEBUG级,上线后能够INFO或者ERROR级。 2.主接口log模块的主接口,后续咱们能够依据我的项目的需要,将接口降级革新成写本地文件或者通过http上传到服务器数据库。 3.log构造log构造打包器,将log依照工夫+log级别+log信息的构造输入。 4.log级别标识依据log级别获取对应的log标识。 5.封装引擎log接口最终写log的接口,不同的引擎调用其提供的log接口即可。 6.编写测试代码乏味的独白。 7.后果演示 总结在自定义开发框架中,设计和实现一个弱小的日志模块是至关重要的。通过明确需要、设计架构、实现外围性能以及提供配置选项和集成能力,能够创立一个灵便、高效的日志零碎,有助于开发人员更好地了解和保护应用程序。不仅如此,一个强壮的日志模块还有助于进步应用程序的可靠性和性能。因而,在自定义开发框架中,不要漠视日志模块的重要性。 本文的重点内容次要有以下几点,不晓得小伙伴们是否曾经了解: 本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢送大家关注分享珍藏订阅。为什么须要自定义日志模块。如何设计自定义日志模块。源码通过关注“亿元程序员”发送"Log"获取。AD:笔者曾经上线的小游戏《填色之旅》《贪吃蛇掌机经典》《重力迷宫球》大家能够自行点击搜寻体验。 感兴趣的小伙伴记得关注"亿元程序员"哦,一位有着8年游戏行业教训的主程。学习游戏开发不迷路。感谢您的关注,心愿能给到您帮忙, 也心愿通过您能帮忙到大家。 喜爱的能够点个赞、点个在看哦!请把该文章分享给你感觉有须要的其余小伙伴。谢谢。

September 3, 2023 · 1 min · jiezi

关于前端:设计模式迭代器模式

设计模式wiki中将设计模式分为四类,别离是: 创立模式(creational patterns)构造模式(structural patterns)行为模式(behavioral patterns)并发模式(concurrency patterns)迭代器模式属于其中的行为模式。 迭代器做的只有一件事,就是解决汇合的遍历问题。 以下是wiki对迭代器模式的概括性形容: Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.提供一种在不裸露底层示意的状况下按程序拜访聚合对象元素的形式。 这个形容乍一看有点形象,但其实咱们罕用的for循环就能够看作是迭代器模式的利用,在遍历时并不知道数组元素的具体示意: let array = [1, 2, 3, 4, 5, 6];for (let i = 0; i < array.length; i ++) { console.log(array[i]);}如果不利用迭代器,咱们想要遍历array数组就得像上面这么做: console.log(array[0]);console.log(array[1]);console.log(array[2]);// ...但应用for循环的前提是array是数组,这样咱们能力应用索引去遍历这个汇合,所以下面这种for循环就是针对数组类型汇合的一种迭代器实现。 定义上面再进一步理解迭代器模式是什么: In object-oriented programming, the iterator pattern is a design pattern) in which an iterator is used to traverse a container) and access the container's elements. The iterator pattern decouples algorithms from containers; in some cases, algorithms are necessarily container-specific and thus cannot be decoupled. ...

September 2, 2023 · 3 min · jiezi

关于前端:使用三角函数在CSS中的随机性

本文翻译自 Randomness in CSS using trigonometry,作者:Kacper 略有删改在过来,我曾经介绍了CSS中应用模运算的伪随机性的主题,我应用素数创立了一个主动计数器,能够用来为每个对象生成不同的值。因而,咱们能够独立地计算每个元素的伪随机值。 只管这个解决方案很弱小,但它简直没有毛病: 模函数不是间断的它过于简单:须要3个变量和@property定义每个咱们想要生成的随机值须要应用尚未广泛支持的@property侥幸的是,咱们能够做得更好!在本文中提出一个更好的解决方案,应用三角函数。 更好的办法自从我上次摸索这个主题以来,CSS中呈现了一些令人惊叹的新个性。其中最令人兴奋的是三角函数。他们解开了许多以前不可能实现的工作。它们也是CSS中第一个原生反对的有界连续函数,使它们成为创立伪随机生成器的工具。 随机性vs伪随机性显然,这里提出的解决方案仅生成伪随机值。应用预约常数计算所有值。正如我在上一篇文章中所形容的,咱们能够增加一个额定的--seed变量,并从零碎内部更改它(例如在加载时在JavaScript中设置它),以提供较少确定性的后果,但CSS不提供任何非确定性的办法。也就是说,该解决方案应该足以取得用于动画、地位等的足够的伪随机值。 正弦函数的特色正弦函数和余弦函数乏味的起因有很多,它们能够在波及圆和旋转的各种操作中十分有用。在咱们的例子中,咱们能够将它们的属性用于其余目标。 有界函数正弦和余弦的一个重要性质是,后果值总是在-1和1之间有界。这意味着,无论传递给它的值有多大或小,后果总是在这个范畴内的值。而后,咱们能够对范畴[0,1]执行简略的归一化。有了归一化的值,咱们能够应用它来示意应用简略的线性映射的任何值。 --x: calc(0.5 + 0.5 * sin(var(--n) * 342.06184 + 23.434));/* Then we can use it as following */background: rgb(calc(50 + var(--x) * 100), 0, 0);/* Red will be in the range of 50-150.下面的代码应用的是我在上一篇文章中介绍的counter var(--n),我应用素数创立了一种在CSS中主动创立计数器变量的无效办法。 而后将该值乘以一些任意值并偏移以提供伪随机大数(这些值实际上并不重要,您能够依据须要更改它们以取得不同后果)。之后咱们应用正弦函数将其映射到范畴[-1, 1]。最初如上面的动画所示,咱们能够通过利用简略的代数变换将其映射到范畴[0, 1]。一旦咱们从范畴[0, 1]中取得值,咱们能够应用线性映射将其映射到任何其余期望值。 连续性正弦函数的另一个个性是连续性。简略了解,你能够认为正弦或余弦函数输出的渺小变动最终会导致输入的渺小变动。因为这一个性,咱们能够在动画中实现逐步变动的值,同时使零碎体现出随机行为。 示例上面是一些示例,展现了应用三角函数生成伪随机值的后劲。 圆网格动画第一个示例显示了正弦属性的作用。生成的值是随机的,但咱们依然能够放弃程序和连续性的感觉,示例波及到色彩和大小动画。 代码的要害局部是x,y,z和w变量的计算,这些变量别离用于示意红色,绿色,蓝色和宽度。 div::before { --x: calc(0.5 + 0.5 * sin(4.284 * var(--n))); --y: calc(0.5 + 0.5 * sin(7.284 * var(--n))); --z: calc(0.5 + 0.5 * sin(4 * var(--n) + 2 * var(--t))); --w: calc(0.5 + 0.5 * sin((0.2 * cos(var(--t)/100) + 0.8) * 49.123 * var(--n) + var(--t))); background: rgb( calc(50 + 100 * var(--x)), calc(200 + 30 * var(--y)), calc(120 + 100 * var(--z)) ); width: calc(50% + var(--w)*50%);}最初2个变量,除了咱们的计数器--n之外,应用工夫变量--t,其通过运行逐步扭转变量的动画来取得: ...

September 2, 2023 · 3 min · jiezi

关于前端:uniapp项目实践总结七编写一个简单的应用页面

之前自定义了顶部和底部导航栏,那接下来就写一个简略的二级页面,这个是出了导航页面之外常常用到的。目录构造模板款式办法示例构造一个一般页面的构造应该是如下所示: <!-- html --><template> <view class="list"> 列表内容 </view></template><!-- js --><script setup name="list"></script><!-- css --><style lang="scss" scoped></style>模板uniapp 内置了罕用的组件,能够间接应用,和微信小程序一样。 容器类viewscroll-viewswiper文本类icontextrich-textprogress表单类forminputtextarealabelradiocheckboxbuttonpickersliderswitch其余navigatorimageaudiovideowebviewcanvasmap款式款式反对css、scss、less、stylus,反对@import导入内部样式表。 尺寸通用尺寸反对以下通用尺寸: rpx响应式 pxpx屏幕像素非凡尺寸nvue 不反对,vue 反对: rem根字体大小vhviewpoint height,视窗高度,vwviewpoint width,视窗宽度,nvue 不反对百分比; 计算公式uni-app 中页面的宽度计算公式: 750 * 元素在设计稿中的宽度 / 设计稿基准宽度; 例如: 设计稿宽度为 750px,元素 A 在设计稿的宽度为 100px,那么元素在 uniapp 外面的宽度为750*100/750为 100rpx;设计稿宽度为 375px,元素 A 在设计稿的宽度为 100px,那么元素在 uniapp 外面的宽度为750*100/375为 200rpx;导入应用@import 'path/name.scss'; 例如: @import "./index.scss";全局款式App.vue中的款式即为全局款式,对于每一个页面通用,nvue 页面不反对全局款式。 内联款式在组件的属性中应用 class 或者 style 增加款式。 <!-- style --><view :style="{'width': '100rpx'}"> </view><!-- class --><view class="block"></view>选择器在 uniapp 中,*选择器有效,page相当于body,微信小程序仅反对class选择器。 选择器样例样例形容.class.intro抉择所有领有 class="intro" 的组件#id#firstname抉择领有 id="firstname" 的组件elementview抉择所有 view 组件element, elementview, checkbox抉择所有文档的 view 组件和所有的 checkbox 组件::afterview::after在 view 组件后边插入内容,仅 vue 页面失效::beforeview::before在 view 组件前边插入内容,仅 vue 页面失效css 变量CSS 变量形容App小程序H5--status-bar-height零碎状态栏高度零碎状态栏高度、nvue 留神见下25px0--window-top内容区域间隔顶部的间隔00NavigationBar 的高度--window-bottom内容区域间隔底部的间隔00TabBar 的高度NavigationBar导航栏44px 44pxTabBar底部选项卡HBuilderX 2.3.4 之前为 56px,2.3.4 起和 H5 调为统一,对立为 50px。(但能够自主更改高度) 50px字体应用@font-face自定义字体。 ...

September 2, 2023 · 3 min · jiezi

关于前端:知识订正浏览器是如何渲染页面的

一.浏览器是如何渲染页面的? 当浏览器的网络线程收到 HTML 文档后,会产生一个渲染工作,并将其传递给渲染主线程的音讯队列。在事件循环机制的作用下,渲染主线程取出音讯队列中的渲染工作,开启渲染流程。 整个渲染流程分为多个阶段,别离是: HTML 解析(Parse HTML)、款式计算(Computed Style)、布局(Layout)、分层(Layer)、绘制(Paint)、分块(Tiling)、光栅化(Raster)、画(Draw)。 每个阶段都有明确的输入输出,上一个阶段的输入会成为下一个阶段的输出。这样,整个渲染流程就造成了一套组织紧密的生产流水线。 1.HTML 解析(Parse HTML) 浏览器解析过程中遇到 CSS 解析 CSS,遇到 JS 执行 JS。为了进步解析效率,浏览器在开始解析前,会启动一个预解析的线程,率先下载 HTML 中的内部 CSS 文件和 内部的 JS 文件。 如果主线程解析到 link 地位,此时内部的 CSS 文件还没有下载解析好,主线程不会期待,持续解析后续的 HTML。这是因为下载和解析 CSS 的工作是在预解析线程中进行的。这就是 CSS 不会阻塞 HTML 解析的根本原因。为了提⾼解析效率,浏览器会启动⼀个预解析器率先下载和解析 CSS,如下图: 如果主线程解析到 script 地位,会进行解析 HTML,转而期待 JS 文件下载好,并将全局代码解析执行实现后,能力持续解析 HTML。这是因为 JS 代码的执行过程可能会批改以后的 DOM 树,所以 DOM 树的生成必须暂停。这就是 JS 会阻塞 HTML 解析的根本原因。如下图: 第一步实现后,会失去 DOM 树和 CSSOM 树,浏览器的默认款式、外部款式、内部款式、行内款式均会蕴含在 CSSOM 树中。 2.款式计算(Computed Style) 主线程会遍历失去的 DOM 树,顺次为树中的每个节点计算出它最终的款式,称之为 Computed Style。 在这一过程中,很多预设值会变成绝对值,比方red会变成rgb(255,0,0);绝对单位会变成相对单位,比方em会变成px。这一步实现后,会失去一棵带有款式的 DOM 树。 ...

September 2, 2023 · 2 min · jiezi

关于前端:学习JavaScript的路径

学习JavaScript的门路能够依照以下步骤进行: 理解基本概念:首先学习JavaScript的基本概念,包含变量、数据类型、运算符、数组、对象、循环和条件语句等。能够通过浏览相干的教材、在线课程或者参考W3Schools和MDN文档等来学习。学习管制DOM元素:学习如何应用JavaScript管制DOM元素,包含获取元素、增加、删除、批改类名、属性和内容等。能够参考jQuery或原生JavaScript的DOM API。学习事件和监听器:理解JavaScript的事件和监听器,学习如何响应用户交互。学习异步编程:学习JavaScript的异步编程,包含回调函数、Promise和async/await。学习面向对象编程和类:理解JavaScript的面向对象编程和类,把握如何创建对象和类的继承。学习罕用的框架和工具:相熟罕用的JavaScript框架和工具,例如React、Vue、Angular和Webpack等。练习我的项目:通过练习编写我的项目来坚固学习的常识,能够抉择基于Node.js搭建后端利用或者应用JavaScript编写网站或游戏等。学习ES6+新个性:理解JavaScript的ES6+新个性,包含变量和常量的申明、箭头函数、模块化等。学习与Node.js的交互:理解如何应用Node.js与后端交互,包含http模块、fs模块等。一直学习和实际:JavaScript是一门一直倒退的语言,须要一直学习新的技术和实际来进步本人的技能程度。在学习过程中,能够通过练习我的项目、加入社区活动等形式与其余开发者交换和学习,进步本人的实际能力和技能程度。

September 2, 2023 · 1 min · jiezi

关于前端:知识订正浏览器工作原理与事件循环

 古代浏览器的复杂程度如同操作系统,只有日益完善的机制能力应答现今越来越简单的网页交互。笔者前文曾述JS单线程引起的思考,现在看来错漏百出,常识内容早已过期。基于当初的常识积攒,现在再发一文作为勘误,心愿能加深印象,有所收货。 如同上文的“JS单线程”,笔者之前所学还是全面的常识,JS的单线程在哪个过程之内,交互操作,代码执行浏览器线程更偏重谁都是只知其一;不知其二。当初从新零碎学习了一遍常识后,有了新的了解。 首先从浏览器的工作原理来一步步解释起因。 一.浏览器的过程模型1.过程与线程: 程序运⾏须要有它⾃⼰专属的内存空间,能够把这块内存空间简略的了解为过程。每个应⽤⾄少有⼀个过程,过程之间互相独⽴,即便要通信,也须要双⽅批准。⼀个过程⾄少有⼀个线程,所以在过程开启后会⾃动创立⼀个线程来运⾏代码,该线程称之为主线程。如果程序须要同时执⾏多块代码,主线程就会启动更多的线程来执⾏代码,所以⼀个过程中能够蕴含多个线程。为了防止相互影响,为了缩小连环解体的⼏率,当启动浏览器后,它会⾃动启动多个过程。 其中,最次要的过程有: 浏览器过程次要负责界⾯显示(非网页页面显示,如标签页样子,后退后退刷新按钮,导航栏等)、⽤户交互(如点击按钮,滚动滚动条等)、⼦过程治理等。浏览器过程外部会启动多个线程解决不同的工作。⽹络过程负责加载⽹络资源。⽹络过程外部会启动多个线程来解决不同的⽹络工作。渲染过程(重点)渲染过程启动后,会开启⼀个渲染主线程,主线程负责执⾏ HTML、CSS、JS 代码。默认状况下,浏览器会为每个标签⻚开启⼀个新的渲染过程,以保障不同的标签⻚之间不相互影响。 2.渲染主过程 渲染主线程须要解决的工作包含但不限于: * 解析 HTML * 解析 CSS * 计算款式 * 布局 * 解决图层 * 每秒把⻚⾯画 60 次 * 执⾏全局 JS 代码 * 执⾏事件处理函数 * 执⾏计时器的回调函数 * ..... 渲染主线程须要解决诸如此类如此多的工作,为了确保稳固的运行,就须要一种机制来做任务调度,因而,音讯队列/事件队列应运而生。 在最开始的时候,渲染主线程会进入一个有限循环。 每一次循环会查看音讯队列中是否有工作存在。如果有,就取出第一个工作执行,执行完一个后进入下一次循环;如果没有,则进入休眠状态。 其余所有线程(包含其余过程的线程)能够随时向音讯队列增加工作。新工作会加到音讯队列的开端。在增加新工作时,如果主线程是休眠状态,则会将其唤醒以持续循环拿取工作。这样一来,就能够让每个工作井井有条的、继续的进行上来了。 整个过程,被称之为事件循环 event loop(音讯循环 message loop )。 在理论的代码运行中,次要会遇到三种异步操作,如: 计时实现后须要执行的工作 —— setTimeout、setInterval(计时线程)网络通信实现后须要执行的工作 – XHR、Fetch(网络线程)用户操作后须要执行的工作 – addEventListener(交互线程) 这时,浏览器通过 异步 形式来解决上述三种形式可能导致的阻塞问题。 如下图所示: 当存在 setTimeout 时,将其代码放入“计时线程”内开始计时,渲染主线程持续运行同步代码,若渲染主线程没有工作时,则从音讯队列(事件队列)内拿取工作来运行,而计时完结后,其回调函数会放入音讯队列(事件队列)尾端,期待主线程拿取。注:当遇到同步延时操作时,浏览器无奈像异步操作那样调用其余线程避免阻塞,只能期待渲染主线程运行完代码后继续执行下一步操作,这段时间会造成阻塞导致页面卡死。 一道面试问答题:如何了解 JS 的异步?JS是一门单线程的语言,这是因为它运行在浏览器的渲染主线程中,而渲染主线程只有一个。而渲染主线程承当着诸多的工作,渲染页面、执行 JS 都在其中运行。如果应用同步的形式,就极有可能导致主线程产生阻塞,从而导致音讯队列中的很多其余工作无奈失去执行。这样一来,一方面会导致忙碌的主线程白白的耗费工夫,另一方面导致页面无奈及时更新,给用户造成卡死景象。所以浏览器采纳异步的形式来防止。具体做法是当某些工作产生时,比方计时器、网络、事件监听,主线程将工作交给其余线程去解决,本身立刻结束任务的执行,转而执行后续代码。当其余线程实现时,将当时传递的回调函数包装成工作,退出到音讯队列的开端排队,期待主线程调度执行。在这种异步模式下,浏览器永不阻塞,从而最大限度的保障了单线程的晦涩运行。 上述异步操作会产生工作,工作是没有优先级的,在音讯队列(事件队列)中先进先出。然而音讯队列有优先级。 ...

September 2, 2023 · 1 min · jiezi

关于前端:Module理解及使用

ES6的模块化设计思维是动态化,也就是说,在编译的时候确定模块的依赖关系,以及输入输出入的变量。而CommonJS和AMD模块都是在运行时确定的。ES6的模块不是对象,而是通过export显示指定输入的代码,再通过import命令输出。 // 模块输出import { start,address } from 'util'下面的模块输出加载了两个办法,即便util模块内有其它办法也不会加载,只会加载下面引入的两个办法,这种加载称为“编译时加载”或动态加载。 须要留神的是,ES6的模块主动采取严格模式,不论头部有没有加上"use strict"都会开启严格模式。严格模式的限度如下: 1、变量必须先申明再应用2、函数参数不能有同名属性,否则报错3、不能应用with语句4、不能对只读属性赋值,否则报错5、不能应用前缀 0 示意八进制数,否则报错6、不能删除不可删除的属性,否则报错7、不能删除变量delete prop,会报错,只能删除属性delete global[prop]8、eval不会在它的外层作用域引入变量9、eval和arguments不能被从新赋值10、arguments不会主动反映函数参数的变动11、不能应用arguments.callee12、不能应用arguments.caller13、禁止this指向全局对象14、不能应用fn.caller和fn.arguments获取函数调用的堆栈15、减少了保留字(比方protected、static和interface) export和import命令模块次要有export和import形成,export规定模块对外的接口,import用于输出模块提供的性能。模块导出 // util模块// 类型function type(a){ return typeof a}// 计算function sum(a,b) { return a * b }// 判断是否为数组function isArray(a) { return a instanceof Array}export { type,sum } // 按需导出模块导入 import { type,sum } from './util'let num = sum(10,5)console.log(num) // 50下面两种形式是可选的形式导出的,也就是说,import导入模块的时候,只会加载export导出的办法,其它的办法不会被import加载,并且import引入util模块能够按需引入,引入本人须要的模块即可,其它未引入的模块也不会加载,这也就是动态加载的益处。 除了export { xxx,xxx }的按需导出外,ES6还提供了export default的默认导出,默认导出的办法,在import导入的时候,不须要跟导出名始终,能够自定义名称接管导出的办法。 // util模块// 计算function sum(a,b) { return a * b }// 判断是否为数组function isArray(a) { return a instanceof Array}export default sum // 默认导出import aaa from './util' // 导入时名字能够自定义let num = aaa(10,5)console.log(num) // 50其实这个default就是一个叫做default的变量,这个变量能够被任意命名,在import导入的时候,取任何名称都能够匹配上default导出的办法。 ...

September 2, 2023 · 2 min · jiezi

关于前端:明道云伙伴大会2023报名火热开启

11月3日-4日咱们将在上海举办明道云搭档大会2023暨公司10周年庆,此次大会规模达千人级别,面向明道云的外围搭档及客户。 明道云搭档大会是咱们一年一度的盛会,已胜利举办三届,失去了宽广合作伙伴和客户的高度认可和反对。往年,大会还将与明道云十周年一起举办,意义不凡。咱们将向与会嘉宾展现最前沿的零代码利用案例以及明道云产品的倒退蓝图,展望未来的倒退时机。 分割信息如需征询或帮助,请分割工作人员姓名:李雨珂电话:133 8613 0360

September 2, 2023 · 1 min · jiezi

关于前端:Cocos独立游戏开发框架中常见问题整理小伙伴们的奇葩私信

引言本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢送大家关注分享珍藏订阅。 随着本系列的连载,越来越多的小伙伴退出到咱们的手把手行列中来,既有刚刚进入游戏行业的小伙伴,也有身经久战的大神们。在这过程中笔者收到了大量的小伙伴私信,有表白本人的想法的,也有表白本人的志愿的,还有表白本人的不解的,更有分享本人的见解的。 上面追随笔者一起来看下。 开发框架中的常见问题总结1.独立游戏开发框架真的有用吗?是的,独立游戏开发框架十分有用,特地是对于独立开发者和小团队来说。以下是一些理由阐明为什么独立游戏开发框架具备价值: 进步开发效率: 游戏开发框架提供了一套现成的工具、库和模板,能够缩小开发者从头开始构建的工作量。这意味着开发者能够更快地创立游戏原型和最终产品。标准化架构: 框架通常遵循统一的架构和设计模式,这有助于进步代码的可维护性和可扩展性。开发者不用从新创造轮子,而是能够利用框架提供的最佳实际。跨平台反对: 许多游戏开发框架提供了跨多个平台的反对,包含iOS、Android、PC、主机等。这意味着你能够应用雷同的代码库来构建游戏,并将其公布到不同的平台,从而节省时间和资源。更新和保护: 框架通常会不断更新和保护,以适应新的技术和平台要求。这意味着开发者能够依附框架来放弃其游戏的最新性和兼容性。可扩展性: 开发者能够依据本人的需要扩大框架,增加自定义性能和模块。这使得框架实用于各种不同类型的游戏我的项目。2.为什么你文章的内容如此简略?是的,笔者最次要是为了给小伙伴们阐释咱们游戏开发框架在游戏开发中的重要性,以及一个开发框架的常见组成,笔者通过一个个简略的例子展示各个模块的核心内容,大家能够依据本身的游戏我的项目需要,去拓展框架,笔者的重点还是遍及思维。 3.我能够用其余语言或者其余引擎去实现框架吗?当然能够, 文章的重点其实只是展示框架中心思想,笔者在游戏行业挣扎多年,对不同的游戏引擎和不同的编程语言都有涉猎,一套好的开发框架,他并不局限于某个引擎或者语言,比如说,咱们基于Cocos的开发框架搭建好后,想要衍生进去一套Unity的开发框架,他其实很简略,将咱们引擎所提供的接口,在框架地底层进行替换和批改,你会发现竟是如此简略。更换语言那就更加简略了,所有的语言都能够是世界上最好的语言。只有你可能更好利用它。 4.你能够解说一下对于XXX这部分的原理吗?十分乐意,笔者本系列次要阐释如何构建本人的开发框架,然而也是违心为大家解说更多的大家想要理解的常识,只有小伙伴有想要浏览的内容或者主题,大家能够像提问题一样私信我,笔者会尽量地为大家安顿到后续的文章去解说和介绍,只有是作者能力范畴内的内容,都会尽力去给大家出现,目标就是为了可能到大家以及通过大家能帮忙到更多的小伙伴。 5.通过该开发框架我能够实现我的游戏幻想吗?能够的,框架只是思维的展示,它只是咱们在游戏开发中的工具,更重要的是咱们的游戏思维,小到简略的俄罗斯方块游戏,大到各种炫酷的MMORPG游戏,只有咱们有打算、有指标、有工夫、有资源(包含各种游戏资源、游戏开发资源、经济资源),那么咱们的游戏幻想还是能够如期实现的,要的就是保持和气魄。包含以下几点: 创意和设计: 游戏概念和设计是游戏胜利的要害。无论你应用什么开发框架,都须要一个引人入胜的故事、乏味的玩法和吸引人的游戏机制。技能和教训: 你和你的团队是否具备足够的游戏开发技能和教训?如果你是一名老手,可能须要工夫来学习和进步你的技能。资源: 游戏开发须要资源,包含工夫、金钱和人力资源。你须要思考你是否有足够的资源来反对游戏的开发和推广。市场竞争: 游戏市场竞争强烈,须要一个精明的市场营销策略,以确保你的游戏可能吸引玩家。理解市场趋势和竞争对手也十分重要。保持和反馈: 游戏开发是一个长久且不断改进的过程。你须要坚定不移地工作,并承受用户的反馈,以不断改进你的游戏。6.能够帮我做一个XXX的游戏吗?笔者只是想把在游戏行业耕耘8年所取得的果实分享给大家,为的就是可能帮到大家能在游戏开发中保持并且走上来,笔者尽管算得上对游戏开发有着粗浅见解,但也并非万能的,并非闭着眼就能把游戏码进去,当然了,如果小伙伴们有比拟好的想法并且有十分丰富的资源,咱们能够尝试强强联合,打造精美乏味的游戏。 7.更完本系列前面打算更新什么内容?本系列还有比拟多的核心内容还安顿在前面,大家喜爱的能够继续关注和订阅咱们的合集。系列完结之后的话,笔者会持续更新一些在游戏开发中的进阶技能和常识,也会更新一些在游戏行业中乏味见识和奇闻,更加欢送大家持续给笔者留言,通知我你想要浏览的货色,欢送大家拿好板凳,急躁期待。 总结独立游戏开发框架能够帮忙你简化开发过程,但胜利还须要更多的致力和信心。如果你具备动摇的信心、创造力和继续学习的精力,那么应用该框架是实现你的游戏幻想的无力工具之一。但请记住,游戏开发是一项具备挑战性的工作,须要急躁和毅力。不论后果如何,享受游戏开发的过程也是十分有价值的。 本文的重点内容次要有以下几点,不晓得小伙伴们是否曾经了解: 本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢送大家关注分享珍藏订阅。开发框架中的常见问题总结。大家周末欢快。AD:笔者曾经上线的小游戏《填色之旅》《贪吃蛇掌机经典》《重力迷宫球》大家能够自行点击搜寻体验。 感兴趣的小伙伴记得关注"亿元程序员"哦,一位有着8年游戏行业教训的主程。学习游戏开发不迷路。感谢您的关注,心愿能给到您帮忙, 也心愿通过您能帮忙到大家。 喜爱的能够点个赞、点个在看哦!请把该文章分享给你感觉有须要的其余小伙伴。谢谢。

September 2, 2023 · 1 min · jiezi

关于前端:uniapp项目实践总结六自定义顶部导航栏

本篇次要讲述如何自定义顶部导航栏,有时候默认导航栏不足以满足咱们的需要,这时候就须要自定义导航栏来解决这个问题。目录默认导航批改配置自定义顶部默认导航自带的默认顶部导航设置的内容无限,不容易扩大批改,因而如果有更加个性化的需要,则须要自定义顶部导航。 配置如下: "globalStyle": { "navigationBarTextStyle": "white", "navigationBarTitleText": "HelloApp", "navigationBarBackgroundColor": "#333", "backgroundColor": "#f8f8f8"}更多配置查看:https://uniapp.dcloud.net.cn/collocation/pages.html#globalstyle 批改配置在pages.json文件中的globalStyle加一个配置。 "globalStyle": { "navigationBarTextStyle": "white", "navigationBarTitleText": "HelloApp", "navigationBarBackgroundColor": "#333", "backgroundColor": "#f8f8f8", "navigationStyle": "custom"}这样咱们就能够自定义顶部导航了。 自定义顶部应用官网插件官网自定义顶部导航文档官网图标库文档根本用法如下: <uni-nav-bar left-icon="left" right-icon="cart" title="题目" left-text="返回" right-text="设置" />本人编写组件有时候官网的自定义顶部导航可能还是达不到咱们的需要,这时候能够本人编写一个自定义顶部导航组件,更加灵便高效。 编写组件在components上面新建文件夹q-navbar和文件q-navbar.vue。 html 局部这部分就是应用flex布局的一个导航,外面是否绑定了很多父组件的音讯,能够自定义右边、两头、左边的图标、名称和是否显示。 还有一个特色就是如果不想应用默认的,能够应用slot插槽本人写适宜本人的那块内容。 <view class="q-navbar" :style="{'color': props.color, 'backgroundColor': props.bgColor, 'border-bottom': `2rpx solid ${props.borColor}`}"> <slot name="navbar"> <view class="q-navbar-left"> <slot name="left"> <view class="q-navbar-item" @click="clickSet('left')" v-if="props.left.show"> <q-icon class="q-navbar-icon" :name="props.left.icon" :size="18" color="#333" v-if="props.left.icon" /> <text class="q-navbar-text" v-if="props.left.name">{{props.left.name}}</text> </view> </slot> </view> <view class="q-navbar-center"> <slot name="center"> <view class="q-navbar-item" @click="clickSet('center')" v-if="props.center.show"> <q-icon class="q-navbar-icon" :name="props.center.icon" :size="18" color="#333" v-if="props.center.icon" /> <text class="q-navbar-text" v-if="props.center.name">{{props.center.name}}</text> </view> </slot> </view> <view class="q-navbar-right"> <slot name="right"> <view class="q-navbar-item" @click="clickSet('right')" v-if="props.right.show"> <q-icon class="q-navbar-icon" :name="props.right.icon" :size="18" color="#333" v-if="props.right.icon" /> <text class="q-navbar-text" v-if="props.right.name">{{props.right.name}}</text> </view> </slot> </view> </slot></view>款式局部.q-navbar { position: fixed; top: 0; left: 0; display: flex; justify-content: space-around; align-items: center; box-sizing: border-box; padding: 0 30rpx; width: 100%; height: $navBarHei; background: $f8; .q-navbar-item { display: flex; align-items: center; width: 100%; .q-navbar-icon { padding: 0 5rpx; } .q-navbar-text { margin-left: 10rpx; } } .q-navbar-left, .q-navbar-right { max-width: 120rpx; width: 100%; } .q-navbar-left { .q-navbar-item { justify-content: flex-start; } } .q-navbar-right { .q-navbar-item { justify-content: flex-end; } } .q-navbar-center { flex: 1; text-align: center; .q-navbar-item { justify-content: center; } }}在uni.scss外面退出: ...

September 1, 2023 · 2 min · jiezi

关于前端:如何使用javascript制作一个网页端3D贪吃蛇游戏附源码

先来看游戏的最终成果: 3D网页版贪吃蛇游戏 上面来具体讲一下如何实现。 该游戏应用Hightopo的SDK制作,总共100多行代码,没有WebGL根底的同学们也可很快把握。 场景初始化首先,咱们对页面进行初始化,包含初始化3D场景,设置高空网格,以及开启事件监听等。次要代码及正文如下: w = 40; // 网格间距m = 20; // 网格行列数d = w * m / 2;food = null;dm = new ht.DataModel();g3d = new ht.graph3d.Graph3dView(dm); // 初始化一个3d场景// 配置网格g3d.setGridVisible(true);g3d.setGridColor('#29B098');g3d.setGridSize(m);g3d.setGridGap(w);// 将3D场景增加到body上面view = g3d.getView();view.className = 'main';document.body.appendChild(view);// 开启事件监听window.addEventListener('resize', function (e) { g3d.invalidate(); }, false);g3d.sm().setSelectionMode('none');view.addEventListener(ht.Default.isTouchable ? 'touchstart' : 'mousedown', function(e){ if(isRunning){ var p = g3d.getHitPosition(e); // 获取以后鼠标点击点在3D场景中的地位 // 依据点击点x,z轴坐标,计算贪吃蛇前进方向 if(Math.abs(p[0]) < d && Math.abs(p[2]) < d){ if(direction === 'up' || direction === 'down'){ direction = p[0] > snake[0].p3()[0] ? 'right' : 'left'; } else if(direction === 'left' || direction === 'right'){ direction = p[2] > snake[0].p3()[2] ? 'down' : 'up'; } } }else if(ht.Default.isDoubleClick(e)){ start(); // 双击启动游戏 }}, false);start();setInterval(function(){ if(isRunning){ isRunning = next(); } }, 200); // 每距离200ms贪吃蛇往前走一步创立食物贪吃蛇每次吃完一个食物,其身材就会增长一段。此时须要创立新的食物并随机放到一个新的地位。创立食物时,其地位不能与上一个地位重合,也不能与以后贪吃蛇身材反复。 ...

September 1, 2023 · 2 min · jiezi

关于前端:设计模式观察者模式发布订阅模式

设计模式wiki中将设计模式分为四类,别离是: 创立模式(creational patterns)构造模式(structural patterns)行为模式(behavioral patterns)并发模式(concurrency patterns)观察者/公布订阅模式属于其中的行为模式。 理论情境公众号订阅说到公布订阅,拿微信公众号举例,就很好了解,有n集体订阅了某公众号,在该公众号公布了推文后,这n集体就会收到推文公布的音讯。 状态更新在理论编程过程中,有一种状况很多人应该碰到过,就是在页面上实现一些与接口的交互操作后,要更新页面的某些状态,但这个状态因为某些起因无奈立刻取得,如果要失去状态的更新后果,能够有两种抉择,一种是反复申请接口以获取,能够是用户手动刷新页面或申请接口、或者交互完结后主动开启接口轮询;第二种是建设长连贯,期待服务端推送后果。第二种形式,就能够算作是一种公布-订阅,订阅者是客户端,订阅内容是页面状态,发布者就是服务端。 为什么说观察者/公布订阅属于行为模式从上述例子就能够了解,本来的行为是客户端被动去获取内容,利用了此模式后,行为变成了客户端订阅(发动长连贯申请)、由服务端来推送音讯,行为形式产生了变动;并且咱们也能够看出,这样做进步了利用的性能,客户端不必要再屡次地去发动申请,缩小了建设网络申请的耗费。 定义在wiki中对这两个模式的作用有着雷同的形容: Define a one-to-many dependency between objects where a state change in one object results in all its dependents being notified and updated automatically.翻译一下: 定义了对象之间一对多的依赖关系,其中一个对象的状态变更,会使其所有依赖对象收到告诉并自动更新。 能够看出,这两个模式解决的是存在一对多依赖关系的单方之间的交互行为。 尽管形容雷同,但两者的理论实现还是存在区别,咱们能够再进一步理解。 观察者模式在这种模式下,一个名为主体的对象会保护其依赖对象(即观察者)的列表,并主动告诉它们任何状态变动,通常是通过调用它们的办法。 该模式通常用于在事件驱动软件中实现分布式事件处理零碎。在这类零碎中,主体通常被称为“事件流”或“事件流源”,而观察者则被称为“事件汇”。 大多数古代编程语言都蕴含实现观察者模式组件的内置事件构造。尽管不是强制性的,大多数观察者实现都应用后盾线程监听主体事件和内核提供的其余反对机制。 公布-订阅模式在软件架构中,“公布-订阅”是一种消息传递模式,在这种模式下,发布者将音讯分类,再由订阅者接管。这与典型的由发布者间接将消息传递给订阅者的消息传递模式造成鲜明对比。 同样,订阅者对一个或多个类别示意感兴趣,只是接管感兴趣的信息,但并不知道有哪些发布者(如果有的话)。 公布-订阅是音讯队列模式的同类,通常是更大的面向音讯的中间件零碎的一部分。大多数消息传递零碎的API中同时反对公布/订阅和音讯队列模型;比方Java音讯服务(JMS)。 该模式提供了更高的网络可扩展性和更动静的网络拓扑构造,但也因而升高了批改发布者和公布数据结构的灵活性。 由上述两个定义可知,在公布-订阅模式中,发布者和订阅者的耦合度更低,订阅者并不知道音讯的发布者,在这种模式下,通常会存在一个第三方的订阅核心,订阅核心接管到发布者的音讯,而后再将音讯分发给订阅者;而在观察者模式中,观察者是通过在主体身上搁置监听器从而间接察看主体,相当于是发布者(主体)间接将消息传递给订阅者(观察者),此时两者的耦合性更高,这种模式下,观察者须要实现对立的接口以供主体调用,而主体则须要保护一个观察者的汇合。 解决的问题观察者模式能够解决以下问题: 应在对象之间定义一对多的依赖关系时,不使对象严密耦合当一个对象更改状态时,应自动更新不限数量的依赖对象一个对象能够告诉多个其余对象通过定义一个间接更新依赖对象状态的对象(主体)来定义对象间的一对多依赖关系是不灵便的,因为它将主体与特定的依赖对象分割在一起。然而,从性能角度,或者对象的实现是严密耦合的(比方每秒执行数千次的低级内核构造),这可能是实用的。在某些状况下,紧耦合对象可能难以实现,而且不容易复用,因为它们会援用并感知许多具备不同接口的对象。 做法形容那么软件设计中的观察者模式具体是怎么做的呢?以下是wiki给出的形容: Define Subject and Observer objects.When a subject changes state, all registered observers are notified and updated automatically (and probably asynchronously).The sole responsibility of a subject is to maintain a list of observers and to notify them of state changes by calling their update() operation. The responsibility of observers is to register and unregister themselves with a subject (in order to be notified of state changes) and to update their state (to synchronize their state with the subject's state) when they are notified. This makes subject and observers loosely coupled. Subject and observers have no explicit knowledge of each other. Observers can be added and removed independently at run time. This notification-registration interaction is also known as publish-subscribe. ...

September 1, 2023 · 2 min · jiezi

关于前端:useI18n基于依赖注入实现国际化功能

前情提要一个月前,我基于React hook 实现前端组件的依赖注入,前文:useIoC:仅一百多行代码实现前端的依赖注入。 同时也尝试基于依赖注入实现一套UI库,目标是验证前端依赖注入的可行性,而后意外解锁 React children 的全新用法:useIoC答疑 & 对children属性的深刻开掘。 UI库已在Github开源:https://github.com/zaoying/uikit在造轮子的过程中,通过一直尝试又找到一些前有未见的最佳实际,还封装一些好用的工具。 上面一一分享给大家 国际化:useI18n业务常常会遇到页面反对国际化的需要,然而组内对于国际化性能的实现却非常简单粗犷,间接在 assets 目录新建 i18n 目录,而后新增 zh-cn.json 或 en-use.json ,而后往里面写对应的中文、英文,如下: { "modal": { "confirm": "Confirm", "cancel": "Cancel" }}这样的做法一开始没啥问题,可随着页面的一直减少,慢慢地文件越来越大,有些翻译太长主动换行后就重大影响可读性。 除此之外,还会常常遇到遗记翻译的难堪情景;或者是文件太长,想找到对应的翻译十分困难。 更令人恶感的是,应用时还须要把 json 文件转换成 Object 对象,而后在应用 TranslateService 翻译一遍,这样的做法切实是过于鸡肋和繁琐。 我在外网以 react i18n 搜寻一番,发现有个比拟受欢迎的我的项目 react-i18next,官网的代码演示如下: <div>{t('simpleContent')}</div><Trans i18nKey="userMessagesUnread" count={count}> Hello <strong title={t('nameTitle')}>{{name}}</strong>, you have {{count}} unread message(s). <Link to="/msgs">Go to messages</Link>.</Trans>呃。。。说实话,这个我的项目的做法和组内大差不差,程度都是一丘之貉。 作为一个七年教训的开发,背过的八股文不可胜数,我很天然就想到通过依赖注入的形式实现国际化性能,并且天经地义地认为业界应该有很多的优良实际,而后事实却狠狠地打我的脸。 为什么当初前端连个优雅的国际化工具都找不到? 难道那些在面试的时候,靠八股文尴尬他人的“高手”,预计也是死记硬背、冒名顶替的水货,目标仅仅就是为了PUA老实人? 吐槽结束,回到正题,我的解决思路是依据不同 locale 别离创立独立的 context ,而后通过 navigator.locales 获取对应的 context 。 首先,先定义一个词条 ModalDict ,并且指定 locale 为 en-us: ...

September 1, 2023 · 5 min · jiezi

关于前端:用友繁荣开发者生态之树结商业创新之果

《论诗》有云:满眼活力转化钧,天工人巧日争新。人类借助丰盛的工具、先进的方法论,不断创新,推动时代“苟日新、日日新、又日新”。在数智化发展的明天,翻新逐渐进入数字化、智能化技术双驱动的商业翻新阶段。过程中,数智化技术与全新商业模式互为推动力,一直优化企业经营模式,激发企业生机,极大晋升社会生产力。那么,有生命力的商业翻新范式是什么样的?如何让更多企业,甚至集体开发者领有这种创新能力?用友的答案是,以凋敝的开发者生态体系,让商业翻新更简略、更高效、更有价值。在各种翻新模式满天飞的明天,这无疑是一种直击商业翻新实质的思路。设想一下,在这里没有“身份限度”,无论是企业、业余IT人员,还是在校学生,抑或是社会用户,都能在这一体系的助力下,疾速构建出所须要的数字化利用,这是不是翻新的现实模式?还能实现成绩转化,是不是一条优质的商业变现门路?8月18日,用友2023寰球商业翻新大会·企业数智化生态峰会举办,其中的ISV生态专题论坛探讨了数智化生态格局、增长空间以及用友为ISV搭档提供的技术、政策、投资等成长全门路赋能体系等。透过这一论坛,笔者更加认同用友开发者生态体系的价值。咱们清晰地看到,用友开发者生态体系“枝繁叶茂”,越来越多的开发者正在将心中的“一团锦绣”,转化为商业翻新的硕果。正如用友网络副总裁邹达所说,“用友开发者生态体系正在全面使能开发者,构筑数智生态新将来。”1施展大智慧,构建开发者生态体系商业生态体系仿佛成了大企业的“标配”,他们通过构建技术生态体系、合作伙伴生态体系等各类生态体系,凝聚更多力量,推动行业前行。但现实情况是,大部分的生态体系“生命力”差,或“中道崩殂”,或成了陈设,很难开释出该有的价值。仔细分析,这类生态体系有两个共同点:一,生态体系中每一个“分支”不够扎实,性能和服务不够欠缺,无奈满足生态成员的需要。二,“分支”和“分支”之间连贯不够顺畅,合作不够严密,无奈造成生态闭环。这两点导致生态系统不足继续的吸引力与自我成长的能力,最终走向“没落”。一个有生命力的生态体系须要具备“阳光”“水”“土壤”等丰盛资源,能以继续的滋润能力,让生态体系之中的每一个参与者,享受到生态的多样性,取得更强的创造力。从组成来看,用友开发者生态体系欠缺且有生机。它以用友开发者核心为外围,基于用友BIP商业翻新平台的iuap技术底座,聚合海量开发资源,为开发者提供产品反对和服务,帮忙他们实现麻利商业翻新。具体来看,开发者的开发过程其实是一个闭环行为,他们须要功能完善、资源丰盛的平台,疾速开发出所须要的利用;问题与教训还心愿与人分享,一直成长;开发进去的利用成绩还须要疾速推向市场,实现变现;如果想一直进阶,有资质的考试是必然。面对上述需要,用友开发者生态体系全副笼罩。在YonMaster开发者认证核心,开发者能够依据本人的能力加入相干考试,拿到职业认证;YonBIP开发者社区汇集了泛滥业余的开发者,大家在这里论述需要,解疑答惑;YonMaker生态定制平台帮忙客户搭档承接生态我的项目;YonStore云市场则与合作伙伴独特公布生态利用。而且,每一部分性能和服务都非常欠缺。拿加入YonMaster开发者认证核心来说,它针对不同产品类别、用户岗位及成长阶段,为开发者提供线上线下双培训,体系化晋升YonBuilder低代码开发能力,帮忙他们实现高级到专家的进阶。再比方,YonMaker生态定制平台上汇集了APP定制开发、小程序开发、企业业务零碎、网站建设、第三方服务等各类型客户的软件定制等我的项目需要,此外YonMaker作为客开业务经营平台,进一步增强了业务管理的体系化能力,以数据驱动平台建设和业务撑持,以经营保障流程运行与我的项目交付。那么,如何评估这一生态?用友开发者生态“始于开发者,而又高于开发者”,以开发者为切入点,但笼罩了生态单干与服务、商机发现与转化等更高的商业翻新行为,造成了生态闭环,盘活了生态。2低代码思维,让商业翻新如此便捷用友开发者生态最重要的思维是低代码思维。家喻户晓,低代码是以后IT开发的重要趋势。Gartner预计,到2024年将有75%的企业应用各类低代码开发平台来满足IT利用及企业开发的需要,到2025年整体低代码开发市场规模将达到290亿美元。截止2022年,用友开发者生态规模已达到了110万。这一问题之下,用友YonBuilder低代码平台的技术普惠能力是重要根底。低代码开发的目标是助力开发人员高效、高质量的开发,须要做到足够“低”代码。用友YonBuilder提供以元数据驱动、点击拖拽+自动化代码生成和多端编译的技术,与开放平台、连贯集成平台、DevOps平台无缝整合,同时反对从开发、调试、公布、治理到经营的全生命周期治理,能从各个方面做到“低”代码,满足开发者多样化的开发需要。更精确来讲,YonBuilder做到了技术普惠。体现在三点:第一,促成全民翻新。以前,开发只有有业余IT背景的人才能参加。当初,身处商业翻新时代,只有你有想法,就可借助低代码开发平台实现。用友YonBuilder冲破工具、平台的限度,撑持社会开发者、生态搭档、企业IT团队、院校群体等多画像生态用户,让每个人都有商业翻新的机会。比方,集体开发者多是小场景开发,开发需要更加多元化,YonBuilder开发门槛低,能让他们以搭积木的形式落地想法。面对私有云低代码产品的企业用户,YonBuilder能针对对业务需要,帮忙他们实现疾速迭代。第二,兼具开发效率与品质。以后市场倒退迅速,商机转瞬即逝。无论是企业还是集体开发者,都须要在最短的工夫内落地想法,疾速造成利用并推向市场。YonBuilder提供通过原型式、可视化开发工具,帮忙企业疾速构建利用,撑持企业业务翻新。同时,依据模型扩大、页面模型扩大、流程&规定扩大、自定义API 扩大,帮忙各级开发者在原厂利用的根底上扩大数据、规定、流转形式,并与新利用联动,效率更高。更为重要的是,还能基于生态级、客户级全新开发、扩大开发,帮助开发者实现业务翻新,并爱护开发成绩。第三,提供丰盛的开发资源。开发者“天马行空”的想法,须要借助丰盛的资源去实现。因而,资源够不够丰盛、能不能撑持开发者的想法落地等,很是考验低代码平台。YonBuilder集成资产包、模板库、数字化利用等,让开发者有更好的开发体验。比方,丰盛的资源包能与第三方业务零碎对接,以及成熟的数字利用,能帮忙开发者实现数据流通以及数据分析。再比方,各种挪动原生插件,让企业疾速构建出挪动利用。3促生态凋敝,谋数智将来从倒退历程来看,用友依靠原有生态能力,不断丰富平台资源市场,且随着生态能力的加强,用友逐步造成了平台+品牌的双驱动,吸引更多开发者以及企业的退出,推动生态体系的凋敝倒退。而且,为实现生态的短暂稳固倒退,用友一直赋能生态体系,为生态注入更多技术、新理念和服务,促成生态体系衰弱倒退。“不谋全局者,有余谋一域”。用友从依靠生态、到丰盛生态、再到赋能生态,最终是心愿与宽广开发者在生态体系中共赢、共生、共荣,谋取数智将来,走向商业翻新。这是用友的职责所在,也是能力所在。在接下来的倒退中,用友将持续秉承生态凋谢、生态共赢的准则,持续降级开发者生态,为财务、人力、供应链等支流畛域的开发者提供弱小的开发能力,同时帮忙电商、社交、视频等方面的开发者高效构建出相干的挪动端利用,让翻新更简略、更高效、更有价值。“独行者速,众行者远”,商业翻新是泛滥开发者共同努力能力达到的“此岸”。面向未来,咱们置信,用友会通过一直凋敝开发者生态之树,结出数智翻新之果!

September 1, 2023 · 1 min · jiezi

关于前端:GaoNeng我是如何为OpenTiny贡献新组件的

本文作者:GaoNeng 大家好啊,又是我GaoNeng。最近在给OpenTiny做奉献,感觉renderless这个架构还是挺有意思的,就奉献了一个color-picker组件,简略写篇文章略微记录一下。 也欢送敌人们给 TinyVue 开源我的项目点个 Star 反对下: https://github.com/opentiny/tiny-vue 浏览完本文,你将会取得如下播种 HSV,HSL,HEX,RGB的区别HSV色调空间下,SV到XY的双向转换ColorPicker 组件的实现原理OpenTiny 新组件开发全流程1 事件的起因故事的产生十分的偶尔。我在翻opentiny仓库issue的时候,偶尔看到了这么一条 之前也在掘金上看过opentiny的介绍,感觉还不错,然而又抢不到组件。这一次终于让我抢到一个闲暇组件了,于是我立即就回复了。 2 初步剖析个别写组件前只思考两个问题 长什么样逻辑是什么color-picker色彩抉择组件用于在应用程序和界面中让用户抉择色彩。它是一个交互式的元素,通常由一个色调光谱、色相环和色彩值输入框组成,用户能够通过这些元素来抉择所需的色彩。ColorPicker的次要性能是让用户可能准确地抉择特定的色彩,以便在应用程序的各种元素中应用。 组件成果如下: ColorPicker 组件次要蕴含四个子组件 饱和度抉择, 色相抉择, alpha抉择, 工具栏。比较简单,所以就没画图。次要的问题在于逻辑,也就是抉择什么样的色调空间更贴合用户的日常应用和直观体验。 常见的色调空间分为 HSV, HSL, CMY, CMYK, HSB,RGB, LAB, YUB, YCrCb 前端最常见的应该是HSV,HSL,RGB这三种。LAB, YUB, YCrCb在日常业务中比拟少见。 3 色调空间基础知识HSV, HSL, HEX, RGB 都是什么呢? HSV,HSL,RGB都是色调空间。而HEX能够看作是RGB的另一种表达方法。 3.1 什么是色调空间?色调空间是为了让人们更好的意识色调而建设的一种形象的数学模型,它是将数值散布在N维的坐标系中,帮忙人们更好地意识和了解色调。 例如RGB色调空间,就是将RGB重量映射在三维笛卡尔坐标系中。重量的数量代表该重量的亮度值。下图是通过归一解决的RGB色调空间示意图 而HSV与HSL色调空间都是将色彩映射到了柱坐标系。下图展现了HSV与HSL的示意图 HSV HSL 3.2 HSV,HSL,RGB 孰优孰劣?理解了HSV,HSL,RGB色调空间及其表达方法,咱们须要思考到底哪一种色调空间对于人类更加的直观呢?要不问问万能的音理吧 啊这,她说不晓得。那看来只能问问万能的chat-gpt了 不愧是你,chatgpt总是能救我于危难之间。不过话又说回来,HSL与HSV都很直观,只是一个是V(Value)另一个是L(lightness)。两种色调空间的柱坐标系如下图所示 HSV HSL 能够看到,HSV越偏差右上角饱和度和亮度越高。但HSL则是偏差于截面的两头饱和度和亮度越高。 在PS和其他软件中,也大都抉择了HSV作为选色时的色调空间。为了放弃对立,color-picker组件也抉择了HSV作为选色时的色调空间。 3.3 SV与XY的双向转换饱和度抉择的时候,咱们须要将XY重量转为SV重量。这存在一种表达方式。SV与XY存在一种计算关系 其中width与height均为容器的宽度和高度, XY为光标地位。 4 组件设计和一般组件开发不同,tinyvue是将逻辑抽离到了renderless下。这样做能够让开发者更着重于逻辑的编写。单测也更好测,测试的时候如果你想,能够只测renderless和被形象的逻辑,UI层面甚至能够意外(因为UI次要是各个库来做渲染和依赖跟踪,单测是最小的可测试单元,所以库能够mock掉,只测renderless)。 一个残缺的组件至多要有以下几个因素 组件UI逻辑类型文档中文英文测试单测E2E测试4.1 目录梳理tiny-vue 简化目录如下所示. 带有!前缀的文件示意必选,?前缀的文件示意可选 例如!index.js示意index.js是必选的。 examples docs public sites <mpt> app ![component-name] !webdoc ![component-name].cn.md // 中文文档 ![component-name].cn.md //英文文档 ![component-name].js // 组件文档配置 ![demo].vue //示例文件 ?[demo].spec.ts //示例的e2e测试 overviewimage //图标 resource webdoc //对应使用指南 config.js !menu.js // 目录文件,须要在此追加你的组件packages renderless src ![component-name] ?[component-name] vue.ts index.ts //函数形象的中央 vue.ts index.ts //函数形象的中央 theme // 桌面端款式 src ?[component-name] // 有些组件不肯定须要款式(例如: config-provider) index.less // 款式 vars.less // 变量申明 theme-mobile // 挪动端款式 src ?[component-name] index.less // 款式 vars.less // 变量申明 vue src ![component-name] !__tests__ ![component-name].spec.vue // 至多要有一个单元测试文件 src pc.vue // 桌面端模板 ?mobile.vue // 挪动端模板,如果你的组件不须要挪动端那么能够删除 index.ts // 组件导出 package.json4.2 模块设计在tiny-vue下输出 pnpm create:ui color-picker 就能够创立最根本的模板了。 ...

September 1, 2023 · 4 min · jiezi

关于前端:潜龙读书会-毛选1中国革命战争的战略问题读后感梳理

毛选我还远远没有读完,两头插了十分多的事件,也包含我先读了其余的书,但并不是说我感觉毛选没用、枯燥乏味,这是齐全没有的。相同,我极力推荐大家浏览毛选,这真得是十分好的一本经验之谈的著述。 断断续续地,我每次读毛选的文章,都能深深地感触到毛主席的捕风捉影、与时俱进的思考形式和做事办法。直到我前阵子读完毛主席总结第二次国内革命战争的教训而写的《中国革命战争的策略问题》著述,感触更加强烈。这不是单纯的文章,而是一本还没写完的著述,在拜读的过程中,我时不时地就有本人的感想。直到读完,我还意犹未尽,连忙做总结梳理,并记录我的读后感。 总结:捕风捉影如果让我用一个词来总结,我浏览毛选1至今最大的感触的话,那就是捕风捉影。次要体现在以下几个方面: 尊重事实。做事件不盲从,而是尊重客观事实,具体问题具体分析。尊重倒退。抵赖事物的动静倒退法则,认为每个人都肯定要一直成长。尊重失败。抵赖失败,并踊跃面对,总结经验,成长本人。尊重事物之间的分割。洞悉事物之间的关系,不论是对等的敌我单方,还是全局与部分之间的关系。一直学习和锤炼剖析能力,能够主观地剖析事物之间的动态分割,同时抵赖事物之间的分割是动静倒退变动的,一直晋升本人的预判能力。 《中国革命战争的策略问题》读后感梳理节选关注公众号,并回复【毛选策略问题】能够获取残缺的读后感梳理接下来,我节选一些本人比拟有感触的读后感分享给你们。 “大家明确,不管做什么事,不懂得那件事的情景,它的性质,它和它以外的事件的关联,就不晓得那件事的法则,就不晓得如何去做,就不能做好那件事。” 【我的感想】 技术学习也是一样,不去理解这项技术的背景来由、利用范畴,不去探索它的原理,不去剖析利用这个技术之后对于原来零碎的影响,就是没学会这项技术,也就不能利用好这项技术。 “只有钻研个别和平的法则就得了,具体地说,只有照着革命的中国政府或革命的中国军事学校出版的那些军事条令去做就得了。” “咱们诚然应该尊重过来流血的教训,然而还应该尊重本人流血的教训” “只有钻研俄国革命战争的教训就得了,具体地说,只有照着苏联内战的领导法则和苏联军事机关颁布的军事条令去做就得了。” “咱们还应该尊重中国革命战争的教训,因为中国反动和中国红军又有许多非凡的状况” “一九二六年至一九二七年的北伐战争的教训是最好的,咱们应该学习它,具体地说,学北伐战争的长驱直进和篡夺大城市。” “北伐战争的教训是应该学习的,然而不应该刻板地抄用,因为咱们现时和平的状况曾经变动了” 【我的感想】 这跟咱们落地某项技术、流程、标准很像,不能生吞活剥,而是要具体问题具体分析,依据理论状况(团队人员状况、团队技术栈状况、团队我的项目现状等)来落地。我工作过的例子中,腾讯 PCG 想要落地 Facebook 的研发流程,真得是一地鸡毛。 “有一种人,抱着一技之长和真知灼见,再也没有提高,这对反动虽则在一地一时有些作用,然而没有大的作用。” 【我的感想】 人不能墨守成规,肯定要一直成长,灵便变通,与时俱进。 “指挥全局的人,最要紧的,是把本人的注意力摆在关照和平的全局下面。” “任何一级的首长,该当把本人留神的重心,放在那些对于他所指挥的全局说来最重要最有决定意义的问题或动作上,而不该当放在其余的问题或动作上。说重要,说有决定意义,不能依照个别的或形象的状况去规定,必须依照具体的状况去规定。” 【我的感想】 这是高级工程师、架构师、管理者必须转变并把握的思维。肯定要站在全局的角度,从整个团队、整个零碎、整个我的项目的视角去具体问题具体分析,本人的工作重心应该放在主要矛盾下面,而不是细枝末节的部分上。 “学习和平全局的领导法则,是要用心去想一想才行的。” “然而全局是由部分形成的,有部分教训的人,有战斗战术教训的人,如肯用心去想一想,就可能明确那些更高级的货色。” “这就是说,可能把和平或作战的所有重要的问题,都提到较高的原则性下来解决,达到这个目标,就是钻研策略问题的工作。” 【我的感想】 全局思考并不是那么高大上,“如肯用心去想一想”,这个意思就是意识转变,只有转变了意识,就可能学会全局思维。 有部分教训是把握全局的前提,就像咱们程序员的职业倒退一样,不要刚毕业入职就妄想着要去负责外围我的项目、简单零碎。应该先深刻把握部分(某项技术、某个模块、某个畛域),循序渐进,一通百通,就可能更好的成长到须要全局思维的更高阶的职位。 到这里插一句,强烈建议肯定要精读第一章:如何钻研和平。外面讲述的思考形式和做事办法的经验之谈真得叹为观止,读完你肯定会有播种。如果你感觉工夫不够的话,那第一章中的第三大节“策略问题是钻研和平全局的法则的货色”,是必读文章,这篇文章次要讲全局(策略)和部分(战斗战术)关系的,这篇文章太精华,其余内容能够不读,这一大节必读。 “要达到有勇无谋这一点,有一种办法是要学的,学习的时候要用这种办法,应用的时候也要用这种办法。什么办法呢?那就是熟识敌我单方各方面的状况,找出其口头的法则,并且利用这些法则于本人的口头。” “这些过来的和平所留给咱们的血的教训,应该着重地学习它。这是一件事。然而还有一件事,即是从本人教训中考据这些论断,排汇那些用得着的货色,回绝那些用不着的货色,减少那些本人所特有的货色。” “读书是学习,应用也是学习,而且是更重要的学习。从和平学习和平 —— 这是咱们的次要办法。没有进学校机会的人,依然能够学习和平,就是从和平中学习。” 【我的感悟】 不要死读书,要从实际中学习并总结,成为本人的技能。 如何能力称为长于学习?捕风捉影,活学活用。 “踊跃进攻,又叫守势进攻,又叫决战进攻。消极进攻,又叫专守进攻,又叫单纯进攻。消极进攻实际上是假进攻,只有踊跃进攻才是真进攻,才是为了反攻和防御的进攻。” 【我的感悟】 带有长远目标的口头才是有意义的,得过且过是没有意义的。 “决定退却起点究在何处,须以整个局势作出发点。在部分局势看来有利于我转入反攻,如果不是同时在整体局势看来也对我无利时,则据此决定退却起点,就是不正确的。因为反攻的开始,必须计算到当前的变动,而咱们的反攻总是从部分开始的。” “对于丢失土地的问题,常有这样的情景,就是只有丢失能力不丢失,这是“将欲取之必先与之”的准则。” 【我的感悟】 咱们常常会被短期利益、局部利益所一叶障目,因而大局观、整体利益的视角十分重要。要站在全局的视角来看部分状况倒退的影响,这才是正确的。 “那种走一步看一步的领导形式,对于政治是不利的,对于和平也是不利的。走一步应该看那一步的具体变动,据此以批改或倒退本人策略战斗打算,不这样做,就会弄出冒险直冲的谬误。然而贯通全策略阶段乃至几个策略阶段的、大体上想通了的、一个长期间的方针,是绝不可少的。” 【我的感悟】 有一个长期指标和长期打算的意义十分重要,这个打算是能够调整的,依据每一步走完之后的变动来调整计划,这才是正确的做事办法。 “欲突破弱小的“进剿”军,反攻的第一个战斗,关系十分之大。第一个战斗的胜败给予极大地影响于全局,乃至始终影响到最初的一个战斗。” “第一,必须打胜。必须敌情、地形、人民等条件,都利于我,不利于敌,确有把握而后入手。否则宁肯让步,持重待机。” “第二,初战的打算必须是全战斗打算的有机的尾声。没有好的全战斗打算,绝不能有真正好的第一仗。” “第三,还要想到下一策略阶段的文章。” 【我的感悟】 这个跟空降到全新团队的做事要领相似,不要一上来就高大上,假大空,而是要抉择一个适当的发力点,初战必胜,获取成绩,获得领导和团队的信赖。同时,第一个我的项目也是本人后续工作的开始,要有全盘打算。因而,空降新团队的 landing 肯定要审慎,并且准备充分。 “无论处于怎么简单、重大、惨苦的环境,军事指导者首先须要的是独立自主地组织和应用本人的力量。被敌逼迫到被动位置的是常有的,重要的是要迅速地复原被动位置。如果不能复原到这种位置,下文就是失败。” “集中兵力之所以必要,是为了扭转敌我的局势。” “咱们的策略是“以一当十”,咱们的战术是“以十当一”,这是咱们制胜敌人的基本法令之一。” 【我的感悟】 要被动调动资源和力量,造成部分劣势,以多打少,能力突破僵局,造成影响全局的变动。 那些在曾经有龙头企业的行业中异军突起的公司,无不是这样的。在大平台下,通过垂类、长尾,发现大平台疏忽掉的、关照不到的用户群体,有针对性的集中资源,就能够造成部分劣势位置,从而异军突起,比方拼多多。 其实我曾经算是读了这本著述 2 次了,第一次精读,而后在总结梳理的时候相当于又读了一次,播种真得很大。我梳理的内容只是冰山一角,心愿你也能够一起来浏览毛选,播种本人的感悟。 ...

September 1, 2023 · 1 min · jiezi

关于前端:图扑软件-参展用友-2023-全球商业创新大会

2023 年 8 月 18 日,以“数据驱动,智能经营”为主题的用友 2023 寰球商业翻新大会,在上海国家会展中心圆满举办。此次大会旨在汇聚寰球商业智慧,用数智化翻新客户价值、开释企业潜能,助力更多的企业成为数智企业。 图扑软件(Hightopo)作为用友的策略生态搭档受邀参展本次峰会,与企业领导、业界同仁、业界专家,独特研究新期间中国企业如何利用数字化技术继续进行商业翻新,晋升治理经营能力,推动企业数智化转型。 在沉迷式“数智企业体验馆”内,图扑软件展区凭借丰盛的可视化内容,且步人后尘的画面格调,吸引了泛滥领导、业界专家、参展商和观众的驻足参观与征询。大家对所展现的新技术、新成绩以及将来的发展前景,体现出了浓重的趣味。 参展期间,图扑软件展现了基于自研引擎 HT for Web 打造的一站式数字孪生可视化解决方案。计划涵盖电力能源、孪生工程、电信机房、智慧交通、园区楼宇、智慧水务等多个畛域,深度交融了包含集控核心、设施运行、故障诊断、智慧巡检、应急救济等多类型数智化经营体系的业务场景。目前,图扑软件提供二三维可视化轻量化引擎、GIS、BIM 以及视频交融等技术,可接入歪斜摄影、GIS 空间信息数据、智能物联网 IoT 数据以及大数据系统平台等数据信息。 融聚数智新生态,创赢行业新价值推动数智化转型,成为数智企业,已成为新期间企业高质量倒退的外围门路之一。随着以大模型为根底的 AI 遍及利用时代的到来,商业翻新从此前的数字商业进入到数字化和智能化并重的全面数智商业翻新的新阶段。 峰会上,用友携手业界大咖、生态搭档、企业代表、投资人、业余学者等万余人,深入探讨主题化交融翻新、全局数据治理、遍及 AI 利用、降级数智底座等企业关注的热点话题。期间,诸多出名企业家和专家学者发表了精彩演讲,用友网络董事长兼 CEO 王文京在致辞中示意,长期单干、共赢倒退是用友的搭档单干方针。 自图扑软件与用友达成生态搭档策略单干以来,单方始终保持严密单干,依靠各自的技术积攒和行业实际,在工业、交通、城市、通信等多业务场景交融翻新,累计为上百家企业提供专业化、行业化、规模化的数智化综合服务。 深耕行业,做企业服务翻新的生态引领者作为国内外当先的 2D 和 3D 数据可视化前端图形技术畛域高科技创新型企业,图扑软件致力于成为企业数字化转型的最佳赋能搭档。专精可视化技术我的项目劣势,通过实时展现运维、生产、治理等信息画面,间接升高企业运维老本,助推企业实现全产业链数字化和智能化的将来产业新模式。 图扑软件自研 HT for Web 产品可帮忙传统企业打造线上 3D 监控场景,通过姿态控制、实时数据监测显示、设施近程管制以及零碎漫游等人机交互性能,实现对三维模型的全面出现和精准操作。使得企业可能更加高效、智能地进行生产和治理,为实现可继续倒退提供了重要的技术支持。 先后与泛滥行业龙头企业达成密切合作,利用自研 HT for Web 产品,为其提供智能化革新我的项目服务。已笼罩工业制作、楼宇园区、轨道交通、城市政务、水务能源、新基建、智慧运维、国防公安、医疗科研、金融军工等各个行业。 数百个工业互联网可视化我的项目施行教训,造成了⼀整套实践证明高效开发流程和生态系,可疾速实现现代化、高性能、跨平台桌面 Mouse/挪动 Touch/虚拟现实 VR 图形展现成果及交互体验。 您能够至图扑软件官网查看更多案例及成果:图扑软件 - 构建先进 2D 和 3D 可视化所须要的所有

September 1, 2023 · 1 min · jiezi

关于前端:五大优势让你坚定选择低代码开发平台

随着数字化时代的到来,企业纷纷寻求新的形式来进步业务效率、降低成本,并满足一直变动的客户需要。在这个过程中,低代码平台逐步成为一种备受瞩目的技术,因为其具备五大非凡劣势,可能极大地提高企业数字化转型的效率。本文将具体介绍这五个劣势,并探讨低代码平台如何帮忙企业实现数字化转型。01升高开发成本,提高效率低代码平台具备显著的老本劣势,因为其提供了一套易于应用的工具,可能帮忙企业在开发过程中缩小工夫和人力老本。通过应用低代码平台,企业能够利用可视化编程工具进行疾速开发,从而大大提高开发效率。此外,低代码平台还能够为企业提供标准化的开发流程,使得开发过程更加标准、高效。02疾速迭代,满足业务需要低代码平台可能实现疾速迭代,以满足企业的业务需要。因为低代码平台的开发过程绝对简略,企业能够更快地实现应用程序的开发和部署。此外,低代码平台还反对实时更新和调试,使得应用程序可能及时响应业务需要的变动,从而放慢了企业的翻新速度。03优化业务流程,晋升业务能力低代码平台能够帮忙企业优化业务流程,晋升业务能力。通过集成各种应用程序和零碎,低代码平台能够实现企业数据和流程的对立治理,从而进步业务解决的效率和品质。此外,低代码平台还能够为企业提供可视化的流程设计和调试工具,使得优化业务流程变得更加简略。04弱小的可扩展性,满足不同需要低代码平台具备弱小的可扩展性,可能满足企业的不同需要。随着企业的倒退和业务变动,企业可能须要一直扩大其应用程序和零碎性能。低代码平台提供了丰盛的扩大能力和自定义选项,使得企业能够依据本身需要进行灵便的扩大和定制。05进步开发品质,缩小谬误低代码平台通过提供可视化的编程工具和事后编写的组件,使得开发过程更加简略和高效。这不仅进步了开发速度,还保障了开发品质。因为低代码平台应用了事后构建的组件,开发人员能够更快地创立应用程序,缩小了人为谬误和编码谬误的可能性。此外,低代码平台还提供了自动化的测试工具和集成环境,进一步保障应用程序的品质和稳定性。除上述提到的劣势,低代码平台还具备以下特点:简略易用的界面:低代码平台的可视化编程工具和预置组件使得开发过程更加简略易懂,不须要编写大量的代码,非技术人员也能疾速把握。疾速部署:低代码平台通常提供疾速部署工具,使得应用程序可能疾速部署到生产环境中,缩小了部署工夫和人力老本。安全性:低代码平台通常提供多种安全措施,包含数据加密、身份验证等,以保障应用程序的安全性。可视化数据分析:低代码平台通常提供可视化数据分析工具,能够帮忙企业疾速创立数据分析应用程序,从而更好地理解业务状况并做出决策。跨平台:低代码平台通常反对多种操作系统和数据库,使得开发人员能够更快地创立跨平台的应用程序。综上所述,低代码平台具备显著的劣势,包含升高开发成本、疾速迭代、优化业务流程、弱小的可扩展性和进步开发品质。这些劣势使得低代码平台成为企业数字化转型的无力工具。将来,随着技术的一直倒退和翻新,低代码平台将进一步优化和扩大其性能,帮忙企业更好地应答数字化时代的挑战。

September 1, 2023 · 1 min · jiezi

关于前端:YonBuilder课堂入职申请单的创建流程

YonBuilder是面向企业组织和集体开发者的低代码开发平台,实现可视化、低代码/无代码开发。提供以元数据驱动、点击拖拽+自动化代码生成和多端编译的技术,与开放平台、连贯集成平台、DevOps平台无缝整合,造成笼罩业务建模,开发、集成、测试、部署、运行、运维的残缺开发构建服务。 明天咱们从简略的“入职申请单”率领大家认识一下YonBuilder的应用流程。能力清单01编号能力清单1审批流2页面设计器基本操作、页面增补字段3自动编码配置操作流程02实体033.1、入职申请援用接口中勾选自动编码,填写后点击保留,确定没有问题,列表页公布实体 设置编码规定标签   四、页面建模044.1、创立入职申请页面切换至页面建模页签。点击右上角新建页面,抉择单卡,点击下一步填写页面名称,抉择元数据,点击确认按钮页面主动生成4.2、调整卡片页面布局点击进入PC端页面设计器切换层级页面,抉择卡片组,右键插入表单 别离选中卡片组下表单,批改其容器名称 拖拽操作台根底控件至各个表单容器内,造成以下布局罕用技巧,管制是否显示暗藏元素4.3、增补字段例如咱们咱们要减少一个工资字段实体减少字段点击保留并公布进入【入职申请卡片】页面设计器,增加工资字段   五、配置审批流055.1、创立审批流 5.2、配置审批流点击进入流程设计器配置审批人一(为不便测试,设置为发起人)配置审批人二(为不便测试,设置为发起人)  六、测试06  看了整篇文章后,是否也想入手试试,移步用友开发者核心网站,点击利用构建,即可开启低代码开发旅程。

September 1, 2023 · 1 min · jiezi

关于前端:如何给个数据库就可自动生成完整后台系统可视化添加定制功能达到摸鱼神之境

前言谈到软件开发,总是避不开管理系统的,只有是一个零碎总会附带 >=1 数据的后盾管理系统。而管理系统的风貌就是性能反复、量大、管饱。可看似性能类型,却总不是反复的所以总是要将这些相似的性能一个一个一遍一遍的手动开发,就会耗费大量的工夫与人力。可是总是写这些反复没养分的页面,为人者总会心有不甘的。所以就踊跃出一大批帝境强人,制作出各种一键生成增删改查性能的工具插件想来逆天改命。java 者的尤甚,而前端生成工具的略少,兴许是框架层出不穷缘故,我所知有若依之列。而后试了一下的确能够,不过要一个一个生成而后解压复制到本地对应目录,当数据表数量达到半步百张之境还是让人头疼不已。不过却实节约了大量工夫与人力。随之而来的是,事实上每个页面并不是纯增删改查之能,如:没有删除性能、没有查问行、某字段不能够编辑、A 数据依赖 B、操作列按状态展现、有审批性能等等。 思考即便做为一条炼气境的小杂鱼,也还是想进一步思考如何去更好的解决此列问题。所以我在想,如果给我一个数据库(或创立库的 sql 构造)如何能最快实现我的需要的计划。 想法没错,还是应用前后拆散生成计划,因为支流。服务端思路 :陈词滥调,没什么特地新鲜的办法。读取表构造生成对应 PO、VO、service、controller 等等。办法就是先创立几个模板(动态文本原样输入、能够传入变量输出不定文本),而后按需将表构造解析传入模板,生成文件到对应目录,到也不难。这里咱们为了不便,不必去生成 sql 就用 mybatis-plus, 如咱们的 controller 模板: package ${package};import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.baomidou.mybatisplus.extension.plugins.pagination.Page;import org.springframework.beans.BeanUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.transaction.annotation.Propagation;import org.springframework.transaction.annotation.Transactional;import org.springframework.web.bind.annotation.*;import java.util.List;import ${impPo};import ${impVo};import ${impService};@EnableAutoConfiguration@RestController@RequestMapping(value="/${strutil.toLowerCase(entityName)}")public class ${entityName}Controller { @Autowired private ${entityName}Service ${varName}Service; /** *${tableComment}增加 **/ @RequestMapping(value="/save", method=RequestMethod.POST) @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) public Object save${entityName}( @RequestBody ${entityName}${poSuffix} ${varName}) { return ${varName}Service.save(${varName}); } /** *${tableComment}批改 **/ @RequestMapping(value="/update", method=RequestMethod.POST) @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) public Object update${entityName}( @RequestBody ${entityName}${poSuffix} ${varName}) { return ${varName}Service.updateById(${varName}); } /** *${tableComment}增加或批改 **/ @RequestMapping(value="/saveOrUpdate", method=RequestMethod.POST) @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) public Object saveOrUpdate${entityName}( @RequestBody ${entityName}${poSuffix} ${varName}) { return ${varName}Service.saveOrUpdate(${varName}); } /** *${tableComment}查找 **/ @RequestMapping(value="/search", method = RequestMethod.POST) public Object search${entityName}(@RequestBody ${entityName}${voSuffix} params) { ${entityName}${poSuffix} ${varName}${poSuffix} = new ${entityName}${poSuffix}(); BeanUtils.copyProperties(params, ${varName}${poSuffix}); Page<${entityName}${poSuffix}> page = new Page<>(params.getPageNo(), params.getPageSize()); QueryWrapper<${entityName}${poSuffix}> queryWrapper = new QueryWrapper<>(${varName}${poSuffix}); return ${varName}Service.page(page, queryWrapper); } /** *${tableComment}通过id删除 **/ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) @RequestMapping(value="/removeById/{id}", method=RequestMethod.POST) public Object remove${entityName}ById(@PathVariable Integer id) { return ${varName}Service.removeById(id); } /** *${tableComment}删除 **/ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) @RequestMapping(value="/remove", method=RequestMethod.POST) public Object remove${entityName}(@RequestBody ${entityName}${poSuffix} ${varName}) { return ${varName}Service.remove(new QueryWrapper<>(${varName})); } /** *${tableComment}删除多条 **/ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) @RequestMapping(value="/removeByIds", method=RequestMethod.POST) public Object remove${entityName}ByIds(@RequestBody List<Integer> ids) { return ${varName}Service.removeByIds(ids); }}能够看到办法名,门路等都能够在模板里批改。启动我的项目裸露办法调用就可能生成根本了性能了,那么后端简略的增删改查性能接口就好了 ...

September 1, 2023 · 3 min · jiezi

关于前端:如何找到一款合适的低代码开发平台

适应传统企业数字化转型的大势,低代码在近几年始终备受业界关注。依据 Gartner 预测,到 2025 年,70% 的新利用将由低代码技术实现开发,而这也使得泛滥厂商纷纷踏入低代码产品赛道,不仅让一大批企业在做技术选型时目迷五色,也让泛滥开发者不能很好地了解低代码产品的外围外延以及对业务带来的理论价值。 身处数字化转型的浪潮下,如何找到一款适合的低代码开发平台?又是否存在一种门路可能帮忙开发者更快捷、更高效地体验低代码产品?对于云时代的开发者而言,他们又该如何疾速解锁从学到用的一站式体验?如果你也期待上述问题失去解决,全新降级的用友开发者核心或者是一个不错的抉择。 用友开发者核心面向用户提供一站式低代码产品反对和服务,基于用友 BIP 商业翻新平台 iuap 技术底座,以对立的开发者入口,实现利用开发、学习赋能、技术交换及职业认证的全链路用户体验。 1开发者须要怎么的低代码产品? 凭借赋予一般业务人员开发技能、减速翻新想法落地等劣势,低代码逐步失去企业的广泛应用,也成为了当下最风行的软件开发办法之一。一时间,吸引了一大批玩家涌入,比方轻流、明源云等原生低代码厂商、腾讯云微搭等互联网厂商、YonBulider 等传统软件厂商、Mendix 等国外低代码厂商以及钉钉塔这类低代码聚合平台型厂商。 面对繁冗多样的低代码产品,开发者到底应该做何抉择?要想切实地答复这个问题,还须要从开发者的需要谈起。 在爱剖析推出的《 中国面向开发者的低代码开发平台市场厂商评估报告》中,其将开发者划分成了企业开发者、社会化开发者(如高校学生、集体开发者等)以及 ISV/SI 开发者三类。咱们可能显著地感知到,当开发者领域变得更广当前,低代码开发平台的需要也产生了扭转。 首先,从利用现状上来看,业务人员对于低代码开发的可操作性仍有待加强,这一方面取决于低代码产品自身的易用性,例如底层技术框架和可视化界面的出现;另一方面也依赖于培训体制的逐步完善; 其次,面对个性化以及行业化场景需要时,低代码平台的价值并未齐全得以开释。因为低代码开发平台通常不具备标准化零碎和组件,不足行业 Know-how,开发者就须要通过定制化开发的形式获取该组件,为零碎开发带来额定老本和研发周期。 最初,从企业级利用开发的需要来看,低代码技术的交融能力同样是须要考量的重要指标。如何能在不产生数据孤岛、不产生体系凌乱的前提下,整合低代码平台能力,并与本身低代码产品造成互补也成为强需要。 更值得注意的是,随着 AIGC 在寰球范畴内的继续走红,这股浪潮也席卷到了低代码开发畛域。因为两者的实质原理都是晋升程序或利用开发的生产力,因而开发者也更加期待通过 AIGC 与低代码的联合,播种更好地低代码利用开发体验。 2用友开发者核心如何满足开发者的种种期待? 当业界真切地看到低代码平台所带来的实在价值当前,已经业界对于低代码的了解差别曾经逐步走向对立。而随之产生的变动是,现阶段,企业 / 开发者曾经不仅仅只满足于“利落拽”式的开发模式,大家更须要综合能力更加齐备的低代码平台来撑持业务的高速运转,用友推出的 YonBuilder 低代码开发平台恰好是其中之一。 正如上文提到的,开发者在易用性、开发者生态、行业组件等方面,都对低代码开发平台提出了更多的能力要求。用友 YonBuilder 低代码开发平台的外围劣势次要集中在产品性能、生态建设和服务教训三方面,恰好可能满足开发者的所有期待。 在产品性能层面,YonBuilder 低代码开发平台性能更加全面,不仅具备表单和流程利落拽开发能力,还具备与企业原有技术底座交融能力,进而可能承载企业简单外围业务零碎;在生态建设层面,用友开发者核心推出一套成熟的开发者培训和认证体系。开发者可在 YonBIP 开发者社区学习、交换低代码零碎开发和集成技巧,并在 YonMaster 开发者认证核心参加认证,极大水平升高开发者的学习门槛;在服务教训层面,用友作为一家企业云服务与软件提供商,曾经累积了 35 年服务数百万企业客户的人财物项、产供销研等 10 大畛域和泛滥行业的利用实际,并曾经基于此积淀了一批行业组件。总体而言,YonBuilder 通过用友 BIP 弱小的中台撑持能力,在元数据模块驱动、动静建模、多租户、分层扩大、平安可信、高可用以及高弹性的对立模型架构下,通过点击拖拽、在线脚本以及多端编译的技术,提供了可视化 + 低代码 + 全代码的一站式开发能力,可能疾速生成 PC 和挪动多端的业务利用,可即时公布与应用。 目前,YonBuilder 低代码开发平台曾经帮忙少量企业实现了利用疾速构建,例如,一汽基于 YonBuilder 构建了整体业务零碎,通过新一代技术平台打造国内汽车行业自主可控 ERP 平台;大宗贸易团体明日控股利用 YonBuilder 开发业财一体化零碎,包含流程线上化、数据发明、流程协同、管控精细化等利用,达成企业发展数字化转型的根底建设;中建五局利用 YonBuilder,通过企业群数字化建模伎俩以及多租户数据隔离机制,构建了产业互联网,从技术实现产业链上下游业务协同、数据连贯...... 3全新降级的用友开发者核心,等你来体验! 看到这里,如果你曾经想要急不可待地想要体验 YonBuilder,用友推出的对立开发者入口——用友开发者核心,刚好能够满足你的需要。在这里,你将播种一站式产品反对和服务,不仅可能应用 YonBuilder 低代码开发平台进行利用构建,还能够实现学习赋能、技术交换、职业认证等残缺用户体验旅程。 ...

September 1, 2023 · 1 min · jiezi

关于前端:动图-用css的animation帧序列实现动画

[接前文《[动图] 前端动图实现形式整顿》](https://segmentfault.com/a/1190000044102194)这篇文档具体说一说 第3种,帧序列(png/jpg + css) 的实现 留神上面这段代码不是原生的CSS语法,在关键帧局部应用了SCSS语法来批量for循环解决(须要装置sass-loader以反对编译),通过扭转背景图片的地位来实现间断的动画成果。 <style>.banner { Position: absolute; top: 35px; width: 100px; height: 50px; background: url(‘../assets/png-sequence.png’) no-repeat; background-size: 1000px 50px; (这里写素材的实在尺寸) animation: standardAnimation 1s forwards steps(1) infinite;}@keyframes standardAnimation { @for $i from 0 through 9 { #{$i/9*100}% { background-position: 0 #{-100*$i}px; } }}</style>对下面的代码段中的重点进行阐明:.banner 类定义了一个元素,应用了相对定位,其中最要害的是设置宽高属性(width: 100px; height: 50px;) 这就是动图窗口的尺寸。 .banner类中的background 属性设置了背景图像,即一张帧序列的雪碧图。这里应用了名为 png-sequence.png 的图片,它能够由一系列图片帧合成。(这里background-size: 1000px 50px; 那就是程度平铺合成的了) .banner类中的background-size 属性设置了背景图片的大小,应用了图片的实在尺寸。这样能够确保每个图像帧依照实在尺寸显示。 .banner类中的animation 属性定义了动画成果。standardAnimation 是一个关键帧动画的名称。它应用了 1s 的持续时间,forwards 示意动画实现后放弃最初一个关键帧状态,steps(1) 示意动画每一步显示一个图像帧,infinite 示意动画循环播放。 关键帧动画局部应用了 SCSS 的语法:@keyframes standardAnimation 定义了一个关键帧动画 standardAnimation。应用 @for 循环来生成关键帧。循环从 0 到 9(共 10 次),每次循环生成一个关键帧。 ...

September 1, 2023 · 1 min · jiezi

关于前端:Cocos独立游戏开发框架中的自定义工具类优化代码重用与可维护性

引言本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢送大家关注分享珍藏订阅。 随着独立游戏开发的一直倒退,开发者们越来越重视代码的重用性、可维护性以及开发效率。自定义工具类(Custom Utility Class)作为这一指标的重要实现形式之一,为开发者们提供了一个将罕用功能模块封装起来,便于重复使用的形式。本文将探讨开发框架中自定义工具类的重要性、设计准则以及应用办法。 本文源码和源工程在文末获取,小伙伴们自行返回。 为什么须要自定义工具类在独立游戏开发过程中,常常会遇到一些通用的性能需要,例如日期工夫格式化、文件操作、字符串解决、日志记录等等。这些性能可能在不同的我的项目中频繁呈现,如果每次都从头开始实现,不仅浪费时间,而且可能导致代码反复,难以保护。自定义工具类的呈现正是为了解决这些问题。 1. 代码重用性: 自定义工具类将通用的性能封装起来,能够在多个我的项目中重复使用,防止了反复编写相似的代码,进步了开发效率。 2. 可维护性: 将罕用功能模块封装为工具类,有助于集中管理和保护。如果某个性能须要批改,只需在工具类中进行批改,所有应用该性能的中央都会受害。 3. 代码整洁性: 自定义工具类能够将类似性能的代码整合到一起,使代码构造更加清晰,易于了解。 4. 进步形象能力: 设计自定义工具类须要思考如何将底层实现抽象化,从而更好地了解面向对象编程的准则。 自定义工具类的设计准则1. 繁多职责准则(Single Responsibility Principle): 每个工具类应该只关注一个特定畛域的性能,不要试图将多个不相干的性能放在一个工具类中。 2. 接口形象准则: 工具类应该通过明确的接口来裸露其性能,而不是裸露外部的具体实现细节。 3. 封装与暗藏实现: 工具类应该将实现细节封装起来,只提供必要的办法和属性,防止内部间接拜访外部数据。 4. 可扩展性: 思考将来的需要变动,尽量设计灵便的接口和可扩大的架构,使工具类可能不便地进行性能扩大。 5. 文档化: 对工具类的接口、办法以及应用示例进行充沛的文档化,不便其余开发者了解和应用。 实用工具类整顿介绍1.单例类单例(Singleton)是一种设计模式,它保障一个类只能有一个实例,并且提供一个全局的拜访点来拜访该实例。这样能够确保在应用程序中的任何中央,无论是哪个代码段,都始终应用雷同的实例,从而防止了多个实例造成的不一致性和资源节约。 2.字符串工具类字符串工具类是一种常见的实用工具类,用于解决字符串操作。它通常提供了一系列静态方法,用于执行字符串的各种罕用操作,如拼接、宰割、替换、格式化、判断空值等。应用字符串工具类能够简化代码,进步代码的可读性和维护性。 3.日期工具类日期工具类是一种常见的实用工具类,用于解决日期和工夫相干的操作。在编程中,常常须要对日期进行解析、格式化、计算、比拟等操作,而日期工具类就是为了简化这些操作而设计的。它通常提供了一系列静态方法,用于执行各种日期和工夫的罕用操作,使开发人员可能更轻松地解决日期和工夫数据。 4.数学工具类一些数学函数办法类,如计算两点间隔,获取两点间的弧度,弧度和角度的相互转换等等。 5.随机数工具类在游戏开发中罕用的随机数生成器。 6.md5工具类MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),是一种被宽泛应用的明码散列函数,能够产生出一个128位(16字节)的散列值(hash value),用于确保信息传输残缺统一。 7.百分比工具类百分比工具类罕用于计算以后百分比、计算以后比例等等。 8.字符串缓冲器字符串缓冲器次要是在进行大量字符串连贯操作时应用。 9.门路解析工具类获取门路目录名、文件名、扩展名等等时应用的工具。 10.Url解析工具类罕用于获取http链接的参数。 总结自定义工具类是在独立游戏开发框架中优化代码重用和可维护性的重要伎俩之一。通过遵循设计准则,正当地划分性能,提供明确的接口,咱们能够创立出易于应用和保护的工具类。然而,须要留神的是,适度应用工具类也可能导致代码过于臃肿和不易了解。因而,在设计工具类时,须要衡量好代码的简洁性和可维护性,确保工具类真正带来价值,而不是减少累赘。 本文的重点内容次要有以下几点,不晓得小伙伴们是否曾经了解: 本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢送大家关注分享珍藏订阅。为什么要应用工具类。工具类的设计准则。源码通过关注“亿元程序员”发送"Utils"获取。AD:笔者曾经上线的小游戏《填色之旅》《贪吃蛇掌机经典》《重力迷宫球》大家能够自行点击搜寻体验。 感兴趣的小伙伴记得关注"亿元程序员"哦,一位有着8年游戏行业教训的主程。学习游戏开发不迷路。感谢您的关注,心愿能给到您帮忙, 也心愿通过您能帮忙到大家。 喜爱的能够点个赞、点个在看哦!请把该文章分享给你感觉有须要的其余小伙伴。谢谢。

September 1, 2023 · 1 min · jiezi

关于前端:JS数组原理探究

JavaScript 数组的 API 常常会被 JS 开发者频繁应用,在整个 JavaScript 的学习过程中尤为重要。 数组作为一个最根底的一维数据结构,在各种编程语言中都充当着至关重要的角色,你很难设想没有数组的编程语言会是什么模样。特地是 JavaScript,它天生的灵活性,又进一步施展了数组的专长,丰盛了数组的应用场景。能够毫不夸大地说,不深刻地理解数组,就不足以写好 JavaScript。 随着前端框架的一直演进,React 和 Vue 等 MVVM 框架的风行,数据更新的同时视图也会随之更新。在通过前端框架实现大量的业务代码中,开发者都会用数组来进行数据的存储和各种“增删改查”等操作,从而实现对应前端视图层的更新。可见熟练掌握数组各种办法,并深刻理解数组是很有必要的。 数组概念的探索截至 ES7 标准,数组共蕴含 33 个规范的 API 办法和一个非标准的 API 办法,应用场景和应用计划纷繁复杂,其中还有不少坑。为了不便你能够循序渐进地学习这部分的内容,上面我将从数组的概念开始讲起。 因为数组的 API 较多,很多相近的名字也容易导致混同,所以在这里我依照“会扭转本身值的”“不会扭转本身值的”“遍历办法”这三种类型离开解说,让你对这些 API 造成更结构化的意识。 Array 的结构器Array 结构器用于创立一个新的数组。通常,咱们举荐应用对象字面量的形式创立一个数组,例如 var a = [] 就是一个比拟好的写法。然而,总有对象字面量表述乏力的时候,比方,我想创立一个长度为 6 的空数组,用对象字面量的形式是无奈创立的,因而只能写成下述代码这样。 // 应用 Array 结构器,能够自定义长度var a = Array(6); // [empty × 6]// 应用对象字面量var b = [];b.length = 6; // [undefined × 6]Array 结构器依据参数长度的不同,有如下两种不同的解决形式: new Array(arg1, arg2,…),参数长度为 0 或长度大于等于 2 时,传入的参数将依照程序顺次成为新数组的第 0 至第 N 项(参数长度为 0 时,返回空数组);new Array(len),当 len 不是数值时,解决同上,返回一个只蕴含 len 元素一项的数组;当 len 为数值时,len 最大不能超过 32 位无符号整型,即须要小于 2 的 32 次方(len 最大为 Math.pow(2,32)),否则将抛出 RangeError。以上就是 Array 结构器的根本状况,咱们来看下 ES6 新增的几个构造方法。 ...

August 31, 2023 · 15 min · jiezi

关于前端:uniapp项目实践总结五自定义底部导航栏

在底部导航栏这个模块,很多时候默认的款式不合乎咱们的设计规范和需要,因而须要自定义底部导航栏,这样能够满足咱们的需要,也能够更加个性化,减少用户体验,上面就介绍如何自定义底部导航栏。目录筹备导航素材配置页面导航自定义导航栏筹备导航素材要自定义底部导航栏,咱们须要到 iconfont 下面找一些罕用的图标,而后保留成图片,存到本地图片文件夹上面。 上面是我筹备的一个图标图片文件。 配置页面导航接下来开始进行配置,先在pages.json文件外面配置好默认底部导航栏。 { "pages": [ //pages数组中第一项示意利用启动页,参考:https://uniapp.dcloud.io/collocation/pages { "path": "pages/index/index", "style": { "navigationBarTitleText": "首页" } }, { "path": "pages/message/index", "style": { "navigationBarTitleText": "音讯" } }, { "path": "pages/discover/index", "style": { "navigationBarTitleText": "发现" } }, { "path": "pages/user/index", "style": { "navigationBarTitleText": "我的" } } ], "globalStyle": { "navigationBarTextStyle": "white", "navigationBarTitleText": "HelloApp", "navigationBarBackgroundColor": "#333", "backgroundColor": "#f8f8f8" }, "tabBar": { "borderStyle": "white", "backgroundColor": "#fff", "color": "#555", "selectedColor": "#24afd6", "list": [ { "text": "首页", "pagePath": "pages/index/index", "iconPath": "static/image/icon/home.png", "selectedIconPath": "static/image/icon/home-act.png" }, { "text": "音讯", "pagePath": "pages/message/index", "iconPath": "static/image/icon/message.png", "selectedIconPath": "static/image/icon/message-act.png" }, { "text": "发现", "pagePath": "pages/discover/index", "iconPath": "static/image/icon/discover.png", "selectedIconPath": "static/image/icon/discover-act.png" }, { "text": "我的", "pagePath": "pages/user/index", "iconPath": "static/image/icon/user.png", "selectedIconPath": "static/image/icon/user-act.png" } ] }} ...

August 31, 2023 · 2 min · jiezi

关于前端:Vue-如何去组织大型-SPA-应用架构

大型应用程序最要害和最具挑战性的方面之一是良好且正当的文件构造。在思考应用微前端将代码库合成为多个应用程序之前,能够遵循一些步骤来改良我的项目级别的架构,并使转换更容易(如果您思考过这条门路)。 本文将介绍如何通过设置性能之间的界线并最大限度地缩小代码耦合和副作用,使代码库更易于了解。 Vue 默认我的项目构造当咱们应用 Vue Cli 生成我的项目的时候,组件构造是扁平的,不遵循任何层次结构。 assets 目录, 用于寄存我的项目中的动态资源,如 图片,音频, 字体, css 款式 等。components 目录, 用于寄存一些可复用的组件,整体比拟扁平化的。router 目录, 用于寄存路由配置文件views 目录, 用于寄存页面 Vue 文件main.ts 文件, 文件作为应用程序的入口点,反对 Vue 初始化和插件或附加库的配置。App.vue 文件, 代表应用程序的根组件,充当其余组件的容器并充当主模板。对于一个小型我的项目来说,这样的文件构造组织看起来没太大问题。 然而,对于一个大型项目来说,这种架构很快就会失控。须要某种模块化能力轻松定位给定文件,设置性能之间的边界,并防止组件的严密耦合。 按功能模块拆分利用任何大型应用程序都分为多个独立的性能。辨认它们并不总是那么容易和间接,但通过一段时间的教训积攒后会变得更好。让咱们尝试将一个风行的应用程序分成几个局部作为练习。 微博的个人主页上有很多的性能内容。 工夫线是页面的外围,四周有许多性能,如导航、微博创立局部、热搜、感兴趣的人等。 将形成这些性能的所有组件放在同一个文件夹中是不可保护的,并且即便应用 IDE 的疾速查找选项,找到其中一个组件也将十分艰难。 更好的我的项目组织构造依据我数十年的工作教训来看, 更好更全面的文件组织构造应该像下边这张图一样。 assets 目录components 目录 - 整个应用程序中应用的所有共享组件。config 目录 - 一些通用的环境配置文件features 目录 - 蕴含所有应用程序性能。咱们心愿将大部分利用程序代码保留在此处。稍后会具体介绍这一点。layout 目录 - 页面的不同布局。lib 目录 - 咱们的应用程序中应用的不同第三方库的配置。pages 目录 - 应用程序的不同页面router 目录 - 路由配置services 目录 - 跨性能共享的一些服务封装。stores 目录 - 一些共享的性能数据流治理test 目录 - 单元测试utils 目录 - 本人写的一些工具办法types 目录 - TS 的类型申明几点注意事项默认状况下,Pages 文件夹将用于寄存理论 Router 配置中的具体展现页面。将所有页面放在一处十分有帮忙,但其中的逻辑应放弃在最低耦合度。为了更好维护性和可扩展性,咱们的指标是将大部分利用程序代码保留在 features 文件夹中。每个性能文件夹都应蕴含给定性能的独立解耦的业务实现代码。在现实状况下,咱们其实不须要跨feture 去共享组件, store, services 等这些专用逻辑。 但,理论业务开发中 需要会千奇百怪各种变动, 所以不可避免咱们须要一些全局共享的store 、组件、 service 等。但,当咱们须要放入公共复用目录的时候,须要好好思考一下,这么做是否有必要。功能模块组织正如咱们之前提到的,咱们的大部分业务代码应该位于多个子目录的 features 文件夹内。 ...

August 31, 2023 · 1 min · jiezi

关于前端:仅限于安全上下文的特性

有些 Web 个性只能在平安上下文中应用,在本文中,我列出了这些个性: 异步剪贴板 API后盾同步(例如 SyncManager)Cache-Control: immutable凭据治理 API设施方向 / 设施挪动拾色器 API加密媒体扩大通用传感器 API定位 API告诉 API领取申请 API演示 API推送 API报告 APIService Worker存储 APIWeb 验证 APIWeb 蓝牙Web MIDIWeb 加密 APIWebGPU APIWeb 分享 APIMediaDevices.getUserMedia()Navigator.registerProtocolHandler()参考资料:仅限于平安上下文的个性 - Web 平安 | MDN 头图来自 Unsplash 上的 Franck

August 31, 2023 · 1 min · jiezi

关于前端:网易云音乐-Tango-低代码引擎正式开源

Tango 简介Tango 是一个用于疾速构建低代码平台的低代码设计器框架,借助 Tango 只须要数行代码就能够实现一个根本的低代码平台前端零碎的搭建。Tango 低代码设计器间接读取前端我的项目的源代码,并以源代码为核心,执行和渲染前端视图,并为用户提供低代码可视化搭建能力,用户的搭建操作会转为对源代码的批改。借助于 Tango 构建的低代码工具或平台,能够实现 源码进,源码出的成果,无缝与企业外部现有的研发体系进行集成。 如上图所示,Tango 低代码引擎反对可视化视图与源码双向同步,双向互转,为开发者提供 LowCode+ ProCode 无缝连接的开发体验。 ✨ 外围个性经验网易云音乐内网生产环境的理论测验,可灵便集成利用于低代码平台,本地开发工具等基于源码 AST 驱动,自私有 DSL 和协定提供实时出码能力,反对源码进,源码出开箱即用的前端低代码设计器,提供灵便易用的设计器 React 组件应用 TypeScript 开发,提供残缺的类型定义文件️ 基于源码的低代码搭建计划Tango 低代码引擎不依赖公有搭建协定和 DSL,而是间接应用源代码驱动,引擎外部将源码转为 AST,用户的所有的搭建操作转为对 AST 的遍历和批改,进而将 AST 从新生成为代码,将代码同步给在线沙箱执行。与传统的 基于 Schema 驱动的低代码计划 相比,不受公有 DSL 和协定的限度,可能完满的实现低代码搭建与源码开发的无缝集成。 <img src="https://p5.music.126.net/obj/wonDlsKUwrLClGjCm8Kx/13140534982/ee2e/f42c/cc9a/184e2918a011b57d46e6c64a2722fa44.png" /> 源码进,源码出因为引擎内核齐全基于源代码驱动实现,Tango 低代码引擎可能实现源代码进,源代码出的可视化搭建能力,不提供任何公有的两头产物。如果公司外部曾经有了一套欠缺的研发体系(代码托管、构建、部署、CDN),那么能够间接应用 Tango 低代码引擎与现有的服务集成构建低代码开发平台。 产品劣势与基于公有 Schema 的低代码搭建计划相比,Tango 低代码引擎具备如下劣势: 比照项基于 Schema 的低代码搭建计划Tango(基于源码 AST 转换)实用场景面向特定的垂直搭建场景,例如表单,营销页面等 面面向以源码为核心的利用搭建场景语言能力依赖公有协定扩大,不灵便,且难以与编程语言能力对齐 间接基于 JavaScript 语言,能够应用所有的语言个性,不存在扩展性问题开发能力LowCode LowCode + ProCode源码导出以 Schema 为核心,单向出码,不可逆 以源码为核心,双向转码自定义依赖须要依据公有协定扩大封装,定制老本高 原有组件能够无缝低成本接入集成研发设施定制老本高,须要额定定制 低成本接入,能够间接复用原有的部署公布能力 技术架构Tango 低代码引擎在实现上进行了分层解藕,使得下层的低代码平台与底层的低代码引擎能够独立开发和保护,疾速集成部署。此外,Tango 低代码引擎定义了一套凋谢的物料生态体系,开发者能够自在的奉献扩大组件配置能力的属性设置器,以及扩大低代码物料的二方三方业务组件。 ...

August 31, 2023 · 1 min · jiezi

关于前端:面试官说说TypeScript类型系统层级

小册这是我整顿的学习材料,十分零碎和欠缺,欢送一起学习古代JavaScript高级小册深入浅出Dart古代TypeScript高级小册linwu的算法笔记类型零碎层级TypeScript 的类型零碎是强类型和动态类型的,这为开发者提供了弱小的类型检查和类型平安保障,同时也减少了肯定的学习复杂性。为了更好地了解 TypeScript 的类型零碎,本文将全面介绍其类型零碎层级,包含顶层类型(Top Type)和底层类型(Bottom Type),以及在这个层次结构中如何解决和操作各种类型。了解 TypeScript 的类型零碎层级有助于咱们更好地应用和把握 TypeScript,写出更强壮、可保护的代码。 1. 顶层类型(Top Type)顶层类型是所有其余类型的父类型,这意味着在 TypeScript 中的任何类型都能够看作是顶层类型的子类型。TypeScript 中有两个非凡的顶层类型:any和unknown。 1.1 any 类型any类型是 TypeScript 的一个逃生窗口,它能够承受任意类型的值,并且对 any 类型的值进行的任何操作都是容许的。应用 any 类型,能够使咱们绕过 TypeScript 的类型查看。上面的例子展现了 any 类型的灵活性: let a: any = 123; // OKa = 'hello'; // OKa = true; // OKa = { id: 1, name: 'Tom' }; // OKa.foo(); // OK咱们能够看到,咱们能够将任何类型的值赋给 any 类型的变量,甚至能够对 any 类型的值进行咱们想要的任何操作,而 TypeScript 编译器并不会对此做出任何投诉。然而,正是因为其超高的灵活性,使得 any 类型在肯定水平上减弱了 TypeScript 的类型安全性,因而在咱们编写 TypeScript 代码时,应尽量避免应用 any 类型。 1.2 unknown 类型unknown 类型与 any 类型在承受任何类型的值这一点上是一样的,但 unknown 类型却不能像 any 类型那样对其进行任何操作。咱们在对 unknown 类型的值进行操作之前,必须进行类型查看或类型断言,确保操作的安全性。 ...

August 31, 2023 · 1 min · jiezi

关于前端:vue中使用tailwindcss

Tailwind CSS with Vuetailwindcss官网文档 创立Vue我的项目npm create vite@latest my-project -- --template vuecd my-project装置Tailwind CSS,创立tailwind.config.js和postcss.config.jsnpm install -D tailwindcss postcss autoprefixernpx tailwindcss init -p配置tailwind.config.js/** @type {import('tailwindcss').Config} */export default { content: [ "./index.html", "./src/**/*.{vue,js,ts,jsx,tsx}", ], theme: { extend: {}, }, plugins: [],}增加Tailwind指令到全局css文件中,此处文件地址比方在./src/style.css@tailwind base;@tailwind components;@tailwind utilities;在main.js入口引入style.cssimport { createApp } from 'vue'import './style.css'启动我的项目npm run dev在模板中应用tailwindcss<template> <h1 class="text-3xl font-bold underline"> Hello world! </h1></template>能够看到页面上此时曾经有成果了。 具体应用教程能够查看官网文档。

August 31, 2023 · 1 min · jiezi

关于前端:加入‘First-Sowing的公开部署马拉松DeployaThon共享巨额奖励

自从“First Sowing”启动以来曾经有一段时间了,但期待终于完结!“First Sowing”传奇的精彩终局以“部署马拉松(Deploy-a-Thon)”的模式到来,咱们非常高兴能与大家分享这一音讯! 筹备好与“First Sowing”一起踏上一次史诗般的冒险,这不仅是4EVERLAND历史上最多元化,还是最发自内心的互动体验。这不仅仅是为开发者筹备的;即便是普通用户也能够收费加入“部署马拉松”,齐全没有学习曲线!设想一下,您将沉迷在开发者的世界中,创立本人的去中心化前端网页,并取得难以想象的处分!咱们在这里议论的是高达12,000,000 T-4EVER代币的惊人奖池! 千万不要错过这个不凡的机会!筹备开释您的创造力,在这个难忘的流动中构建一些真正了不起的货色! 立刻成为这个史诗般流动的一部分:https://firstsowing.4everland.org/ 工夫 流动:9月1日 — 15日 NFT快照:2023年,9月1日 UTC 12:00 处分铸币:9月15日 令人兴奋的处分细则 以下是您能够期待的处分的令人兴奋的细则: 部署处分每个账户最多能够从模板核心部署一个模板我的项目。参加后,您将有机会博得奖池的一部分,并进入模板投票排行榜。 多个我的项目能够参加模板排名。 流动奖池将在“First Sowing” NFT持有者和所有用户之间进行调配,其中“First Sowing” NFT持有者将独家分享200万代币,其余用户将分享400万代币。 邀请处分每个账户都能够通过邀请新用户加入来取得邀请处分(邀请胜利是指新用户胜利部署了一个模板)。 此外,举荐排名前100的账户将取得额定处分(请参阅下表)。 所有胜利邀请了新用户的用户也将有机会分享来自举荐池的额定处分(300万)。 优良模版和投票处分所有通过4EVERLAND模板胜利部署的我的项目将作为优良模板特地展现,供所有用户浏览和摸索。 参加“First Sowing”流动的所有用户都能够为他们喜爱的已部署前端网站投票。 排名前10的网站将取得额定处分,反对他们的用户将平均分配处分(请参阅下表)。 每个注册用户领有10个投票权。 赛道处分随机奖品将授予那些将其站点部署到Arweave,IPFS或BNB Greenfield赛道的侥幸用户,赛道处分为200AR、1000USDT和5BNB! 新的处分增加零碎 在这个流动中,账户处分将依据以下工作的实现状况取得处分,最大潜在奖金为300%。 服务条款4EVERLAND保留对流动的最终解释权,以及确定规定和处分的权力。 不容许不正当竞争、抄袭或任何歹意竞争行为。发现参加这种流动的参与者将失去资格。 如有任何与4EVERLAND零碎相干的问题,请报告至contact@4everland.org。 在应用4EVERLAND服务时遇到问题?请随时在4EVERLAND Discord的#Feedback(反馈)频道发问。 对于4EVERLAND4EVERLAND是一个集成存储、计算和网络外围能力的Web 3.0基础设施。它旨在帮忙用户从Web 2.0平滑逾越到Web 3.0,并成为数百万Web 3.0开发人员和应用程序的基础设施。 Website | Twitter | Telegram | Discord | Reddit | Medium | Email

August 31, 2023 · 1 min · jiezi

关于前端:使用taro或react框架的针对微信小程序隐私协议的组件封装网上找了很久都没有相关模版只有自己写了一个

留神:我是应用hooks的,其余能够参考封装思路大同小异的首先写一个PrivacyAgreement.js文件 import { useState, useEffect } from "react";// Taro 额定增加的 hooks 要从 '@tarojs/taro' 中引入import { useDidShow, useDidHide,useReady } from '@tarojs/taro'import { View, Text, Button } from "@tarojs/components";import { AtFloatLayout, AtButton } from "taro-ui";import "./index.scss";let privacyHandlerlet privacyResolves = new Set()let closeOtherPagePopUpHooks = new Set()if (wx.onNeedPrivacyAuthorization) { wx.onNeedPrivacyAuthorization(resolve => { console.log('触发 onNeedPrivacyAuthorization') if (typeof privacyHandler === 'function') { privacyHandler(resolve) } })}const closeOtherPagePopUp = (closePopUp) => { closeOtherPagePopUpHooks.forEach(hook => { if (closePopUp !== hook) { hook() } })}export default ({ showPrivacyClk}) => { // 显示和暗藏 const [showPrivacy, setShowPrivacy] = useState(false) const [closePopUpCopy, setclosePopUpCopy] = useState(false) useEffect(() => { const closePopUp = () => { disPopUp() } console.log('closePopUp',closePopUp) privacyHandler = resolve => { console.log('3456') privacyResolves.add(resolve) popUp() // 额定逻辑:以后页面的隐衷弹窗弹起的时候,关掉其余页面的隐衷弹窗 closeOtherPagePopUp(closePopUp) } closeOtherPagePopUpHooks.add(closePopUp) setclosePopUpCopy(closePopUp) }, []) const disPopUp = () => { if (showPrivacy === true) { wx.showTabBar() setShowPrivacy(false) } } const popUp = () => { if (showPrivacy === false) { wx.hideTabBar() setShowPrivacy(true) } } // 关上隐衷协定页面 const openPrivacyContractClk = () => { wx.openPrivacyContract() } // 用户点击回绝隐衷协定 const refundPrivacy = () => { wx.showTabBar() disPopUp() privacyResolves.forEach(resolve => { console.log('resolve111', resolve); resolve({ event: 'disagree', }) }) privacyResolves.clear() closeOtherPagePopUpHooks.delete(closePopUpCopy) } // 用户点击批准隐衷协定 const handleAgreePrivacyAuthorization = e => { // // 显示tabbar wx.showTabBar() disPopUp() // 这里演示了同时调用多个wx隐衷接口时要如何解决:让隐衷弹窗放弃单例,点击一次批准按钮即可让所有pending中的wx隐衷接口继续执行 (看page/index/index中的 wx.getClipboardData 和 wx.startCompass) privacyResolves.forEach(resolve => { console.log('resolve2222', resolve); resolve({ event: 'agree', buttonId: 'agree-btn' }) }) privacyResolves.clear() } return ( <View> { showPrivacy ? ( <View> <View className="privacyAgreementMask"></View> <View className="privacyAgreementIdx"> 在您应用小程序服务之前,请您仔细阅读<Text onClick={openPrivacyContractClk} className="privacyTitle">《小程序隐衷爱护协定》</Text> 。如您批准该隐衷爱护指引,请点击“批准”开始应用小程序 <View className="pivacyAgreementBtn"> <View className="btnLeftCon"><AtButton type='primary' full={false} onClick={refundPrivacy}>回绝</AtButton></View> <View className="btnLeftCon btnRightCon"> <Button id="agree-btn" class="agree" open-type="agreePrivacyAuthorization" onAgreeprivacyauthorization={handleAgreePrivacyAuthorization}>批准</Button> </View> </View> </View> </View> ) : '' } </View>);};款式文件index.scss如下 ...

August 31, 2023 · 3 min · jiezi

关于前端:对BFC的理解

在前端的面试中,绝对JavaScript而言,CSS布局方面考查的内容会绝对少一些,其中BFC是布局款式方面常考的一个考点。 什么是BFCBFC,全称为Block Formatting Context,翻译过去即块格式化上下文。 之前在其余文章中看到的阐明是,网页上一个独立且隔离的渲染区域。当初呢,我略微查阅了一些官网的信息。 在理解BFC之前,咱们须要先理解一些其余概念: 蕴含块(containing block)containing block A rectangle that forms the basis of sizing and positioning for the boxes associated with it. Notably, a containing block is not a box (it is a rectangle), however it is often derived from the dimensions of a box. Each box is given a position with respect to its containing block, but it is not confined by this containing block; it can overflow. The phrase “a box’s containing block” means “the containing block in which the box lives,” not the one it generates. ...

August 30, 2023 · 4 min · jiezi

关于前端:GaoNeng我是如何为OpenTiny贡献新组件的

本文共10076字,预计浏览20分钟大家好啊,又是我GaoNeng。最近在给OpenTiny做奉献,感觉renderless这个架构还是挺有意思的,就奉献了一个color-picker组件,简略写篇文章略微记录一下。 也欢送敌人们给 TinyVue 开源我的项目点个 Star 反对下: https://github.com/opentiny/tiny-vue 浏览完本文,你将会取得如下播种 HSV,HSL,HEX,RGB的区别HSV色调空间下,SV到XY的双向转换ColorPicker 组件的实现原理OpenTiny 新组件开发全流程1 事件的起因故事的产生十分的偶尔。我在翻opentiny仓库issue的时候,偶尔看到了这么一条 之前也在掘金上看过opentiny的介绍,感觉还不错,然而又抢不到组件。这一次终于让我抢到一个闲暇组件了,于是我立即就回复了。 2 初步剖析个别写组件前只思考两个问题 长什么样逻辑是什么color-picker色彩抉择组件用于在应用程序和界面中让用户抉择色彩。它是一个交互式的元素,通常由一个色调光谱、色相环和色彩值输入框组成,用户能够通过这些元素来抉择所需的色彩。ColorPicker的次要性能是让用户可能准确地抉择特定的色彩,以便在应用程序的各种元素中应用。 ColorPicker 组件次要蕴含四个子组件 饱和度抉择, 色相抉择, alpha抉择, 工具栏。比较简单,所以就没画图。次要的问题在于逻辑,也就是抉择什么样的色调空间更贴合用户的日常应用和直观体验。 常见的色调空间分为 HSV, HSL, CMY, CMYK, HSB,RGB, LAB, YUB, YCrCb 前端最常见的应该是HSV,HSL,RGB这三种。LAB, YUB, YCrCb在日常业务中比拟少见。 3 色调空间基础知识HSV, HSL, HEX, RGB 都是什么呢? HSV,HSL,RGB都是色调空间。而HEX能够看作是RGB的另一种表达方法。 3.1 什么是色调空间?色调空间是为了让人们更好的意识色调而建设的一种形象的数学模型,它是将数值散布在N维的坐标系中,帮忙人们更好地意识和了解色调。 例如RGB色调空间,就是将RGB重量映射在三维笛卡尔坐标系中。重量的数量代表该重量的亮度值。下图是通过归一解决的RGB色调空间示意图 而HSV与HSL色调空间都是将色彩映射到了柱坐标系。下图展现了HSV与HSL的示意图 <center><img src="https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2baa31a6cd3440da9f87c82d0d924115~tplv-k3u1fbpfcp-watermark.image?" style="zoom: .5" alt="HSV"><p>HSV</p><img src="https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/05c3c41894ee48dfa9e6908befbbfbea~tplv-k3u1fbpfcp-watermark.image?" style="zoom: .5" alt="HSL"></center><p>HSL</p></center> 3.2 HSV,HSL,RGB 孰优孰劣?理解了HSV,HSL,RGB色调空间及其表达方法,咱们须要思考到底哪一种色调空间对于人类更加的直观呢?要不问问万能的音理吧 <center><img src="https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1463fe17d6d84bf88a361c72bf3a83de~tplv-k3u1fbpfcp-watermark.image?" style="zoom:0.5;" alt="让音理通知你吧"></center> 啊这,她说不晓得。那看来只能问问万能的chat-gpt了 不愧是你,chatgpt总是能救我于危难之间。不过话又说回来,HSL与HSV都很直观,只是一个是V(Value)另一个是L(lightness)。两种色调空间的柱坐标系如下图所示 <center><img src="https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2baa31a6cd3440da9f87c82d0d924115~tplv-k3u1fbpfcp-watermark.image?" style="zoom: .5" alt="HSV"><p>HSV</p><img src="https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/05c3c41894ee48dfa9e6908befbbfbea~tplv-k3u1fbpfcp-watermark.image?" style="zoom: .5" alt="HSL"></center><p>HSL</p></center> 能够看到,HSV越偏差右上角饱和度和亮度越高。但HSL则是偏差于截面的两头饱和度和亮度越高。 在PS和其他软件中,也大都抉择了HSV作为选色时的色调空间。为了放弃对立,color-picker组件也抉择了HSV作为选色时的色调空间。 3.3 SV与XY的双向转换饱和度抉择的时候,咱们须要将XY重量转为SV重量。这存在一种表达方式。SV与XY存在一种计算关系 $$\begin{cases} S=\frac{x}{width} \times 100& S \in [0,100]\\ V=100 - \frac{y}{height} \times 100& V\in [0,100] \\ X=\max(\frac{(S \times width)}{100}, 0)& X \in [0,width] \\ Y=\max(\frac{(V \times height)}{100},0)& Y \in [0,heght]\end{cases}$$ ...

August 30, 2023 · 5 min · jiezi

关于前端:教你实现一个深浅拷贝

浅拷贝的原理与实现对于浅拷贝的定义咱们能够初步了解为: 本人创立一个新的对象,来承受你要从新复制或援用的对象值。如果对象属性是根本的数据类型,复制的就是根本类型的值给新对象;但如果属性是援用数据类型,复制的就是内存中的地址,如果其中一个对象扭转了这个内存中的地址,必定会影响到另一个对象。上面我总结了一些 JavaScript 提供的浅拷贝办法,一起来看看哪些办法能实现上述定义所形容的过程。 办法一:object.assignobject.assign 是 ES6 中 object 的一个办法,该办法能够用于 JS 对象的合并等多个用处,其中一个用处就是能够进行浅拷贝。该办法的第一个参数是拷贝的指标对象,前面的参数是拷贝的起源对象(也能够是多个起源)。 object.assign 的语法为:Object.assign(target, ...sources)object.assign 的示例代码如下: let target = {};let source = { a: { b: 1 } };Object.assign(target, source);console.log(target); // { a: { b: 1 } };从下面的代码中能够看到,通过 object.assign 咱们确实简略实现了一个浅拷贝,“target”就是咱们新拷贝的对象,上面再看一个和下面不太一样的例子。 let target = {};let source = { a: { b: 2 } };Object.assign(target, source);console.log(target); // { a: { b: 10 } }; source.a.b = 10; console.log(source); // { a: { b: 10 } }; console.log(target); // { a: { b: 10 } };从下面代码中咱们能够看到,首先通过 Object.assign 将 source 拷贝到 target 对象中,而后咱们尝试将 source 对象中的 b 属性由 2 批改为 10。通过控制台能够发现,打印后果中,三个 target 里的 b 属性都变为 10 了,证实 Object.assign 临时实现了咱们想要的拷贝成果。 ...

August 30, 2023 · 4 min · jiezi

关于前端:uniapp项目实践总结三全局公共组件和样式以及方法的使用

uniapp 我的项目实际总结(三)全局公共组件和款式以及办法的应用上一篇解说了如何创立一个新的 uniapp 我的项目,这篇来解说以下如何注册和应用全局的公共组件,全局款式和全局办法。目录目录构造公共组件公共款式公共办法目录构造创立好我的项目当前,能够先初始化一下目录,上面是我本人的习惯。 ┌─components├─hybrid│ ├─html│ │ └─error.html│ └─q-icon│ └─q-icon.vue├─pages│ └─index│ └─index.vue├─static│ ├─fonts│ │ └─iconfont.css│ └─image│ └─logo.png├─scripts│ └─http.js│ └─index.js│ └─urls.js│ └─utils.js├─styles│ └─extend.scss│ └─global.scss│ └─mixin.scss│ └─reset.scss│ └─variable.scss├─App.vue├─favicon.ico├─index.html├─main.js├─manifest.json├─pages.json├─uni.promisify.adaptor.js└─uni.scss上面是官网给出的目录构造标准。 ┌─uniCloud 云空间目录,阿里云为uniCloud-aliyun,腾讯云为uniCloud-tcb(详见uniCloud)│─components 合乎vue组件标准的uni-app组件目录│ └─comp-a.vue 可复用的a组件├─utssdk 寄存uts文件├─pages 业务页面文件寄存的目录│ ├─index│ │ └─index.vue index页面│ └─list│ └─list.vue list页面├─static 寄存利用援用的本地动态资源(如图片、视频等)的目录,留神:动态资源只能寄存于此├─uni_modules 寄存[uni_module](/uni_modules)。├─platforms 寄存各平台专用页面的目录,详见├─nativeplugins App原生语言插件 详见├─nativeResources App端原生资源目录│ ├─android Android原生资源目录 详见| └─ios iOS原生资源目录 详见├─hybrid App端寄存本地html文件的目录,详见├─wxcomponents 寄存小程序组件的目录,详见├─unpackage 非工程代码,个别寄存运行或发行的编译后果├─AndroidManifest.xml Android原生利用清单文件 详见├─Info.plist iOS原生利用配置文件 详见├─main.js Vue初始化入口文件├─App.vue 利用配置,用来配置App全局款式以及监听 利用生命周期├─manifest.json 配置利用名称、appid、logo、版本等打包信息,详见├─pages.json 配置页面路由、导航条、选项卡等页面类信息,详见└─uni.scss 这里是uni-app内置的罕用款式变量公共组件上面开始公共组件的编写、注册和应用。 编写公共组件在 uniapp 我的项目下是基于 vue 框架来写页面的,因而能够应用 vue 的相干知识点来新建公共组件。 ...

August 30, 2023 · 2 min · jiezi

关于前端:头像循环滚动实现的记录

背景:须要用户头像(3个)左边局部叠层展现,并且反对循环滚动 实现:扭转dom上绑定的款式id,论循替换 <template> <div class="slider-headimg"> <div class="out"> <div class="inner"> <div class="img" ref="headimgList" v-for="(item,index) in sliderHeadimgList" :key="index"> <img :src="item.headImgUrl"> </div> </div> </div> </div></template><script>export default { props: { sliderHeadimgList: { type: Array, default: () => [] } }, data () { return { timer: null, // 定义地位数组 idArr: ['first', 'second', 'right', 'last'] } }, mounted () { this.init() }, destroyed () { if (this.timer) { clearInterval(this.timer) } }, methods: { init () { // 初始化图片地位,依据id不同,初始化款式 var img = this.$refs.headimgList img[0].id = this.idArr[0] img[1].id = this.idArr[1] img[3].id = this.idArr[3] for (let i = 0; i < (this.sliderHeadimgList.length - 4); i++) { this.idArr.splice(3, 0, 'left') } this.initialize() // 定时器图片轮播 this.timer = setInterval(this.next, 1000) }, next () { // 将地位数组的最初一个元素删除,并将删除元素增加到地位数组第一个 this.idArr.unshift(this.idArr.pop()) this.initialize() }, // 将地位数组元素作为id赋值给img,达到轮播成果 initialize () { var img = this.$refs.headimgList for (var i = 0; i < img.length; i++) { img[i].id = this.idArr[i] } } }}</script><style lang="less">.slider-headimg { position: relative; display: flex; align-items: center; width: 200px; padding-bottom: 55px; margin-right: 10px;}.out { width: 100%; height: 100%; position: relative; .inner { width: 100%; .img { width: 48px; height: 48px; position: absolute; transition: 0.3s; display: flex; border-radius: 50%; border: 1px solid #fff; img { width: 100%; height: 100%; border-radius: 50%; } } } //设置id款式 #last { display: flex; transform: translateX(48px); z-index: 3; opacity: 1; } #first { display: flex; transform: translateX(96px); z-index: 2; opacity: 1; } #second { display: flex; transform: translateX(144px); z-index: 1; opacity: 1; } #left { display: none; transform: translateX(-48px); z-index: 1; opacity: 0; } #right { display: flex; transform: translateX(240px); z-index: 1; opacity: 0; }}</style>

August 30, 2023 · 2 min · jiezi

关于前端:商城二维码系统二维码生成系统源码与设计OctShop

OctShop开源商城零碎自带了二维码生成零碎,商城所有零碎要应用二维码的中央都是对立由此二维码生成系统生成的。其中包含:店铺收款二维码(H5/小程序)、店铺二维码(H5/小程序)、订单核销二维码、优惠券线下核销二维码、礼品支付核销二维码、奖品支付验证二维码等等。当买家或商家扫码相应的二维码,二维码零碎就会依据二维码内容,调用相应的业务逻辑处理程序。二维码生成的二维码都是以图片的模式进行输入,在程序开发中,像间接援用图片网址一样应用即可,也能够保留到本人的手机或电脑中。 一、店铺收款二维码(H5/小程序)生成与应用店铺收款二维码在OctShop商城零碎中,次要是商家的间接收款码。个别是放在线下实体店结算台间接让客户扫码付款,当然,也能够用于其余场景的收款。客户扫码付款后,在商家后盾零碎中就会呈现收单信息的揭示,并有到账揭示声。如下图: 二、店铺二维码(H5/小程序)生成与应用店铺二维码在OctShop商城零碎中,当访客扫描此二维码,访客就会进入到商家店铺的首页,外面有各种与店铺相干的信息,如:商品,优惠券,收款入口,拼团、秒杀、礼品、流动等等。此店铺二维码能够作为店铺的网上推广门户,能够将二维码张贴到各种中央。让更多的人拜访店铺,并下单购买商品,进步店铺的流量,达成更高的交易量。如下图: 三、分销商品,分享商品返佣二维码生成与应用OctShop商城零碎中,用户能够分享商家容许分销的商品,在商品的详情页,分享商品返佣选项上,点击立刻分享按钮,二维码生成零碎就会生成用户和商品专享二维码。只有把此二维码分享进来,通过此码扫进来的用户如果下单领取,那么,分享者就能够继续一直的获取商品的分销返佣。如下图: 四、订单核销二维码生成与应用在OctShop商城零碎中,如果须要到店生产、自取或到店享受服务的订单,在订单生成时就会同时生成订单核销二维码,在你到店的时候就须要展现订单核销二维码,商家扫码后进行核销验证,实现整个订单的交易过程。如下图: 五、优惠券线下核销二维码生成与应用OctShop商城零碎中的优惠券如果商家设置能够线下应用,那么,二维码生成零碎就会为线下应用优惠券生成线下核销二维码。当买家在线下实体店生产时,就能够应用此二维码,在结算时,商家扫描此此二维码,进行优惠券的核销。领取时就能够省去优惠券的金额。 六、礼品支付核销二维码生成与应用OctShop商城零碎买家能够应用积分兑换平台的礼品,如果礼品须要线下支付或到实体店生产的话,那么就须要核销验证。对于此类的礼品订单,二维码生成零碎就会为这类礼品订单生成核销二维码。到了实体店支付或生产时,展现二维码,商家扫码核销即可。 七、奖品支付验证二维码生成与应用OctShop商城零碎有抽奖零碎,对于曾经中奖的用户就会存在须要支付奖品或者奖品自身是服务型的商品,那么就须要到店支付。这时就须要一个形式进行验证,OctShop商城零碎采纳的是二维码核销形式。须要线下支付的奖品信息订单,二维码零碎就会生成核销二维码,商家扫码验证即可。

August 30, 2023 · 1 min · jiezi

关于前端:Flutter-生成小程序的混合-App-实践

一、背景微信小程序倒退的越来越快,目前小程序甚至取代了大部分 App 的生态位,公司的坑位不增反降,只能让原生利用开发兼顾或换岗进行小程序的开发。 以我的理论状况来讲,公司利用采纳的 Flutter 框架,同样的性能不可避免的就会存在 Flutter 利用开发和微信小程序开发兼顾的状况,这种反复造轮子的工作十分低效。 为什么会呈现这种状况呢?随着 2019 年 5 月 Google I/O 上 Flutter 1.5.4 的公布,宣示着 Flutter 真正开始进入全终端时代,意味着只须要写一份代码,不须要任何额定的修改改,就能够运行在 iOS、Android、Web、PC 上。Flutter 正在革命性的扭转挪动开发的生态系统,从面向各个终端的开发,转向面向框架开发,不仅会扭转开发者的开发方式,也有越来越多的公司开始关注应用 Flutter。 Flutter 作为一个跨平台的框架,其开发技术栈交融了 Native 和前端的技术,不仅波及到了 Native(Android、iOS )的开发常识,又汲取了很多前端(例如 React)的技术理念和框架,并且在此基础上又有晋升,造成 Flutter 本人独特的技术思维。 但目前来讲,Flutter 并不反对小程序,Flutter for Web 尽管最初也会生成 JS 代码,然而 Flutter 生成的 JS 和 CSS 都是不能批改的。而在 Flutter 中也没方法通过 Dart 间接调用小程序的接口,所以现阶段用 Flutter 开发小程序不是太好的抉择。 二、一些解决思路事实上,随着小程序这种轻量级终端的呈现,公司和业务也不得不向着互联网巨头的流量抬头,同时小程序的逐步风靡,也使得用户下载 App 的习惯产生了变动。不论购物、订餐还是办事,人们都会首先查找“关上即用,即用即走”的小程序,省去了下载 App 的繁琐流程。  当然也晓得很多开发者对于小程序是有十分多意见的,App 也不会说死就死,毕竟 App 绝对于小程序来讲,还是有很多劣势。所以 App 和小程序开发都共存的状况下,如何解决效率问题?是否让过往开发的小程序间接运行在 Flutter 开发的利用中呢?同样一个性能业务仅需一次小程序开发,即可实现在除了微信端的其它 App 中也运行起来。 在 Google 找相干的解决方案和材料的时候,发现国外简直没有这种计划,国内倒是有厂商在做这块,想想也的确合乎情理。基于公司 Flutter 框架的根底现实情况下,名为 FinClip 小程序容器技术的产品是可能反对除原生 iOS、Android 之外的 Flutter 和 React Native ,于是大略测试了下这个产品。 ...

August 30, 2023 · 4 min · jiezi

关于前端:技术专题API资产识别大揭秘二

在上一期中,咱们介绍了API资产的辨认技术,探讨了API资产的定义以及各类格调API的辨认技术。在本期中,咱们将持续介绍API资产辨认中的API聚合技术。 一、相干介绍作为API资产梳理中的关键环节,API聚合的目标是从流量数据中辨认出各种API,并通过剖析将流量中API进行归一化解决。 *API资产聚合其实相似于生存中的物品聚类。在API资产梳理过程中,将通信流量当中属于同一个的API接口用通用模式来示意。举个例子:在API通信流量当中,咱们辨认了多个Restful API:http://www.test.com/v1/app/1001很显著,这其实是属于同一个API接口,该API聚合后的成果应该为:http://www.test.com/v1/app/{id}在理论企业API资产梳理工作中,API通信流量通常十分微小。当咱们在流量中辨认到了10亿次API申请时,咱们就必须思考这到底是存在10亿个API资产,还是只有10个API资产。因而,API资产剖析的聚合成为企业理清API资产实在数量的要害。 二、API聚合技术整体思路:基于统计算法,将通信流量中API初步归类,一般来说依照同一个业务零碎进行分类,而后将其所有的 API 无论是 URL 的局部还是 Body 的局部,全副形象成一个数据结构,通过统计的办法去放大API聚合范畴,最初通过肯定的算法把通用的模式识别进去,再用这些通用的模式去打标签,这种增量的流量逐步的可能收敛掉,靠近到实在 API 的资产数量水平。上面来看看统计局部的算法。1.字典树算法Trie,又称字典树、单词查找树或键树,是一种树形构造,是一种哈希树的变种。典型利用是用于统计,排序和保留大量的字符串(但不仅限于字符串),所以常常被搜索引擎零碎用于文本词频统计。长处是:利用字符串的公共前缀来缩小查问工夫,最大限度地缩小无谓的字符串比拟,查问效率比哈希树高。举个例子:关键字汇合为:{“a”, “to”, “tea”, “ted”, “ten”, “i”, “in”, “inn”} 应用Trie树示意如下图所示:在API聚合逻辑中,咱们还须要对Trie算法进行变形,将/作为节点宰割符,将API的URL局部变成树状构造。比方:http://example.com/cat/sports解析后果如下图:基于树状构造,咱们将统计确定API聚合范畴的相干维度,比方:尾结点到跟节点的间隔,示意API中URL的长度领有雷同节点的树状构造,示意API中URL雷同门路同一深度的节点可变性通过以上统计数据,咱们将API聚合的范畴进一步放大:这些API属于同一业务零碎、门路长度雷同、领有雷同门路节点,并且存在可变门路。2.字符串类似断定当咱们使用后面提及的Tire算法进一步放大API聚合的范畴后发现,后续的工作次要是对于那些可变门路的类似度的计算,也就是这些在同一地位的可变门路是不是属于同一类,如果是就能够把它们进行聚合解决。上面咱们将介绍几种对于字符串类似度计算的基本原理:余弦相似性余弦相似性通过测量两个向量的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1,而其余任何角度的余弦值都不大于1;并且其最小值是-1。定义如下:编辑间隔编辑间隔是针对二个字符串(例如英文字)的差别水平的量化量测,量测形式是看至多须要多少次的解决能力将一个字符串变成另一个字符串。汉明间隔汉明间隔是两个字符串对应地位的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所须要替换的字符个数。汉明间隔是编辑间隔中的一个非凡状况,仅用来计算两个等长字符串中不统一的字符个数。Sorensen Dice 类似度系数Dice类似度系数是用于度量两个汇合的相似性,因为能够把字符串了解为一种汇合,因而Dice间隔也会用于度量字符串的相似性。Jaccard 类似度定义公式如下,简略来说就是汇合的交加与汇合的并集的比例。当然,上述都是计算字符串的相似性的实践计划,在肯定水平上这些办法是无效的,但联合不同的训练样本和业务理论,计算API中URL类似度的办法也各有不同。Simhash算法Simhash是google于2007年公布的一篇论文《Detecting Near-duplicates for web crawling》中提出的算法,最后次要用于解决亿万级别的网页去重工作。SimHash自身属于一种部分敏感hash,其次要思维是降维,将高维的特征向量转化成一个f位的指纹,通过算出两个指纹的海明间隔来确定两篇文章的类似度。当然,利用Simhash算法,咱们也能够用于两个字符串的类似度的计算,上面是SimHash算法的流程:而传统的Hash算法只负责将原始内容尽量平均随机地映射为一个签名值,原理上仅相当于伪随机数产生算法。即使是两个原始内容只相差一个字节,所产生的签名也很可能差异很大,所以传统的Hash是无奈在签名的维度上来掂量原内容的类似度。 3.聚合成果那通过上述API聚合技术的介绍,咱们聚合后最终可能达到什么样的成果呢?咱们以测试网站的API为例:从流量中获取到该网站存在以下API(通过解决,图中显示API的URL门路局部)通过统计算法解决之后,咱们将失去门路雷同、URL长度雷同、领有雷同门路节点等条件的API聚合范畴。依据统计后的聚合范畴,咱们对满足条件的API中的可变门路局部进行类似度计算并聚合,最终后果如下所示: 小结本次次要旨在揭示基于统计算法的API资产剖析和聚合技术。通过将通信流量中的API进行初步分类,并将所有API的URL局部形象为一个数据结构。通过统计办法放大API聚合范畴,而后利用相干算法计算和聚合满足条件的API中可变门路局部的类似度。最初,对聚合的通用模式进行辨认,并对后续增量的流量进行收敛,以此帮忙企业梳理出靠近实在API的资产及其数量。 对于Portal Lab星阑科技 Portal Lab 致力于前沿平安技术钻研及能力工具化。次要钻研方向为数据流动平安、API 平安、利用平安、攻防反抗等畛域。实验室成员研究成果曾发表于BlackHat、HITB、BlueHat、KCon、XCon等国内外出名平安会议,并屡次公布开源平安工具。将来,Portal Lab将持续以凋谢翻新的态度踊跃投入各类平安技术钻研,继续为平安社区及企业级客户提供高质量技术输入。

August 30, 2023 · 1 min · jiezi

关于前端:Taro-React-底部自定义TabBar-使用React-useContext-解决-底部选中异常需要点两次才能选中的问题

所用技术Taro,React HooKs(useContext , createContext),@antmjs/vantui(这是UI组件)背景在应用 Taro 进行小程序开发时,底部 TabBar 是十分常见的页面导航形式。然而,有时候咱们可能会遇到一个问题:底部 TabBar 的选中状态异样,须要点击两次能力胜利选中某个标签。本文将介绍如何应用 React 的 useContext 来解决这个问题,同时联合 Taro 的自定义 TabBar 来实现失常的底部导航。 解决方案应用 React 的 useContext在 Taro 中,咱们能够应用 useContext 钩子来创立和应用上下文。上下文可能在组件之间共享数据,这里咱们将应用它来解决底部选中异样的问题。 首先,咱们须要创立一个上下文对象,用来治理底部 TabBar 的选中状态。// UserContext.jsimport { createContext } from 'react';const UserContext = createContext();export default UserContext;在利用的入口文件app.js中,咱们将应用 useContext 创立上下文,并将底部 TabBar 的选中状态放入上下文中。// app.jsimport { useState } from 'react';import Taro, { createContext, Provider } from '@tarojs/taro';import './app.scss';import UserContext from './UserContext';function App({ children }) { const [selectedTab, setSelectedTab] = useState(0); return ( <UserContext.Provider value={{ selectedTab, setSelectedTab }}> {children} </UserContext.Provider> );}export default App;当初,咱们能够在任何组件中应用 useContext 来获取和设置选中状态。那么上面咱们来创立一个自定义组件TabBar ...

August 30, 2023 · 2 min · jiezi

关于前端:Nodejs-是什么Nodejs-简介及安装配置详解指南

Node.js 是一个基于 Chrome V8 引擎的开源、跨平台的 JavaScript 运行时环境。它容许开发者应用 JavaScript 构建高性能、可扩大的网络应用程序,使 JavaScript 可能在服务器端运行,而不仅仅局限于浏览器端。Node.js 的包管理器 npm,是寰球最大的开源库生态系统。应用 Node.js 能够实现前端开发和后端开发,它具备事件驱动、非阻塞 IO 模型等个性。 Node.js 的装置及环境配置装置 Node.js要开始应用 Node.js,首先须要在你的计算机上安装 Node.js 运行时。以下是装置 Node.js 的几种罕用办法: 1.官方网站下载安装包: 拜访 Node.js 官方网站,抉择适宜你操作系统的版本,下载并装置(傻瓜式装置,点击下一步就能够了),你能够抉择自定义装置目录,而后在终端输出 node -v 和 npm -v 查看是否装置胜利。 2.应用包管理器装置(实用于 Linux/macOS): 如果你应用的是 Linux 或 macOS,你能够应用包管理器来装置 Node.js。例如,在终端中运行以下命令: 对于 Linux(应用 apt): sudo apt install nodejs sudo apt install npm对于 macOS(应用 Homebrew): brew install node配置 Node.js 环境装置 Node.js 后,你可能还须要配置一些环境设置以便更好地应用它: 1.查看装置: 在命令行中运行以下命令,查看 Node.js 和 npm(Node.js 包管理器)是否正确装置: ...

August 30, 2023 · 2 min · jiezi

关于前端:强烈推荐收藏的前端学习资源

明天分享一些集体珍藏的前端学习资源,按一下几个维度简略划分了下,有 3D、框架、构建工具等等。因为这些地址都是我集体珍藏的,所以带有一些强烈的主观意识,还有很多优良的网址没有收录进来,会不断更新的,欢送大家点赞,珍藏。 对于库名的翻译问题,因为是机翻,会存在一些问题,还请见谅。 本文首发于微信公众号:家养程序猿江辰 3Dcesium 地址 对于:用于世界级 3D 地球仪和地图的开源 JavaScript 库 举荐理由:3D 实现的各种地球 举荐指数:⭐️⭐️⭐️⭐️⭐️ vanta 地址 对于:为您的网站提供 3D 动画背景 举荐理由:炫酷,特效,简略,自定义 举荐指数:⭐️⭐️⭐️⭐️⭐️ webgl-fundamentals 地址 对于:从根底开始的 WebGL 课程 举荐理由:从入门到放弃 举荐指数:⭐️⭐️⭐️ 框架dioxus | 二恶英 地址 对于:实用于桌面、Web、挪动等的全栈 GUI 库。 举荐理由:应用 Rust 编写的全栈开发框架 举荐指数:⭐️⭐️⭐️⭐️⭐️ 构建工具parcel 地址 对于:用于网络的零配置构建工具 举荐理由:性能更快 举荐指数:⭐️⭐️⭐️⭐️⭐️ esbuild 地址 对于:速度极快的网络捆绑器 举荐理由:性能更快 举荐指数:⭐️⭐️⭐️⭐️⭐️ swc 地址 对于:基于 Rust 的 Web 平台 举荐理由:Rust 带来牢靠的性能 举荐指数:⭐️⭐️⭐️⭐️⭐️ 图标Font-Awesome 地址 对于:标志性的 SVG、字体和 CSS 工具包 举荐理由:字体、SVG、CSS 举荐指数:⭐️⭐️⭐️⭐️⭐️ flag-icons | 旗号图标 ...

August 30, 2023 · 2 min · jiezi

关于前端:你知道什么是标签函数么

大家好,我卡颂。 在JS中有一类非凡的函数 —— 标签函数,用于自定义模版字符串的解决逻辑。 不同于个别函数形如fn(argA, argB)的执行形式,标签函数能够间接跟在模版字符串后面,比方: tagFn`hello ${name}`本文来聊聊标签函数都有哪些有意思的利用。 欢送围观朋友圈、退出人类高质量前端交换群,带飞 内置的标签函数JS中只有一个内置标签函数 —— String.raw,用于获取模字符串的原始字符串模式,即: 解决替换(例如替换${name}为变量理论的值)不解决转义序列(例如 \n)对于如下代码: const name = 'Ka Song';const s1 = `Hello \n ${name}`const s2 = String.raw`Hello \n ${name}`用console.log别离打印s1、s2的后果如下: 之所以s1有换行符,而s2没有,是因为默认状况,模版字符串会解决转义字符(比方这里的\n),而String.raw不会解决。 要实现一个繁难的String.raw也很简略,比方上面的myRaw,其中: strings参数是保留原始字符串的数组values参数是保留所有替换变量的数组function myRaw(strings, ...values) { let result = ''; for (let i = 0; i < strings.length; i++) { result += strings.raw[i] || strings[i]; if (i < values.length) { result += values[i]; } } return result;}对于模版字符串你好${1}我是${2}${3}谢谢: strings参数如下: ["你好", "我是", "", "谢谢"]values参数如下:[1, 2, 3]myRaw办法会顺次从strings和values中取值拼接字符串。 ...

August 30, 2023 · 1 min · jiezi

关于前端:业务流程与逻辑编排的低代码平台一文全方位了解它的轻应用信息

JVS低代码开发平台提供了大量的可配置组件和事后集成的性能,开发人员能够通过拖拽和设置属性的形式,疾速搭建应用程序的前端界面和交互逻辑。同时,低代码平台也提供了丰盛的后端服务和集成能力,能够轻松地与现有的零碎和第三方服务进行对接。低代码的轻利用通常实用于一些简略的业务场景,例如表单解决、数据展现、流程治理等。因为应用低代码平台进行开发,轻利用的开发工夫和老本都失去了较大的缩小,同时还具备肯定的可定制性和扩展性。 JVS轻利用的详情展现如下图所示,点击利用的名称,右侧展现出利用的根本详情 其中包含利用的根本信息、利用的权限信息、页面信息、业务流程、业务逻辑、数据模式、利用相干日志与自定义页面等信息。 根本信息如下图所示,包含利用的根本信息与基本操作 ①:利用的根本信息与logo②:利用的状态与快速访问的URL信息③:利用的凭证展现利用的外围秘钥信息④:利用的操作,对利用的公布与卸载,在待发布状态下,才能够删除利用 利用权限点击利用权限,零碎进入利用权限治理页面,提供对本利用的受权配置的操作 利用管理员有两类:利用主管与开发成员,利用主管受权后,用户能够对本利用进行配置编辑、公布;利用开发成本是受权后,能够在利用核心查看到此利用,能够对利用的卸载,公布到模板核心等操作,如下图所示 例如,如果须要两个人或者多人对轻利用进行批改,就能够在这里进行受权设置: 页面列表点击页面列表,展现的零碎中蕴含的配置生成的列表页与表单,这里能够对曾经配置的页面进行删除操作。 业务流程在业务流程界面展现了本利用 蕴含的所有的业务流程,同时这里能够创立流程。 页面能够对创立流程、删除流程、对流程进行设计, 展现流程相干公布状态 逻辑编排列表点击集成自动化列表页,零碎展现了本利用中所有通过编排的可执行逻辑 其中,这里能够创立逻辑,这里创立的逻辑是能够反对独立自主运行的,能够设置主动启动的定时工作的。 数据模型数据模型是 轻利用存储数据的根底能力,相似一般的数据表,然而数据模型更多是具备柔性的能力,也就是依据列表页、表单配置的调整,零碎或动静调整数据模型的构造 点击详情,将展现该数据模型的具体表构造,能够点击具体字段增加索引。 备注:模型中如果没有字段的,零碎将不展现详情按钮,如下图所示 利用日志利用日志是记录本利用编辑操作的历史过程,其中记录了操作人员、操作工夫,操作的内容,如下图所示 自定义页面这里自定义页面次要解决自定义的前端页面须要接入轻利用是,须要具备同样的权限管制体系,能够通过申明权限的标识,由自定的页面本人实现界面的权限管制,由轻利用来配置权限调配。 点击新增,这弹出新增自定义页面的表单,输出页面地址与页面信息即可实现自定页根底信息的增加; 点击权限设置,这进入自定义权限治理的界面:如下图所示: ①:新增权限标识,就是申明一个对应权限的标识,在自定义页面中实现对这个标识 的权限管制,能够增加多个权限标识 ②:增加权限控制组,和其余页面、性能的权限管制相似,能够新增多个权限组,能够赋予多个人员、角色等 在线demo:https://frame.bctools.cn/根底框架开源地址:https://gitee.com/software-minister/jvs 往期干货回顾独立服务编排逻辑引擎:jvs-logic服务原子组件介绍JVS低代码:如何触发逻辑并获取内部API数据,接入百度天气查问低代码、逻辑、规定、数据分析、协同工具汇合,解决企业不同需要低代码开发重要工具:JVS低代码2.1.8新版本性能清单

August 30, 2023 · 1 min · jiezi

关于前端:面试官说说Javascript数据类型和类型转换

大厂学习材料这是我整顿的学习材料,十分零碎和欠缺,欢送一起学习古代JavaScript高级小册深入浅出Dart古代TypeScript高级小册linwu的算法笔记Javascript数据类型和类型转换在JavaScript中,了解数据类型,如何辨别它们,以及它们如何被转换是至关重要的。在这篇文章中,咱们将探讨这些主题,以帮忙坚固你的JavaScript根底。 根底数据类型和援用数据类型当波及JavaScript的数据类型时,咱们能够将其分为两类:根本数据类型和援用数据类型。 根本数据类型(Primitive Types):数字(Number):示意数值,能够蕴含整数和浮点数。例如:let age = 25;字符串(String):示意文本数据,由一串字符组成。能够应用单引号或双引号包裹。例如:let name = 'John';布尔(Boolean):示意逻辑值,只有两个可能的值:true(真)和false(假)。例如:let isStudent = true;空值(Null):示意空值或无值。它是一个非凡的关键字null。例如:let myVariable = null;未定义(Undefined):示意变量申明但未赋值的值。它是一个非凡的关键字undefined。例如:let myVariable;符号(Symbol):示意惟一且不可变的值,用于创建对象属性的惟一标识符。在ES6中引入。例如:let id = Symbol('id');援用数据类型(Reference Types):对象(Object):示意简单的数据结构,能够蕴含多个键值对。对象能够通过大括号{}创立,或者通过构造函数创立。例如: let person = { name: 'John', age: 25, city: 'New York'};数组(Array):示意有序的数据汇合,能够蕴含任意类型的数据。数组能够通过方括号[]创立。例如: let numbers = [1, 2, 3, 4, 5];函数(Function):是一段可执行的代码块,能够接管参数并返回值。函数能够作为变量、参数传递、存储在对象属性中等。例如: function greet(name) { console.log('Hello, ' + name + '!');}根本数据类型在JavaScript中是按值传递的,而援用数据类型则是按援用传递的。这意味着根本数据类型的值在传递过程中是复制的,而援用数据类型的值在传递过程中是共享的。 理解这些根本数据类型和援用数据类型,为后续解说类型转换提供了根本的背景常识。它们在JavaScript中的不同行为和用法对于了解类型转换的概念和机制十分重要。 应用typeof操作符在JavaScript中,咱们能够应用typeof操作符来获取一个值的数据类型。上面是一些例子: console.log(typeof undefined); // 'undefined'console.log(typeof true); // 'boolean'console.log(typeof 78); // 'number'console.log(typeof 'hey'); // 'string'console.log(typeof Symbol()); // 'symbol'console.log(typeof BigInt(1)); // 'bigint'console.log(typeof new String('abc')); // 'object'console.log(typeof null); // 'object'console.log(typeof function(){}); // 'function'console.log(typeof {name: 'Jack'}); // 'object'留神,typeof返回的是值的类型,而不是变量的类型。因为在JavaScript中,变量自身并没有类型,它们能够持有任何类型的值。 ...

August 30, 2023 · 3 min · jiezi

关于前端:zonejs由入门到放弃之二zonejs-API大练兵

这是来自孙啸达 同学的zone.js系列文章第二篇,这篇文章次要为咱们介绍了Zone和ZoneTaskzone.js系列往期文章zone.js由入门到放弃之一——通过一场游戏意识zone.jszone.js中最重要的三个定义为:Zone,ZoneDelegate,ZoneTask。搞清楚了这三个类的API及它们之间关系,基本上对zone.js就通了。而Zone,ZoneDelegate,ZoneTask三者中,Zone,ZoneDelegate其实半差不差的能够先当成一个货色。所以文中,咱们集中火力主攻Zone和ZoneTask。 Zone传送门 interface Zone { // 通用API name: string; get(key: string): any; getZoneWith(key: string): Zone|null; fork(zoneSpec: ZoneSpec): Zone; run<T>(callback: Function, applyThis?: any, applyArgs?: any[], source?: string): T; runGuarded<T>(callback: Function, applyThis?: any, applyArgs?: any[], source?: string): T; runTask(task: Task, applyThis?: any, applyArgs?: any): any; cancelTask(task: Task): any; // Wrap类包装API wrap<F extends Function>(callback: F, source: string): F; // Task类包装API scheduleMicroTask( source: string, callback: Function, data?: TaskData, customSchedule?: (task: Task) => void): MicroTask; scheduleMacroTask( source: string, callback: Function, data?: TaskData, customSchedule?: (task: Task) => void, customCancel?: (task: Task) => void): MacroTask; scheduleEventTask( source: string, callback: Function, data?: TaskData, customSchedule?: (task: Task) => void, customCancel?: (task: Task) => void): EventTask; scheduleTask<T extends Task>(task: T): T;}Zone中的API大抵分了三类:通用API、Wrap类和Task类。Wrap和Task类别离对应zone.js对异步办法的两种打包形式(Patch),不同的打包形式对异步回调提供了不同粒度的"监听"形式,即不同的打包形式会暴露出不同的拦挡勾子。你能够依据本身对异步的控制精度抉择不同的打包形式。 ...

August 30, 2023 · 6 min · jiezi

关于前端:纯CSS杂志封面折叠效果

如图所示,这是一个杂志封面图的折叠成果,折叠前后的图片内容齐全不违和,霎时对这个图片内容的排版设计很是称誉,但这块不再本次文章的探讨范畴,本次文章是要用纯CSS实现这个折叠成果。 按图片的成果进行代码还原很多形式都能够实现,以下是本次实现的次要几点: 纯CSS实现,不依赖JavaScript应用单张图片,不须要在PS中切割成多单图片能够通过款式属性中设置CSS变量来配置页面实现过程界面布局HTML的实现绝对简略,img标签次要实现内容大小的管制,将图标外部的内容宰割为3个局部,其中左侧span.a占50%,右侧 span.bc占50%,span.bc中的 span.b 和 span.c 各占比一半。图片的地址从HTML中可传入,这样须要更换图片的时候就不须要更新CSS中的代码了。 <span class="jaffee" style="--bg: url('path/to/image.png');"> <span class="a"></span> <span class="bc"> <span class="b"></span> <span class="c"></span> </span> <img src="path/to/image.png"></span> 你可能会好奇图片为什么被暗藏了,外围的逻辑就是对不同的宰割块中设置不同的 background-position,每一块都是用的同一个图片地址,然而真正显示的区域不一样,拼在一起刚好是一张残缺的图片。当hover时对 span.b 和 span.c设置不同的动画成果,接下来看外围的代码实现。 下面有提到img标签次要实现内容大小的管制,所有img标签的目标是撑开内容的大小,然而自身是不展现在页面中的,所以img标签有一个非凡的款式管制opacity: 0,暗藏其透明度。这样咱们就能够灵便的操作span宰割进去的背景了。 img { width: auto; height: auto; max-width: 100%; max-height: 56vh; opacity: 0;}接下来设置abc三个区域的尺寸: .jaffee .a { position: absolute; left: 0; width: 50%; background-position: 0 0;}.jaffee .bc { position: absolute; width: 50%; height: 100%; left: 50%;}.jaffee .b,.jaffee .c { position: relative; width: 50%;}bc区域会波及到3d动画,进一步减少相干css属性: .jaffee .bc { transform-origin: left; transition: transform 3s; transform-style: preserve-3d;}而后对不同的区域背景图片设置不同的 background-position,a区域在最左侧且无相干动画展现,所以不须要设置: ...

August 30, 2023 · 1 min · jiezi

关于前端:Cocos独立游戏开发框架中的Socket网络模块

引言本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢送大家关注分享珍藏订阅。 Socket模块是Cocos游戏开发框架中的重要组成部分之一。通过Socket模块,开发者能够轻松实现游戏中的网络通信性能,使得玩家能够与其余玩家进行实时交互或者获取服务器上的数据。在游戏开发中,网络通信是不可或缺的一环,而Socket模块的存在,为开发者提供了一个不便、高效、稳固的解决方案。无论是多人在线游戏还是多人对战游戏,Socket模块都可能满足开发者的需要,并且具备良好的跨平台性能,能够在不同的操作系统和设施上进行开发和运行。在本文中,咱们将深入探讨Cocos游戏开发框架中的Socket模块,介绍其原理、应用办法和常见利用场景,帮忙开发者更加全面地理解和使用Socket模块,从而实现更加杰出的游戏开发成绩。 本文源码和源工程在文末获取,小伙伴们自行返回。 什么是Socket在游戏开发中,Socket是一种用于实现网络通信的编程接口(API)。它容许不同计算机或设施之间通过网络进行数据交换和通信。游戏开发中的Socket通常用于创立客户端和服务器之间的通信连贯,以便实现实时多人互动或实时数据传输。以下是一些对于游戏开发中Socket的重要信息: 客户端和服务器通信: 在多人游戏中,通常有一个游戏服务器,负责管理游戏的状态和逻辑。玩家通过游戏客户端连贯到服务器。Socket技术容许客户端和服务器之间建设连贯,以便它们能够通过网络传输数据,例如玩家的地位、操作指令、游戏状态等。实时性: Socket通信是实时的,意味着数据能够即时传输。这对于须要疾速响应和实时交互的游戏十分重要,如多人射击游戏、实时策略游戏等。数据传输: 通过Socket连贯,游戏中的数据能够在客户端和服务器之间双向传输。这包含玩家的输出、游戏状态更新、其余玩家的动作等。同步: Socket连贯在多人游戏中确保了各个玩家的游戏状态放弃同步。服务器能够接管所有玩家的输出,计算游戏状态变动,而后将后果播送给所有玩家,以确保所有客户端都显示雷同的游戏画面。协定: 在应用Socket进行通信时,开发人员须要抉择适当的网络协议,例如TCP(传输控制协议)或UDP(用户数据报协定)。TCP提供牢靠的、面向连贯的通信,实用于须要确保数据完整性的状况。UDP则更适宜一些实时性要求较高但对数据失落有肯定容忍度的状况。编程: 在游戏开发中,开发人员须要应用编程语言(如C++、C#、Python等)来实现Socket通信。通过操作Socket库提供的函数和办法,能够创立、连贯、发送和接收数据。Socket实用游戏类型应用Socket连贯的游戏通常是须要实时通信或多人互动的游戏。Socket是一种用于在网络上进行数据传输的技术,实用于建设客户端和服务器之间的实时通信。以下是一些须要应用Socket连贯的游戏类型: 多人在线游戏(MMO): 多人在线角色扮演游戏(MMORPG)和其余类型的多人在线游戏须要玩家之间的实时互动。通过Socket连贯,玩家能够在游戏世界中共享地位、状态和其余信息,实现多人游戏体验。实时策略游戏: 实时策略游戏(RTS)通常要求玩家实时协调和执行各种操作,例如建造基地、训练单位、攻打敌人等。Socket连贯容许玩家之间进行实时的指令和状态传输,确保游戏的同步性。射击游戏: 多人射击游戏(FPS)和其余射击游戏须要玩家之间的疾速实时通信,以确保击中和挫伤的精确计算。Socket连贯用于传输玩家地位、射击信息以及其余与游戏中的碰撞和互动无关的数据。体育竞技游戏: 足球、篮球等体育竞技游戏通常须要玩家在虚拟环境中模仿理论较量。Socket连贯可用于在玩家之间传输较量状态、球员动作和比分等信息。卡牌游戏和棋类游戏: 卡牌游戏和棋类游戏可能须要玩家之间实时的操作和状态同步,以确保游戏的公平性和准确性。Socket连贯能够用于在对手之间传输棋局状态、卡牌信息等。虚拟世界游戏: 一些虚拟世界游戏或社交游戏也应用Socket连贯,以便玩家能够实时在虚拟环境中进行互动、聊天和交易。Socket网络模块的实现1.新建Socket脚本构造大家能够自行定义如图: 2.定义封装内容包含Socket连贯状态枚举(未连贯,连贯中,已连贯),外围模块WebSocket模块,以及一些回调: 3.Socket连贯其中url是服务器的ip和端口组成,例如: http :ws://127.0.0.1:3000https : wss://域名/3000 https必须要备案的域名。 4.绑定回调事件次要包含: 连贯关上onopen连贯敞开opclose连贯出错onerror接管音讯onmessage 5.发送音讯发送音讯到服务器: 6.敞开连贯被动敞开连贯: 7.编写测试代码连贯服务器,顺次发送聊天对话到服务器,期待服务器回复,完结后敞开连贯: 8.写一个简略的AI Socket服务器语言用的是js,据说这个AI外围代码价值1个亿: 9.把服务器跑起来大家自行装置node.js: 10.成果演示估值上亿的成果展现: 总结Socket模块是Cocos游戏开发框架中的重要组成部分,用于实现网络通信性能。它反对TCP和UDP协定,并提供了异步通信机制和多线程反对,可能在不阻塞游戏主线程的状况下进行网络通信。此外,Socket模块还提供了数据加密和压缩性能,确保网络通信的安全性和效率。通过应用Socket模块,开发人员能够不便地实现各种网络相干的性能,为游戏应用程序增加更多的交互和乐趣。 本文的重点内容次要有以下几点,不晓得小伙伴们是否曾经了解: 本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢送大家关注分享珍藏订阅。Socket网络模块的介绍。Socket网络模块实用游戏类型。源码通过关注“亿元程序员”发送"Socket"获取。AD:笔者曾经上线的小游戏《填色之旅》《贪吃蛇掌机经典》《重力迷宫球》大家能够自行点击搜寻体验。 感兴趣的小伙伴记得关注"亿元程序员"哦,一位有着8年游戏行业教训的主程。学习游戏开发不迷路。感谢您的关注,心愿能给到您帮忙, 也心愿通过您能帮忙到大家。 喜爱的能够点个赞、点个在看哦!请把文章分享给你感觉有须要的其余小伙伴。谢谢。

August 30, 2023 · 1 min · jiezi

关于前端:有意义的前端应用程序文件夹结构

微信搜寻 【大迁世界】, 我会第一工夫和你分享前端行业趋势,学习路径等等。本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试残缺考点、材料以及我的系列文章。快来收费体验ChatGpt plus版本的,咱们出的钱 体验地址:https://chat.waixingyun.cn 能够退出网站底部技术群,一起找bug,另外新版作图神器,ChatGPT4 已上线 https://cube.waixingyun.cn/home 对于大规模利用来说,最要害也最具挑战性的方面之一就是良好且正当的文件夹构造。在思考将代码库合成为应用微前端的多个利用之前,有一些步骤能够遵循,以在我的项目级别改良架构,并使过渡更加容易,如果你已经思考过这条门路的话。 指标是利用某种模块化,通过在性能之间设定边界并最小化代码耦合和副作用,使代码库更易于了解。 默认我的项目构造默认状况下,当应用某个风行的前端框架搭建新我的项目时,组件构造是平坦的,齐全不遵循任何层次结构。 assets 目录用于存储整个应用程序中应用的动态资源,如图片、字体和CSS文件。components 目录蕴含可重用的Vue组件,倡议应用扁平化的层次结构。main.js 文件作为应用程序的入口点,使得 Vue 初始化和插件或附加库的配置成为可能。App.vue 文件代表了咱们应用程序的根组件,它充当其余组件的容器,并作为主模板提供服务。咱们曾经粗浅体验到,对于大型项目来说,这种架构很快就会失控。咱们须要某种模块化,以便可能轻松定位特定文件,设定性能之间的边界,并防止组件之间的严密耦合。 将应用程序合成为多个性能任何大型应用程序都会被拆分为多个独立的性能。辨认它们并不总是容易和间接的,但随着工夫和教训的积攒,这个过程会变得更好。让咱们一起尝试将一个风行的应用程序合成为各个局部作为练习。 推特的主页内容丰富多彩。页面的外围局部是工夫线,四周围绕着许多性能,如导航、推文创立区域、带有多个子组件的侧边栏、浮动音讯组件等等。 将形成这些性能的所有组件放在同一个文件夹中是无奈保护的,即便应用IDE的疾速查找选项,要找到其中的一个也会十分艰难。 一个更具体的我的项目构造依据教训,一个更好且更全面的文件构造应该是这样的: components : 所有在整个应用程序中应用的共享组件。composables : 所有共享的可组合部件。config : 应用程序配置文件。features : 蕴含所有的应用程序性能。咱们心愿将大部分的利用程序代码保留在这里。layouts : 页面的不同布局。lib : 咱们利用中应用的各种第三方库的配置。pages : 咱们应用程序的页面。services : 共享的应用服务和提供商。stores : 全局状态存储。test : 与测试相干的模仿、助手、实用程序和配置。types : 共享的 TypeScript 类型定义。utils : 共享的实用功能。须要留神的三件重要事项: Pages 文件夹自身就曾经在肯定水平上实现了模块化,无论是在上下文方面还是在像webpack或Vite这样的构建工具会创立的理论块方面。将所有页面放在一个中央十分有帮忙,然而它们外部的逻辑应该尽量简化。为了更便于保护和扩大,咱们的指标是将大部分利用程序代码保留在 features 文件夹内。每个性能文件夹应蕴含给定性能的特定畛域代码。在现实的世界里,咱们不应该有共享的组件、可组合的、存储和服务,所有的货色都应该在相应的个性文件夹内。可怜的是,在理论的我的项目中,这是无奈防止的,但咱们应该提前布局,并在向这些文件夹增加内容时分外小心Features Folder 性能文件夹正如咱们之前提到的,咱们的应用程序的大部分应该存在于个性文件夹中,并宰割成多个子目录。 api : 所有的获取逻辑都在这里,这使得API和UI解耦。components : 特定性能的组件。composables : 特定性能的可组合项。stores : 状态治理代码,咱们期待并实际上激励有多个子模块。types : 特定性能的TypeScript类型定义。index.ts : 这是性能的入口点。它作为性能的公共API进行操作,只应导出应用程序的其余局部应公开的内容。上述的 index.ts 文件作为每个性能的公共API。当从另一个畛域导入某些内容时,应仅通过此文件进行。这应该能够避免循环依赖,并且也使得找到导入源更为容易。 ...

August 30, 2023 · 1 min · jiezi

关于前端:uniapp-项目实践总结二从零开始搭建一个项目

导语:本篇文章次要是我的项目方面的技术开发总结,新建一个我的项目能够抉择应用可视化界面,也能够应用命令行搭建。目录可视化界面命令行搭建安卓开发环境苹果开发环境可视化界面装置软件应用官网举荐的 HbuilderX 软件,开发方式比较简单,内置相干环境以及终端,无需配置 node。 下载地址: hbuilderx;新建我的项目关上软件找到文件》新建》我的项目,抉择 uni-app 我的项目,默认模板就能够;填写项目名称和存储门路,点击右下角创立按钮,这样我的项目就创立胜利了;运行我的项目在我的项目根目录上面,抉择顶部导航运行。 运行到游览器:点击运行到游览器,能够抉择内置游览器,也能够内部游览器,内部游览器须要设置好游览器装置门路。运行到小程序:抉择须要的小程序,配置小程序开发者工具门路,点击运行到指定的小程序开发工具或指定页面。运行到 app: 运行到安卓,下载安卓开发编辑器或应用真机,抉择运行到安卓基座或指定页面;运行到 ios,下载苹果 xcode 编辑器或应用真机,抉择运行到 ios 基座或指定页面;发行我的项目在我的项目根目录上面,抉择顶部导航发行。 公布到网站PC、Web 或手机 H5:填写网站名称和域名以及可选项,点击发行。 公布到小程序抉择须要的小程序,填写小程序名称和小程序 AppId 以及可选项,点击发行。 公布到 app形式有云打包或者本地打包。 云打包:安卓签名证书生成指南,ios 签名证书生成指南 本地打包:安卓本地打包教程,iOS 本地打包教程命令行搭建环境装置装置 node 环境全局装置 vue-clinpm install -g @vue/cli创立我的项目创立 uni-app 我的项目 应用 vue 脚手架#应用正式版(对应 HBuilderX 最新正式版)vue create -p dcloudio/uni-preset-vue my-project#应用 alpha 版(对应 HBuilderX 最新 alpha 版)vue create -p dcloudio/uni-preset-vue#alpha my-alpha-project应用 Vue3/Vite 版node 版本^14.18.0 || >=16.0.0。 #应用正式版(对应 HBuilderX 最新正式版)npx degit dcloudio/uni-preset-vue#vite my-vue3-project#应用 alpha 版(对应 HBuilderX 最新 alpha 版)npx degit dcloudio/uni-preset-vue#vite-alpha my-vue3-project# 创立以 typescript 开发的工程npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project更新依赖版本# 更新到最新正式版npx @dcloudio/uvm# 更新到最新 Alpha 版npx @dcloudio/uvm alpha运行 uniapp 我的项目npm run dev:%PLATFORM%公布 uniapp 我的项目npm run build:%PLATFORM%tips: %PLATFORM% 可取值如下: ...

August 29, 2023 · 2 min · jiezi

关于前端:applycallbind原理介绍

call、apply 和 bind 是挂在 Function 对象上的三个办法,调用这三个办法的必须是一个函数。 根本用法如下: func.call(thisArg, param1, param2, ...)func.apply(thisArg, [param1,param2,...])func.bind(thisArg, param1, param2, ...)其中 func 是要调用的函数,thisArg 个别为 this 所指向的对象,前面的 param1、2 为函数 func 的多个参数,如果 func 不须要参数,则前面的 param1、2 能够不写。 这三个办法共有的、比拟显著的作用就是,都能够扭转函数 func 的 this 指向。call 和 apply 的区别在于,传参的写法不同:apply 的第 2 个参数为数组; call 则是从第 2 个至第 N 个都是给 func 的传参;而 bind 和这两个(call、apply)又不同,bind 尽管扭转了 func 的 this 指向,但不是马上执行,而这两个(call、apply)是在扭转了函数的 this 指向之后立马执行。 这三个办法的理念都是借用办法的思路,例如A 对象有个 getName 的办法,B 对象也须要长期应用同样的办法,那么这时候咱们是独自为 B 对象扩大一个办法,还是借用一下 A 对象的办法呢?当然是能够借用 A 对象的 getName 办法,既达到了目标,又节俭反复定义,节约内存空间。 ...

August 29, 2023 · 2 min · jiezi

关于前端:NestJS系列连接数据库及优雅地处理响应

前言Node作为一门后端语言,当然也能够连贯数据库,为前端提供CURD接口 咱们以mysql为例,自行装置mysql TypeORMTypeORM 是一个ORM框架,它能够运行在 NodeJS、Browser、Cordova、PhoneGap、Ionic、React Native、Expo 和 Electron 平台上,能够与 TypeScript 和 JavaScript一起应用。 它的指标是始终反对最新的 JavaScript 个性并提供额定的个性以帮忙你开发任何应用数据库的(不论是只有几张表的小型利用还是领有多数据库的大型企业应用)应用程序。TypeORM作为TypeScript中最成熟的对象关系映射器,能够很好的与Nest框架集成应用。 装置依赖npm install --save @nestjs/typeorm typeorm mysql2新建数据库CREATE DATABASE nanjiu DEFAULT CHARACTER SET = 'utf8mb4';新建一个nanjiu数据库 连贯数据库数据库建好之后,咱们就能够应用typeorm来连贯数据库并建设映射关系了 // dbConfig.ts// 数据库配置export function dbConfig() { return { type: 'mysql', // 数据库类型 host: '127.0.0.1', // 数据库地址 port: 3306, // 端口 username: 'root', // 用户名 password: '123456', // 明码 database: 'nanjiu', // 数据库名 entities: [__dirname + '/../**/*.entity{.ts,.js}'], // 实体类 synchronize: true, // 主动创立表 autoLoadEntities: true, // 主动加载实体类 } as DbConfig}须要在app.module.ts中进行注册 ...

August 29, 2023 · 3 min · jiezi

关于前端:微商城分销系统免费源码设计功能开发OctShop

要应用微商城分销零碎源码来搭建或制作本人的微商城分销零碎平台,那么,首先你须要晓得什么是分销?艰深点讲就是买家或消费者成为商家或平台的分销商,通过举荐给分享好友,或其余的各种推广形式,如二维码,链接等。只有有人通过你的推广到微商城分销购买商品,分销商就能够继续一直取得返利分佣收益。通过这种有限裂变的形式,企业或商家能够爆炸式的推广本人的产品,做到口碑流传,同时获取更多的客户与分销员。而分销员推广又能取得佣金激励,这样各自得利,造成裂式良性循环。 一、微商城分销零碎制作那么微商城怎么分销,微商城分销零碎怎么制作呢,须要留神哪些事件? 1、首先你须要对市场的一些个性进行十分深刻的理解,这个能够说是十分多的,包含分销的产品生命周期、定位以及市场的竞争、利润空间状况等。这样企业或商家才可能更好的设计微商城分销零碎,更好的依据理论业务需要设计制作零碎。 2、深刻的了解微信用户需要,只有适宜微信消费者的想法与体验,能力更好的晋升微商城分销零碎的服务质量,这样企业或商家才可能取得更好的分销营销成果。能够通过如:微信敌人图投票流动,分享商品优惠等,收集用户信息,开掘用户的次要需要,依据客户需要,钻研微商城分销零碎中的商品卖点和价值。 3、抉择适宜本人的制作形式,次要的开发方式有:1)本人组建开发团队,从零开始开发,这种形式老本比拟高,开发周期长,只适宜有大型公司并且领有业余电商开发技术团队,否则,无奈把握开发成本与工夫周期。2)抉择现成零碎,再在此零碎根底上进行定制开发,这种形式比拟适宜初创企业,个别一两万就能够搞定。 4、交易数据要齐全本人把控,有些敌人可能是用的第三方的分销平台,那么,你的交易、用户、订单数据都是存储在第三方平台之上的,数据安全存在隐患,你做的越大数据越有价值时,越可能被泄密。微商城分销零碎每天都在产生大量的订单,交易,会员数据,数据如果不放在本人的服务器上,本人是无奈把控的。 二、微商城分销零碎源码 1、微商城分销零碎源码当初市面上各种各样,当然,品质也参差不齐,大部分开源的要么就是模板生成的,要么就是不残缺,或者是被放弃了的我的项目。一个比较完善,比拟成体系化的微商城分销零碎源码,并且有更新时切实保护,随时都能分割到官网客服,并能即时分割解决问题的不好找。 2、微商城分销零碎源码的分销模式必须要适宜本人,分销模式多种多样,只有适宜本人的才有意义。所以,在抉择时,你须要具体的体验微商城分销零碎的分销业务逻辑是怎么运行的。整套流程你都体验一遍。 3、OctShop微商城分销零碎分销模式有:全网用户分成返现、会员分享商品分润、店铺商家推广会员分润、会员推广商家分润、会员推广会员分润等等。具体介绍请拜访:https://pc.opencodetiger.com/OctShop/FeatureDetail_10_1_0.html4、微商城分销零碎源码必须要有很好的扩展性,适宜二次开发。这是保障日后你的平台发展壮大后,自行组建团队后,能够残缺的接手整个我的项目,并在此基础之上,进行性能批改与减少业务逻辑性能。

August 29, 2023 · 1 min · jiezi

关于前端:Web-代码片段主题

帮忙你在整个我的项目中治理色调的技术集锦。欢送来到咱们一直减少的主题片段集。这些片段旨在帮忙你创立自适应色调体系,这样就能够轻松适应用户对明暗等色调偏好的设置。 应用 HSL 的色调计划https://codepen.io/zhoushengdao/pen/OJrMjqq 该片段展现了如何利用 CSS 自定义属性实现超过浅色和深色的主题。 残缺文章 · YouTube 上的视频 · GitHub 上的源代码 明暗 HSL 入门套件https://codepen.io/zhoushengdao/pen/wvRMraV 本片段展现了如何应用 HSL,通过 CSS 自定义属性创立谐和的明暗主题。 明暗主题切换https://codepen.io/zhoushengdao/pen/xxmZLNL 该片段展现了如何为网站创立一个开关,容许在浅色和深色主题之间切换,并为当前的拜访保留该偏好。 该片段应用了 Open Props 的 Easing 成果。残缺文章 · YouTube 上的视频 · GitHub 上的源代码

August 29, 2023 · 1 min · jiezi

关于前端:给你的浏览器主页换一种全新的布局WeTab新标签页

当初的桌面格调各花入各眼,然而iOS风仍旧是许多人的心头爱,甚至有不少安卓零碎的手机主题都是以iOS风为主的。 当然,除了桌面格调之外,浏览器主页的格调也各不相同,Infinity新标签页主打一个简洁,几枝是一款中国风的新标签页,而我正在应用的WeTab新标签页则是一款iOS格调的浏览器新标签页。 WeTab的主页有搜寻框、各种图标和小组件,和iPad桌面一模一样。这样的浏览器主页格调让我眼前一亮,在看到它的第一眼,我就在浏览器里装置了它。 除了Chrome,edge、Safari等PC端浏览器都能够装置,安卓手机和平板能够装置反对扩大的手机浏览器、iPhone和iPad则间接装置在Safari里就能够了。 如何装置?搜寻WeTab新标签页官网,进入后抉择装置门路。具体的装置步骤能够点击官网右上角的【装置教程】查看,每个设施的教程都有。 WeTab的劣势?一、图标与小组件的联合图标库包揽了上万个罕用网站图标,能够分类查找,也能够搜寻增加。如果是图标库里没有的,也能够停留在该网站上而后点击地址栏后的wetab标记增加到主页。 图标能够自定义名称、色彩或图片,齐全打造成本人喜爱的主题。 小组件从最开始的几个,到当初越来越多,也涵盖了各个领域,包含游戏、体育赛事、新闻资讯、AI助手、日期记录等。 二、Chat AI这是一个优良的AI助手,不论什么问题都能够迎刃而解。你只须要提出需要和问题,剩下的它都能够帮你办。接入gpt3.5,既可闲聊,也能够辅助工作和学习。 三、小组件帮你记住工夫WeTab自带节日和往年余额两个小组件,帮你记住并倒计时所有节日。还有生日、倒计时、纪念日等,你能够自定义增加各种日子并将小组件增加到主页中,关上浏览器就能看到,就再也不会遗记重要日子了。 四、壁纸库弱小的壁纸库会让你在抉择壁纸的时候目迷五色,因为每一张都难看,并且为你贴心地分好了类,抉择本人喜爱的类别即可。 当然WeTab也关照到了抉择艰难症——你能够设置定时主动切换壁纸。 五、多设施同步前文中说到,WeTab能够在简直所有设施中装置应用。你只须要注册一个WeTab账号,便能够云端同步所有数据和设置,包含自定义的壁纸和背景图片、笔记待办事项里的内容以及Chat AI的历史对话等。

August 29, 2023 · 1 min · jiezi

关于前端:图扑数字孪生-电缆厂-3D-可视化管控系统

近年来,我国各类器材制造业曾经开始向数字化生产转型,使得生产流程变得更加精准高效。通过利用智能设施、物联网和大数据分析等技术,企业能够更好地监控生产线上的运行和品质状况,及时发现和解决问题,从而进步生产效率和产品质量。电缆厂作为传统机械器材加工业,更需顺应时代潮流,紧跟数字化趋势。 图扑软件基于自研引擎 HT for Web 搭建的三维可视化电缆厂,是将传统机械制造业的电缆厂在数字孪生世界残缺映射。以电缆厂实景为根底,1:1 还原了具备科技格调的电缆厂环境,三维场景平面地呈现出工厂内路线散布、修建、厂房等场景。通过数字孪生布电线车间及仓储车间,并搭配设施动画、场景漫游、监控数据等多维监控形式,帮助工厂管理者更零碎的理解以后工厂的运行状态。 厂区三维可视化图扑基于自研 HT for Web 3D 渲染引擎,打造三维可视化电缆厂厂区内景。厂区蕴含办公楼、布电线车间、仓储车间、能源配备车间等次要修建,辅以园区周边路线、修建、车流、绿植、灯光等景观,丰盛场景成果,营造出实在的电缆厂厂区内景。 在页面左侧,通过一些数据及图表展现园区的根本信息及车间的重要信息,如园区的产值、人数、面积、车间的生产能力,以及仓储能力等等。不便管理者疾速理解园区实时状态,发现问题,解决问题。图扑软件反对 2D 面板和图表的数据绑定,2D 可与 3D 在三维空间无缝交融复用素材资源。 用户应用鼠标左键点击建筑物顶部的信息标签,即可将视角拉近至标签附件,便捷、疾速且清晰的查看厂房信息。 在页面顶部,应用列表搜寻的形式展现以后最新厂区事件,次要内容为展现车辆进出状况(车牌照、出车频率、以后状态等)。点击列表搜寻右侧查看按钮,查看近段时间内所有厂区事件。 图扑软件基于 WebGL 及 HTML5 技术,实现电缆厂的智能化生产监控。通过将物理工厂与数字模型相结合,搭配图扑软件提供的丰盛多样的图表组件,电缆厂可能十分直观的实时监测和剖析生产过程中的数据,反对模仿不同操作条件下的设施运行状态,及时辨认和解决潜在问题,优化电缆厂的保护和经营,以及预测设施的故障和保护需要,防止生产中断和设施损坏,达到降本增效的目标。 布电线车间可视化布电线车间是电线电缆厂生产家用线缆、插头线等电线电流在 1000 伏以下的低压电线车间。图扑 HT 利用现场照片及 CAD 图纸,联合 PBR 材质零碎,通过高级材质球,打造具备科技感的布电线车间内部结构及设施出现。 双头铜大拉机 电线电缆厂中的双头铜大拉机是一种罕用的生产设施,分为拉丝、退火、收线三个局部。电线电缆罕用的铜、铝杆材。在常温下,利用拉丝机通过一道或数道拉伸模具的模孔,使其界面减小、长度减少、强度进步,造成铜和铝单丝。此过程称为拉丝,是各个电线电缆厂的首道工序。 通过拉制的铜丝在加热到肯定的温度下,以再结晶的形式来进步单丝的韧性,升高单丝的强度,以合乎电线电缆对导电线芯的要求,此过程称为单丝退火,该工序的要害是杜绝铜丝的氧化。 在实现拉丝和退火两道工序后,线材依据规格别离应用梅花框及工字盘进行收纳和储存,用于后续工艺制作。 挤塑机 电线电缆厂中的挤塑机是一种罕用的生产设施,用于生产绝缘层和护套层。其工作原理是通过加热和挤压,将塑料颗粒消融成为熔融状态的塑料料液,而后通过模头将熔融的塑料挤出,造成所需的绝缘层或护套层。 图扑 HT 电缆厂联合装置在设施上的各个传感器传回的数据,以数字化图表组件形式,实时反馈生产过程中的数据变动,不便管理人员实时理解以后生产状况,针对突发的问题能够做到及时反馈并解决。 成圈包膜机 电线电缆厂中的成圈包膜机也被称为成圈包装机,次要用于进行电线电缆的成圈解决,可实现电线电缆的防尘、防潮、防伤害等作用。个别能够依据客户的须要,进行多尺寸、多种规格的电线电缆打卷。图扑 HT 电缆厂依据设施返回数据进行可视化出现,管理者能够清晰理解到以后生产进度及生产实现状况,联合工厂以后订单状况,疾速调整生产节奏,保障工单任务的顺利按时实现。 图扑 HT 电缆厂中还采纳了将挤塑机和成圈包膜机联合在一起的挤塑成圈机,节俭了惯例流程中人工或机械运输半成品的老本,实现从线缆制作到包装实现的一体化生产,达到提质增效的目标。 辐照机 电线电缆厂中的辐照机,是一种对曾经生产好的电线电缆进行辐射交联解决的设施。辐照交联就是电缆在特定的环境下,通过辐照设施产生的电离辐射,导致塑料绝缘体外部分子间产生化学键的连贯,造成三维网络结构,从而使电缆具备更好的物理和化学性能。 ...

August 29, 2023 · 1 min · jiezi

关于前端:电缆厂-3D-可视化管控系统-图扑数字孪生

近年来,我国各类器材制造业曾经开始向数字化生产转型,使得生产流程变得更加精准高效。通过利用智能设施、物联网和大数据分析等技术,企业能够更好地监控生产线上的运行和品质状况,及时发现和解决问题,从而进步生产效率和产品质量。电缆厂作为传统机械器材加工业,更需顺应时代潮流,紧跟数字化趋势。 图扑软件基于自研引擎 HT for Web 搭建的三维可视化电缆厂,是将传统机械制造业的电缆厂在数字孪生世界残缺映射。以电缆厂实景为根底,1:1 还原了具备科技格调的电缆厂环境,三维场景平面地呈现出工厂内路线散布、修建、厂房等场景。通过数字孪生布电线车间及仓储车间,并搭配设施动画、场景漫游、监控数据等多维监控形式,帮助工厂管理者更零碎的理解以后工厂的运行状态。 厂区三维可视化图扑基于自研 HT for Web 3D 渲染引擎,打造三维可视化电缆厂厂区内景。厂区蕴含办公楼、布电线车间、仓储车间、能源配备车间等次要修建,辅以园区周边路线、修建、车流、绿植、灯光等景观,丰盛场景成果,营造出实在的电缆厂厂区内景。 在页面左侧,通过一些数据及图表展现园区的根本信息及车间的重要信息,如园区的产值、人数、面积、车间的生产能力,以及仓储能力等等。不便管理者疾速理解园区实时状态,发现问题,解决问题。图扑软件反对 2D 面板和图表的数据绑定,2D 可与 3D 在三维空间无缝交融复用素材资源。 用户应用鼠标左键点击建筑物顶部的信息标签,即可将视角拉近至标签附件,便捷、疾速且清晰的查看厂房信息。 在页面顶部,应用列表搜寻的形式展现以后最新厂区事件,次要内容为展现车辆进出状况(车牌照、出车频率、以后状态等)。点击列表搜寻右侧查看按钮,查看近段时间内所有厂区事件。 图扑软件基于 WebGL 及 HTML5 技术,实现电缆厂的智能化生产监控。通过将物理工厂与数字模型相结合,搭配图扑软件提供的丰盛多样的图表组件,电缆厂可能十分直观的实时监测和剖析生产过程中的数据,反对模仿不同操作条件下的设施运行状态,及时辨认和解决潜在问题,优化电缆厂的保护和经营,以及预测设施的故障和保护需要,防止生产中断和设施损坏,达到降本增效的目标。 布电线车间可视化布电线车间是电线电缆厂生产家用线缆、插头线等电线电流在 1000 伏以下的低压电线车间。图扑 HT 利用现场照片及 CAD 图纸,联合 PBR 材质零碎,通过高级材质球,打造具备科技感的布电线车间内部结构及设施出现。 双头铜大拉机 电线电缆厂中的双头铜大拉机是一种罕用的生产设施,分为拉丝、退火、收线三个局部。电线电缆罕用的铜、铝杆材。在常温下,利用拉丝机通过一道或数道拉伸模具的模孔,使其界面减小、长度减少、强度进步,造成铜和铝单丝。此过程称为拉丝,是各个电线电缆厂的首道工序。 通过拉制的铜丝在加热到肯定的温度下,以再结晶的形式来进步单丝的韧性,升高单丝的强度,以合乎电线电缆对导电线芯的要求,此过程称为单丝退火,该工序的要害是杜绝铜丝的氧化。 在实现拉丝和退火两道工序后,线材依据规格别离应用梅花框及工字盘进行收纳和储存,用于后续工艺制作。 挤塑机 电线电缆厂中的挤塑机是一种罕用的生产设施,用于生产绝缘层和护套层。其工作原理是通过加热和挤压,将塑料颗粒消融成为熔融状态的塑料料液,而后通过模头将熔融的塑料挤出,造成所需的绝缘层或护套层。 图扑 HT 电缆厂联合装置在设施上的各个传感器传回的数据,以数字化图表组件形式,实时反馈生产过程中的数据变动,不便管理人员实时理解以后生产状况,针对突发的问题能够做到及时反馈并解决。 成圈包膜机 电线电缆厂中的成圈包膜机也被称为成圈包装机,次要用于进行电线电缆的成圈解决,可实现电线电缆的防尘、防潮、防伤害等作用。个别能够依据客户的须要,进行多尺寸、多种规格的电线电缆打卷。图扑 HT 电缆厂依据设施返回数据进行可视化出现,管理者能够清晰理解到以后生产进度及生产实现状况,联合工厂以后订单状况,疾速调整生产节奏,保障工单任务的顺利按时实现。 图扑 HT 电缆厂中还采纳了将挤塑机和成圈包膜机联合在一起的挤塑成圈机,节俭了惯例流程中人工或机械运输半成品的老本,实现从线缆制作到包装实现的一体化生产,达到提质增效的目标。 辐照机 电线电缆厂中的辐照机,是一种对曾经生产好的电线电缆进行辐射交联解决的设施。辐照交联就是电缆在特定的环境下,通过辐照设施产生的电离辐射,导致塑料绝缘体外部分子间产生化学键的连贯,造成三维网络结构,从而使电缆具备更好的物理和化学性能。 ...

August 29, 2023 · 1 min · jiezi

关于前端:带着这种思想我快速高效的学会了webpack开发环境配置

前言咱们在应用webpack时,常常会看到相似以下构造: build├── webpack.common.js└── webpack.dev.js└── webpack.prod.js很多时候,webpack的配置咱们根本复制粘贴过去的,没有想过为什么咱们要把配置文件拆解成这么多。因而,当咱们本人去学习配置webpack时,咱们常常会呈现以下等问题: 开发环境构建速度慢打包后页面空白资源找不到其实这些问题,都源于咱们: 不了解webpack构建开发环境、生产环境,两种环境配置的思维差别对两种环境输入的文件目录,脑海中没有一个清晰的了解所以本文还是跟以前一样,不会一味的把配置复制过去,而是心愿总结相干办法,让大家更好学会配置。 后期筹备因为讲的是配置,所以心愿你对webpack有一些根底。如果你只是刚学习webpack,倡议先浏览一下前两篇文章,尤其是第二篇: 弄懂这几个概念后,我对webpack有了更新的了解:学习应用webpack时波及到的一些概念,让咱们对webpack整体有个大抵的理解有了这些办法,webpack你也能够本人配:总结配置webpack时的一些办法。通过这些办法,咱们能够很好的了解webpack的一些根底配置该如何配置学习纲要这篇文章次要解说: webpack开发环境配置的核心思想依据核心思想,实现一个开发环境配置解析devServer配置项一些容易混同的点总结webpack开发环境配置外围备注文章波及到的案例曾经上传到 github: 为了浏览不便,文章只贴了相干代码,倡议fork一下,看看残缺代码;或者跟着文章一起边看边敲,这样印象会更粗浅一些创作不易,如果感觉有帮忙的话,欢送star开发环境核心思想在上文咱们提到,咱们在应用webpack时,常常会看到相似以下目录: build├── webpack.common.js└── webpack.dev.js└── webpack.prod.js为什么咱们须要把配置文件拆解成这么多,那么繁琐呢? 咱们先回顾一下,在咱们在理论开发中,为了我的项目可能稳固平安上线,咱们个别会分好几个环境: 开发环境:在本地进行开发,调试的环境测试环境:咱们在本地开发实现后,将代码部署到咱们的测试服务器,进行测试生产环境:测试通过,将代码部署到正式服务器,正式上线有些更严格的测试,还会有预生产环境等咱们的配置应该对环境具备针对性,因而不同的环境,咱们的配置当然不能千篇一律。 目标咱们要先分明开发环境基本的目标是什么。 开发环境的基本目标,就是在开发过程中,能疾速定位到问题,更快能看到成果调试,进步开发效率。 尤其作为前端,离不开跟视觉打交道。咱们巴不得Ctrl+S后,立马出成果,不便咱们疾速调试。试想一下,如果每次写完一个成果,要等上几秒钟能力看到,这会不会把咱们逼疯? 思维因而,为了能让咱们尽快看到成果调试,缩小webpack的编译过程,开发环境,配置应该所有从简: 对款式,咱们不须要拆散,间接用style-loader插入到<head />对js、img、media、font等前端资源文件,不须要分包开启source map,不便定位问题应用webpack提供的devServer配置项,进行本地开发不要压缩代码不必没必要的loader跟plugins...开发环境配置,也因人而异,以上是我的做法。然而咱们要记得,开发环境,配置应该所有从简,为了让咱们可能更快看到成果,进步开发效率 开发环境配置初体验通过前一篇文章的解说,置信大家对webpack的根底配置: 解决css、less、前端资源等文件编译es6+语法及api解决html文件曾经把握了相干的配置办法,并且咱们还总结了一份根底的配置,不太分明的同学能够看一下先,这个根底配置还是蛮重要的。 ok,那咱们先用 learn-08 这个案例来体验一下如何进行本地开发调试。为了尽量贴近咱们事实中开发的我的项目,案例里会: 在html外面援用图片应用less外面援用图片在js里应用es6+,动静加载图片应用devServer配置项为了浏览不便,具体的源码就不放文章了,大家能够去 github 看而后进行以下步骤: 为了语义化,咱们把webpack配置文件命名为webpack.dev.js应用命令行启动webpack——npm start "scripts": { "start": "webpack server --config ./webpack.dev.js"}运行后果: 咱们会发现: 文件编译解决实现后,不会输入任何文件此时开启了一个外部服务器(http://192.168.0.196:8080/)。如果咱们的手机与电脑用的同个网络,用手机拜访这个链接,就能看到成果了。这对调试H5开发是非常高效的(这次要归功于deveServer配置项,后文会有解说)咱们批改代码后,页面会实时更新以上简直是咱们想要的高效开发成果。 剖析初步体验完后,咱们依据上文总结的开发环境配置思维,来看看对开发环境该如何配置: 解析款式不须要拆散出css文件,咱们间接将解析进去的款式插入到<header />中: module: { rules: [ { test: /.(css|less)$/, use: [ 'style-loader', 'css-loader', 'less-loader' ] }, ]},对js、img、media、font等前端资源文件,不须要分包: output: { path: path.resolve(__dirname, './dist'), filename: '[name]-[chunkhash:5].js',},module: { rules: [ { test: /\.(png|svg|jpg|jpeg|gif)$/i, type: 'asset', parser: { dataUrlCondition: { maxSize: 1024 * 3 // When the image size is < 3kb it will be converted to base64 } }, generator: { filename: '[name]-[hash:5][ext]' // Set the name of the output file } }, { test: /\.m?js$/, exclude: /(node_modules|bower_components)/, use: { loader: 'babel-loader' } } ]},开启source map,不便定位问题;并且不压缩代码: ...

August 29, 2023 · 2 min · jiezi

关于前端:程序员常逛的17-个杀手级网站

99.8%的人都不晓得的网站,先珍藏下吧~ 通过api,可随机获取Unsplash网站的图片https://source.unsplash.com/ Notion小插件为您的 Notion 文档增加第三方应用程序嵌入或创立自定义嵌入插件 https://apption.co/ Carbon创立并共享源代码的精美图片。很适宜开发者写博客时候,让你插入的代码增加精美的背景,代码浏览更舒服。 https://carbon.now.sh/ Peppertype几秒钟内取得人工智能生成的推文创意 https://www.peppercontent.io/peppertype-ai Poet. sohttps://poet.so/ 每周游客报告获取拜访您网站的公司的每周报告。 https://clearbit.com/resources/tools/visitor-report 智能模型轻松在线创立令人惊叹的产品模型最快的网络模仿工具无需教训或技能,超级易用https://smartmockups.com/zh 小型开发工具便捷的开发工具,令人愉悦的界面。提供 20 多种工具,帮忙开发人员实现编码/解码、最小化、测试虚构数据集等罕用工作 https://smalldev.tools/ 让控制台打印的信息更丑陋https://www.npmjs.com/package/figlet FIGlet 是一款将一般文字制作成大字母。 视觉类型表https://typescale.com/ 理解并可视化不同字体大小、REM 值与 EM 值之间的差别。实时查看预览成果 移除图像背景5 秒内 100% 主动移除背景 https://www.remove.bg/zh Responsivelyhttps://responsively.app/ 将开发响应式网络应用程序的速度进步 5 倍! MetatagsMeta Tags 是一款为任何网站调试和生成元标签代码的工具。你能够编辑标签,并对内容进行试验,而后预览网页在 Google、Facebook、Twitter 等网站上的成果。 https://metatags.io/ ReadMe在几分钟内创立 README 文件的最简略直观办法 https://readme.so/ Storytale实用于网络和挪动我的项目的高级插图。用超棒的角色让你的我的项目引人注目。可用于商业和集体用处。 https://storytale.io/ 头像制作器https://pfpmaker.com/ SigmaOS收费的待办事项治理 https://sigmaos.com/ 摘自原文:https://medium.com/javascript-in-plain-english/17-killer-webs...

August 29, 2023 · 1 min · jiezi

关于前端:前端工作常见题

第一道:有3个div,呈竖向排列,第一个div贴顶,第三个div贴底,两头的div填满残余空间。该怎么做?(flex,grid,js动静计算)第二道:我要写一个弹窗,须要程度竖直居中,同时它不能被其余元素遮掩。该怎么做?(居中,zindex,zindex的从父准则) 第三道:你的挪动端的自适应是怎么做的?(rem,vwvh。其实这两个等比放大放大的自适应单位解决方案是不够完满的。内容用px + 排版用自适应单位 + 布局采纳flex/grid才是解决挪动端自适应的最优解) 第四道:如何缩小重排。 js会呈现不准确的问题javascript的number最大9007199254740992,是2的53次方。如果超过这个值,那么js会呈现不准确的问题如何解决数字精度失落的问题?实践上用无限的空间来存储有限的小数是不可能保障准确的,但咱们能够解决一下失去咱们冀望的后果当你拿到 1.4000000000000001 这样的数据要展现时,倡议应用 toPrecision 凑整并 parseFloat 转成数字后再显示,如下:parseFloat(1.4000000000000001.toPrecision(12)) === 1.4 // True封装成办法就是:function strip(num, precision = 12) { return +parseFloat(num.toPrecision(precision));}最初还能够应用第三方库,如Math.js、BigDecimal.js 什么是递归,http的Content-Type 权限组件node node中间件 1、promiseApiPromise构建进去的实例存在以下办法:then() 是实例状态产生扭转时的回调函数,第一个参数是resolved状态的回调函数,第二个参数是rejected状态的回调函数catch() 用于指定产生谬误时的回调函数finally() 用于指定不论 Promise 对象最初状态如何,都会执行的操作 Promise构造函数存在以下办法:all() 用于将多个 Promise实例,包装成一个新的 Promise实例race() 同样是将多个 Promise 实例,包装成一个新的 Promise 实例allSettled() allSettled() 将返回一个对象数组,而不是一个数组,它蕴含 {status, value, reason} 形容每个承诺是被履行还是被回绝 resolve()reject()try() var、let、const三者区别 能够围绕上面五点开展:1.变量晋升var申明的变量存在变量晋升,即变量能够在申明之前调用,值为undefinedlet和const不存在变量晋升,即它们所申明的变量肯定要在申明后应用,否则报错 2.暂时性死区var不存在暂时性死区let和const存在暂时性死区,只有等到申明变量的那一行代码呈现,才能够获取和应用该变量 3.块级作用域var不存在块级作用域let和const存在块级作用域 4.反复申明var容许反复申明变量let和const在同一作用域不容许反复申明 5.变量批改 申明的变量var和let能够const申明一个只读的常量。一旦申明,常量的值就不能扭转应用能用const的状况尽量应用const,其余状况下大多数应用let,防止应用var bind、call、apply 区别1.call和apply会调用函数,且会扭转函数外部的this指向2.call和apply传递的参数不一样,call传递参数aru1,aru2.模式 而apply必须是数组模式[arg]3.bind 不会调用函数,能够扭转函数外部指向 利用场景:1.call常常做继承2.apply常常和数组有关系,比方借助于数学对象实现数组的max、min3.bind不调用函数,但扭转this指向,比方扭转定时器外部的this指向apply:调用一个对象的一个办法,用另一个对象替换以后对象。例如:B.apply(A, arguments);即 A 对象利用 B 对象的办法。 call:调用一个对象的一个办法,用另一个对象替换以后对象。例如:B.call(A, args1,args2); 即 A 对象调用 B 对象的办法。 bind 除了返回是函数以外,它的参数和 call 一样。 ...

August 29, 2023 · 1 min · jiezi

关于前端:撮合前端平台在低代码平台的落地实践-京东云技术团队

在京东技术的倒退当下,不同的业务线,不同的区域,甚至于很多触达消费者的端,正在被中台架构能力所撑持。大家都很分明,中台建设可能带来技术的规模化效应,具备进步业务协同、减速翻新和交付速度、进步零碎稳定性和可靠性、降低成本和反对业务疾速倒退等劣势。 中台架构往往和畛域产品有亲密的关系,畛域产品是在京东体系中,处于前台和共享业务域之间,基于规范实践规范,为实现某个特定商业场景、而提供的一组业务流动能力,接入团队能够通过复用畛域产品的能力,达到疾速实现业务需要的目标。 基于传统认知,前端产品直接触达消费者,往往具备高度的定制化、需要变更频繁等特点,要求具备很好的动态性, 可能满足不同客户的需要。那么是否建设相似的前端中台产品,咱们权且称之为“前端畛域产品”,实现接入团队端到端能力复用呢?咱们在撮合业务线中进行了一系列思考和摸索。 架构设计 左图展现了实现前端畛域产品之前业务线的接入模式:各个业务线独立对接撮合中台,须要各自搭建前端平台(端)。右图展现了在撮合中台和端之间,嵌入了前端畛域产品(后文中对立称为撮合前端平台),以一套MVP标准版驱动多种业务状态接入,对各个业务线提供前端撑持能力,提供接入撮合的根底能力和业务能力供业务方应用,业务接入后不再须要本人搭建前端平台,而是作为撮合前端平台的一部分间接应用,这样就大大减少了开发成本。 作为一套规范畛域产品,撮合前端平台该当具备如下特色: 能力隔离:实现不同业务接入的数据隔离、业务状态隔离标准化:对撮合业务进行模型形象,对流程不同环节中的业务提供规范组件兼容性:不同业务线之间可能实现技术通用和复用易扩大:新业务疾速接入,不同业务域具备肯定的定制化能力技术计划撮合业务能够形象为多租户接入模型,在数据隔离方面次要参考交易中台的四因素模型,四因素蕴含租户(Tenant)、流量场(BU)、子渠道(Channel)、用户终端(UA),次要利用于多租户、多流量场、多销售渠道、多端的业务场景。 租户(Tenant)流量场(BU)子渠道(Channel)管制方畛域产品畛域产品接入方载体利用/页面页面组件撮合前端平台总体采纳平台和接入方共享共建的形式应用: 针对租户级别的差异性,咱们思考应用利用或页面的形式进行承载,例如撮合前端平台划分为3个根底利用,别离为买家端、商家端和经营端,别离承当撮合询价、报价和治理的角色。在新业务接入时,若与根底利用能力差异很大,则可基于根底利用疾速搭建子利用接入的形式;否则可采纳根底利用内新建页面的模式。针对场差异性,应用页面的形式进行隔离承载,由畛域产品提供形象的业务闭环能力,例如询价能力、报价能力,由接入方进行应用。最初针对场内的轻微差别,接入方可通过页面/组件裸露的配置化接口进行配置的形式实现。若撮合前端平台能力有余,则接入方也可通过平台提供的能力自建组件进行能力补充。低代码平台与产品状态符合度高、设计格调对立,可能反对业务疾速运维部署,咱们认为这套业务模型在低代码平台上进行落地更为高效,因而在技术选型的过程中抉择了水滴低代码平台进行撮合前端平台的可视化搭建 ,充分利用低代码平台的内置能力,例如表单表格、权限管控、微前端等。基于低代码平台能力和底层撮合中台的能力,咱们针对撮合业务状态搭建了残缺的业务链路。 技术减速在2022/12咱们着手开始搭建撮合前端平台MVP版本,2023/2实现专项视觉优化革新,并在2023/3布局新业务接入。在大促前后,将技术架构进一步改进,驱动这种创新能力在新业务接入中进行赋能,有利于推动撮合交易业务增长。在新业务的接入中,辨认到业务的较大差别,对原有基于SKU进行撮合的MVP能力进行了较大革新,实现了基于SKU和SPU进行撮合的两套业务体系。 在我的项目搭建的过程中充分利用低代码的页面搭建能力,实现了33个页面的规范页面开发,并实现如下通用化革新: 场参数和环境参数:采纳url传参的形式,实现四因素参数和环境参数的注入,实现数据和环境自在切换。对立拦截器:将扩散在各个表单和表格的接口进行辨认和整合,通过对立拦截器进行解决,封装公共逻辑如接口异样解决、公共参数拼接等,对接口调用形式进行了精简。能力复用:对性能进行更细粒度的拆分和重组,如将询价单和商品信息剥来到,询价单操作和询价单展现剥离等,新增页面表头操作组件、spu查问组件、spu卡片等组件,并兼容跨场能力。引入描述性列表组件和通用形容协定,实现跨场动静表单配置和渲染。业务组件采纳npm包插件的形式引入,能够在低代码页面引入后应用。微前端革新:反对业务线进行旧工程微前端革新,实现低代码页面以微前端形式嵌入。 新业务作为新的场接入,由撮合前端平台在平台根底上一键复制新的子利用或子页面供业务方应用。撮合前端平台提供了丰盛的根底组件和定制化的业务组件可供使用,并且全副反对配置可视化,业务方可利用拖拽的形式进行页面性能调整后公布失效。 结语撮合前端平台尚且年老,然而凝聚着京东技术人的智慧,置信将来会有更广大的利用前景。 作者:京东批发 陈震 起源:京东云开发者社区 转载请注明起源

August 29, 2023 · 1 min · jiezi

关于前端:twitter-换新-logo-了用-CSS-渐变来画一个吧

大家可能晓得,不久前 twitter 换了一个新 logo,从蓝色小鸟变成了一个 “x”,如下 不聊其余的,看看如何用 CSS 突变来绘制这样一个图形 一、 x 的绘制整个 logo 是一个镂空的“x”形态,先不思考镂空局部,如何绘制实心的“x”呢 突变有 3 种,线性突变、径向突变和锥形突变。很显然,x 能够看成是两端歪斜的线段,用线性突变就足够了。 假如 HTML 构造是这样,一个x元素 <x></x>用字号来管制尺寸大小 x{ display: inline-block; font-size: 200px; width: 1em; height: 1em;}而后通过线性突变绘制一条斜线,其实就是通明→纯色→通明的突变,留神这里的角度关系,示意如下 用代码实现就是 x{ /**/ background: linear-gradient(-52deg, #0000 50%, currentColor 0 55%,#0000 0);}能够失去一条歪斜的线段 用同样的形式绘制另一个方向上的 x{ /**/ background: linear-gradient(-52deg, #0000 50%, currentColor 0 55%,#0000 0), linear-gradient(52deg, #0000 44%, currentColor 0 56%,#0000;}这样就失去一个“x” 二、镂空的实现提到镂空,你应该想到 CSS mask。 遮罩的原理很简略,在遮罩图像下,只显示不通明的局部,通明的局部会被裁剪,半透明以此类推,示意如下 对于遮罩,这个技巧十分实用,之前在多篇文章中都有用到,有趣味的能够回顾一下 ...

August 29, 2023 · 1 min · jiezi

关于前端:独立游戏开发的基石构建开发框架为何至关重要

引言本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢送大家关注分享珍藏订阅。在游戏开发的世界中,就像修建一座壮丽的大厦须要牢固的根底一样,构建一个胜利的游戏也须要一个松软的根底。这个根底就是游戏开发的框架。游戏开发框架能够被视为创作的蓝图,为游戏的各个方面提供了构造、组织和领导。正如在探险中的指南针,一个精心设计的开发框架为开发者提供了方向,让他们可能在简单的游戏世界中迅速后退。 然而,为什么在游戏开发的起始阶段投入工夫和精力来构建开发框架是至关重要的呢?这篇文章将会深入探讨这个问题,揭示构建开发框架的价值和影响。无论是集体独立开发者还是游戏开发团队,理解开发框架的关键作用,将会在游戏创作的路线上带来明确的指引。让咱们一起踏上这个探索之旅,探讨游戏开发框架为何如此至关重要。 组织与结构化优良的开发框架之所以可能实现组织与结构化,是因为它提供了一套有序的架构、设计模式和准则,帮忙开发者在我的项目中建设清晰的组织构造和良好的代码构造。以下是好的开发框架如何实现组织与结构化的一些要害形式: 1. 对立的代码构造: 开发框架通常规定了统一的代码构造,将不同的性能和模块划分为特定的文件和文件夹。这使得整个我的项目的代码组织更加有序和可预测。 2. 模块化设计: 框架激励模块化设计,将性能划分为独立的模块,每个模块负责特定的工作。这有助于合成简单的问题,将我的项目拆分为可治理的局部。 3. 设计模式的利用: 好的框架通常会在其设计中采纳罕用的设计模式,如单例模式、工厂模式等。这些设计模式提供了一种有构造的办法来解决常见的开发问题。 4. 标准的命名约定: 框架可能会提供命名约定,用于标识不同类型的变量、函数和类。这使得代码更易于了解和保护,进步了整体的结构化水平。 5. 分层架构: 好的框架通常采纳分层架构,将代码划分为不同的层,如数据层、逻辑层和展现层。这有助于实现逻辑的拆散和组织。 6. 提供模板代码和示例: 框架可能提供一些模板代码和示例,展现了如何在框架中组织代码和实现特定性能。这为开发者提供了一个终点,帮忙他们更好地组织我的项目。 7. 代码标准和格调指南: 好的框架通常附带代码标准和格调指南,领导开发者编写具备一致性和可读性的代码,从而加强代码的结构化水平。 代码重用优良的开发框架之所以可能实现代码重用,次要是因为它提供了一些机制和办法,使得开发者可能更轻松地共享、复用和组织代码。以下是好的开发框架如何实现代码重用的一些要害形式: 1. 模块化设计: 开发框架激励模块化设计,将不同的性能和个性划分为独立的模块。这使得每个模块都能够被独立开发、测试和保护,从而不便在不同我的项目中复用。 2. 组件化开发: 一些框架反对组件化开发,将罕用的性能封装为可复用的组件。开发者能够在不同我的项目中应用这些组件,防止反复编写类似的代码。 3. 提供代码库和工具: 好的框架可能会提供一些罕用的代码库和工具,用于解决通用的工作,如数据操作、文件解决等。开发者能够间接应用这些工具,缩小重复性劳动。 4. 提供示例和模板: 开发框架可能提供示例代码和模板,展现了如何实现常见的性能。开发者能够依据这些示例进行批改和扩大,减速开发过程。 5. 代码集成: 开发框架能够提供代码集成的机制,使得在我的项目中引入已有的代码变得更加简略。这能够是通过导入库、组件或模块来实现的。 6. 跨我的项目应用: 好的框架设计能够使得开发者在不同我的项目中轻松地复用代码,从而防止在每个我的项目中反复编写类似的性能。 7. 提供接口和形象层: 框架可能提供形象层或接口,将底层细节暗藏起来,使得开发者能够在不同我的项目中应用雷同的接口进行编程。 疾速启动开发一个优良的开发框架之所以可能让我的项目疾速启动开发,次要归功于它提供的一系列劣势和性能。以下是为什么好的开发框架可能减速我的项目启动开发的一些关键因素: 1. 提供基本功能和组件: 开发框架通常事后集成了许多基本功能和罕用的组件,如输出解决、渲染引擎、碰撞检测、资源管理等。这使得开发者无需从头开始构建这些根底局部,从而节俭了大量的开发工夫。 2. 基础架构和模板代码: 框架通常提供了一个良好的基础架构和模板代码,蕴含了我的项目的整体构造和组织形式。开发者能够在此基础上进行扩大,而不用从零开始设计整个我的项目的架构。 3. 设计模式和最佳实际: 开发框架往往蕴含了一些罕用的设计模式和最佳实际,供开发者参考和利用。这能够放慢开发过程,缩小在设计上的决策工夫。 4. 代码复用和模块化: 开发框架激励代码的复用和模块化设计,使得开发者能够在不同我的项目中共享和重用曾经实现的模块和性能。 5. 跨平台反对: 一些开发框架提供了跨平台反对,使得开发者可能在不同的设施战争台上运行游戏,而不用针对每个平台从新编写代码。 6. 自动化和工具反对: 框架可能集成了自动化构建、测试和部署工具,缩小手动操作,提高效率。这些工具能够帮忙开发者更快地将变更利用到我的项目中。 7. 缩小重复性劳动: 开发者不须要反复编写通用的性能代码,能够更专一于游戏的外围逻辑和创意局部,从而减速开发进度。 8. 共享常识和教训: 开发框架能够传递团队中已有的常识和教训,帮忙新成员更快地上手,缩小学习老本。 ...

August 29, 2023 · 1 min · jiezi

关于前端:一文详解JS-闭包

JavaScript 中的闭包是相当重要的概念,并且与作用域相干常识的指向密切相关,在大厂的前端面试过程中常常会被提及。 作用域根本介绍JavaScript 的作用域艰深来讲,就是指变量可能被拜访到的范畴,在 JavaScript 中作用域也分为好几种,ES5 之前只有全局作用域和函数作用域两种。ES6 呈现之后,又新增了块级作用域,上面咱们就来看下这三种作用域的概念,为闭包的学习打好根底。 全局作用域在编程语言中,不管 Java 也好,JavaScript 也罢,变量个别都会分为全局变量和局部变量两种。那么变量定义在函数内部,代码最后面的个别状况下都是全局变量。 在 JavaScript 中,全局变量是挂载在 window 对象下的变量,所以在网页中的任何地位你都能够应用并且拜访到这个全局变量。上面通过看一段代码来阐明一下什么是全局的作用域。 var globalName = 'global';function getName() { console.log(globalName) // global var name = 'inner' console.log(name) // inner} getName();console.log(name); // console.log(globalName); //globalfunction setName(){ vName = 'setName';}setName();console.log(vName); // setNameconsole.log(window.vName) // setName从这段代码中咱们能够看到,globalName 这个变量无论在什么中央都是能够被拜访到的,所以它就是全局变量。而在 getName 函数中作为局部变量的 name 变量是不具备这种能力的。 如果在 JavaScript 中所有没有通过定义,而间接被赋值的变量默认就是一个全局变量,比方下面代码中 setName 函数外面的 vName 变量一样。 咱们能够发现全局变量也是领有全局的作用域,无论你在何处都能够应用它,在浏览器控制台输出 window.vName 的时候,就能够拜访到 window 上所有全局变量。 当然全局作用域有相应的毛病,咱们定义很多全局变量的时候,会容易引起变量命名的抵触,所以在定义变量的时候应该留神作用域的问题。 函数作用域在 JavaScript 中,函数中定义的变量叫作函数变量,这个时候只能在函数外部能力拜访到它,所以它的作用域也就是函数的外部,称为函数作用域,上面咱们来看一段代码。 function getName () { var name = 'inner'; console.log(name); //inner}getName();console.log(name);下面代码中,name 这个变量是在 getName 函数中进行定义的,所以 name 是一个部分的变量,它的作用域就是在 getName 这个函数里边,也称作函数作用域。 ...

August 28, 2023 · 2 min · jiezi

关于前端:Day5react函数组件与类组件

指标: 继续输入!每日分享对于web前端常见常识、面试题、性能优化、新技术等方面的内容。 次要面向群体:前端开发工程师(初、中、高级)、应届、转行、培训、自学等同学 Day4-今日话题react函数组件和类组件的区别,将从以下七个角度介绍: 语法和定义外部状态治理生命周期性能可读性和维护性上下文集成状态治理库1. 语法和定义:函数式组件: 应用函数来定义,接管props作为参数,并返回一个React元素。 function FunctionalComponent(props) { return <div>{props.message}</div>;}类组件: 应用类来定义,继承自React.Component,应用render 办法返回React元素。 class ClassComponent extends React.Component { render() { return <div>{this.props.message}</div>; }}2. 外部状态治理:函数式组件: 晚期函数式组件无奈本人治理状态。应用Hooks后,能够应用useState来在函数式组件外部治理状态。 类组件: 能够通过this.state来治理外部状态,能够在constructor中初始化状态,而后应用setState办法来更新状态。 3. 生命周期:函数式组件: 晚期函数式组件没有生命周期办法。应用Hooks后,能够应用useEffect来模仿生命周期行为,如componentDidMount、componentDidUpdate等。 类组件: 领有残缺的生命周期办法,包含componentDidMount、componentDidUpdate、componentWillUnmount等。 4. 性能:函数式组件:通常比类组件性能更好,因为函数组件不须要创立类的实例,从而缩小了内存和性能开销。 类组件: 须要创立类的实例,可能会导致轻微的性能损失。 5. 可读性和维护性:函数式组件: 通常更简洁,适宜用于无状态、纯UI渲染的状况,代码更易于了解和保护。 类组件: 可能会显得简短,因为须要定义类、构造函数和render办法,但在简单的场景中提供了更多的构造。 6. 上下文(Context):函数式组件: 能够通过useContext Hook来拜访上下文。 类组件: 能够通过this.context来拜访上下文。 7. 集成状态治理库:函数式组件: 能够轻松地集成Redux或其余状态治理库,因为它们能够在任何中央应用Hooks。 类组件: 也能够集成Redux等库,但可能须要应用高阶组件(HOC)或应用connect办法。 下一篇文章将分享React相干的知识点,欢送点赞、关注、转发~ 本文由mdnice多平台公布

August 28, 2023 · 1 min · jiezi

关于前端:NestJS系列核心概念Middleware中间件

前言用过express与koa的同学,对中间件这个概念应该十分相熟了,中间件能够拿到Request、Response对象和next函数. 一般来讲中间件有以下作用: 执行任何代码对申请与响应拦挡并革新完结request-response周期通过next()调用下一个中间件如果以后中间件没有完结以后request-response周期,必须调用next()函数,否则申请会处于挂起状态,阻塞整个利用中间件个别有两种:类中间件、函数中间件 类中间件创立类中间件应用@Injectable()装璜器,并且须要实现NestMiddleware接口(use办法) // Logger.middleware.tsimport { Injectable, NestMiddleware } from "@nestjs/common";import { Request, Response } from "express";@Injectable()export class LoggerMiddleware implements NestMiddleware { use(req: Request, res: Response, next: () => void) { console.log('logger middleware', `url: ${req.url}`); next(); }}应用类中间件类两头创立完之后,须要在模块中进行挂载,但@Module装璜器并没有中间件的相干配置,咱们须要让module类实现NestModule接口,实现外面configure办法来进行挂载 // user.module.tsimport { Module, NestModule } from '@nestjs/common';import { UserService } from './user.service';import { UserController } from './user.controller';import { LoggerMiddleware } from '../middleware/Logger.middleware';@Module({ controllers: [UserController], providers: [UserService]})export class UserModule implements NestModule { configure(consumer) { consumer .apply(LoggerMiddleware) .forRoutes(UserController); }}apply办法示意挂载的是哪个中间件forRoutes办法示意对哪个申请门路起作用,这种形式与app.use(path, middleware)作用是一样,只针对局部门路起作用当给forRoutes办法传递的是一个controller控制器时,那么该中间件则对整个控制器下的门路失效比方这里传递的是UserController控制器,那么针对该控制器下的门路都会失效 ...

August 28, 2023 · 1 min · jiezi

关于前端:面试官-类型兼容结构化类型

类型兼容:结构化类型TypeScript 是一种基于 JavaScript 的动态类型语言,它为 JavaScript 增加了类型零碎,并提供了弱小的类型检查和主动补全性能。TypeScript 的类型零碎有一个十分重要的个性,那就是 "鸭子类型"(Duck Typing)或 "结构化类型"(Structural Typing)(文章会以"鸭子类型"(Duck Typing)作为简称)。这种个性有时会让人感到诧异,但它是 TypeScript 加强 JavaScript 开发体验的重要形式之一。 鸭子类型的概念来自一个古老的英语成语:“如果它走起路来像一只鸭子,叫起来也像一只鸭子,那么它就是一只鸭子。”在 TypeScript(或更一般地说,动态类型语言)的上下文中,鸭子类型意味着一个对象的类型不是由它继承或实现的具体类别决定的,而是由它具备的构造决定的。 本文将全面深刻地探讨 TypeScript 中的鸭子类型,以及如何在理论的开发中利用和利用鸭子类型。 1. 鸭子类型:定义和示例鸭子类型的概念来自一个古老的英语成语:“如果它走起路来像一只鸭子,叫起来也像一只鸭子,那么它就是一只鸭子。”在 TypeScript(或更一般地说,动态类型语言)的上下文中,鸭子类型意味着一个对象的类型不是由它继承或实现的具体类别决定的,而是由它具备的构造决定的。 这是一个简略的鸭子类型示例: interface Duck { walk: () => void; quack: () => void;}function doDuckThings(duck: Duck) { duck.walk(); duck.quack();}const myDuck = { walk: () => console.log('Walking like a duck'), quack: () => console.log('Quacking like a duck'), swim: () => console.log('Swimming like a duck')};doDuckThings(myDuck); // OK在这个例子中,咱们定义了一个 Duck 接口和一个 doDuckThings 函数,这个函数须要一个 Duck 类型的参数。而后咱们创立了一个 myDuck 对象,它有 walk、quack 和 swim 这三个办法。只管 myDuck 并没有显式地申明它实现了 Duck 接口,然而因为 myDuck 的构造满足了 Duck 接口的要求(即 myDuck 有 walk 和 quack 这两个办法),咱们能够将 myDuck 作为参数传递给 doDuckThings 函数。 ...

August 28, 2023 · 2 min · jiezi

关于前端:在低代码平台里给页面变量赋值

在低代码平台中,变量扮演着十分重要的角色,它们是数据管理和流程管制的要害工具。就像在传统的编程语言中一样,变量被用来存储、援用和操作数据。在低代码环境中,这些变量有助于简化简单的逻辑,进步代码的重用性,使非程序员更易于了解和应用。 首先,咱们先来解释一下什么是变量。在计算机编程中,变量是一种存储数据的形式,咱们能够把它设想成一个盒子,能够放入各种类型的数据,如数字、文本、日期、列表等。在程序运行过程中,咱们能够读取变量中的数据,或者扭转它的值。变量的名称通常代表了它所存储的数据含意。 在低代码平台中,变量的应用十分宽泛。比方,咱们能够在一个屏幕(或者叫作视窗、页面)中定义一个变量,用来存储用户输出的数据;在一个流程或逻辑中,咱们能够定义一个变量,用来存储计算结果,或者作为决策的根据。变量还能够被用来在不同的屏幕、流程或逻辑之间传递信息。 以下是一些具体的例子,阐明了变量在低代码平台中的用处。 用户输出存储:在一个低代码利用的界面中,咱们可能须要收集用户的输出。例如,咱们可能有一个表单,让用户输出他们的姓名和电子邮件地址。在这个例子中,咱们能够为姓名和电子邮件地址定义两个变量,当用户在表单中输出数据时,这些数据就会被存储在相应的变量中。逻辑决策:在应用程序的流程中,咱们可能须要依据一些条件来决定接下来的动作。例如,咱们可能有一个流程,须要检查用户输出的年龄是否大于 18 岁,如果大于 18 岁,就容许他们拜访某个页面;否则,就显示一个谬误音讯。在这个例子中,咱们能够定义一个变量来存储用户输出的年龄,而后在决策逻辑中援用这个变量。看个具体的例子。 首先在页面设置的页面变量里,创立一个新的页面变量,取名申请后果,默认值为 11111. 新拖拽一个按钮进去,创立一个点击事件: 点击事件具体的执行逻辑是,设置页面变量: 变量赋值抉择成赋值硬编码成 333 运行时测试,文本显示的默认值为 11111: 点击“页面变量”按钮后,值便成为 333:

August 28, 2023 · 1 min · jiezi

关于前端:sessioncookie-和-token-三个概念的区别和联系

Session(会话):"Session"是一种服务器端的状态管理机制,用于跟踪和存储用户在Web应用程序中的状态信息。当用户拜访应用程序时,服务器会为每个会话调配一个惟一的会话ID。这个会话ID通常通过"cookie"或URL参数在用户的浏览器和服务器之间进行传递。会话数据存储在服务器上,能够蕴含用户的身份信息、权限、购物车内容等。 Cookie(HTTP Cookie):"Cookie"是一种在用户浏览器和Web服务器之间传递数据的小型文本文件。服务器能够通过HTTP响应的"Set-Cookie"头将cookie发送到用户的浏览器,而后浏览器会在后续的申请中通过"Cookie"头将cookie值发送回服务器。Cookie罕用于存储长久化数据,比方用户的首选语言、登录状态等。 Token(令牌):"Token"是一种代表用户身份和权限的数据结构。它能够是一串加密的字符串,通常蕴含无关用户的信息,比方用户名、角色和过期工夫。Token通常是无状态的,这意味着服务器不须要在后端存储任何对于令牌自身的信息。令牌能够通过各种形式传递,如HTTP头部、URL参数或"cookie"。 区别与分割: 地位与存储: Session数据存储在服务器上,客户端只保留一个会话ID,通常通过"cookie"传递。Cookie存储在客户端浏览器中,能够蕴含各种数据,但大小有限度。Token也存储在客户端,通常是作为HTTP头部的一部分发送到服务器。数据内容: Session通常蕴含敏感数据,因为它存储在服务器上。Cookie能够蕴含持久性数据,如用户偏好设置。Token通常蕴含用户的身份信息和权限申明。状态与无状态: Session是有状态的,服务器须要存储会话数据。Cookie和Token是无状态的,服务器不须要在后端存储相干数据。应用场景举例: 假如有一个电子商务网站: 当用户登录时,服务器会创立一个会话,并将用户信息存储在会话中。用户的购物车内容和登录状态都存储在会话中。为了跟踪用户,服务器会在用户的浏览器中设置一个蕴含会话ID的cookie。这样,用户在浏览网站的不同页面时,服务器能够辨认会话。在某些状况下,网站可能会应用Token来实现单点登录(SSO)。用户登录后,服务器会生成一个Token,将其加密并发送给客户端。客户端在后续申请中通过HTTP头部将Token发送给服务器,从而容许用户拜访受爱护的资源,无需再次输出凭据。总结:"Session"、"cookie"和"token"都在Web应用程序中施展着重要作用,但它们的用处和特点各不相同。"Session"用于存储服务器端状态数据,"cookie"用于在客户端存储小量数据,"token"用于在客户端和服务器之间传递用户身份和权限信息。依据应用程序的需要和安全性要求,能够灵便地抉择如何应用这些机制来构建弱小的用户认证和受权零碎。

August 28, 2023 · 1 min · jiezi

关于前端:Web-代码片段动画

一组应用 CSS 或 JavaScript 构建的动画技巧,思考了可拜访性和用户偏好。欢送来到咱们一直减少的动画片段集。这些片段试图展现你能够如何创立引人入胜的动画和交互成果,同时依然尊重用户对动画的偏好。它们还反对所有古代浏览器,因而你能够放心使用。 文字拆散——字母动画https://codepen.io/zhoushengdao/pen/mdaVmad 该片段展现了如何创立尊重用户动画偏好的有限字母动画成果。 残缺文章 · YouTube 上的视频 · GitHub 上的源代码 文字拆散——单词动画https://codepen.io/zhoushengdao/pen/jOXWwba 该片段展现了如何创立尊重用户动画偏好的有限单词动画成果。 残缺文章 · YouTube 上的视频 · GitHub 上的源代码 文字拆散——字母悬停https://codepen.io/zhoushengdao/pen/PoXZjvO 该片段展现了如何创立尊重用户动画偏好的交互式字母成果。 残缺文章 · YouTube 上的视频 · GitHub 上的源代码 文字拆散——单词悬停https://codepen.io/zhoushengdao/pen/gOZPxpo 该片段展现了如何创立尊重用户动画偏好的交互式单词成果。 残缺文章 · YouTube 上的视频 · GitHub 上的源代码

August 28, 2023 · 1 min · jiezi

关于前端:JVS低代码开发工具基础篇应用中心配置说明

JVS利用核心是一个集中管理和提供企业级轻应用程序的平台或界面。它能够是相似企业轻利用的利用商店或者一个软件管理工具,用于管理者便捷的下载、上传、公布和装置各种企业级应用程序。 利用核心性能介绍在JVS角色中有“利用管理员”的角色,如果赋予该角色,则用户为利用管理员,利用管理员有进入利用配置核心的权限。 利用配置界面利用核心蕴含三个局部:创立利用、我的利用、利用模板 利用导航区中,包含的利用搭建介绍与利用导入、创立按钮。导入利用:通过利用模板文件上传,反对单机或拖拽对应的 以“.jvs”结尾的模板文件。 创立空白利用:这里创立的利用是轻利用,设置利用的名称与利用的相干展现信息。 利用模板展现利用模板区域展现了零碎内置的轻利用模板,点击任意模板, 零碎弹出利用模板的具体界面,能够点击利用模板后零碎会主动装置对应利用; 在模板区域点击“更多”按钮,零碎进入模板详情页面,如下图所示,可上传模板文件,也能够增加利用模板。 利用展现我的利用,通过利用核心创立的利用展现,包含利用的根本名称、利用简介、利用的公布状态等信息,如下图所示: 利用创立模式利用创立反对两种模式,创立空白利用、通过模板创立利用 利用的治理利用创立-利用公布-利用卸载-利用删除,利用创立后,主动实现公布,如果须要批改时,先卸载利用,而后调整后再公布利用公布后,受权用户能够间接在菜单栏进行查看 公布状态下的利用不反对删除。 公布为模板公布模板的权限目前受权给系统管理员admin,公布模板后,间接能够在模板核心查看。 在线demo:https://frame.bctools.cn/根底框架开源地址:https://gitee.com/software-minister/jvs JVS低代码往期回顾低代码、逻辑、规定、数据分析、协同工具汇合,解决企业不同需要低代码开发工具:JVS轻利用之间如何实现数据的调用?低代码开发重要工具:JVS低代码2.1.8新版本性能清单

August 28, 2023 · 1 min · jiezi

关于前端:element一些小问题总结

问题:el-dialog加上v-loading会加在整个页面上?解决:在el-dialog下套一个el-main或其余,将v-loading加在下面即可。 留神:加上el-main后 ,el-dialog自带的页脚区域不显示,需本人手动写问题:批改el-dialog中el-dialog__body的内边距不失效?解决:去掉style上的scoped属性或者deep浸透 留神:为了限度只在本页生效,倡议在后面加上自定义class问题:el-dialog中插入vxe-table,vxe-table想要文字超长显示提醒::show-overflow-tooltip="true" 无反馈?解决:曲线救国,敞开el-dialog的暗影层。扭转el-dialog的z-index问题:el-dialog上插入图片,图片大图预览不显示?解决:给图片预览层从新定义z-index,使他层级比dialog高,即可显示。 留神:vue页面中的class不能加scope 否则会生效。 .el-image-viewer__wrapper{ z-index: 2050 !important;}问题:element-ui的el-table动静批改表格展现列,table高度变小问题解决办法:在更新表格数据后对el-table进行重载 this.$nextTick(() => { this.$refs.tableName.doLayout(); // el-table增加ref="tableName"})问题:提示信息换行let newDatas = [];const h = this.$createElement;for (let i in data.data) { newDatas.push(h("p", { class: "fontRed" }, data.data[i]));}this.$message({ type: "error", dangerouslyUseHTMLString: true, message: h("div", null, newDatas),

August 28, 2023 · 1 min · jiezi

关于前端:openEuler创新项目探索一个Java端的向量化BLAS库VectorBLAS

VectorBLAS简介 VectorBLAS是一个应用Java语言实现的向量化BLAS高性能库,目前已在openEuler社区开源。 VectorBLAS通过循环展开、矩阵分块和内存布局优化等算法优化,对BLAS函数进行了深度优化,并利用VectorAPI JDK提供的多种向量化API实现。 能够了解为:VectorBLAS = VectorAPI + BLAS。 BLAS简介: BLAS(Basic Linear Algebra Subprograms)是进行向量和矩阵等根本线性代数操作的数值库,是LAPACK(Linear Algebra Package)的一部分。 在高性能计算畛域中被广泛应用,由此衍生出大量优化版本,如OpenBLAS、Intel的Intel MKL等优化版本。 次要反对三个级别的运算:别离反对向量与向量、向量与矩阵、矩阵与矩阵的相干操作。 VectorAPI简介: VectorAPI是Java端为实现SIMD向量化性能提供的一个形象层,从JDK16开始公布,目前已孵化到第六代(JDK21)。 VectorAPI提供的能力包含: 定义更清晰及精确的向量化API,使用户更间接的实现向量化;与平台无关:反对AArch64和x86等平台,反对NEON、SVE、AVX等多种向量化指令,一份代码多处可用;利用场景: 目前BLAS库在大数据、HPC和机器学习等高性能计算中被宽泛应用。例如大数据组件Spark中的多种机器学习算法(如:KMeans、 LDA、 PCA、 Bayes、 GMM、 SVM等)都用到了BLAS函数接口gemm、 gemv、 axpy、 dot、 spr等。 次要优化办法 1. VectorAPI向量化 BLAS库中的函数分为矢量-矢量、矢量-矩阵、矩阵-矩阵的计算,其中少数场景为对数组、矩阵进行计算,因而应用向量化进行优化,一次解决多个数据,晋升效率,上面以daxpy函数为例: daxpy => y = alpha * x + y, 其中alpha为常数,x和y为一维向量,数据类型均为double; 原生奢侈实现:对x和y中的元素一一计算; 向量化实现:以256位宽的寄存器为例,一次能够解决2个double类型,即一次对alpha、x和y做两次乘加操作; 能够看出,向量化操作能够成倍的晋升解决效率,目前的向量化寄存器有128、256、512等大小的位宽,SVE等指令集甚至最高可反对2048位。 2. 循环展开 循环展开是一种循环转换技术, 通过缩小或打消控制程序循环的指令,来缩小计算开销,这种开销包含减少指向数组中下一个索引或者指令的指针算数等,还能够缩小循环的次数,每次循环内的计算也能够利用CPU的流水线晋升效率; JDK中的JIT即时编译器也有针对循环进行主动优化,尤其是应用int, short, 或者char变量作为计数器的计数循环(counted loops) VectorBLAS次要剖析函数个性,通过把循环革新为counted loop,或手动对要害循环进行开展,以此进步执行效率; 3. 矩阵分块 矩阵分块是一种cache优化伎俩,当数组、矩阵的规模较大的时候,在N层循环中的跨度太大时,无奈fit in the cache,数据则会被清出了缓存,造成较高的cache miss率; 通过矩阵分块,能够将小块数据锁在L1/L2 Cache中,进步cache命中,升高cache miss率。 4. Packing Packing优化又称为内存布局优化,因矩阵在数组中个别是按列存储或者按行存储,若计算时不是依照整行整列的程序进行,那么就须要跨列或跨行读取数据。 Packing指的是在内存中新开一块空间,在这块空间内从新排布数据,使得数据的读取能够变得间断,缩小cache miss,晋升读取速度,Packing个别与矩阵分块搭配应用。 性能数据 ...

August 28, 2023 · 1 min · jiezi

关于前端:谈谈-H5-移动端适配原理

前言欢送关注同名公众号《熊的猫》,文章会同步更新,也可疾速退出前端交换群!H5 挪动端 开发的必不可少的一个环节就是 挪动端网页的适配,因为 UI 通常只会提供 大小固定的设计稿,而各种不同挪动设施具备不同的页面分辨率和大小,所以适配的目标就是让一份设计稿在不同挪动设施上体现出一致性。 尽管现如今各种插件都能够帮忙咱们疾速配置实现,例如 lib-flexible、postcss-pxtorem、postcss-px-to-viewport 等等,但不少小伙伴在被问及相干原理时却很难说分明,那么本篇文章咱们就一起来探索一下其中原理吧!!! 文中有不当之处,欢送在评论区斧正!!! CSS 中的尺寸单位在理解具体的适配计划之前,咱们先把 CSS 中适配会波及到的相干尺寸单位进行一个理解吧,总结起来就是一句话:CSS 中的尺寸单位都是 绝对长度单位,只是绝对的指标不同。 px 像素单位px 全称为 pixel(像素),它是绝对于 屏幕显示器分辨率(桌面设定的分辨率,不是显示器的物理分辨率) 而言的,在 雷同/不同 的设施上 1px 示意多个 设施像素。 当 一个像素点越大 时, 出现的图像就会 越含糊;当一个像素点越小时, 像素点就会 越密集, 出现的图像就会 越清晰。 ![image.png]() em 绝对单位好多人都认为 em 就是绝对于 父元素 font-size,实际上在不同的 CSS 属性当中应用 em 其绝对的指标也是不同,如下: 用于 font-size 中则是绝对于 父元素 font-size 大小 用于 其余属性(如 width,height) 中应用是绝对于 本身 font-size 大小 值得注意的是,若 以后元素/父元素 的 font-size 未设置,因为 font-size 属性值可被继承的起因,可逐级向上查找,最终找不到则绝对于浏览器默认字体大小,即 font-size = 16px。 ...

August 28, 2023 · 4 min · jiezi