关于大前端:互动游戏团队如何将性能体验优化做到TOP级别

一、背景随着互动游戏业务 DAU 量级减少,性能和体验重要性也越发重要,好的性能和体验不仅能够减少用户应用体感,也能够减少用户对于互动游戏的应用粘性。 对现状剖析,次要存在首屏渲染速度慢、关上页面存在白屏、页面加载过多资源等问题,外围伎俩是减少骨架、接口优先级调整、预渲染、减小包体积等。 优化后,互动游戏签到性能做到同类业务性能体验 Top 级别,上面是优化后数据: 首屏渲染速度:优化后晋升首屏渲染速度 39%。首屏骨架:骨架体积大小缩小 44%(压缩后缩小 50%)。首次加载总资源:资源总体积优化后,大小缩小 69%。二、骨架骨架屏是指在页面加载时,长期显示出页面的次要构造,能够让用户在期待页面加载实现时,失去视觉上的反馈,晋升页面的用户体验。骨架示意图vs数据渲染 能够看出在接口返回数据之前,能够先应用骨架失去一些界面反馈。 三、缓存尽管骨架屏能够让用户在视觉上失去反馈,毕竟不是实在的数据,总体还是有一些简陋,用户也可能并不知道这块区域理论渲染的是什么样的内容,若是网络环境不好,很可能会长工夫的停留在骨架屏阶段,为了加强一些体感,应用缓存进一步对页面进行优化。应用缓存渲染具备以下劣势: 与骨架屏相比,缓存渲染非常靠近用户最终所见,因为每次接口返回数据都会更新缓存,用户再次进入时看到的都是本人上次进入时的数据。当用户处在弱网或者断网等不可抗力的环境中时,能够失去较为残缺的页面数据展现,能够很好削弱用户环境带来的网络营销。应用缓存注意事项: 一些缓存渲染应屏蔽事件响应,防止造成不必要的报错和客诉。比方商品的缓存渲染,因为商品存在下架、优惠券调整等状况,缓存的数据和理论数据会存在肯定的偏差。缓存渲染逻辑须要更加前置,不应该将缓存渲染的逻辑放在本来的地位,这样会拖慢渲染的机会。四、接口后置浏览器对同一时间内的申请数量是有限度的,既并发申请限度。当一个页面首次渲染时须要浏览器发动很多接口申请,用于填充页面渲染须要的数据,若是对于页面渲染时的申请数量不加以控制,便可能导致一些问题呈现。 当初有 home 和 info 两个接口,home 接口返回的数据是首屏渲染须要依赖的,info 接口返回的数据则不是首屏必须依赖的。假如当初还有一些其余申请占据了并发申请限度的数量,导致 home 接口申请变慢。若是 info 接口响应慢,长时间占据这浏览器的申请过程,会导致页面首屏渲染速度更慢,那么就须要有个一套计划能够依据接口的优先级进行加载顺序控制,能够将程序变为如下。计划: 当页面加载实现后肯定工夫后,进行低优先级接口的申请,或者触发页面的滚动、点击等时立刻进行接口申请。 此计划实用于:确定接口提早加载并不会阻塞用户的交互和操作。 将其封装为一个 hooks,便于复用,间接先看代码再解释: import { useRM, createRM } from 'xxx'const listen = (type: string, listener: () => void) => { const l = () => { listener() document.removeEventListener(type, l) } document.addEventListener(type, l)}const pageFlowModule = createRM( { assemble(state) { const reactionObserver = () => { state.isUserReactioned = true } ;['scroll', 'mousedown', 'touchstart'].forEach((type) => { listen(type, reactionObserver) }) setTimeout(reactionObserver, 4000) }, }, { isUserReactioned: false },)pageFlowModule.actions.assemble()export const usePageFlow = () => { const [state] = useRM(pageFlowModule) return state}应用: ...

February 23, 2024 · 3 min · jiezi

关于大前端:开源数据可视化开发平台FlyFish数据源应用教程详解

介绍飞鱼(FlyFish)是云智慧开源的一款收费的数据可视化编排平台。通过繁难的形式疾速创立数据模型,通过利落拽的模式,疾速生成一套数据可视化解决方案。在飞鱼产品中能够通过间接连贯 MySQL 、 Oracle 等数据库间接从数据源中获取数据展现在可视化利用上,本文旨在为读者形容如何从数据源连贯到数据展现在利用的步骤。 数据源类型飞鱼(FlyFish)目前反对的数据源类型有如下几种。其中 MySQL、Postgres、ClickHouse、MariaDB、SqlServer、达梦、Oracle均为数据库,能够间接写sql获取数据。http数据源能够填写申请门路参数等信息,最终对返回的json构造做解决反对利用展现。 数据库类型数据本篇文章以MySQL数据源为例,详细描述一下数据库类的数据源解决流程。 数据源创立首先点击数据源治理页面的新建按钮,能够看到如下页面: 选中MySQL数据源类型,而后填写对应信息,其中具体信息含意如下: 数据源名称:为新创建的数据源命名以便创立胜利后在列表中找到他。连贯地址:填写MySQL数据库的连贯地址如图中示例,留神ip和端口号以及db名称的正确填写。数据库名称:该值不须要填写,会从连贯地址中主动解析。用户名:连贯MySQL数据库的用户名。明码:连贯MySQL数据库的用户名对应的用户明码。须要留神的是,因为对于不同的数据库定位到一个db所需的配置不同,所以不同的数据库所要填写的值可能不同,例如Oracle数据库如果上述内容,还有Schema名称须要填写。 信息填写实现之后能够点击链接测试按钮,校验以后db是否能够胜利链接。弹出如下图所示内容,则示意胜利链接。 如果弹出如下图,阐明以后db并没有连贯胜利,须要查看所填写的信息是否正确,以及是否是网络问题,比方局部用户的db只在本人的内网能够拜访。 测试链接胜利后,点击保留数据源按钮保留、设置好的数据源信息。能够点击编辑去更改数据源的信息,以及删除按钮去删除掉不想要的数据源。在列表上看到保留胜利的数据源如下: 数据查问创立创立好数据源只是、应用数据源的第一步,下一须要通过写SQL来获取所需内容。点击侧边栏的数据查问按钮来创立新的数据查问。点击新建根底查问按钮咱们看到如下页面: 如果以后数据源过多,能够输出之前设置好的数据源名称来进行检索。选中之前增加好的数据源,能够看到所有的数据表信息会展现在页面上,如下图所示: 选中想要获取数据的表会跳转到书写SQL的页面,并且主动生成全表查问的SQL如下图所示: 在这能够去书写想要实现的SQL语句,须要留神,这里并不是只限度查问以后选中的表,仍然能够写其余的表名或者做关联查问。此外对于不同类型的数据源须要留神SQL语法,比方MySQL的语法和Oracle的语法就会有区别,须要依据数据源的类型书写能够辨认的sql语句。写完SQL之后能够点击输出右上角的执行按钮,来执行编写的SQL语句,如下图所示: 在输入框上面,能够看到以后SQL语句查问返回的数据信息,如果后果和预期不符能够持续更改SQL改成本人称心的成果。此外,输入框右上角还有一个设置参数的按钮。该按钮次要是为了解决SQL复用问题。举个例子,比方有两张大屏,一张须要id字段,另一张须要name字段,那么用户是不是须要写两句SQL呢?而设置参数就完满解决了这个问题,上面来看一下设置参数如何应用。 如下图可将我本人须要查问的字段设置为一个叫做param的参数,即应用{{}}将我想要设置的参数包裹起来: 而后点击设置参数按钮,零碎会主动解析须要设置的参数如下图弹窗 在这里设置这个参数的类型为:文本,而后默认值为:id,填写一个形容信息,而后点击确定。当再次点击执行按钮就会应用参数默认值,展现新的后果如下图: 这个参数能够利用于语句的各个中央,查问字段、表名、查问条件等,开发者能够根据集体需要进行变量设置。前面会详细描述如何在大屏上怎么设置此类变量。 当调整好SQL语句点击页面右上角的保留,会呈现如下弹窗: 为查问起一个不便记忆的名字,是很好的抉择,以便能够很快找到它。点击确定即保留胜利。此时,在数据查问的列表页,便能够看到新建胜利的数据查问,如下图所示。 点击数据名称能够对数据查问进行编辑,须要留神的是,如果该数据查问曾经利用于大屏组件,如果更改后返回后果与之前不统一,可能导致大屏展现异样。 数据查问的利用接下来讲一下如何将曾经配置好的数据查问利用于大屏。 从侧边栏点击到利用创立->利用开发,能够新创建一个利用或者在之前的利用中编辑,在利用上点击开发,进入如下开发页面: 以滚动列表图中组件为例。拖动一个滚动列表组件到编辑器而后选中该组件,在右侧边栏选中【数据】 ,而后在数据类型下拉选中选中【数据查问】,之后在数据查问输入框中输出之前命名好的数据【查问名称】,在搜寻后果中选中它,能够发现之前设置的参数也会同时展现在上面,这个时候就能够去更改参数的值,如下图所示: 上图中能够看到入选中之前创立的数据查问,而后将参数值改为name,点击利用后就能够看到组件上展现的信息曾经变更为name字段的信息。而后进行利用的保留即可。至此实现数据源从配置到利用的全副流程。 http类型数据http数据源辨别于数据库类的数据源增加的时候有本人独自的逻辑。 数据源创立在数据源列表页面,点击新建按钮而后选中数据源类型为http看到如下界面: 字段解释: 数据源名称:自定义新增数据源的名称,符合要求即可。数据库名称:定义一个数据库的名称,用于前面的sql加工。申请:下拉选抉择申请类型,而后在前面的地址栏填写对应的门路。header申请头:填写该申请的header信息。申请参数:填写该申请的参数信息。申请体:填写申请体信息。全副填写实现后点击保留数据源即可保留胜利。需注意以后数据源在前面数据查问的创立时会被当做一个db解决,所以数据库名名称会呈现在SQL的查问语句中,这里的命名须要合乎对应的规定。 数据表创立回到数据源列表页面,找到新建的数据源点击进入数据源详情页面,如下图所示: 点击左下角的新增表格,而后输出自定义的数据表的名称,点击回车即可开始建表。这里能够了解为数据库的建表,便于后续做SQL加工建表过程中,会把数据源的header及参数信息回显在这里,而后点击执行查问按钮,能够在后果预览中看到申请返回的数据如上图所示。随后能够开始对返回的信息做字段定义来进行json抽取,点击定义字段上面的增加按钮,看到如下弹窗: 字段解释: 字段名称:定义一个字段名称,能够了解为数据库中的列名,用于后续sql加工字段类型:下拉选抉择字段的类型数据抽取:填写jsonpath门路,用于提取json中的数据。数据预览:在填写jsonpath的过程中会实时展现以后jsonpath提取到的信息对于jsonpath的具体用法可参考:https://blog.csdn.net/software_test010/article/details/125427926,在数据预览中看到已提取到所需数据之后,点击确定来保留以后字段的设置。提取到所需字段会有相似数据库的行列展现如下图: 图中数据表的展现信息即以后数据表最终拿到的后果,点击保留即可。反复下面步骤能够对同一数据源创立多张数据表,即对返回的后果进行不一样的字段抽取来解决申请复用问题。 数据查问创立创立数据查问的过程与数据库相似,可参考之前段落。 点击新建数据查问,抉择曾经创立的数据源,以及创立的数据表,而后编写SQL,如下图: 须要留神的是,这里是不反对连表查问,由Http数据源创立的数据表只能在单表中查问。此外,上述应用的是Spark的SQL语法,底层是应用Spark引擎进行SQL剖析和解决的,书写SQL时须要留神。 设置参数的操作以及如何将数据查问利用在组件上进行展现在上文中曾经形容过,此处不再赘述。 结语开源数据可视化编排平台FlyFish是一款功能强大且易于应用的数据可视化工具,可能帮忙用户将大量的数据转化为直观、易于了解的图表和图形。作为一个全面的数据可视化解决方案,该平台不仅提供了丰盛的可视化选项,还反对多种数据源的利用技术。 至此,置信各位开发者对如何在FlyFish平台新增数据源,以及如何在数据源中获取本人想要的数据并利用于组件中,应该有了大抵的理解。心动不如口头,点击下方链接,快来通过FlyFish搭建属于本人的一套数据可视化大屏吧! GitHub 地址: https://github.com/CloudWise-OpenSource/FlyFish ...

May 29, 2023 · 1 min · jiezi

关于大前端:前端设计走查平台实践前端篇

我的项目背景 随着前端业务的一直倒退,前端对设计稿的还原水平也成为了影响用户对产品体验的一个要害指标,作为最靠近用户侧的研发,前端工程师通常须要和设计师同学通力配合来晋升用户体验。其中,设计走查是设计同学最常见的测试前端同学是否完满还原了本人设计理念的形式,本文旨在通过设计走查平台在前端侧的实际总结下在前端上游研发链路中的一些根底建设,以期可能为其余有相干须要的同学提供一些实际思路。 计划 一个前端工程师的次要指标是寻找一款贴近浏览器原生的框架,svelte 是你不二的抉择。前端架构选型,从整体的产品业务状态来看,属于较为简单的繁多页面状态,并且思考到要反对浏览器的插件生态,因此前端局部抉择应用了svelte的框架计划。抉择 svelte 作为本业务的前端技术选型次要思考到以下两方面起因:一是思考到业务状态较为简单,只有一个上传图片的页面;二是因为浏览器插件相干的编写还是更加偏差原生js一些,应用大型框架有些大材小用。综合近几年 svelte 的迅猛发展,小型业务还是思考应用它作为一个框架应用的,其在编译时利用位掩码做的脏值查看的思路其实还是能够作为框架开发者借鉴的一个思路的(ps:对这个感兴趣的同学,能够看一下新兴前端框架 Svelte 从入门到原理这篇文章的介绍),然而目前倒退绝对还是比拟初期,整个生态绝对还不够欠缺,同时也是给宽广开发者提供了很好的蓝海空间,比方:目前还没有呈现相似 Element UI 和 Ant Design 这种非常好用的组件库零碎,尽管有几个,然而个人感觉很不好用,作者在本我的项目中对须要用到的几个组件做了简略的封装,有须要的同学能够参考借鉴一下。 目录public buildbg.jpegfavicon.pngglobal.cssindex.htmlmanifest.jsonscripts setupCrxScript.jssetupTypeScript.jssrc components Button.svelteDialog.svelteIcon.svelteInput.svelteMessage.svelteTooltip.svelteUpload.svelteutils function.jsimage.jsindex.jsApp.sveltemain.jsrollup.config.js实际 设计走查平台提供了治理平台及对应的Chrome插件,可提供给测试及UI同学用于图片的比对,晋升研发效率 源码 svelte作者--前端驰名的轮子哥Rich Harris,同时也是rollup的作者,因此本我的项目中就抉择了 rollup 作为打包构建的工具,同时为了将Chrome插件公布到内网中(ps:本我的项目次要用于我的项目外部基建利用,因此未在私有云及Chrome官网平台去公布,服务端波及到了图片的比对计算);在scripts目录下内置了两个脚本,一个用于生成ts,一个用于向云平台发送压缩包;因为 svelte 的组件库生态绝对不是特地丰盛(ps:业界常见曾经开源的 svelte 组件库能够参看这篇文章Svelte的UI组件库),比照了业界几个相干的组件库后,决定本人实现下业务中须要用到的组件,具体组件放在了components目录下 rollup.config.jsimport svelte from 'rollup-plugin-svelte';import commonjs from '@rollup/plugin-commonjs';import resolve from '@rollup/plugin-node-resolve';import livereload from 'rollup-plugin-livereload';import { terser } from 'rollup-plugin-terser';import css from 'rollup-plugin-css-only';const production = !process.env.ROLLUP_WATCH;function serve() { let server; function toExit() { if (server) server.kill(0); } return { writeBundle() { if (server) return; server = require('child_process').spawn('npm', ['run', 'start', '--', '--dev'], { stdio: ['ignore', 'inherit', 'inherit'], shell: true }); process.on('SIGTERM', toExit); process.on('exit', toExit); } };}export default { input: 'src/main.js', output: { sourcemap: true, format: 'iife', name: 'app', file: 'public/build/bundle.js' }, plugins: [ svelte({ compilerOptions: { // enable run-time checks when not in production dev: !production } }), // we'll extract any component CSS out into // a separate file - better for performance css({ output: 'bundle.css' }), // If you have external dependencies installed from // npm, you'll most likely need these plugins. In // some cases you'll need additional configuration - // consult the documentation for details: // https://github.com/rollup/plugins/tree/master/packages/commonjs resolve({ browser: true, dedupe: ['svelte'] }), commonjs(), // In dev mode, call `npm run start` once // the bundle has been generated !production && serve(), // Watch the `public` directory and refresh the // browser on changes when not in production !production && livereload('public'), // If we're building for production (npm run build // instead of npm run dev), minify production && terser() ], watch: { clearScreen: false }};scriptssetupCrxScript.js通过minio这个库来进行公有云平台的对象存储库上传,archiver这个次要用于压缩 ...

September 27, 2022 · 10 min · jiezi

关于大前端:开源星001-号落地-FlyFish欢迎登陆赢神秘大礼包

前言往年 5 月 6 日,腾讯·腾源会社区联结 FlyFish 等在内的 80 余家开源社区、国内外开源基金会等,独特发动「开源摘星打算」。发展 3 月以来,咱们累计为近百位优良摘星贡献者,送出激励大礼包 300 余份;同时为 700 位的开源爱好者搭建了独特的交换乐园,帮忙很多人实现了从开源萌新到「过来人」的成长、变质。 明天,「开源摘星打算」持续「001号」工作摸索,船长登陆,心愿能和 FlyFish 星开掘新一批的优良摘星者,独特将 FlyFish 星建设得更好以下是船长发来的火线信号…… Hi,各位开源爱好者,大家好! 我是「开源摘星号」飞船船长小源 很快乐今日起飞 FlyFish 星 执行「开源星球」001 号工作 在 FlyFish 星上 我投递了有数的能量块 侥幸的你只有从今日开始收集 上面这些非凡能量块 就有机会取得我在 8 月为你筹备的登陆礼包 (证书、奉献卡、鹅厂周边、盛典入场券……) 残缺参加攻略欢送查看 FlyFish 星「能量块」介绍FlyFish代码仓库地址 FlyFish 是云智慧公司自主设计、研发的一款低门槛、高拓展性的低代码利用开发平台, 为数据可视化开发场景提供了高效的一站式解决方案。飞鱼提供丰盛的组件和利用模板库, 可通过利落拽的模式实现数据可视化开发,零开发背景的用户也可实现数据可视化开发工作。 同时,飞鱼也提供了灵便的拓展能力,反对组件开发、自定义函数与全局事件等配置, 面向简单需要场景可能保障高效开发与交付。 应用形式一: 线上Demo环境体验应用形式二: 本地下载部署应用能量块 1: 文档修复 具体阐明: 通过体验FlyFish发现并欠缺FlyFish官网技术文档问题,并提交PR。 难度: 10 积分 工作详情: https://github.com/CloudWise-... 能量块2: 体验报告 具体阐明: 应用 FlyFish 并输入无效体验报告并公布至云智慧AIOps社区 难度: 10 积分 工作详情: https://github.com/CloudWise-... 能量块3: BUG 修复 ...

August 9, 2022 · 1 min · jiezi

关于大前端:大前端2022版全面升级某课完结

download:大前端2022版全面降级某课完结线段树(动静开点)的两种形式题目描述Tag : 「线段树(动静开点)」、「线段树」实现一个 MyCalendar 类来存放你的日程安排。如果要增加的工夫内不会导致三重预订时,则可能存储这个新的日程安排。MyCalendar 有一个 book(int start, int end) 方法。它意味着在 start 到 end 工夫内减少一个日程安排,注意,这里的工夫是半开区间,即 [start,end)[start, end)[start,end), 实数 xxx 的范畴为, start<=x<end start <= x < end start<=x<end。当三个日程安排有一些工夫上的交叉时(例如三个日程安排都在同一时间内),就会产生三重预订。每次调用 MyCalendar.book 方法时,如果可能将日程安排胜利增加到日历中而不会导致三重预订,返回 true。否则,返回 false 并且不要将该日程安排增加到日历中。请按照以下步骤调用 MyCalendar 类: MyCalendar cal = new MyCalendar(); MyCalendar.book(start, end)示例:MyCalendar();MyCalendar.book(10, 20); // returns trueMyCalendar.book(50, 60); // returns trueMyCalendar.book(10, 40); // returns trueMyCalendar.book(5, 15); // returns falseMyCalendar.book(5, 10); // returns trueMyCalendar.book(25, 55); // returns true 解释: 前两个日程安排可能增加至日历中。 第三个日程安排会导致双重预订,但可能增加至日历中。第四个日程安排流动(5,15)不能增加至日历中,因为它会导致三重预订。第五个日程安排(5,10)可能增加至日历中,因为它未使用已经双重预订的工夫10。第六个日程安排(25,55)可能增加至日历中,因为工夫 [25,40] 将和第三个日程安排双重预订;工夫 [40,50] 将独自预订,工夫 [50,55)将和第二个日程安排双重预订。复制代码提醒: ...

July 19, 2022 · 6 min · jiezi

关于大前端:从开源模型框架到自研声网-Web-端虚拟背景算法正式发布

依据钻研发现,在均匀 38 分钟的视频会议外面,大略会有 13 分钟左右的工夫用于解决和烦扰相干的事件。同时钻研也表明在加入在线会议的时候,人们更加偏向于语音会议,其中一个要害起因就是大家不心愿个人隐私裸露于公众的视线。 如何在视频会议中突出演讲者,缩小背景当中的烦扰信息,并晋升人们对视频会议的参加激情成为了实时音视频技术所要解决的问题,而实时虚构背景正是一项这样的技术。不同于绿幕等传统技术手段,虚构背景通过机器学习推理对实时视频内容当中的人像进行宰割,实现对人像外内容的替换。因而用户无需对事实环境中的背景进行安排即可应用,具备便捷高效的长处。 2021 年 8 月,声网落地了基于 Web SDK 的第一个虚构背景插件版本,实现了背景替换与背景虚化性能。在近期公布的虚构背景插件更新中,该性能失去进一步晋升,目前已可反对图片虚构背景、基于 CSS 色值的纯色背景、3 档不同水平的虚化背景。机器学习推理引擎也从通用机器学习框架降级为 Agora AI 实现,不仅整体包增量从 3M 升高至 1M,运算性能实现了 30% 以上的进步,新的 API 也更为易用。 回顾声网 Web SDK 虚构背景性能的研发过程,次要经验了三个阶段: 第一阶段 开源模型 + 开源机器学习框架在这一阶段,咱们基于 MediaPipe selife 人像宰割模型和TFlite机器学习框架实现了虚构背景在 Web 平台的工程化实际。实现了从图像采集、实时处理到编码发送的残缺管线。在这一个过程中,咱们对影响解决性能的关键因素进行了大量剖析,并对这些性能瓶颈进行了针对性的优化。同时咱们也对不同机器学习框架在 Web 人像宰割的利用场景进行了定制和优化,这其中包含对 MediaPipe 和 TFlite 框架的定制。 MediaPipe 应用 TFlite 作为机器学习推理引擎,MediaPipe 的 TFlite 人像宰割模型所应用的算子除了蕴含 TFlite 反对的通用算子,还蕴含 MediaPipe 提供的非凡算子。在实践中,咱们将 MediaPipe 人像宰割模型所依赖的 MediaPipe 非凡算子间接移植到 TFlite,实现了 selife segmentation 模型脱离 MediaPipe 框架间接在 TFlite 上的运行。同时应用自研 WebGL 算法代替 Mediapipe 提供的图形处理性能。这样就打消工程对 MediaPipe 的依赖,不仅升高了 MediaPipe 带来的整体包增量,同时使机器学习运算和图像处理解耦,整体计划更具灵活性。 ...

May 6, 2022 · 1 min · jiezi

关于大前端:建议收藏总结了42种前端常用布局方案

作者:一碗周 原文链接:https://juejin.cn/post/702896... 著作权归作者所有。商业转载请分割作者取得受权,非商业转载请注明出处。 对CSS布局把握水平决定你在Web开发中的开发页面速度。随着Web技术的一直变革,实现各种布局的形式曾经多得不可胜数了。 本篇文章总结了四十二种CSS的常见布局,这四十二种布局能够细分为如下几类: 程度居中垂直居中程度垂直居中两列布局三列布局等分布局Sticky Footer布局全屏布局这些内容也正是本篇文章的目录。 程度居中实现程度布局比较简单,办法也比拟多,这里总结了7种罕用的布局办法,其公共的CSS代码如下所示: .parent { background: #ff8787; }.child { height: 300px; width: 300px; background: #e599f7; }复制代码其HTML构造也是固定的,就是一个父级,其宽度继承了<body>的宽度,还有一个子级,这里是固定的300px*300px,代码如下: <div class="parent"> <div class="child"></div></div>复制代码最终的实现成果如下: 上图中玫瑰色的块是父级,随页面宽度减少的;淡紫色是子级,绝对于父级居中的。 1. 应用text-align属性若元素为行内块级元素,也就是display: inline-block的元素,能够通过为其父元素设置text-align: center实现程度居中。实现的CSS代码如下: .parent { /* 对于子级为 display: inline-block; 能够通过 text-align: center; 实现程度居中 */ text-align: center;}.child { display: inline-block;}复制代码2. 定宽块级元素程度居中(办法一)对于定宽的的块级元素实现程度居中,最简略的一种形式就是margin: 0 auto;,然而值得注意的是肯定须要设置宽度。 实现CSS代码如下: .child { /* 对于定宽的子元素,间接 margin:0 auto; 即可实现程度居中 */ margin: 0 auto;}复制代码3. 定宽块级元素程度居中(办法二)对于开启定位的元素,能够通过left属性 和margin实现。 实现CSS代码如下: .child { /* 开启定位 */ position: relative; left: 50%; /* margin-left 为 负的宽度的一半 */ margin-left: -150px;}复制代码4. 定宽块级元素程度居中(办法三)当元素开启决定定位或者固定定位时,left属性和right属性一起设置就会拉伸元素的宽度,在配合width属性与margin属性就能够实现程度居中。 ...

April 13, 2022 · 8 min · jiezi

关于大前端:FlyFish-20已发布大屏开发应用更加灵活便捷

云智慧数据可视化编排平台-FlyFish 自开源至今已有2个月啦!在这期间,这款具备低门槛、高拓展性的利用开发平台,不仅为用户提供了数据可视化一站式解决方案,还取得了中国云联盟优良开源我的项目奖,并成为Gitee最有价值开源我的项目(GVP)。与此同时,在云智慧AIOps社区中,因FlyFish汇聚了一群酷爱开源与技术的小伙伴,与他们一起交流学习更是让FlyFish吸取了泛滥贵重倡议和反馈。近期,通过降级与优化后,FlyFish2.0版本正式公布。 较大扭转:FlyFish 2.0 将拆分为组件开发和数据利用两个平台;精细化分工,使得大屏的开发和利用更加专一和高效。 新增性能:组件开发平台用于组件开发及组件积淀,组件开发平台的独立将更有利于组件的开发及灵便的拓展与保护。 新增组件分类性能,反对组件分类管理,反对组件筛查。反对组件组织批改,依据组件的类型、应用范畴等更改组织类别。新增组件导入导出性能,便于组件灵便分享和接入。反对组件共用;一个组件开发平台能够对接多个利用平台。反对组件下载和导入;已下载的组件可导入数据利用平台。升高组件占用空间;导入到数据利用平台的组件体积更小。数据利用平台用于大屏的开发和利用;减少了标签性能,更为便捷的治理大屏。 新增标签治理性能;创立大屏可抉择预设标签,使大屏的分类管理更加直观便捷。新增可视化组件模块;反对组件封面上传,组件展现更加直观,反对组件二次更新。新增组件:视频组件 按钮-1组件 按钮-2组件 导航栏-1组件 导航栏-2组件 降级形式:FlyFish 2.0 需重新安装部署,可参考下列步骤,点击 “浏览原文” 获取我的项目地址。 组件开发平台部署文档配置文件批改 1.进入我的项目 cd component_platformnpm install2.初始化数据库配置 本地:pm2 run init_database_dev开发:pm2 run init_database_development测试:pm2 run init_database_staging生产:pm2 run init_database_production在线编辑器服务启动 1.clone 仓库 ssh : git clone ssh://git@git.cloudwise.com:36000/FlyFish/code-server.githttps : git clone https://git.cloudwise.com/FlyFish/code-server.git[2.如在本地开始,须要批改vscode编辑器文件门路] 批改本地web代码,path:component_platform_web/CodeEditor.jsx批改codeServerUrl folder参数为组件所在目录3.批改配置文件 vi ~/.config/code-server/config.yaml{ bind-addr: 0.0.0.0:8080 // 可应用localhost:8080 或者 127.0.0.1:8080拜访 auth: none // 删除明码登录}3.装置依赖 npm i pm2 -g4.启动 mac: npm run macos-startlinux: npm run linux-start启动/进行 //启动本地:pm2-dev-start开发:pm2-development-start测试:pm2-staging-start生产:pm2-production-start//重启本地:pm2-dev-restart开发:pm2-development-restart测试:pm2-staging-restart生产:pm2-production-restart//从新加载本地:pm2-dev-reload开发:pm2-development-reload测试:pm2-staging-reload生产:pm2-production-reload//进行本地:pm2-dev-stop开发:pm2-development-stop测试:pm2-staging-stop生产:pm2-production-stop数据利用平台部署文档配置文件批改 1.进入我的项目 ...

December 17, 2021 · 1 min · jiezi

关于大前端:技术干货前端性能优化快速定位代码bug

分享人:Mark Wu( 吴银波 )云智慧前端工程师,致力于云智慧大屏产品及ITSM、DOMM、DOEM等产品线定制化开发,领有丰盛的前端性能优化和开源我的项目教训。背景介绍:不晓得你有没有碰到过这些状况: 被告诉下周一前肯定要解决某个bug,当初曾经是周五下午了;上线封版前一天被告诉客户机器性能不行,打不开某个页面,过后曾经是早晨10点了;早晨2点接到电话,某个零碎当初运行不起来,然而今天要给客户领导演示,而后你还没带电脑回家...如果你也有这些状况,那么祝贺你,这只是开始... 如果没有,那么也祝贺你,你迟早会遇到的... 那么, 如果咱们可能找到一些疾速定位问题的办法,那大概率能够防止这样的问题,大幅提高效率。 联合具体的示例来分享一下我是如何利用Performance性能面板和console面板来定位问题的,开端也和大家分享一个应用这个办法优化后造出的轮子。 一、Performance性能剖析面板当初看一下Performance性能剖析报告: 能够看到时间轴上面蕴含FPS、CPU、网络等;这一块次要 关注FPS,察看有没有飘红的区域,可定位到上面的Main指标对应的js执行过程,察看程序哪局部影响了页面性能,这能帮忙咱们疾速确定须要优化的代码地位; 还应关注总 阻塞工夫,这是对以后页面运行是否晦涩的一个总体评估,应尽可能减少阻塞工夫; 最初关注 摘要局部,比照正在执行脚本与渲染工夫,确定JS执行和页面渲染哪个为次要优化对象(优化往往是两者并行)。 上面两个示例别离偏重JS执行效率和页面渲染效率进行优化,JS执行效率次要升高代码空间复杂度,缩小不必要的内存开销,防止深拷贝,及时革除定时器等;页面渲染效率次要缩小页面重排次数,尽量同步页面动画与显示器帧数刷新。 二、JS执行性能优化示例呈现问题DOMM定制化我的项目:现场某场景内G6拓扑组件节点数量一多,浏览器假死,开发环境无奈重现。 剖析:页面假死通常是js线程阻塞、栈内存溢出,或者是页面动画过于简单导致css线程卡死、频繁布局抖动等造成的。 Performance剖析: 从上图能够看到js执行工夫比拟长,渲染工夫占用比拟短。这种状况先排除css线程以及布局抖动的影响,确定问题是在JS执行上。并且在页面性能优化时针对这种状况想要再去较大地优化页面渲染效率是很难也是不划算的,这个时候的重点也是在JS执行效率上。 应用console打印各环节工夫耗费,确定问题代码通过对于Performance的Main进行剖析并联合代码剖析,确定问题代码区域,在代码执行次要节点上打印工夫耗费,针对耗时较大的区域代码进行细化,最终确定问题代码。 计算耗时打印 耗时打印状况: 剖析:能够看到这部分JS代码总执行时长1027ms,其中计算节点、计算连线耗时最长,而且反复执行了两次,设置防抖函数。 剖析:设置防抖后,此段JS总执行时长599ms,持续细化“计算连线”局部耗时打印。 细化耗时打印: a、 “ 连线计算 ” 耗时过长 剖析:“计算连线”段JS代码被屡次援用,持续细化这部分耗时打印; b、单次连线耗时 剖析:“连线耗时”为计算单次节点间连线耗时,大量执行且单次耗时不短,对此局部代码持续细化,发现存在可疑的代码--深拷贝。 c、深拷贝耗时 剖析:“克隆耗时”的打印法则和“连线耗时”相当,且存在耗时较长问题,应用累加计时打印深拷贝总体耗时。 剖析:深拷贝累加有三次打印,总耗时679ms,占比很大。 耗时定位:每次深拷贝耗时较长,深拷贝算法须要优化或者连线计算逻辑避开深拷贝 剖析:拷贝层级过深,造成耗时较长,应用浅拷贝代替。 优化深拷贝耗时后打印 剖析:应用浅拷贝打印总耗时6ms,绝对于原来的679ms耗时很短。 动画渲染剖析当初不能确定现场部署就没有问题,再来看看拓扑节点数量对于JS执行以及页面渲染效率的影响。 i 加载200个节点前端渲染耗时 ii 加载1个节点前端渲染耗时 剖析:能够看到200节点与单节点页面渲染耗时相差不大,次要是执行JS脚本多了25ms,因为现场最大会有800多个节点的状况,简略计算了下,发现耗时比照原先的1027ms仍有很大晋升。 三、动画渲染性能优化示例遇到问题:之前开发一张大屏,本地跑没有问题,然而联调测试发现右侧的滚动组件模块(有4个)中有一个模块没有货色,接口失常返回,字段也是失常的。最初发现是接口返回了190多条数据,前端全副渲染了这些组件,以致模块假死。 先看下现场效果图。左侧别离是地图、轮播图、饼图、轮播图,两头下面是两个拓扑链路图轮播,上面是4个echarts图表,右侧是4个滚动模块(图片不全)。当初除了要解决上述问题还得做好整张大屏的加载同步。 现场大屏的展现成果↓ 剖析:当初来看这个问题,既然全副加载会导致模块假死,那就不加载全副,而是采纳过一条渲染一条(onebyone)形式,当初演示单个成果: onebyone模式 单模块成果 注:绿框为可视区域,红框为滚动组件,渲染固定数量的滚动单位,利用css管制页面动画,定时刷新对应的滚动单位。 onebyone模式 单模块Performance剖析面板 ...

December 7, 2021 · 1 min · jiezi

关于大前端:如何优雅地操作数据库ORM了解一下

写作不易,未经作者容许禁止以任何模式转载!如果感觉文章不错,欢送关注、点赞和分享!继续分享技术博文,关注微信公众号  前端LeBron原文链接什么是ORM 对象关系映射(Object Relational Mapping,简称ORM),是一种程序技术,实现面向对象编程语言中的内存对象与关系型数据库中的业务实体之间的关系映射。这样在咱们操作数据库的时候,不再须要和简单的SQL语句打交道,只须要简略地操作对象的属性和办法就能够间接实现对数据库中对应实体表的CRUD(增删改查)的操作。常见的ORM框架有Node.js 的TypeOrm、Sequlize,Java的Hibernate、Mybatis和Go的Gorm、GoRose等。 ORM的方法论基于三个外围准则 简略:以最根本的模式建模数据传播性:数据库构造被任何人都能了解的语言文档化精确性:基于数据模型创立正确、标准化的构造为什么会呈现ORM面向对象编程语言和关系型数据库都是目前最风行的技术,但他们的模型是不一样的。简直所有的程序外面,都存在对象和关系数据库。在业务逻辑层和用户界面层中,咱们是面向对象的。当对象信息发生变化的时候,咱们须要把对象的信息保留在关系数据库中。以 MVC 分层模式为例。Model 作为数据承载实体,在用户界面和业务逻辑层之间,数据以面向对象的模式传递;而当咱们须要通过 Controller 散发申请把数据长久化的时候,咱们就遇到了内存中的对象如何长久化成关系数据库中存储的一条理论数据记录的问题。面向对象是从软件工程的根本准则,即封装,继承,多态的根底上倒退起来的;而关系型数据库则是从数学实践的根底上倒退起来的,两者之间是不匹配的。所有就呈现了 ORM 以我的项目中间件的模式实现数据在不同场景下的数据关系映射。。而对象关系映射就是这样一种为了解决面向对象与关系数据库存在的互不匹配的景象的技术。在其根底上诞生很多对象和关系之间的映射框架,也即ORM技术。ORM的应用 以Sequelize为例仅示例,更多操作可参考Sequelize 中文文档RobinBuschmann/sequelize-typescriptSequelize 是一个基于 Promise 的 Node.js ORM, 目前反对 Postgres, MySQL, MariaDB, SQLite 以及 Microsoft SQL Server. 它具备弱小的事务反对, 关联关系, 预读和提早加载,读取复制等性能。 Sequelize 听从 语义版本控制。 反对 Node v10 及更高版本以便应用 ES6 性能。 连贯数据库设置应用sequlize插件,并配置要连贯的数据库定义Model通过面向对象Class 和 关系型数据库的表建设连贯 @Column 示意数据库的一列 @PrimaryKey 示意主键 import {  Column,  Model,  PrimaryKey,  Table,} from '@gulu/sequelize/typescript';enum GameType {  micro_game = 'micro_game',  mobile_game = 'mobile_game',  micro_app = 'micro_app',}@Table({ modelName: 'game', timestamps: false })export default class GameModel extends Model {  @PrimaryKey  @Column  gameId!: string;  @Column  name!: string;  @Column  description?: string;  @Column  type!: GameType;  @Column  icon?: string;  @Column  isDelete!: number;}操作数据库通过Model的办法操作数据库import GameModel from '../model/game';// 游戏列表查问服务async query() {  return GameModel.findAll({    // 去除软删除字段    attributes: {      exclude: ['isDelete'],   },    // 查问未被软删除的游戏    where: {      isDelete: 0,   }, });}相当于以下SQL语句select gameId, name, description, type, icon from game where isDelete = 0;当然Sequlize也反对SQL语句查问import GameModel from '../model/game';// 游戏列表查问服务async query() {  return GameModel.sequelize.query(      'select gameId, name, description, type, icon from game where isDelete = 0', );}ORM的优缺点长处暗藏了数据拜访的细节,“关闭”的通用数据库交互是ORM的外围。他使得咱们的通用数据库交互变得简单易行,并且齐全不必思考SQL语句。开发效率更高,ORM使咱们结构固化数据变得简单易行,在ORM诞生前,咱们须要见过咱们的对象模型转化为一条一条的SQL语句,通过直连或者是DB helper在关系数据库结构咱们的数据库体系。而当初,基本上所有的ORM框架都提供了通过对象模型结构关系数据库构造的性能。数据拜访更形象、轻便,反对面向对象封装。数据模型都在一个中央定义,更容易更新和保护,也利于重用代码ORM有现成的工具,很多性能都能够主动实现,比方数据消毒、预处理、事务等等。它迫使你应用MVC架构,ORM就是人造的Model,最终使代码更清晰。基于ORM的业务代码比较简单,代码量少,语义性好,容易了解。防备SQL注入攻打不用编写性能不佳的SQL。毛病无可避免的,自动化意味着映射和关联治理,代价是就义性能。当初的各种ORM框架都在尝试应用各种办法来加重性能上的损失,如懒加载技术、缓存技术等。面向对象的查询语言作为一种数据库与对象之间的过渡,尽管暗藏了数据层面的业务形象,但并不能齐全屏蔽数据库层的设计。ORM库也不是轻量级的工具,须要花很多精力学习和设置,无疑将减少学习老本。ORM难以实现过于简单的查问。尽管能够实现,然而须要破费很大的代价(性能不如原生SQL)。长久化层不足弹性,一旦呈现业务需要变更,就必须批改长久化层的接口长久化层同时与域模型与关系数据库模型绑定,不论域模型还是关系数据库模型发生变化,都要批改长久化层相干程序代码,减少了软件的保护难度。什么是“长久化” 层长久(Persistence),即把数据(如内存中的对象)保留到可永恒保留的存储设备中(如磁盘)。长久化的次要利用是将内存中的数据存储在关系型的数据库中,当然也能够存储在磁盘文件中、XML数据文件中等等。总结:当下ORM的开发模式是支流,进步了代码的封装性和可读性,同时防备了SQL注入攻打。以较小量级的性能损失换来了显著的开发效率晋升,显著的性能损失往往存在于简单的查问,这种状况能够抉择应用ORM提供的SQL语句接口进行查问以优化性能。原文链接掘金:前端LeBron知乎:前端LeBron继续分享技术博文,关注微信公众号  前端LeBron

August 11, 2021 · 1 min · jiezi