关于javascript:webpack系列从基础配置到掌握进阶用法

前言本篇文章将介绍一些webpack的进阶用法,演示内容继承自上一篇文章的内容,所以没看过上一篇文章的倡议先学习上一篇内容再浏览此篇内容,会更有利于此篇的学习~ 文件指纹文件指纹指的是打包输入的文件名后缀,个别用来做版本治理、缓存等 webpack的指纹策略有三种:hash、chunkhash、contenthash,它们之间最次要的区别就是每种hash影响的范畴不同。 占位符webpack提供占位符用于将特定信息附加在打包输入的文件上名称含意[ext]资源后缀名[id]文件标识符[name]文件名称[path]文件的相对路径[folder]文件所在的文件夹[hash]模块标识符的 hash,默认是 md5 生成[chunkhash]chunk 内容的 hash,默认是 md5 生成[contenthash]文件内容的 hash,默认是 md5 生成[query]文件的 query,例如,文件名 ? 前面的字符串[emoji]一个随机的指代文件内容的 emoji咱们能够应用特定的语法,对 hash 、 chunkhash、contenthash 进行切片:[chunkhash:4],像 8c4cbfdb91ff93f3f3c5 这样的哈希会最初会变为 8c4c。 hash与整个我的项目的构建无关,只有我的项目内文件有批改,整个我的项目构建的hash值就会扭转咱们应用多入口打包来体验一下: // webpack.config.jsmodule.exports = { entry: { main: './src/main.js', index: './src/index.js' }, output: { filename: '[name].[hash:6].js', path: __dirname + '/dist', clean: true }, // ...}此时咱们应用了占位符来设置文件指纹[name].[hash:6].js代表的是文件名+6位hash 此时咱们执行npm run build,看打包进去的内容如下: 此时两个js文件的hash都是207495 咱们批改一下index.js的内容,再打包一次 咱们会发现此时两个js文件的hash都变成了9f0e2d chunkhashchunkhash 是和 webpack 打包的模块相干,每一个 entry 作为一个模块,会产生不同的 Chunkhash 值,文件扭转时只会影响以后chunk组的hash值咱们再来看看chunkhash // webpack.config.jsmodule.exports = { entry: { main: './src/main.js', index: './src/index.js' }, output: { filename: '[name].[chunkhash:6].js', path: __dirname + '/dist', clean: true }, // ...}还是延用下面的例子,这次咱们只批改main.js文件内容 ...

June 25, 2023 · 4 min · jiezi

关于javascript:URLSearchParams-api简单解析url参数

先上代码 var url = new URL("https://www.baidu.com/s?wd=%E2%80%9C%E5%8D%B0%E5%BA%A6%E5%88%B6%E9%80%A0%E2%80%9D%E6%8C%91%E6%88%98%E2%80%9C%E4%B8%AD%E5%9B%BD%E5%88%B6%E9%80%A0%E2%80%9D%EF%BC%9F&rsv_idx=2&tn=baiduhome_pg&ie=utf-8&rsv_pq=a030fb450001560a&oq=URLSearchParams&rsv_t=ffef3M86%2BydHr8QY4E1XqDq8ehTgIeB45QYM7a10slr%2FI5okYJlF8yryJ2KE2TLcbPs6&rqid=a030fb450001560a&rsf=b387b176e09280bbdef0d2f1a2c0e56e_1_15_11&rsv_dl=0_right_fyb_pchot_20811&sa=0_right_fyb_pchot_20811");var searchParams3 = new URLSearchParams(url.search);for(var pair of searchParams3.entries()) { console.log('================='); console.log(pair[0]+ ', '+ pair[1]);}输入后果 URLSearchParamsURLSearchParams.append(),插入一个指定的键/值对作为新的搜寻参数。URLSearchParams.delete(),从搜寻参数列表里删除指定的搜寻参数及其对应的值。URLSearchParams.entries(),返回一个iterator能够遍历所有键/值对的对象。URLSearchParams.get(),获取指定搜寻参数的第一个值。URLSearchParams.getAll(),获取指定搜寻参数的所有值,返回是一个数组。URLSearchParams.has(),返回 Boolean 判断是否存在此搜寻参数。URLSearchParams.keys(),返回iterator 此对象蕴含了键/值对的所有键名。URLSearchParams.set(),设置一个搜寻参数的新值,如果原来有多个值将删除其余所有的值。URLSearchParams.sort(),按键名排序。URLSearchParams.toString(),回搜寻参数组成的字符串,可间接应用在 URL 上。URLSearchParams.values(),返回iterator 此对象蕴含了键/值对的所有值。两个问题entries,keys,values办法返回的是遍历器,不是数组URLSearchParams 不会解析残缺 URL,然而如果字符串起始地位有 ? 的话会被去除。他是解析url查问字符串的看代码var paramsString1 = "http://example.com/search?query=%40";var searchParams1 = new URLSearchParams(paramsString1);searchParams1.has("query"); // falsesearchParams1.has("http://example.com/search?query"); // truesearchParams1.get("query"); // nullsearchParams1.get("http://example.com/search?query"); // "@" (equivalent to decodeURIComponent('%40'))var paramsString2 = "?query=value";var searchParams2 = new URLSearchParams(paramsString2);searchParams2.has("query"); // truevar url = new URL("http://example.com/search?query=%40");var searchParams3 = new URLSearchParams(url.search);searchParams3.has("query") // true如上,"http://example.com/search?query"会被当做键值对的一个key来解析 示例起源MDN

June 25, 2023 · 1 min · jiezi

关于javascript:原生JavaScriptHTML编写一个模态框

何为模态框就是一个网页弹窗,这个弹窗你能够展现一句话、一段文字、图片、视频、音频都能够。反正就是一个点击一个中央弹出一个弹出层,你能够在这个弹出层展现你须要展现的内容、媒体。 设计一个半透明度的100%宽高的遮罩层一个模态框主体顶部模态框加粗题目内容区就是失常的文案右上角敞开按钮点击半透明度的遮罩层任意地位也是能够敞开的关上模态框有从上往下的滑出动画敞开模态框有从下往上的滑入动画原生JavaScript易于扩大,须要应用的时候,能够依据模态框的id来管制关上不同的模态框应用时,只有对div进行减少、批改即可,不须要批改css和JavaScript代码<!DOCTYPE html><html><head> <title>原生JavaScript编写的模态框</title> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, viewport-fit=cover"> <style> /*模态框主体款式*/ .modal { display: none; position: fixed; z-index: 1; left: 0; top: 0; width: 100%; height: 100%; overflow: auto; background-color: rgba(0, 0, 0, 0.5); } /*模态框公共款式*/ .modal-content { background-color: #fefefe; margin: 50px auto 0; padding: 20px; border: 1px solid #888; box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2); animation: modal-show 0.3s; } /* 失常大小 */ .modal-normal { width: 600px; } /* 中等大小 */ .modal-medium { width: 400px; } /* 迷你大小 */ .modal-mini { width: 250px; } /* 暗藏 */ .modal-hide { animation: modal-hide 0.3s; } /* 展现动画 */ @keyframes modal-show { from { opacity: 0; transform: translateY(-50px); } to { opacity: 1; transform: translateY(0); } } /* 暗藏动画 */ @keyframes modal-hide { from { opacity: 1; transform: translateY(0); } to { opacity: 0; transform: translateY(-50px); } } /*敞开按钮*/ .close { color: #aaa; float: right; font-size: 28px; font-weight: bold; cursor: pointer; -webkit-tap-highlight-color: rgba(255,0,0,0); } /*敞开按钮的鼠标点击和通过款式*/ .close:hover, .close:focus { color: black; text-decoration: none; cursor: pointer; -webkit-tap-highlight-color: rgba(255,0,0,0); } </style></head><body> <h2>模态框</h2> <button data-modal-action="open" data-modal-target="myModal">关上模态框</button> <div id="myModal" class="modal"> <div class="modal-content modal-normal"> <span class="close">&times;</span> <h3>模态框题目</h3> <p>模态框文字、段落等内容。</p> </div> </div> <script> // 获取触发模态框的自定义属性 var modalButtons = document.querySelectorAll("[data-modal-action]"); // 获取模态框主体 var modals = document.querySelectorAll(".modal"); // 监听模态框的按钮事件 modalButtons.forEach(function(button) { button.addEventListener("click", function() { var targetId = this.dataset.modalTarget; var targetModal = document.getElementById(targetId); if (targetModal) { var action = this.dataset.modalAction; if (action === "open") { openModal(targetModal); } else if (action === "close") { closeModal(targetModal); } } }); }); // 关上模态框 function openModal(modal) { modal.style.display = "block"; modal.querySelector(".modal-content").classList.remove("modal-hide"); } // 敞开模态框 function closeModal(modal) { modal.querySelector(".modal-content").classList.add("modal-hide"); modal.querySelector(".modal-content").addEventListener("animationend", function () { modal.style.display = "none"; }, { once: true }); } // 监听模态框的敞开时事件 modals.forEach(function(modal) { var closeButton = modal.querySelector(".close"); if (closeButton) { closeButton.addEventListener("click", function() { var targetModal = this.closest(".modal"); closeModal(targetModal); }); } }); // 当用户点击模态框内部时,敞开模态框 window.onclick = function (event) { modals.forEach(function(modal) { if (event.target === modal) { closeModal(modal); } }); }; </script></body></html>应用阐明这个模态框的长处就是易使用,如果你一个页面有多个性能须要应用到模态框,你能够增加以下的组合来增加多个模态框。 ...

June 24, 2023 · 2 min · jiezi

关于javascript:开源项目智慧工地经典开源项目数字孪生智慧工地开源工程及源码

国企某大型工地的工程和源码收费赠送,开启智慧工地新篇章! 我的项目介绍 通过数字孪生技术,实现工程数据和场景的整合,以构建一个高效、平安、可视化的工地环境。工地的各项指标和状态将实时可视化,让您把握全局,晋升工地治理的程度和效率。 应用数字孪生技术将理论工地与虚拟现实相结合,对工地进行精确模仿和数据化操作。通过数据和场景的整合,能够清晰出现工地的各种情况,提供可视化的工地监控与治理。 功能分析智慧监控 智慧工地展现了一套弱小的监控设施,确保工地的平安有保障。通过高清摄像头、红外传感器等设施,实现对工地各个区域的监控和实时录像。工地管理者能够随时查看工地情况,及时发现潜在隐患并采取相应的应答措施,确保工人的生命安全。 烟尘检测 利用先进的烟尘检测技术,智慧工地可能主动监测工地的烟尘状况。一旦检测到烟尘超过规定规范,零碎将主动启动喷水安装进行喷水降尘解决,无效缩小了空气中的颗粒物含量,爱护了工地周边环境的空气质量。 智能建筑 数字孪生技术使智慧工地可能实现工地修建过程的可视化展现。通过准确的模仿和实时数据更新,能够清晰地出现工地的建造进度和各个部位的状态。工地管理者能够随时查看施工状况,及时调整工期和资源分配,进步施工效率。 施工模仿 基于数字孪生技术,智慧工地实现了对以后施工的挖填方剖析。通过场景模仿和数据计算,工地管理者能够精确评估挖方和填方的工作量,优化土方作业计划,升高工程老本并进步工作效率。 数字孪生的呈现为智慧工地带来了前所未有的治理形式,晋升了工地治理的效率和安全性。国企某大型工地的工程和源码收费赠送,将工地治理推向新的高度!

June 21, 2023 · 1 min · jiezi

关于javascript:图扑智慧地下采矿像素游戏智能呈现

在这个像素世界里,咱们须要一个智能公开采矿可视化综合治理平台,来帮忙咱们治理和监控公开采矿全流程。 图扑软件依靠自主研发的 HT for Web 产品,联合三维定制化渲染、动静模仿、物理碰撞、5G、物联网、云计算及大数据等先进技术,围绕公开采矿相干的实时监控、数据分析、人工智能等生产、经营和治理指标,实现对勘探、开采、解决和治理四个阶段的全面监控和治理。通过这个平台,咱们能够随时把握矿区的状况,对矿区进行精细化治理,进步采矿效率和工作安全性。让咱们一起进入这个像素世界,开启智能公开采矿可视化的探索之旅吧! 公开采矿是一项简单而危险的工作,须要高度的技术和管理水平。本文咱们将为大家介绍公开采矿的全流程,包含采矿前的勘探、采矿中的开采和支护、以及采矿方法的解决和治理。 图扑软件 HT for Web 自主研发引擎,具备良好的兼容性和稳定性。它能够通过开发对应性能最终在各种终端设备上运行,包含 PC、挪动设施、VR 设施等。同时,它还具备疾速响应、高效运行的特点,能够满足用户对实时性和效率的要求。本我的项目采纳“像素游戏”格调进行还原公开采矿全过程,实现对公开采矿全流程的智能化治理。它集成了实时监控、数据分析、人工智能等先进技术,能够实现对矿区的全面监控和治理。 采矿各环节根底还原 通过我的项目总览页面,咱们能够看到一个栩栩如生的三维全地形还原,它能够帮忙咱们直观地理解矿区的地形和地貌。同时,咱们还能够通过能源监测模块,实时监测矿区的电力、水力等能源的应用状况,为矿区的能源管理提供参考。 除此之外,咱们还能够通过生产报表模块,实时理解矿区的生产状况和效率,为矿区的生产治理提供数据反对。通过环境监测模块,实时监测矿区的环境污染状况,为矿区的环境治理提供参考。 通过三维全地形还原和智能化采矿治理平台,咱们能够实现对公开采矿全流程的智能化治理和精细化管制,查看任意环节在采矿全流程存在及起到的作用,进步采矿效率和工作安全性。 无底柱分段崩落法 无底柱分段崩落法是一种公开采矿方法,它次要用于开采深部矿床。该办法的特点是在矿床底部设置肯定数量的无底柱,将矿体分成若干个段落,而后一一段落地进行开采。这种办法能够进步采矿效率,缩小矿石节约,同时也能够减小地面沉降和地震等地质灾害的危险。 HT 采纳最新研发的物理碰撞技术联合三维模型数字孪生可视化在公开采矿中实现了,可视化数字孪生模仿无底柱分段崩落法的矿体开采过程。通过 HT 引擎渲染,咱们能够实时监测矿体的变动,包含矿体的状态、大小、地位等信息,并依据这些信息进行实时调整和优化采矿计划。 基于 Web 3D 开发技术搭建的无底柱分段崩落法过程还原,将采矿过程中的各环节、应用技术及设施、传感器及数据信息进行原比例 3D 建模渲染还原,实时加载采矿产能运维数据,模仿事实世界采矿的设施运行状态。 无底柱分段崩落法实用于以下条件: 矿体规模较大,深度较深,采纳传统开采办法难以达到预期成果。 矿体性质较好,不易崩落或塌陷。 采矿条件较为简单或危险,须要采纳平安、高效的采矿方法。 采矿区域地质条件较为稳固,不容易产生地质灾害。 图扑软件 HT 采矿数据可视化版块联合虚拟现实技术,将矿体开采过程模仿成三维场景,让采矿工人能够直观地理解矿体的变动,更好地管制采矿过程。同时,数字孪生还能够联合人工智能技术,对采矿过程进行智能化治理和优化,进步采矿效率和安全性。上向程度分层填充法上向程度分层填充法是一种公开采矿方法,它次要用于开采浅层、薄层、近地表的矿床。该办法的特点是在矿体顶部开挖肯定深度的程度巷道,而后将巷道顶部的矿体分层填充到巷道底部,造成一个稳固的工作面,再从工作面下方进行开采。 利用图扑软件(Hightopo)自主研发的 HT 产品上的 Web 组态,联合三维物理引擎技术,将上向程度分层填充法工艺段的进行绘制,基本原理是通过应用激光或光学扫描仪等设施获取事实世界中的物体或场景的三维数据,并将这些数据转换成数字模型。而后,应用计算机图形学技术将数字模型渲染成可视化的图像或视频,以便用户能够在计算机上浏览和操作这些数字模型。 上向程度分层填充法是一种常见的公开采矿技术,它能够将数字模型分成多个程度档次,每个档次都蕴含一组立体切片。这些切片能够用来可视化数字模型的内部结构和细节。此外,上向程度分层填充法还能够用来进行数字模型的比拟和剖析,以便用户能够更好地了解数字模型的特色和性能。 房柱采矿法 通过 HT 引擎中的三维渲染、物理碰撞技术实现对物理零碎的数字化建模和仿真,出现房柱采矿法的三维全过程。 采集数据: 首先须要采集房柱采矿法的相干数据,包含采矿区域的地质状况、采矿机械的运行状态等等。 建设数字孪生模型: 利用采集到的数据,建设数字孪生模型。这个模型能够包含地质模型、机械模型等等。 ...

June 21, 2023 · 1 min · jiezi

关于javascript:图扑智慧地下采矿像素游戏智能呈现

在这个像素世界里,咱们须要一个智能公开采矿可视化综合治理平台,来帮忙咱们治理和监控公开采矿全流程。 图扑软件依靠自主研发的 HT for Web 产品,联合三维定制化渲染、动静模仿、物理碰撞、5G、物联网、云计算及大数据等先进技术,围绕公开采矿相干的实时监控、数据分析、人工智能等生产、经营和治理指标,实现对勘探、开采、解决和治理四个阶段的全面监控和治理。通过这个平台,咱们能够随时把握矿区的状况,对矿区进行精细化治理,进步采矿效率和工作安全性。让咱们一起进入这个像素世界,开启智能公开采矿可视化的探索之旅吧! 公开采矿是一项简单而危险的工作,须要高度的技术和管理水平。本文咱们将为大家介绍公开采矿的全流程,包含采矿前的勘探、采矿中的开采和支护、以及采矿方法的解决和治理。 图扑软件 HT for Web 自主研发引擎,具备良好的兼容性和稳定性。它能够通过开发对应性能最终在各种终端设备上运行,包含 PC、挪动设施、VR 设施等。同时,它还具备疾速响应、高效运行的特点,能够满足用户对实时性和效率的要求。本我的项目采纳“像素游戏”格调进行还原公开采矿全过程,实现对公开采矿全流程的智能化治理。它集成了实时监控、数据分析、人工智能等先进技术,能够实现对矿区的全面监控和治理。 采矿各环节根底还原 通过我的项目总览页面,咱们能够看到一个栩栩如生的三维全地形还原,它能够帮忙咱们直观地理解矿区的地形和地貌。同时,咱们还能够通过能源监测模块,实时监测矿区的电力、水力等能源的应用状况,为矿区的能源管理提供参考。 除此之外,咱们还能够通过生产报表模块,实时理解矿区的生产状况和效率,为矿区的生产治理提供数据反对。通过环境监测模块,实时监测矿区的环境污染状况,为矿区的环境治理提供参考。 通过三维全地形还原和智能化采矿治理平台,咱们能够实现对公开采矿全流程的智能化治理和精细化管制,查看任意环节在采矿全流程存在及起到的作用,进步采矿效率和工作安全性。 无底柱分段崩落法 无底柱分段崩落法是一种公开采矿方法,它次要用于开采深部矿床。该办法的特点是在矿床底部设置肯定数量的无底柱,将矿体分成若干个段落,而后一一段落地进行开采。这种办法能够进步采矿效率,缩小矿石节约,同时也能够减小地面沉降和地震等地质灾害的危险。 HT 采纳最新研发的物理碰撞技术联合三维模型数字孪生可视化在公开采矿中实现了,可视化数字孪生模仿无底柱分段崩落法的矿体开采过程。通过 HT 引擎渲染,咱们能够实时监测矿体的变动,包含矿体的状态、大小、地位等信息,并依据这些信息进行实时调整和优化采矿计划。 基于 Web 3D 开发技术搭建的无底柱分段崩落法过程还原,将采矿过程中的各环节、应用技术及设施、传感器及数据信息进行原比例 3D 建模渲染还原,实时加载采矿产能运维数据,模仿事实世界采矿的设施运行状态。 无底柱分段崩落法实用于以下条件: 矿体规模较大,深度较深,采纳传统开采办法难以达到预期成果。 矿体性质较好,不易崩落或塌陷。 采矿条件较为简单或危险,须要采纳平安、高效的采矿方法。 采矿区域地质条件较为稳固,不容易产生地质灾害。 图扑软件 HT 采矿数据可视化版块联合虚拟现实技术,将矿体开采过程模仿成三维场景,让采矿工人能够直观地理解矿体的变动,更好地管制采矿过程。同时,数字孪生还能够联合人工智能技术,对采矿过程进行智能化治理和优化,进步采矿效率和安全性。 上向程度分层填充法 上向程度分层填充法是一种公开采矿方法,它次要用于开采浅层、薄层、近地表的矿床。该办法的特点是在矿体顶部开挖肯定深度的程度巷道,而后将巷道顶部的矿体分层填充到巷道底部,造成一个稳固的工作面,再从工作面下方进行开采。 利用图扑软件(Hightopo)自主研发的 HT 产品上的 Web 组态,联合三维物理引擎技术,将上向程度分层填充法工艺段的进行绘制,基本原理是通过应用激光或光学扫描仪等设施获取事实世界中的物体或场景的三维数据,并将这些数据转换成数字模型。而后,应用计算机图形学技术将数字模型渲染成可视化的图像或视频,以便用户能够在计算机上浏览和操作这些数字模型。 上向程度分层填充法是一种常见的公开采矿技术,它能够将数字模型分成多个程度档次,每个档次都蕴含一组立体切片。这些切片能够用来可视化数字模型的内部结构和细节。此外,上向程度分层填充法还能够用来进行数字模型的比拟和剖析,以便用户能够更好地了解数字模型的特色和性能。 房柱采矿法 通过 HT 引擎中的三维渲染、物理碰撞技术实现对物理零碎的数字化建模和仿真,出现房柱采矿法的三维全过程。采集数据: 首先须要采集房柱采矿法的相干数据,包含采矿区域的地质状况、采矿机械的运行状态等等。建设数字孪生模型: 利用采集到的数据,建设数字孪生模型。这个模型能够包含地质模型、机械模型等等。进行仿真: 利用数字孪生模型进行仿真,模仿房柱采矿法的三维全过程。能够包含开采、支护、运输等等。可视化展示: 将仿真后果进行可视化展示,能够应用虚拟现实技术、加强事实技术等等。这样能够让用户更直观地理解房柱采矿法的全过程。 ...

June 21, 2023 · 1 min · jiezi

关于javascript:深入了解CSS颜色架构提升你的网页设计技巧

微信搜寻 【大迁世界】, 我会第一工夫和你分享前端行业趋势,学习路径等等。本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试残缺考点、材料以及我的系列文章。快来收费体验ChatGpt plus版本的,咱们出的钱 体验地址:https://chat.waixingyun.cn 能够退出网站底部技术群,一起找bug,另外新版作图神器已上线 https://cube.waixingyun.cn/home 这篇文章深入探讨了CSS色彩架构的重要性和实际办法,以帮忙开发人员和设计师创立更具吸引力和一致性的网页设计。作者首先介绍了CSS色彩的基础知识,包含色彩表示法、色彩值和色彩抉择工具。接着,他强调了良好的色彩架构对于网页的视觉吸引力和用户体验的重要性。 作者提供了一些实用的技巧和领导准则,帮忙读者建设和组织无效的色彩架构。他探讨了色彩调色板的设计,包含主色、辅助色和中性色的抉择和配对。此外,他强调了在不同设施和主题模式下放弃一致性的重要性,并分享了一些工具和资源,帮忙读者更好地治理和调整色彩计划。 最初,作者总结了文章的次要观点,并激励读者在设计和开发过程中器重色彩架构的重要性。他强调了良好的色彩抉择和组织对于网页的整体外观和用户体验的影响。 上面是注释~~~ 编程语言中最艰难的事件之一就是以易于了解和保护的形式组织代码。 在这篇文章中,我想解释一下我是如何在咱们的 Pink Design 我的项目中工作和组织色彩的。 就像生存中的所有,咱们有许多正确的办法,更多的谬误的办法来做同样的事件。在我向你展现如何组织咱们的CSS变量之前,让咱们先探讨在CSS中组织色彩的错误方法。 留神:咱们的一些色彩架构应用Sass预处理。定义 CSS 色彩变量的错误方法审查其余CSS架构时,尝试思考哪些低效会使其难以保护。 应用全局变量来代替没有语义意义的所有内容作者从LinkedIn网站上的:root元素中,通过应用inspect性能,拿了这个小例子。 正如你在上面的示例中所看到的,一个 :root 选择器上有超过 900 个 CSS 变量!在如此宽泛的变量列表中找到某些货色简直是不可能的。 将色彩与语义名称关联我常常看到的第二个选项是具备语义名称的全局变量色彩,例如 --header-background-color 。 定义逻辑全局命名的问题首先在于你有太多的命名。 创立深色模式主题的第二个问题是,网页设计师不遵循特定色彩须要在深色模式下更改为其余色彩的逻辑。这可能会导致创立过多类型的变量,这些变量难以了解或保护。 来自旧版Appwrite控制台1.0的示例: 此外,全局色彩的笼罩会使代码的调试变得不清晰,在 Chrome 的查看元素中会呈现所有笼罩的穿插线。 理解了这些问题之后,作者思考如何更好地构建咱们的CSS色彩变量。 咱们如何决定治理咱们的CSS色彩变量作者次要想法是为色调谱上的每个色彩组家族创立一个CSS变量,以连贯每个色彩组(例如蓝色、绿色、橙色和红色)。通过这种形式,我能够更改每个色彩组的主色调,并轻松替换该色彩家族的所有色调。 作者示意,他对这种办法的惟一疑虑在于,设计团队定义的色彩是用十六进制代码示意的,这种代码实际上代表了RGB色彩。当咱们须要创立同一色调的不同深浅时,应用这种示意形式会变得比拟艰难。 在解决这个问题时,作者抉择将HEX/RGB色彩转换为HSL色彩,而后尝试找出每一组色彩的典型色调。 从 HEX/RGB 转换为 HSL如果咱们将信息(蓝色)色彩转换为HSL色彩,咱们能够看到所有色调(第一个值)都不同;它们的范畴在 188 和 192 之间。 次要思维是将第一个值保留为另一个CSS变量。 为了应答这个挑战,作者决定利用CSS的calc()函数,通过对根底色调值进行加减运算来解决问题。 从每个家族组的主色中取基色色调;在咱们的状况下,主色是“100”色彩,信息(蓝色)家族组的色调是189。 :root { --color-info-hue: 189; --color-info-10: var(--color-information-hue) 87% 97%; /* #F1FCFE */ --color-info-50: calc(var(--color-information-hue) + 3) 90% 89%; /* #C8F2FC */ --color-info-100: var(--color-information-hue) 100% 38%; /* #00A7C3 */ --color-info-120: calc(var(--color-information-hue) + 1) 100% 26%; /* #007187 */ --color-info-200: calc(var(--color-information-hue) - 1) 87% 12%; /* #04333A */}通过这种形式,作者能够灵便地调整色调,并扭转所有由这个色调派生出的色彩。 ...

June 21, 2023 · 3 min · jiezi

关于javascript:elementUI分页在不知道总数的时候完成分页

接口因为数据过多,无奈查问整表,无奈给出数据总数,且须要页面分页的状况 1.pagination vue 展现 <el-pagination class="table-pager" @current-change="currentchange" :current-page.sync="current" :page-size="pagesize" :total="total" layout="prev,next"> </el-pagination>2.初始化值 分页组件的layout仅展现左右键按钮total值必填,先默认为pagesizecurrent以后页码,默认1应用以后页码变动触发分页事件3.以后页码变动触发 批改页码前的当前页码数与每页数量的乘积是否曾经大于计算的total值,如果大于则没有下一页如果能进入下一页,则须要再更新一下total值,便于下一轮能进入下一页如果current在获取数据的时候曾经小于pagesize,,则示意没有更多信息,无须再进入下一页,即不须要更新total简而言之,下一页的按钮是否能触发,取决于当前页的返回数据的长度是否等于pagesize,如果等于则须要把total再减少一个pagesize值。否则不减少,也不能再点击下一页。 currentchange(val){ if((this.current-1)*this.pagesize > this.total){ this.$message({ type:'warning', message:`没有信息了` }) this.current=val-1; return } this.current=val; this.getAccessLogs() }, getAccessLogs(){ this.loading=true; if(this.current==1){ this.total=this.pagesize } this.$apollo.query({ query: gqlreq.accessLogs, variables:{ first:this.pagesize, offset:((this.current-1)>=0)?(this.current-1)*this.pagesize:0 } }).then(async (res) => { this.loading=false; if (res.data && res.data.accessLogs&& res.data.accessLogs) { this.tabledata=commonjs.takeoffEdges(res.data, "accessLogs"); if((this.tabledata&&this.tabledata.length)){ if(!(this.tabledata.length<this.pagesize)){ this.total=(this.current+1)*this.pagesize } }else{ this.$message({ type:'warning', message:`以后查问第${this.current}页,没有信息了` }) } } }).catch((e)=>{ console.log('catch err',e) this.loading=false; }) },

June 20, 2023 · 1 min · jiezi

关于javascript:vite首次启动加载慢

随着vue3的到来,vite开始被各大vue3组件库应用,公司开始一个新我的项目,筹备尝试用vite试一波。问题发现当把公司新我的项目移植到vite后,启动十分快,但发现页渲染工夫慢了很多。 能够看到页面的首屏加载工夫是3.34s,页面的渲染完工夫是3.37s,下载总大小是8.6MB,发送了119个申请; 再看看webpack的渲染工夫: 能够看到页面的首屏加载工夫是1.05s,页面的渲染完工夫是1.21s,下载总大小是3.6MB,发送了32个申请; vite的首屏加载工夫是webpack的三倍,下载文件大小是webpack的两倍,申请数量也是三倍。vite开发环境下,模块以原生 esm 的模式被浏览器加载,也就说模块的加载是用es6原生的模块加载机制,没有对代码进行打包压缩解决,所以服务启动很快。那带来的问题就是下载的js文件没有解决的过的源码,那文件大小天然要比webpack解决过的js文件大很多。 因而初步判断因为这个起因导致首屏加载工夫相差这么多。得出结论vite是就义了页面首次加载工夫来达到启动工夫快的目标。 峰回路转于是我去网上寻找有没有好的解决方案,在vite的issue中找到相似的问题:尤大大也答复了这个问题: 这个问题有两个细节: 我的项目启动后浏览器第一次加载才会慢。这个慢是因为加载less的源码,按需编译中加载工夫其实是在less的编译上。看看vite我的项目第二次加载: 能够看到页面的首屏加载工夫是1.04s,页面的渲染完工夫是1.09s,下载总大小是8.6MB,发送了120个申请; 页面的渲染工夫和webpack我的项目的渲染工夫差不多,esm 的模式被浏览器加载和申请数量对页面的渲染工夫的影响不是次要的,也证实我的项目启动后浏览器第一次加载多出的工夫次要是在编译上。 尤大大在知乎答复中提到:“webpack 的打包模式在我的项目自身源码模块数量极大 (>1000) 的状况下还是有一点劣势的,因为浏览器在解决这个级别的并发申请上会产生阻塞(但通常来说如果你一个路由下模块数到这个级别阐明你代码宰割/按需加载没做好)。”意思是esm 的模式被浏览器加载和申请数量对页面的渲染工夫的影响不是次要的。 剖析浏览器第一次加载工夫比拟长的文件工夫分部: waterfall性能检测详解详解: Queueing 是排队的意思Stalled 是阻塞 申请拜访该URL的主机是有并发和连接数限度的,必须要等之前的执行能力执行之后的,这段时间的耗时DNS Lookup 是指域名解析所耗时间Initial connection 初始化连接时间,这里个别是TCP 3次连贯握手工夫SSL https特有,是一种协定Request sent 发送申请所耗费的工夫Waiting 期待响应工夫,这里个别是最耗时的Content Download 下载内容所须要耗费的工夫加载index.less的工夫次要在Waiting阶段,Content Download的工夫占比很少。期待响应工夫应该就是vite在编译的工夫。 我的我的项目也援用了组件库的less源码,改为援用组件库的css看下渲染工夫如何: 能够看到页面的首屏加载工夫是1.13s,页面的渲染完工夫是1.16s,下载总大小是8.4MB,发送了120个申请; 渲染速度根本和webpack差不多。 论断通过下面剖析能够确定vite开发模式启动,页面加载慢的起因是less编译导致。 这里反思下,因为对调试工具waterfall性能检测不相熟导致开始谬误的论断,走了一下弯路。有时候咱们通过实践推导进去的论断未必正确的,须要理论数据去证实但更须要去证伪。就像吴军老师说的: “咱们每次给出的论断,都存在一种证伪的可能性,咱们能够设计出一种办法、一个试验,或者一个场景,去看看咱们的论断是不是还是成立,如果成立,咱们就维持现有的论断;如果不成立,咱们就批改现有论断。这就叫做证伪。 迷信是一种做事件的办法,而不是特定的论断。采纳迷信办法失去的论断,绝对来讲,比拟经得起工夫和事实世界的测验。更重要的是,用迷信的办法求知,咱们能失去可累加的提高,因为每一次验证的过程都是能够反复,前面的工作也能够基于后面的工作开展。”这句话牢记心中。

June 20, 2023 · 1 min · jiezi

关于javascript:GraphQL-封装多个请求使得network只有一条请求记录

1,js办法封装 //util.js//一些发动申请的依赖import gql from 'graphql-tag'import initapolloclient from '@/assets/js/apolloclient.js'import $store from '@/store/index' // 依据openid获取人员姓名 // openid的取值matchkey // 匹配后将姓名set到readkey字段中export const gerMultiUsername = async(origindata, matchkey, readkey) => { let allopenids = origindata.map((item) => item[matchkey]); allopenids = [...new Set(allopenids)]; let queryinputs = []; //形参 let queryinputsval = {}; //实参 let querybody = []; //申请体 allopenids.forEach((item, index) => { queryinputs.push(`$keywords${index}:String`); queryinputsval[`keywords${index}`] = `${item}`; //openid进行过滤 querybody.push(`queryuser${index}:users( keywords:$keywords${index} ){ edges{node{name openid}} }`) }) let queryall = `query ( ${queryinputs.join()}){ ${querybody.join('')} }`; const iamuri = ($store.state.api_gateway_uri + "/iam"); const iamclient = initapolloclient.initAppllo(iamuri); await iamclient.query({ query: gql(queryall), variables: queryinputsval }).then((res) => { if (res.data) { let successitem = [] for (let key in res.data) { if (res.data[key]) { if (res.data[key].edges && res.data[key].edges.length == 1 && res.data[key].edges[0].node) { successitem.push(res.data[key].edges[0].node) } } } // if (successitem && successitem.length) { successitem.forEach((item) => { if (item.openid) { origindata.forEach((nitem) => { if (item.openid == nitem[matchkey]) { nitem[readkey] = item.name ? item.name : nitem[matchkey] } }) } }) } } }).catch((err) => { console.log(err) })}2:vue文件中引入应用 ...

June 20, 2023 · 1 min · jiezi

关于javascript:css面试题

盒模型常见的盒模型有w3c盒模型(又名规范盒模型)box-sizing:content-box和IE盒模型(又名怪异盒模型)box-sizing:border-box。规范盒子模型:宽度=内容的宽度(content)+ border + padding + margin低版本IE盒子模型:宽度=内容宽度(content+border+padding)+ margin css3 新个性常问: word-wrap 文字换行text-overflow 超过指定容器的边界时如何显示text-decoration 文字渲染text-shadow文字暗影gradient突变成果transition过渡成果 transition-duration:过渡的持续时间transform拉伸,压缩,旋转,偏移等变换animation动画audio音频vadio视频RGBA和透明度css3 边框border-radius 圆角box-shadow 盒子暗影border-image 边框图片 css3 背景background-image 背景图片background-size 背景大小background-origin 背景图像的地位区域background-clip 背景剪裁属性是从指定地位开始绘制 css选择器及优先级!important内联款式ID选择器类选择器 属性选择器 伪类选择器 元素选择器 关系选择器 伪元素选择器通配选择器1,class选择符:10,id选择符:100,内联款式权值最大,为1000 !important申明的款式优先级最高,如果抵触再进行计算。如果优先级雷同,则抉择最初呈现的款式。继承失去的款式的优先级最低。 CSS选择器有哪些?哪些属性能够继承?id选择器(#myid)、类选择器(.myclassname)、标签选择器(div, h1, p)、相邻选择器(h1 + p)子选择器(ul > li)、后辈选择器(li a)、通配符选择器(*)、属性选择器(a[rel=”external”])、伪类选择器(a:hover, li:nth-child)可继承的属性:font-size, font-family, color 不可继承的款式:border, padding, margin, width, height BFCBFC是块级格式化上下文。 计算BFC高度时,浮动元素也会参加计算、在BFC这个元素垂直方向的边距会产生重叠BFC的区域不会与浮动元素的box重叠BFC在页面上是一个独立的容器,其里外的元素不会相互影响BFC利用:避免margin重叠革除外部浮动自适应两栏布局避免字体盘绕BFC的生成条件:根元素float值不为noneoverflow的值不为visibledisplay的值为inline-block,table-cell,table-captionposition的值为absolute,fixed 弹性盒display:flex;align-items:center;justify-conter:center;图片整合技术的劣势缩小对服务器的申请次数缩小图片体积,进步加载速度 元素垂直程度居中不须要晓得宽和高 position:absolute;top:0;left:0;right:0;bottom:0;margin:auto;须要晓得宽和高 position:absolute;top:50%;left:50%;margin-top:+/-50%(本身高度的50%);margin-left:+/-50%;元素程度居中margin:0 auto;css定位形式position:static;//默认定位position:relative;//绝对定位 (参照物是本身,不脱离文档流)position:absolute;//相对定位 (参照物是父元素,遵循就近准则,寻找父元素及其爷爷元素中设置 position:relative 属性进行定位,脱离文档流;如果都不设置定位属性,就以根元素<html>进行定位。)position:fixed;//固定定位 (参照物是可视区窗口,脱离文档流)绝对于浏览器窗口进行定位。position:sticky;//display:none和visibility:hidden区别?display:none指的是元素齐全不排列进去,不占据空间,波及到了DOM构造,故产生重排和重绘visibility:hidden指的是元素不可见但存在,保留空间,不影响构造,故只产生重绘,但不可触发绑定事件 rem和em的区别总而言之,就是浏览器把谁转化成“px”rem 根据的是html的font-size值。1rem=16pxem 根据的是父元素的font-size值。 革除浮动办法一:clear:both clear:both;办法二:万能革除浮动 .clean{ content:'.'; height:0; display:block; clear:both; overflow:hiddden; visibility:hidden; }display 有哪些值?阐明他们的作用?inline默认。此元素会被显示为内联元素,元素前后没有换行符。 ...

June 20, 2023 · 2 min · jiezi

关于javascript:编写serverless云函数实践抓取网页后转发基于valtown

指标能定时抓取网站内容,并发送到飞书群机器人接口。 介绍https://www.val.town/ 是个云函数的运行环境。 示例demo能够教会你如何给本人的邮箱发送笑话(console.email只能发给本人的注册邮箱) 反对动静引入npm包,但调试不大不便,最开始想援用node-fetch来实现fetch,但总是报错,报错信息不明确。起初间接用fetch代替了。 val.town 提供定时工作的模式,只须要写好本人的函数,再抉择增加schedule,设定一下cron,就能够实现定时运行函数的性能。(定时有肯定的限度) 实际拿echojs网站为例,须要fetch网页内容,通过cheerio等库解析一下html,选择器找到对应的内容,提取即可。 抓取局部如下fetchEchojs函数实现抓取网站网页的文章题目和链接,并返回 async function fetchEchojs() { const url = "https://www.echojs.com/"; // 动静引入npm包的形式 await import('npm:xxx') const cheerio = await import("npm:cheerio"); try { const res = await fetch(url); const data = await res.text(); const $ = cheerio.load(data); const result = []; $("#newslist article").each((i, elem) => { const $article = $(elem).find("h2"); const title = $(elem).find("h2").text(); const url = $article.find("a").attr("href"); result.push({ title, url, }); }); return result; } catch (err) { console.error(err); }}下一步编写val并设置抓取实现后,取得了一个存储文章的数组,正好飞书群机器人提供api承受申请内容,转发到飞书群音讯。 ...

June 19, 2023 · 1 min · jiezi

关于javascript:在-React-Router-中使用-JWT

hello 大家好,我是 superZidan,这篇文章想跟大家聊聊 在React Router 中应用 JWT ,如果大家遇到任何问题,欢送 分割我 或者间接微信增加 superZidan41 在这篇文章中,咱们将探讨 JWT 身份校验与 React 和 React-router 的无缝集成。 咱们还将学习如何解决公共路由、受校验爱护路由,以及如何利用 axios 库通过身份验证令牌(token)收回 API 申请。 创立一个 React 我的项目应用下方的指令会为咱们创立一个我的项目 $ npm create vite@latest react-jwt-cn而后咱们抉择 react 和 javascript 作为咱们的框架和语言。在我的项目开始之前,咱们要确保所有的依赖都曾经被装置,所以咱们要先执行 $ npm install装置结束后,在我的项目的根目录下,咱们能够运行上面的指令来启动咱们的我的项目 $ npm run dev咱们通过这些步骤来让咱们的 React 我的项目顺利启动和运行 装置 React-Router 和 Axios在咱们持续之前,要确保咱们曾经为咱们的我的项目装置了必要的依赖项。 咱们将从装置 react-router v6 开始,它将解决咱们的 React 应用程序中的路由。 此外,咱们将装置 Axios,这是一个用于发送 API 申请的库。 通过执行这些步骤,咱们将装备实现无缝路由和执行高效 API 通信所需的工具。 让咱们从装置这些依赖项开始。 $ npm install react-router-dom axios在 React 中创立 AuthProvider 和 AuthContext接下来咱们要实现的就是 JWT 身份验证的性能。在这个大节中咱们将创立一个 AuthProvider 组件和一个关联的 AuthContext 。这将帮助咱们在整个利用中存储和共享 JWT 身份验证相干的数据和函数 ...

June 19, 2023 · 6 min · jiezi

关于javascript:使用Flow发送企业应用的通知到微信里

明天咱们以kintone作为企业应用治理平台来解释,怎么应用flow发送企业的告诉到微信上。 实现后的样子1.Microsoft Flow响应kintone增加记录的Webhook。2.Microsoft Flow向微信发送音讯。 微信是什么?微信有点相似于中国版的LINE,在中国被宽泛应用。这次咱们应用的是,针对企业的微信,也就是企业微信。开明企业微信的办法 在kintone里作成利用简略设置一个表单字段。能够保留原有字段代码。在利用的设置→记录题目设置我的项目里,设置上述页面的字段 企业微信端设置 选项里的CorpID我的项目先记录下来。企业微信里创立利用后,页面上会显示 AgentIid 和 Secret ,这个也记录下来。微信端胜利创立利用后,微信的页面上会显示已创立的利用。 Microsoft FLow里创立流首先做一个Webhook的接管接口。应用的连接器是 “申请”。在申请注释 JSON 架构里正确插入以下的JSON架构 { "$schema": "http://json-schema.org/draft-04/schema#", "type": "object", "properties": { "app": { "type": "object", "properties": { "name": { "type": "string" } } }, "recordTitle": { "type": "string" }, "url": { "type": "string" } }}获取微信的AccessToken应用的连接器是 HTTP参考上面的文章,发出请求。获取企業微信AccessToken的办法 向微信发送音讯应用的连接器是 HTTP参考上面的文章,发出请求。发送接口阐明音讯类型及数据格式kintone的Webhook里蕴含的信息,以及之前获取的Access Token在下图中应用。  想要查看全副工作流的样子,请点击:应用Flow发送kintone的告诉到微信里

June 19, 2023 · 1 min · jiezi

关于javascript:老生常谈的-Event-Loop-你真懂吗

写这篇文源起于一个不务正业、不写 JavaScript 的老友问我 JavaScript 的事件循环是怎么回事,他还不甘于只知其一;不知其二。按说这方面的常识网上也是一大堆,但从他的检索后果来看,的确没有适宜他口味的。特写此文,兼做事件循环知识点总结。 常识筹备我感觉网上的大多数相干材料要么太业余、细碎,让老手(甚至新手)抓不住重点,要么就是太简陋甚至有严重错误。另外,一个很显著的问题就是短少必要的相干常识介绍。我试试看能不能把事件循环这件事说分明。 1)JavaScript 与宿主 像 document.getElementById 这种函数是宿主提供的,不属于 JS 语言自身,此时的宿主个别是浏览器。另一个常见的宿主是 Node 环境,比方它提供的 fs 模块下的函数,都不属于语言自身。 JS 解释器被宿主环境调用,宿主会“植入”本人特有的 API。这个知识点写 JS 的人都晓得。须要特地指出的是 setTimeout/setInterval 函数,是绝大多数宿主会提供的函数,它不属于语言标准。这个函数会成为事件循环队列的生产者,后文开展讲。 2)JavaScript 与单线程 首先申明,此文不探讨 web worker 。常说 JS 是单线程的,要正当了解这里的“单线程”。它是指 JS 执行环境(执行模型)是单线程,并不是说 JS 解释器是单线程,更不是说宿主环境是单线程。以浏览器宿主为例—— 咱们发 Ajax 申请的时候,浏览器会应用其 HttpClient 模块进行网络申请,它是独立的线程。也就是说当你 send 一个申请时,理论的操作曾经交接给了宿主的其它线程(理论的实现也可能是过程,后文不再非凡阐明此类情况,这里为了防止杠精。后文针对对本文不重要的常识我也将讲得不那么谨严)。 UI 事件也相似,浏览器有独立的事件监听器接管解决来自操作系统的事件,比方用户点击了鼠标,浏览器中独立的线程监听到点击,并计算出点击的是 DOM 渲染后页面上的一个 <button> 。 3)JavaScript 执行过程 JS 的执行过程中会创立个栈来寄存参数、作用域链、this 等,每个函数是在独立的栈帧中执行。函数的返回事实上是栈帧指针的变动。这里不开展讲了。你能够将一个个的回调函数当作整体了解,后文的图中我也只把它们画成一个个的方框,不探讨外部细节。我也不会刻意指出“执行上下文栈”、“调用栈”这些名词的含意。 事件循环间接上图: 事件循环(Event Loop)的外围逻辑极其简略。首先要有一个事件队列(或者叫音讯队列,总之是一个队列),外面放着一个个事件,事件就是我方才说的小方框,能够了解为一个函数或者你晓得 Execution Context。主观了解即可。主线程中会有限循环地去取出并调用这个队列里的一个个“事件”。这就是事件循环的所有内容! 代码层面能够了解成: while (true) { // 每一轮循环为一个 tick if (hasNextEvent()) { callNextEvent() }}我晓得这种水平的解释并不能满足你。当初结合实际的例子具体讲一下。 ...

June 19, 2023 · 2 min · jiezi

关于javascript:让-React-拥有更快的虚拟-DOM

Million.js 是一个十分疾速和轻量级的 ( <4kb) 虚构 DOM。框架能够通过包装 React 组件来晋升性能(该框架目前版本只兼容 React 18 及以上版本)。 先说论断:Million.js 适应的场景极其无限,但在特定场景下也大放异彩。 如何应用Million.js 集成 React 中应用非常简单。先进行装置和编译器配置。 装置与配置npm install million以后是 webpack 的配置文件。如果有应用其余的构建工具,能够自行参考 装置 Million.js。 const million = require('million/compiler');module.exports = { plugins: [ million.webpack(), ],}应用 block 和 For 组件import { block as quickBlock } from "million/react";// million block 是一个 HOCconst LionQuickBlock = quickBlock(function Lion() { return <img src="https://million.dev/lion.svg" />;});// 间接应用export default function App() { return ( <div> <h1>mil + LION = million</h1> <LionQuickBlock /> </div> );}以后是数组的状况下 ...

June 18, 2023 · 2 min · jiezi

关于javascript:位运算符

与 & 按位比照两个二进制数,如果对应的位都为 1,则后果为 1,否则为 0 1 & 3 == 1 9 & 8 == 8 或 | 按位比照两个二进制数,如果对应的位有一个 1,则后果为 1,否则为 0 (1 | 3) == 3 异或 ^ 按位比照两个二进制数,如果对应的位有且只有一个 1,则后果为 1,否则为 0 (1 ^ 3) == 2 非 ~ 按位对操作的二进制数取反,即 1 变 0,0 变 1,任何数的非运算符计算结果都是 -(x + 1) 一个数和它的取反数相加的后果总为 -1左移 << 左移会将二进制值的有效位数全副左移指定位数,被移出的高位(最右边的数字)抛弃,但符号会保留,低位(最左边的数字)会主动补0 1 << 2 == 4 右移 >> 和左移相同的操作,将二进制的操作数右移指定位数,高位补0,低位抛弃 4 >> 2 == 1

June 17, 2023 · 1 min · jiezi

关于javascript:pnpm-7140-发布

当应用 npm 或 Yarn 时,如果你有 100 个我的项目,并且所有我的项目都有一个雷同的依赖包,那么, 你在硬盘上就须要保留 100 份该雷同依赖包的正本。然而,如果是应用 pnpm,依赖包将被寄存在一个对立的地位。因而以我的项目和依赖包的比例来看,应用 pnpm 将节俭大量的硬盘空间, 并且装置速度也能大大提高。目前,pnpm 已公布 7.14.0 版本,此版本蕴含许多新性能、性能优化以及谬误修复,次要更新内容如下:增加 pnpm doctor 命令,用于对常见问题进行查看pnpm link --global <pkg> 不应扭转依赖关系的类型当 pnpm outdated 命令失败时,打印它在哪个目录下失败strict-peer-dependencies 默认为 false当 auto-install-peers 设置为 true,并且在一个在多个我的项目中有雷同依赖关系的工作区进行装置时,不会解体在 pnpm link --help 中减少全局选项在 install、update、add 和 remove 中显示执行工夫修改 pnpm pack 的返回门路

June 16, 2023 · 1 min · jiezi

关于javascript:原生JavaScript实现Vue的transition-fade过渡动画效果

Vue有一个过渡动画,很多网页都在用,次要是体验还不错,所以很多应用Vue构建的页面如果思考应用动画,根本就会应用这个fade动画,我当初应用原生的JavaScript来实现。 代码<style>.page { opacity: 0; transition: opacity 0.5s, transform 0.5s; transform: translateY(100%);}.page.visible { opacity: 1; transform: translateY(0);}.fade { opacity: 0; transform: translateY(10%); transition: opacity 0.5s, transform 0.5s;}@keyframes fadeAnimation { 0% { opacity: 0; transform: translateY(10%); } 100% { opacity: 1; transform: translateY(0); }}.fade.show { opacity: 1; transform: translateY(0);}#page-content{ width: 800px;}#app{ width: 800px; height: 600px; margin: 100px auto; padding: 20px 20px; background: #eee;}#app .nav{ width: 200px; height: 600px; float: left;}#app .nav button{ width: 200px; height: 40px; margin: 0 auto 10px; background: #39f; color: #fff; font-size: 15px; outline: none; cursor: pointer; border: none; border-radius: 5px;}#page-content{ width: 550px; height: 600px; float: right}</style><script type="text/javascript">var pageData = [ {'Page1': '请留神,上述示例中的动画成果是通过CSS的动画来实现的,而不是应用原生JavaScript逐帧解决动画。这种形式能够更不便地应用CSS来定义和治理动画成果,但具体的实现形式会依据你的需要和设计来定制。你能够依据须要进行调整和扩大,以满足你的具体需要。'}, {'Page2': '在下面的示例中,咱们增加了一个名为fade的CSS类,用于利用淡入淡出的动画成果。应用animation属性指定了名为fadeAnimation的动画,并设置了持续时间为0.5秒。@keyframes规定定义了fadeAnimation动画的关键帧。在0%时,页面内容元素的透明度为0,向下挪动50%;在100%时,透明度为1,不再进行垂直位移。这样就实现了从下往上的淡入成果。'}, {'Page3': 'avaScript局部的changePage函数接管一个页面索引作为参数,依据索引从pageData数组中获取相应的页面数据。而后,咱们通过操作page-content元素的textContent属性,将页面内容更新为对应页面的值。'}];window.onload=function(){ // 进入页面加载 changePage(0);}function changePage(pageIndex) { var pageContent = document.getElementById('page-content'); var page = pageData[pageIndex]; var key = Object.keys(page)[0]; var value = page[key]; pageContent.classList.remove('show'); setTimeout(function() { pageContent.textContent = value; pageContent.classList.add('show'); }, 300);}</script><div id="app"> <div class="nav"> <button onclick="changePage(0)">Page 1</button> <button onclick="changePage(1)">Page 2</button> <button onclick="changePage(2)">Page 3</button> </div> <div id="page-content" class="fade"></div></div>成果动态图: ...

June 16, 2023 · 1 min · jiezi

关于javascript:js对url含有特殊字符的转码处理

问题url 上传有特殊字符,导致接口拼接传参会报400的谬误 解决办法办法一:正则替换 var str = str.replace(/\+/g, "%2B"); //"+" 本义 var str = str.replace(/\&/g, "%26"); //"&" 本义var str = str.replace(/\#/g, "%23"); //"#" 本义办法二:encodeURIComponent(str) 办法 (举荐) let str = 'NBA+';str = encodeURIComponent(str);console.log(str) // NBA%2B当然,能够两者联合,再你不晓得该特殊字符的本义的时候,能够应用 encodeURIComponent() 来解码失去,就像你不晓得键盘某键的keyCode一样

June 16, 2023 · 1 min · jiezi

关于javascript:提升CSS技巧is-where-和has伪元素的运用

微信搜寻 【大迁世界】, 我会第一工夫和你分享前端行业趋势,学习路径等等。本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试残缺考点、材料以及我的系列文章。快来收费体验ChatGpt plus版本的,咱们出的钱体验地址:https://chat.waixingyun.cn/#/home能够退出网站底部技术群,一起找bug. :is()、:where() 和 :has() 伪元素是 CSS 中用于款式化元素的十分弱小的工具。它们是在 CSS 选择器 Level 4 标准中引入的。它们容许咱们将款式利用于合乎特定条件的任何元素,例如元素的类型、元素的地位和元素的后辈。 :is():is() 伪类能够用于基于选择器的组合来定位元素。它将一系列选择器作为其参数,并在元素匹配任何选择器时返回 true。 例如,如果你想要针对所有类名为 isPink 或 isPretty 的元素进行定位,能够应用:is()伪类。 HTML/CSS div:is(.isPink, .isPretty) { color: pink;}<div class="isPink"> <p> Pink </p></div><div class="isPretty"> <p> Pretty </p></div><div> <span> Not Pretty </span></div>在浏览器中渲染时会看起来像这样: 2. :where():where() 伪类能够依据条件来定位元素。它以条件作为参数,并在元素匹配条件时返回 true。 例如,如果你想要定位所有类名以 bold 结尾的元素,能够应用 :where()伪类来实现: 将以下伪类增加到上述CSS文件中,将导致任何具备以 bold 结尾的CSS类的子元素渲染为粗体。 div:where([class^="bold"]) { font-weight: bold;}HTML <div class="isPink"> <p> Pink </p></div><div class="bold_text isPretty"> <p> Pretty </p></div>在浏览器中渲染时会看起来像这样: 伪元素 :is() 和 :where() 看起来在做同样的事件。然而,伪元素 :is() 用于依据选择器列表匹配元素,而伪元素 :where() 则用于依据条件匹配元素。 ...

June 16, 2023 · 1 min · jiezi

关于javascript:比较三种非破坏性处理数组的方法

在这篇文章中,咱们将会摸索解决数组的三种办法: for…of循环数组办法.reduce()数组办法.flatMap()目标是帮忙你在须要解决数组的时候在这些个性之间做出抉择。如果你还不晓得.reduce()和.flatMap(),这里将向你解释它们。 为了更好地感触这三个个性是如何工作的,咱们别离应用它们来实现以下性能: 过滤一个输出数组以产生一个输入数组将每个输出数组元素映射为一个输入数组元素将每个输出数组元素扩大为零个或多个输入数组元素过滤-映射(过滤和映射在一个步骤中)计算一个数组的摘要查找一个数组元素查看所有数组元素的条件咱们所做的一切都是非破坏性的:输出的数组永远不会被扭转。如果输入是一个数组,它永远是新建的。 for-of循环上面是数组如何通过for-of进行非破坏性的转换: 首先申明变量result,并用一个空数组初始化它。对于输出数组的每个元素elem: 如果一个值应该被增加到result中: 对elem进行必要的转换并将其推入result。应用for-of过滤让咱们来感受一下通过for-of解决数组,并实现(简易版的)数组办法.filter(): function filterArray(arr, callback) { const result = []; for (const elem of arr) { if (callback(elem)) { result.push(elem); } } return result;}assert.deepEqual( filterArray(['', 'a', '', 'b'], str => str.length > 0), ['a', 'b']);应用for-of映射咱们也能够应用for-of来实现数组办法.map()。 function mapArray(arr, callback) { const result = []; for (const elem of arr) { result.push(callback(elem)); } return result;}assert.deepEqual( mapArray(['a', 'b', 'c'], str => str + str), ['aa', 'bb', 'cc']);应用for-of扩大collectFruits()返回数组中所有人的所有水果: ...

June 16, 2023 · 5 min · jiezi

关于javascript:RBAC-和-KetoGo-RBAC-框架

RBACRBAC(Role-Based Access Control)是最通用的权限拜访控制系统。其思维是,不间接授予具体用户各种权限,而是在用户汇合和权限汇合之间建设角色汇合。每种角色对应一组相应的权限,一旦用户被调配适当的角色,他就领有此角色的所有权限。这样做的益处是,不用在每次创立用户时都调配权限,只有给用户调配相应的角色即可,并且角色的权限变更比用户的权限变更要少得多,这将简化用户的权限治理,缩小零碎开销。RBAC 有三种模型。1.1. RBAC0它是其它 RBAC 模型的根底。在该模型中,用户和角色之间是多对多的关系,每个角色至多有一个权限。1.2. RBAC1在 RBAC0 的根底上,引入角色间的继承关系,即角色有上下级的区别。角色间的继承关系可分为个别继承关系和受限继承关系。个别继承关系要求角色继承关系是相对偏序关系,容许角色间的多继承。而受限继承关系则进一步要求角色继承关系是树状构造,实现角色间的单继承。1.3. RBAC2在 RBAC0 的根底上,引入角色的访问控制。该模型有以下两种束缚:动态职责拆散互斥角色:互斥角色是指各自权限能够互相制约的角色。对于这类角色,用户在某次流动中只能被调配其中的一个角色,不能同时取得多个角色的使用权。比方在审计流动中,一个用户不能被同时调配会计角色和审计员角色基数束缚:一个角色被调配的用户数量受限;一个用户可领有的角色数量受限;一个角色对应的拜访权限数目也受限,以管制高级权限的调配。比方公司的管理层是无限的先决条件角色:要想取得较高的权限,首先要领有低一级的权限动静职责拆散运行时互斥:动静地束缚用户领有的角色,比方一个用户能够领有两个角色,然而运行时只能激活其中一个Keto 介绍2.1. 介绍Ory Permissions(基于开源的 Ory Keto Permission Server)是第一个、惟一的“Zanzibar:Google 的统一的、寰球的受权零碎”的开源实现。如果你须要晓得是否容许一个用户做某些事件 - Ory Permissions 非常适合你。Ory Permission 实现根本的 API 契约,用于应用 HTTP 和 gRPC API 治理和查看关系(“权限”)。将来的版本将蕴含用户集重写(比方 RBAC 格调的角色-权限模型)、Zookies 等个性。2.2. 装置Ory 软件能够运行在任何操作系统(FreeBSD、macOS、Linux、Windows、...)上,反对所有次要 CPU(ARM64、ARMv7、x86_64、x86、...)平台。Ory 提供预构建的二进制、Docker 镜像,反对多种包管理器。详情请参考:https://www.ory.sh/docs/keto/install2.3. 性能本文档解释 Ory Keto 的工夫复杂度(time complexity)。稍后将剖析和增加主内存复杂度。咱们只查看评估引擎(检查和开展 API),因为其它局部次要由依赖决定,比方你抉择的数据库、音讯的解/编码。为清晰起见,给定的示例疏忽命名空间(namespace)。2.3.1. 查看引擎实质上,查看引擎(check-engine)假如关系元组(relation tuple)和它们的间接组合成一个无环有向图,被称为关系图(the graph of relations)。思考上面的示例:file#access@(file#owner) // probably defined via subjectset rewritesfile#access@user1 // access was granted directlyfile#owner@user2 // file owner record; indirectly gets access被解释为下图:通过从 object 开始搜寻图,通过 relation,尝试达到 user 的形式,计算object#relation@user 模式的查看申请。如果存在这样的门路,那么容许申请。Ory Keto 应用的图遍历算法是广度优先搜寻。在最坏的状况下,工夫复杂度是 O(n+e),其中 n 是从节点 object#relation 通过 e 条边可达到的节点数。重排列,工夫和空间复杂度都是 o(b^d),其中 b 是从搜寻根见到的最大宽度,d 是最大深度。这意味着复杂性很大水平上取决于图的构造。如果图蕴含深度嵌套的间接(indirection),须要屡次递归调用解析这些间接。相似地,如果有广度嵌套的间接,Ory Keto 必须能解析所有间接。指标是以只需解析少许间接的形式,设计 ACL 元组。理解更多对于 ACL 设计的最佳实际。因而,咱们认为惯例的基准测试不会产生任何有意义的后果。因而,咱们将在稍后增加与其它相似我的项目的比拟。2.3.2. 扩大引擎与查看引擎遍历关系元组(relation tuple)图的形式相似,扩大引擎构建它遇到的所有汇合操作的树。它解析从申请的主体汇合(subjectset)开始到指定深度的所有间接(indirection)。因为它也是用广度优先搜寻,工夫和空间复杂度线性依赖于从申请的主体汇合可达到的节点。同样的性能思考也实用于这里,须要特地留神的是,申请较低的深度将进一步限度操作的复杂度。如果关系元组是深嵌套和/或宽泛嵌套的,那么返回的树也可能很快超过正当的大小限度。2.3.3. 参考Wikipedia Breadth-first search2.4. 疾速入门:猫视频示例本示例介绍一个视频共享服务。视频被组织在目录中。每个目录有一个所有者,每个视频的所有者与其父目录雷同。所有者有视频文件的特权,无需独自地在 Ory Keto 中建模。在本例中,建模的其它权限只有“视图拜访”,每个所有者都有对其对象的视图拜访权,也能授予其它用户该权限。视频共享应用程序将非凡的 * 用户 ID 解释为任何用户,爱护匿名用户。留神,Ory Keto 对该主体的解读与其它主体并无不同。它不晓得对于目录构造或诱发的所有权的任何事件。术语:“Keto 客户端”是与 Keto 进行交互的应用程序。在本例中,咱们将视频共享服务后端称为 Keto 客户端。2.4.1. 开始示例首先,装置 Keto。当初能够应用 docker-compose 或 bash 脚本启动示例。bash 脚本须要你在 $PATH 中领有 keto 二进制程序。或者,应用 Docker 主动获取所需的镜像。# clone the repository if you don't have it yetgit clone https://github.com/ory/keto.git && cd ketodocker-compose -f contrib/cat-videos-example/docker-compose.yml up ...

June 15, 2023 · 9 min · jiezi

关于javascript:20个你从未想过的-ChatGPT-有趣用途

微信搜寻 【大迁世界】, 我会第一工夫和你分享前端行业趋势,学习路径等等。本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试残缺考点、材料以及我的系列文章。快来收费体验ChatGpt plus版本的,咱们出的钱体验地址:https://chat.waixingyun.cn/#/home能够退出网站底部技术群,一起找bug. 这篇文章向咱们展现了ChatGPT的乏味用处,如创作独特的故事、写作帮助、模仿对话和游戏等。这些利用展现了ChatGPT的弱小性能和灵活性。通过这些乏味的例子,咱们能够看到ChatGPT作为一种人工智能技术在生活中的理论利用和后劲。无论是娱乐还是实用,ChatGPT都给人们带来了无尽的创意和乐趣。 总之,Mark Schaefer的这篇文章向咱们展现了ChatGPT在娱乐方面的20种乏味利用。这些利用包含创作、游戏、模仿对话等,都充分体现了这个大型语言模型的弱小性能和灵活性。 ChatGPT的用处几乎是无穷无尽且令人沉醉。咱们一个一个来看看: 1.写 Twitter 线程Jim MacLeod 申请 ChatGPT 为他创立一个对于设计的 Twitter 线程。 2. 写一部小说Giuseppe Fratoni想要写一本小说。 “哇,这个货色太不堪设想了!我无话可说。我真的问了我能想到的第一件事,联合了我三个喜好:写作、推理小说和爵士乐。” 申请是:“为一部悬疑小说开发情节,其中一名破灭的杀人侦探追捕一名刁滑的连环杀手,后者以演奏爵士规范曲《秋叶》的音乐家为猎物。”这是我失去的: 能够试试咱们基于ChatPlus开发的版本,速度快:https://chat.waixingyun.cn 3.嘉宾演讲问答提醒你的流动将有一位嘉宾演讲,你心愿从观众中提出问题...让ChatGPT为你事后生成一些问题。主持人能够说:“这里有一个来自咱们人工智能的问题。” 例如,会议的主题是美国西部的水资源短缺问题。演讲者是一位水资源治理专家。这是我向人工智能提出的问题... 我应该向一个淡水淡化专家询问哪些问题以及其影响? 4. 创作游戏Richard也是一个驰名的桌游专家。他倡议能够应用ChatGPT来布局和设计新游戏。留神:一些人曾经开始寻求帮忙解决填字游戏的线索。 5. 约会帮忙如果你想在约会应用程序上的第一条音讯中增加一些调情,以下是一些启发: You caught my eye from across the screen. I couldn’t resist saying hi and seeing if there’s a spark between us.你在屏幕另一端吸引了我的留神。我忍不住想打个招呼,看看咱们之间是否有火花。Your profile photo is stunning. I can’t stop thinking about your [Feature] and how much I’d love to get to know you better.你的个人资料照片很惊艳。我无奈进行思考你的[特色],以及我如许心愿更好地理解你。I’m not usually one to make the first move, but I just had to message you. You’re incredibly [Attractive Quality] and I can’t wait to chat with you.”我通常不会被动迈出第一步,但我必须给你发消息。你十分[吸引人的品质],我急不可待地想和你聊天。Hi there! I saw your profile and I’m not going to lie, I’m a little intimidated. You’re so [Attractive Quality] and I’m feeling a little starstruck. (many more examples provided)你好!我看到了你的个人资料,我不得不抵赖,我有点胆怯。你太[吸引人的品质]了,我感到有点心慌。能够试试咱们基于ChatPlus开发的版本,速度快:https://chat.waixingyun.cn ...

June 14, 2023 · 2 min · jiezi

关于javascript:基于虚拟化的物联网沙盒操作系统

理解她的技术先谈谈虚拟化吧! 为什么要有虚拟化?物理CPU,物理内存和存储,物理网络的硬件能力越来越丰盛的状况下,为了高效、灵便的应用资源,以及在应用时的资源隔离,把硬件资源形象成软件资源,来动静的业务按需分配和应用。 在虚拟化环境下,物理服务器的CPU、内存、硬盘和网卡等硬件资源被虚拟化并受Hypervisor的调度,多个操作系统在Hypervisor的协调下能够共享这些虚拟化后的硬件资源,同时每个操作系统又能够保留彼此的独立性。依据Hypervisor所处档次的不同和Guest OS对硬件资源的不同应用形式,Hypervisor虚拟化被分为两种类型:Bare-metal虚拟化形式(“裸机”虚拟化)和Host OS虚拟化形式(基于操作系统的虚拟化,宿主型虚拟化)。 Host OS类型将Hypervisor虚拟化层装置在传统的操作系统中,虚拟化软件以应用程序过程模式运行在Windows和Linux等主机操作系统中。典型的宿主型Hypervisor有VMware Workstation和VirtualBox。 Bare-metal类型的Hypervisor虚拟化环境中毋庸残缺的Host OS,间接将Hypervisor部署在裸机上并将裸机服务器的硬件资源虚拟化,Bare-metal类型(裸机)Hypervisor有Microsoft的Hyper-V以及开源的KVM等虚拟化软件。咱们常说的虚拟化个别指的是Bare-metal类型。 虚拟化技术又分为全虚拟化(Full Virtualization,FV)、准虚拟化(Para Virtualization,PV)和主机操作系统虚拟化(Host OS Virtualization),其中PV和FV基于Bare-metal类型Hypervisor的虚拟化技术,而主机操作系统虚拟化基于Host OS类型Hypervisor的虚拟化技术。 基于容器的虚拟化技术并不依赖传统的Hypervisor虚拟化引擎,而是在Host OS中配置虚构服务器环境(Virtual Server Environment,VSE),即毋庸在Host OS中配置Hypervisor,并且在容器虚拟化中,仅有Guest OS被仿真模仿。因为容器虚拟化技术摈弃了较为简单的,针对全副硬件资源进行虚拟化的Hypervisor,且是仅针对Guest OS的虚拟化,因而基于容器的虚拟化是一种“更轻”的虚拟化形式,同时也具备很好的性能。 理解她的特点Docker概述为了解决硬件性能和过剩和软件抵触,「硬件虚拟化」的遍及就很自然而然的呈现。对于 Guest OS 和下面的应用程序来说,这台虚拟机和一般物理计算机是齐全一样没有任何区别的——除了性能可能差一点。寰球第一人气的 VMware Workstation 就是这么一个软件,Oracle 的 VirtualBox 以及 Microsoft 的 Virtual PC 都是。这类软件英语有一个专用的单词是 Hypervisor(虚拟机管理程序)。 虚拟机的长处: 能够把资源分配到不同的虚拟机,达到硬件资源的最大化利用;相比间接在物理机上部署利用,虚拟机更容易扩大利用;云服务:通过虚拟机虚构出不同的物理资源,能够疾速搭建云服务。虚拟机的毛病: Guest OS 通常会占用不少硬件资源。Hypervisor会对硬件的性能在肯定水平上受其影响。 为了解决这个问题,容器技术倒退了起来,她是应用程序级别的虚拟化技术。和虚拟机相比,容器有以下长处: 更疾速的启动工夫:没有虚拟机硬件的初始化,没有 Guest OS 的启动过程,能够节约很多启动工夫,这就是容器的“开箱即用”;更高效的利用系统资源:没有运行 Guest OS 所需的内存开销,无需为虚拟机预留运行内存,无需装置、运行 App 不须要的运行库/操作系统服务,内存占用、存储空间占用都小的多。雷同配置的服务器,如果运行虚拟机能运行十多台的,通常能够运行上百个容器毫无压力。统一的运行环境:Docker 的镜像提供了除内核外残缺的运行时环境,确保了利用运行环境一致性,从而不会再呈现「这段代码在我机器上没问题啊」 这类问题。继续交付和部署:应用 Docker 能够通过定制利用镜像来实现继续集成、继续交付、部署。 Webassembly概述Docker的创始人所罗门·海克斯(Solomon Hykes)说过:"如果在2008年曾经有了 WASM + WASI,咱们基本不须要创立 Docker,WASM 就是这么重要。服务器端的 Webassembly 是计算的将来。标准化的零碎接口是缺失的环节。让咱们心愿WASI可能胜任这项工作!",可见其对WASM的器重和青眼。 WebAssembly 技术源于浏览器,其倒退历程能够说是一部浏览器性能优化史。在 Web 前端畛域,JavaScript 语言是编写运行在浏览器上的 Web 利用的首选,为了满足利用日益增长的性能需求,针对 JavaScript 语言自身缺点带来的瓶颈优化,逐步形成了三个阶段性优化产物,他们别离是 asm.js、NaCl/PNaCl 以及 WebAssembly。 ...

June 13, 2023 · 2 min · jiezi

关于javascript:this-之谜揭底从浅入深理解-JavaScript-中的-this-关键字二

前言系列首发于公众号『前端进阶圈』 ,若不想错过更多精彩内容,请“星标”一下,敬请关注公众号最新消息。this 之谜揭底:从浅入深了解 JavaScript 中的 this 关键字(二)调用地位在了解 this 的绑定过程之前,首先要了解调用地位:调用地位就是函数在代码中被调用的地位(而不是申明的地位)。通常来说,寻找调用地位就是寻找"函数被调用的地位", 最重要的要剖析调用栈(就是为了达到以后执行地位所调用的所有函数)。运行代码时,调用器会在那个地位暂停,同时会在展现以后地位的函数调用列表,这就是调用栈。绑定规定函数的调用地位决定了 this 的绑定对象,通常状况下分为以下几种规定: 默认绑定最罕用的函数调用类型:独立函数调用。可把这条规定看到是无奈利用其余规定时的默认规定。 function foo(){console.log(this.a);}var a = 2;foo(); // 2当调用 foo() 时,this.a 被解析成了全局变量 a。为什么? 因为在上述代码中,函数调用时利用了this 的默认绑定,因而 this 指向全局对象。(要了解 this,就要先了解调用地位)如果应用严格模式(strict mode),那全局对象将无奈应用默认绑定,因而 this 会绑定到 undefined。 function foo(){"use strict";console.log(this.a);}var a = 2;foo(); // Type: this is undefined尽管 this 的绑定规定齐全取决于调用地位,然而只有 foo() 运行在非 strict mode下时,默认绑定能力绑定到全局对象; 严格模式下与 foo() 的调用地位无关。 function foo(){console.log(this.a);}var a = 2;(function (){"use strict";foo(); // 2})通常状况下,尽量减少在代码中混合应用 strict mode 与 non-strict mode,尽量减少在代码中混合应用 strict mode 和 non-strict mode。隐式绑定另一条规定是调用地位是否有上下文对象,或者说是否被某个对象领有或包裹。思考以下代码: ...

June 13, 2023 · 5 min · jiezi

关于javascript:CSS粘性定位-它的真正工作原理

本文首发于微信公众号:大迁世界, 我的微信:qq449245884,我会第一工夫和你分享前端行业趋势,学习路径等等。更多开源作品请看 GitHub https://github.com/qq449245884/xiaozhi ,蕴含一线大厂面试残缺考点、材料以及我的系列文章。快来收费体验ChatGpt plus版本的,咱们出的钱体验地址:https://chat.waixingyun.cn能够退出网站底部技术群,一起找bug. 这篇文章具体解释了CSS中的sticky定位形式,并解说了它的工作原理。 CSS中的sticky定位有很好的浏览器反对,但许多开发者并没有应用它。起因有两方面:一是期待浏览器反对的工夫太长,导致这个个性被忘记;二是大部分开发者并不齐全了解它的工作原理。 我假如你们都晓得CSS定位,但让咱们简要回顾一下: 直到3年前,有四个CSS地位: static , relative , absolute 和 fixed 。 static 或 relative 与 absolute 或 fixed 之间的次要区别在于它们在DOM流中占用的空间。static 和 relative 保留其在文档流中的天然空间,而 absolute 和 fixed 则不保留空间,它们具备浮动行为。而新的sticky定位具备所有类型的相似性。 应用 position: sticky应用 position: sticky 时,每个人都很快明确,当视口达到定义的地位时,元素会粘在那里。 .some-component{ position: sticky; top: 0;} 有时候sticky定位能失常工作,有时候则不能。当它失常工作时,元素会"粘"在肯定地位,但在滚动的其余局部,它又会进行"粘"住。作为一个每天都在应用CSS的人,作者无奈承受本人不能深刻了解这个问题的根本原因,所以决定深入研究sticky定位。 Stick 摸索在尝试应用 sticky 定位的过程中,我很快发现,当一个具备sticky定位款式的元素被包裹起来,并且它是包裹元素内惟一的元素时,这个被定义为sticky定位的元素并不会"粘"住。 <!-- DOESN'T WORK!!! --><style> .sticky{ position: sticky; top: 0; }</style><div class="wrapper"> <div class="sticky"> SOME CONTENT </div></div>当我在包裹元素内增加更多元素时,它开始失常工作了。 为什么? 这样做的起因是,当一个元素被赋予sticky定位款式时,粘性元素的容器是粘性元素能够粘住的惟一区域。这个元素没有其余元素能够浮动,因为它只能浮动在兄弟元素上,而作为惟一的子元素,它没有兄弟元素。 CSS Sticky 定位的真正工作原理!CSS 的 sticky 定位有两个次要局部,即粘性元素和粘性容器。 ...

June 13, 2023 · 1 min · jiezi

关于javascript:开源项目昆明智慧昆明CIMBIM数字孪生可视化项目开源工程源码

为了打造更加智能化的城市,智慧昆明借助数字孪生技术,将城市的真实世界实时反映到数字世界中,实现了城市的疾速剖析和准确预测。更为棒的是,智慧昆明工程及源码均收费赠送,助您的城市更慢步入智慧化时代! 我的项目介绍 智慧昆明地处云南省核心,是一座山水园林城市。数字孪生技术在昆明的利用,致力于用AI解决地形影像,呈现出实在的数字孪生城市场景。 五华、盘龙区应用高精度的max模型,其余区域则应用AI生成cim数据,并加以优化。数字孪生的技术,可能将各式各样的城市数据进行无缝整合,使得人们可能在数字世界中,更加不便地理解和剖析城市的各个方面。 功能分析总体态势 智慧昆明可通过可视化每块行政布局的数据,使用户更具体理解各个区域的生态、经济、交通、教育等各方面的状况。比方,在应急治理中,用户能够通过数字孪生的技术,对市政管网数据、市政交通数据等加以解决,使得对于各个区域的状况疾速理解和响应成为可能。 用地布局 智慧昆明可加载二维的用地布局数据,使规划师可能更明确地理解城市土地利用状况,为城市的布局、拓展提供更加合理化的解决方案。在日常治理和古代城市规划方面,数字孪生的技术可能使咱们疾速理解城市中不同区域的信息,从而更好地进行用地布局和市政基础设施建设等。 滇中经济圈 智慧昆明可视化滇中经济圈中各个城市之间的贸易、投资、工业、生产以及用工状况等各方面数据,从而更好地理解经济圈内城市的产业结构,进而制订经济倒退的宏观政策。 电子地图 智慧昆明可加载矢量切片包数据,提供实时路况、公交查询、高清晰度等性能,为市民提供一个更加便当的康居环境。此外,电子地图也能够在应急事件的处理过程中施展更为重要的作用,为城市的治理提供更具体的数据反对。 智慧昆明通过数字孪生技术,将城市的真实世界实时反映到数字世界中,实现了城市的疾速剖析和准确预测。该我的项目采纳AI解决地形影像,呈现出实在的数字孪生城市场景。在各式各样的城市数据整合方面表现出色,用户能够更加不便地理解和剖析城市的各个方面。此外,智慧昆明也提供了多种与市民生存相干的服务,比方实时路况、公交查询、应急治理等,让市民在数字化城市中可能享受更加便当、平安和丰盛的生存。须要源码和工程的敌人请一键三连,私信回复【源码】即可获取

June 12, 2023 · 1 min · jiezi

关于javascript:利用vfocusnext指令实现Form表单回车后聚焦下一个元素

简介v-focus-next是一个Vue指令,应用该指令后,在表单的某个元素中输出回车符,能够主动聚焦到下一个表单元素,防止了用户通过鼠标来回选中表单元素,大大晋升了表单填写的效率和用户体验。 《演示成果》 v-focus-next的应用非常简单。 只须要为某个Dom或Vue组件(如div、form、ElForm等)绑定v-focus-next指令,则该Dom下的所有input/textarea主动反对回车聚焦性能,无需任何其余配置。 反对以下个性: 默认会将所有input/textarea退出回车聚焦性能,也可通过指定className等形式,将局部表单元素反对回车聚焦。反对首个表单元素主动聚焦反对任意一般Dom元素和Vue组件主动过滤掉disable的元素及type为hidden、radio、checkbox、file、submit、reset的元素反对vue2/3应用装置npm install v-focus-next我的项目中引入通过use形式,引入该指令中间件。 Vue3示例: import { createApp } from 'vue'import App from './App.vue'import vFocusNext from "v-focus-next";let app = createApp(App)app.use(vFocusNext) //通过中间件形式引入指令app.mount('#app')Vue2示例: import Vue from 'vue'import App from './App.vue'import vFocusNext from "v-focus-next";Vue.use(vFocusNext); //通过中间件形式引入指令new Vue({ render: h => h(App),}).$mount('#app')示例1只需为某个父元素减少v-focus-next指令,则其中所有表单元素就领有了回车聚焦性能。 <div v-focus-next> <input placeholder="输出回车主动聚焦下一行"/> <input/> <input/> <input/> <input/> <textarea /></div>Vue组件也是一样的,如为el-form增加v-focus-next指令。 <el-form v-focus-next > <el-form-item label="名称"> <el-input v-model="form.name" id="name" /> </el-form-item> <el-form-item label="年龄"> <el-input v-model="form.age" id="age" disabled /> </el-form-item> </el-form>示例2:指定参加回车聚焦的元素或者你不想所有表单元素都参加回车聚焦,比方只想让所有设置了class为'test'的元素参加回车聚焦,只须要设置 v-focus-next="'.test'",可设为querySelectorAll反对的参数模式。 <div v-focus-next="'.test'"> <input class="test"/> <input /> <input class="test"/></div>示例3:主动聚焦首个元素只需设置v-focus-next.autoFocus即可。 ...

June 12, 2023 · 1 min · jiezi

关于javascript:11种前端数据去重方式你都知道吗

本文总结了JavaScript去重的多种形式,各有优缺点,依据需要正当应用吧。 应用 for 循环和 indexOf 办法,复杂度 O(n^2)function uniqueArray(arr) { const result = [] for (let i = 0; i < arr.length; i++) { if (result.indexOf(arr[i]) === -1) { result.push(arr[i]) } } return result}应用 for 循环和对象,复杂度 O(n^2)function uniqueArray(arr) { const result = [] const obj = {} for (let i = 0; i < arr.length; i++) { if (!obj[arr[i]]) { result.push(arr[i]) obj[arr[i]] = true } } return result}应用 filter 办法和 indexOf 办法,复杂度 O(n^2)function uniqueArray(arr) { return arr.filter((item, index, arr) => arr.indexOf(item) === index)}应用 filter 办法和对象,复杂度 O(n)function uniqueArray(arr) { const obj = {} return arr.filter((item) => obj.hasOwnProperty(item) ? false : (obj[item] = true))}应用 Set 数据结构,复杂度 O(n)function uniqueArray(arr) { return Array.from(new Set(arr))}// 应用解构 + Setfunction uniqueArray(arr) { return [...new Set(arr)]}应用 Map 数据结构,复杂度 O(n)function uniqueArray(arr) { const map = new Map(); const result = []; for (let i = 0; i < arr.length; i++) { if (!map.has(arr[i])) { map.set(arr[i], true); result.push(arr[i]); } } return result;}// orfunction uniqueArray(arr) { const map = new Map(); return arr.filter(function(item) { return !map.has(item) && map.set(item, true); });}应用双重循环和 splice 办法,复杂度 O(n^2)function uniqueArray(arr) { for (var i = 0; i < arr.length; i++) { for (var j = i + 1; j < arr.length; j++) { if (arr[i] === arr[j]) { arr.splice(j, 1); j--; } } } return arr;}应用排序和双指针应用排序和双指针能够实现 O(nlogn) 的工夫复杂度。先对数组进行排序,而后应用双指针遍历数组,如果左指针和右指针指向的值雷同,就把右指针向右挪动,直到找到不同的值,而后把左指针向右挪动,持续遍历。 ...

June 11, 2023 · 2 min · jiezi

关于javascript:对数据进行模糊匹配搜索动态规划最长公共子串最长公共子序列

在搜寻时经常在输出一半或者输出谬误时,搜索引擎就给出智能提醒。 已知的搜寻举荐次要包含以下几个方面: 蕴含:“清华” 和 “清华大学”类似:“聊天软件” 和 “通信软件”相干:“明星” 和 “刘亦菲”纠错:“好奇害死毛” 和 “好奇害死猫”其中蕴含含糊匹配能够应用动静布局算法解决,其余几个则要大量数据进行机器学习才行。 假使要在一堆数据中对一个关键词进行匹配搜寻,传统做法是把数据拆离开,而后遍历他们,看看是否蕴含这个关键词,对于 “fin” 和 “finish” 这样存在蕴含关系的单词来说是没问题的,然而对于 “fish” 和 “finish” 这样并不存在蕴含关系的单词就生效了,这时候冀望计算出两个单词的相似性,比方 “fish” 和 “finish” 都蕴含 “ish”,“ish” 的长度是 3,咱们能够了解相似性为 3。目前支流做法是通过最长公共子串来寻找两个或多个已知字符串最长的子串。 注:深拷贝应用了依赖库,需先装置 npm install mazey --save 最长公共子串示例: import { deepCopy } from 'mazey';/** * @method calLongestCommonSubstring * @description 计算两个字符串的最长公共子串 * @param {String} aStr 字符串 * @param {String} bStr 字符串 * @return {Number} 长度 */function calLongestCommonSubstring (aStr, bStr) { const aLen = aStr.length; const bLen = bStr.length; // 创立二维数组并且深拷贝 const arr = deepCopy(new Array(aLen).fill(new Array(bLen).fill(0))); for (let i = 0; i < aLen; ++i) { for (let j = 0; j < bLen; ++j) { if (aStr[i] === bStr[j]) { let baseNum = 0; if (i > 0 && j > 0) { baseNum = arr[i-1][j-1]; } arr[i][j] = baseNum + 1; } } } // 二维数组转一维数组 const arr1 = Array.prototype.concat.apply([], arr); // 获取最长公共子串 const maxLong = Math.max(...arr1); return maxLong;}calLongestCommonSubstring('fish', 'finish'); // 3“fish” 和 “finish” 除了 “ish” 之外还独特蕴含 “f”,所以 “ish” + “f” 更好的表白其相似性(3 + 1 = 4),于是应用最长公共子序列对最长公共子串进行降级来查找所有序列中最长子序列,版本治理中应用的 git diff 就是建设在最长公共子序列的根底上。 ...

June 11, 2023 · 2 min · jiezi

关于javascript:你的表单支持回车自动聚焦吗

背景最近在做产品优化,产品让给表单减少一个性能,就是回车后主动进入下一个表单元素,这样就不必频繁应用鼠标进行切换了,能够大大晋升表单输出的流畅性,让用户一路Next。 这个需要很正当,也十分通用,实践上全副表单都应该反对这样的成果,很多大厂的产品,也都是反对这个成果的,当初问题就变成了如何完满设计一个计划,以实现这个成果。 制订指标在进行技术开发之前,我习惯先给本人定义下技术指标,而不是上来就做。定义好技术指标,就定义好了咱们的需要,定义好了要做什么,做成什么样,而不是上来先思考如何去做,这样更合乎做事的方法论。 针对这个问题,我给本人定了如下几个指标: 配置要简略: 因为大量的表单都须要进行这个配置,所以配置肯定要尽可能简略,尽量一行代码搞定不须要配置程序,依据表单中的程序,主动聚焦下一个表单要反对配置哪些表单元素参加回车聚焦 默认应该反对所有含有input和textarea的元素参加回车聚焦然而也要反对自定义,自定义要简略,比方指定含有某个className的元素参加回车聚焦要反对主动聚焦首个表单元素要可能主动滚动到聚焦的表单元素要可能跳过disabled的元素,以及一些不须要聚焦的表单元素,如radio、checkbox、submit等要反对vue2和vue3计划制订网上有一些文章,根本都是针对某个表单元素,监听keydown事件,而后非凡解决其逻辑,这样的解决方案没有通用性,而且也非常复杂,每个表单都要大量的有效反复代码。 思考通过指令的形式来解决这个问题,冀望开发一个 v-focus-next指令,只有配置了这个指令,其中的表单元素就主动反对回车聚焦。 冀望的应用形式: <div v-focus-next> <input/> <input/> <input/> <input/> <input/> <textarea/></div>组件也同样反对该指令 <el-form v-focus-next > <el-form-item label="名称"> <el-input v-model="form.name" id="name" /> </el-form-item> <el-form-item label="年龄"> <el-input v-model="form.age" id="age" disabled /> </el-form-item> </el-form>如果咱们只想让className为 focus-next的参加回车聚焦,则这么配置。 <div v-focus-next="'.focus-next'"> <input class=focus-next/> <input/> <input class=focus-next/> <input/> <input class=focus-next/> <textarea/></div>主动聚焦首个表单,应该只有设置下autoFocus即可 <div v-focus-next.autoFocus></div>到目前为止,咱们只是在定义要做的事件应该是什么样的,并没有开始编码,无论是编写组件,还是指令,都心愿先定义好对外的接口,而后评估这样的接口设计是否足够易用,最初再去实现。 记住:定义接口比实现更重要。 核心技术点如何兼容Vue2和Vue3Vue2和Vue3反对的指令钩子函数并不相同。 Vue3的指令 const myDirective = { // 在绑定元素的 attribute 前 // 或事件监听器利用前调用 created(el, binding, vnode, prevVnode) { // 上面会介绍各个参数的细节 }, // 在元素被插入到 DOM 前调用 beforeMount(el, binding, vnode, prevVnode) {}, // 在绑定元素的父组件 // 及他本人的所有子节点都挂载实现后调用 mounted(el, binding, vnode, prevVnode) {}, // 绑定元素的父组件更新前调用 beforeUpdate(el, binding, vnode, prevVnode) {}, // 在绑定元素的父组件 // 及他本人的所有子节点都更新后调用 updated(el, binding, vnode, prevVnode) {}, // 绑定元素的父组件卸载前调用 beforeUnmount(el, binding, vnode, prevVnode) {}, // 绑定元素的父组件卸载后调用 unmounted(el, binding, vnode, prevVnode) {}}Vue2的指令 ...

June 11, 2023 · 3 min · jiezi

关于javascript:JavaScript-worker之普通worker

技术背景家喻户晓,JavaScript 语言采纳的是单线程模型,也就是说,所有工作只能在一个线程上实现,一次只能做一件事。后面的工作没做完,前面的工作只能等着。随着电脑计算能力的加强,尤其是多核 CPU 的呈现,单线程带来很大的不便,无奈充分发挥计算机的计算能力。Web Worker 的作用,就是为 JavaScript 发明多线程环境,容许主线程创立 Worker 线程,将一些任务分配给后者运行。在主线程运行的同时,Worker 线程在后盾运行,两者互不烦扰。等到 Worker 线程实现计算工作,再把后果返回给主线程。这样的益处是,一些计算密集型或高提早的工作,被 Worker 线程累赘了,主线程(通常负责 UI 交互)就会很晦涩,不会被阻塞或拖慢。Worker 线程一旦新建胜利,就会始终运行,不会被主线程上的流动(比方用户点击按钮、提交表单)打断。这样有利于随时响应主线程的通信。然而,这也造成了 Worker 比拟消耗资源,不应该适度应用,而且一旦应用结束,就应该敞开。 应用限度1、同源限度调配给 Worker 线程运行的脚本文件,必须与主线程的脚本文件同源。所谓同源指同ip,同协定,同端口。不能像script那样无限度。 2、DOM 限度Worker 线程所在的全局对象,与主线程不一样,无奈读取主线程所在网页的 DOM 对象,也无奈应用document、window、parent这些对象。然而,Worker 线程能够navigator对象和location对象,也能够拜访XMLHttpRequest。 3、通信限度因为是不同的脚本环境,Worker和主线程它们不能间接通信,必须通过音讯实现。 4、文件限度Worker 线程无奈读取本地文件,即不能关上本机的文件系统(file://),它所加载的脚本,必须来自网络。 根本用法主线程主线程采纳new命令,调用Worker()构造函数,新建一个 Worker 线程。Worker()构造函数的参数是一个脚本文件,该文件就是 Worker 线程所要执行的工作。因为 Worker 不能读取本地文件,所以这个脚本必须来自网络。如果下载没有胜利(比方404谬误),Worker 就会默默地失败。 而后,主线程就调用worker.postMessage()办法,向 Worker 发消息。worker.postMessage()办法的参数,就是主线程传给 Worker 的数据。它能够是各种数据类型,包含二进制数据。 接着,主线程通过worker.onmessage指定监听函数,接管worker子线程发回来的音讯。下面代码中,事件对象的data属性能够获取 Worker 发来的数据。 Worker 实现工作当前,主线程就能够把它关掉。 Worker 线程Worker 线程外部须要有一个监听函数,监听message事件。除了应用self.addEventListener()指定监听函数,也能够应用self.onmessage指定。监听函数的参数是一个事件对象,它的data属性蕴含主线程发来的数据。self.postMessage()办法用来向主线程发送音讯。 依据主线程发来的数据,Worker 线程能够调用不同的办法,上面是一个例子。下面代码中,self.close()用于在 Worker 外部敞开本身。 Worker API主线程浏览器原生提供Worker()构造函数,用来供主线程生成 Worker 线程。 const myWorker = new Worker( workUrl, [options] );Worker()构造函数,能够承受两个参数。第一个参数是脚本的网址(必须恪守同源政策),该参数是必须的,且只能加载 JS 脚本,否则会报错。第二个参数是配置对象,该对象可选。Worker()构造函数返回一个 Worker 线程对象,用来供主线程操作 Worker。Worker 线程对象的属性和办法如下。 ...

June 9, 2023 · 2 min · jiezi

关于javascript:JS原始类型为什么能调用方法

参考地址:原始类型的办法 如果,有这样一段代码,将字符串转换为大写: let str = 'abc';str.toUpperCase(); // 'ABC'这是一段简略又一般的代码,按说str是字符串类型,它存储的是一个单值,并且是不可变的,它不能像对象那样,能够存储多个属性,像这样: let user = {}; user.name = '张三';user.say = function () { return '你好';}; user.name; // 张三user.say(); // 你好通过代码能够看到,不能给一般类型增加属性 let user = ''; user.name = '张三';user.say = function () { return '你好';};user.age; // undefineduser.say(); // user.say is not a function那么,为什么原始类型(比方字符串)可能调用办法(比方toUpperCase())呢?其原理是:为了使办法起作用,创立了提供额定性能的非凡“对象包装器”,应用后即被销毁。 “对象包装器”对于每种原始类型都是不同的,它们被称为 String、Number、Boolean、Symbol 和 BigInt。因而,它们提供了不同的办法。 以之前的代码为例: let str = 'abc';str.toUpperCase(); // 'ABC'理论产生的状况: 字符串 str 是一个原始值。因而,在拜访其属性时,会创立一个蕴含字符串字面值的非凡对象,并且具备可用的办法,例如 toUpperCase()。该办法运行并返回一个新的字符串。非凡对象被销毁,只留下原始值 str。所以原始类型能够提供办法,但它们仍然是轻量级的。 JavaScript 引擎高度优化了这个过程。它甚至可能跳过创立额定的对象。然而它依然必须恪守标准,并且体现得如同它创立了一样。

June 8, 2023 · 1 min · jiezi

关于javascript:this-之谜揭底从浅入深理解-JavaScript-中的-this-关键字一

前言系列首发于公众号『前端进阶圈』 ,若不想错过更多精彩内容,请“星标”一下,敬请关注公众号最新消息。this 之谜揭底:从浅入深了解 JavaScript 中的 this 关键字(一)为什么要用 this思考以下代码: function identify() {return this.name.toUpperCase();}function speak() {var greeting = "Hello, I'm " + identify.call( this );console.log( greeting );}var me = {name: "Kyle"};var you = {name: "Reader"};identify.call( me ); // KYLEidentify.call( you ); // READERspeak.call( me ); // Hello, 我是 KYLEspeak.call( you ); // Hello, 我是 READER这段代码再不同的上下文对象(me 和 you) 中重复使用函数 identify() 和 speak(), 不必针对每个对象编写不同版本的函数。若不应用 this 如下代码: function identify(context) {return context.name.toUpperCase();}function speak(context) {var greeting = "Hello, I'm " + identify( context );console.log( greeting );}identify( you ); // READERspeak( me ); //hello, 我是 KYLE打消对 this 的误会在解释下 this 到底是如何工作的,首先必须打消对 this 的错误认识。 ...

June 8, 2023 · 3 min · jiezi

关于javascript:OpenSSL-是什么

OpenSSL 是什么?OpenSSL 是开源的程序套件,该套件由三局部组成: libcrypto:具备通用性能的加密库,外面蕴含泛滥加密算法libssl:实现 SSL/TLS 性能openssl:多功能的命令行工具,能够实现加密、解密、自建 CA、创立证书、撤消证书等性能 本文次要介绍如何应用 OpenSSL 自建 CA,生成 SSL 证书、撤消证书。根底概念 非对称加密:对称加密算法在加密和解密时,应用同一密钥。非对称加密算法须要两个密钥,即公开密钥和公有密钥,公开密钥和公有密钥是一对。用公开密钥对数据进行加密,只有用对应的公有密钥能力解密;用公有密钥对数据进行加密,只有用对应的公开密钥能力解密。因为加密和解密应用两个不同的密钥,所以这类算法叫非对称加密算法。在非对称加密中,应用的次要算法包含 RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。非对称加密的毛病是加密和解密破费工夫长、速度慢,只适宜对大量数据进行加密Private Key:证书的私钥,PEM 格局,通常应用 RSA 算法生成。在生成私钥时,能够指定明码对其进行爱护CSR(Certificate Signing Request,证书签名申请):用于申请证书,在制作 CSR 文件时,须要应用私钥文件。CSR 文件必须由 CA 进行签名,才可造成证书(CRT)CRT(数字证书):数字证书是通过证书受权核心(CA)签名的、蕴含公开密钥拥有者信息和公开密钥的文件。数字证书的一个重要特色是 - 只在特定的时间段内无效。以数字证书为外围的加密技术能够对网络上传输的信息进行加密和解密,数字签名和签名认证,确保传输信息的机密性、完整性、不可抵赖性: 保密性 - 只有收件人能力浏览信息认证性 - 确认信息发送者的身份完整性 - 信息在传递过程中不会被篡改不可抵赖性 - 发送者不能否定已发送的信息数字证书的颁发过程个别为:用户首先产生本人的密钥对将公共密钥和局部个人身份信息传递给证书受权核心证书受权核心在核实用户身份后,将给用户颁发数字证书,其中蕴含用户的身份信息和公共密钥,同时还附有证书受权核心的签名信息数字证书工作原理:应用接管单方约定的 HASH 算法对报文计算出固定位数的摘要。在数学上保障:只有改变报文中的任何一位,从新计算出的报文摘要值就与原先的值不相符。这样即可保障报文的不可更改性应用发送者的私钥对报文摘要值进行加密,而后连同原报文一起发送给接收者,加密后的报文摘要即为数字签名接管方收到数字签名后,用同样的 HASH 算法对原报文计算出报文摘要值,而后与应用发送者的公开密钥对数字签名进行解密失去的报文摘要值进行比拟,如果相等,则阐明报文的确来自所称的发送者之所以对报文摘要进行加密,而不是对原报文进行加密,是因为 RSA 加解密十分耗时,被加密的报文越大,耗时越多证书的内容包含:CA 信息、公钥用户的信息、公钥、CA 的签名和有效期等。证书的格局和验证办法广泛遵循 X.509 国际标准CA(Certificate Authority,证书受权核心):CA 是负责发放和治理数字证书的权威机构,作为受信赖的第三方,承当公钥体系(PKI)中公钥的合法性检查的责任。CA 也领有一个证书(内含公钥)和私钥。用户通过验证 CA 的签名从而信赖证书,任何人都能够失去 CA 的证书,用以验证它所签发的证书。如果用户想要甄别证书的真伪,须要用 CA 的公钥对证书上的签名进行验证,一旦通过,认为证书无效证书链(Certificate Chain)证书链由两个环节组成:信赖锚环节(CA 证书)和已签名证书环节。自签名的证书仅有一个环节的长度:信赖锚环节就是已签名证书自身。证书链能够领有任意环节的长度。在三节的证书链中,信赖锚证书能够对两头证书进行签名,两头证书的拥有者能够用本人的私钥对另一个证书进行签名。证书链是 CA 收回的证书序列,最终以根 CA 证书完结。证书最后生成时,是一个自签名证书,自签名证书是签名者(Issuer)和主题(Subjet)雷同的证书(即用证书本人的公钥对证书的签名进行认证)。自签名证书是证书链中的最初一个证书。证书链中的每个证书都须要应用链中的前一个证书的公钥进行验证,直至达到自签名的根证书CRL(Certificate Revocation List,证书撤消列表):用于指定证书发布者认为有效的证书列表。CRL 肯定是被 CA 签订的,CRL 中蕴含被撤消的证书的序列号。证书具备指定的寿命,但 CA 能够通过撤消证书缩短这一寿命。CA 通过公布证书撤消列表,列出被认为不能再应用的证书的序列号。CA 能够指定证书被撤消的起始日期,也能够在证书撤消列表中退出撤消证书的理由: ...

June 8, 2023 · 4 min · jiezi

关于javascript:判断两个矩形是否相交Rect-Intersection

0x00 Preface最近在开发一个2D组态图形组件的过程中,外面的数学模块,波及到两个矩形是否相交的判断。 这个问题很多年前就写过,算是个小的算法吧。 网络上搜寻一下,有很多思路,有一些思路要基于多种组合的判断,显得比较复杂。 比方两个矩形相交的情景,可能有上面的多种类型: 而每种类型又有多种子类型。 0x01 Body其实能够反向来思考这个问题,就比较简单,两个矩形A和B,不相交的状况有哪些,而后通过bool 取反,就是相交的状况。假如矩形的的定义如下: class Rect { constructor(x,y,w,h) { this.x = x; this.y = y; this.w = w; this.h = h; this.r = x + w; // r示意矩形的左边 this.b = y + h; // b 示意矩形的下边 }}不相交的状况能够演绎为这几种状况: A在B的右边 (A.r < B.x)A在B的左边 ( B.r < A.x)A在B的上边 (A.b < B.y )A在B的下边 (B.b < A.y )所以不相交的代码如下: A.r < B.x || B.r < A.x || A.b < B.y || B.b <A.y对于这种状况取反,就是相交的状况: ...

June 8, 2023 · 1 min · jiezi

关于javascript:开源项目数字孪生应用智慧监狱开放数据及源码

某监狱的工程和源码免费送出,这一数字孪生技术打造的智慧监狱将极大进步监狱管理效率。立刻获取收费的监狱工程源代码,博得高效治理利器! 我的项目介绍 智慧监狱是一种全新的、尖端的监狱治理技术,将数字孪生技术用于监狱治理中。数字孪生技术是通过对事实场景的全面扫描来获取数据,再利用物联网、云计算和人工智能等技术进行剖析和加工,将事实场景残缺地克隆进去,并在虚拟环境中进行运行和模仿。 智慧监狱利用数字孪生技术,齐全克隆了监狱的三维场景,包含各个监控点、监狱宿舍和监狱內外的交通状况等情景,为监狱治理提供了极大的便当。 功能分析 园区监控:智慧监狱展现了监狱内所有的监控点位,无死角、无监管盲区,不便管理员全方位监控犯人和监狱环境。监狱官员能够在数字孪生的虚拟环境中实时追踪犯人动静,确保他们原地待命,避免逃跑和暴力事件。 犯人押解:智慧监狱可视化押解犯人的导览轨迹,监管人员能够清晰看到每个犯人的押解轨迹和押解安顿,无效防止可能的意外和犯人逃脱等事变产生。 宿舍治理:智慧监狱还能可视化监狱宿舍供管理人员进行治理。管理员不仅能够实时监测犯人劳动、就餐的工夫和地点,还能够交付犯人行李和食品等物品,避免犯人采取解围事件。 智慧监狱的数字孪生技术能够实现三维场景全面克隆,大大提高监狱管理效率,同时升高犯人逃脱和暴力事件的危险,对进步监狱管理水平和人员平安都非常重要。须要工程以及前端源码的敌人,一键三连评论区见

June 8, 2023 · 1 min · jiezi

关于javascript:js手动实现一个深拷贝

function deepClone(obj, hash = new WeakMap()) { if (obj === null) return obj; // 如果是null或者undefined我就不进行拷贝操作 if (obj instanceof Date) return new Date(obj); if (obj instanceof RegExp) return new RegExp(obj); // 可能是对象或者一般的值 如果是函数的话是不须要深拷贝 if (typeof obj !== "object") return obj; // 循环援用属性的解决 if (hash.get(obj)) return hash.get(obj); // 是对象的话就要进行深拷贝 let cloneObj = new obj.constructor(); // 找到的是所属类原型上的constructor,而原型上的 constructor指向的是以后类自身 hash.set(obj, cloneObj); for (let key in obj) { if (obj.hasOwnProperty(key)) { // 实现一个递归拷贝 cloneObj[key] = deepClone(obj[key], hash); } } return cloneObj;}如果没有 if (hash.get(obj)) return hash.get(obj);这段代码会有限递归上来。WeakMap是为了不烦扰垃圾回收机制:hash.set(obj, cloneObj);对obj产生的援用是弱援用。 ...

June 6, 2023 · 1 min · jiezi

关于javascript:Yjs代码简析

CRDT在多人合作畛域除了上一篇所介绍的OT算法,还有后起之秀CRDT (conflict-free replicated data type) 无抵触复制数据类型:是一种能够协调网络上多个正本达到一致性的算法。CRDT又分为两种实现:基于状态的CmRDT和基于操作的CvRDT;然而在理论利用的时候,基于状态的CmRDT的个别实用价值比拟低(数据传输体积更大),所以Yjs也是基于操作的CvRDT的一个实现。 CRDT VS OTOTCRDTOT 依赖中心化服务器实现合作CRDT 算法能够通过 P2P 的形式实现数据的同步为保障一致性,OT 的算法设计时的复杂度更高为保障一致性,CRDT 算法设计更简略OT 的设计更容易保留用户用意设计一个保留用户用意的 CRDT 算法更艰难OT 不影响文档体积CRDT 文档比原文档数据更大因为CRDT对于OT算法来说,解决抵触算法是固定的,齐全绕过过OT算法中的最难的中央transfrom办法的设计(transform的复杂度会随着operation类型增多快速增长,而且保障正确性也须要付出更多的工夫和精力)。 Lamport Clock在Yjs实现外面每个字符都是有一个惟一的id(clientId, clock),而外面的clock就是Lamport Clock。因为在分布式外面,所有的节点的时钟是很难放弃准确对立的,想通过赋予一个工夫戳给事件,而后比照事件的工夫戳还原出各个节点的事件程序简直无奈实现,所以Lamport Timestamp就被提出来,它通过节点之间替换信息,并应用logic clock而不是true lock来解决事件程序问题。例如上图A,B,C初始的clock都是0,当C1产生时就把本地clock+1,并播送给其余节点,当其余节点A,B接管到C的的播送的信息时就应用max(本地的clock, 接管的clock)尝试更新本地的clock,这样能够了解为A,B之后的事件是预感了C所产生事件才产生的,所以前面产生事件的clock都会比接管到的clock大。然而并不象征所有clock比拟大的事件就肯定在比拟小的事件前面产生:在图外面B3的clock就比A2小,然而A2的事件理论并不是在B3前面产生的(可能是同时,也可能在它之前),所以Lamport Clock存在肯定的局限性,并不能齐全能够从clock的大小就能推出所有事件间的程序,只能取得局部有序的事件序列。 Vector ClockVector Clock是在Lamport Clock根底上扩大而来。Vector Clock要求每个一个节点都有本人独立的clock,当有本地事件产生时候只更新本人节点的clock+1;而在播送音讯时要把节点整个Vector Clock传出去,当接管到音讯时须要遍历接管的Vector Clock上所有节点,并应用max(节点的clock,接管的节点clock)来更新。定义Va,Vb为事件A和B的Vector Clock,再定义Vb >= Va为Vb蕴含每个节点clock都大于等于Va上每个节点clock;那么就有Vb >= Va象征事件B会在A的前面产生,因为这样阐明B的事件产生的时候,是明确看到A的时间轴上的事件。如上图,大部分Vector Clock都能持续找到对应的>=关系,然而在同样的A2和B3地位上,是不存在A2 >= B3 也不存在 B3 >= A2的关系的,这样就阐明这里可能存在并发的事件,无奈确定精确的程序,这也是合乎预期的,并不会产生Lamport Clock那样的问题。 Yjs剖析数据结构Yjs提供丰盛的数据结构YArray, YMap, YText等,而且数据结构间还能够组合一起,这样能够利用这些组成更加简单的数据结构十分不便容易融入不同利用场景中。首先介绍外围构造Item。 Item作为Yjs最外围的构造,撑持其余所有构造的实现,所以如果可能把这个构造吃透,根本其余构造也是很容易了解。Item属性如下: type Item = { // 由[clientId, clock]组成,CRDT算法要求每个字符都调配一个id,而Yjs为了节俭空间,会把雷同clientId且间断的字符串合并成一个Item // 所以Item的id也就是第一个字符的id,而通过clock+字符串长度失去Item最初一个字符的id id: ID, left: Item | null, origin: ID | null, right: Item | null, ID: rightOrigin, parent: AbstractType<any>|ID|null, parentSub: string | null, content: AbstractContent, keep: boolean, // 用于redo/undo场景,防止Item过早回收 info: number, // 状态标记位}origin和rightOrigin指向的是Item插入时地位前后的字符的ID,次要是用在解决抵触的时候用来维持原始用户操作用意;left,right是Item的通过解决抵触后理论前后节点,所以Item是双向链表的构造,而且left,right在不会参加序列化传输的,只有origin,rightOrigin和content会被序列化传输过来;parent指向父节点(YText),parentSub当父节点内容是YMap时,parentSub就是key;而父节点内容是其余的时候就是为null了。content就是Item理论承载的内容能够是ContentString,ContentJSON,ContentDoc,ContentType等等。 ...

June 6, 2023 · 6 min · jiezi

关于javascript:ES2023来了深入解析JavaScript的最新更新

本文首发于微信公众号:大迁世界, 我的微信:qq449245884,我会第一工夫和你分享前端行业趋势,学习路径等等。更多开源作品请看 GitHub https://github.com/qq449245884/xiaozhi ,蕴含一线大厂面试残缺考点、材料以及我的系列文章。快来收费体验ChatGpt plus版本的,咱们出的钱体验地址:https://chat.waixingyun.cn能够退出网站底部技术群,一起找bug. 1.从数组开端查找元素这个函数容许咱们依据条件从数组的最初一个元素向前查找元素。例如: const array = [{a: 1, b: 1}, {a: 2, b: 2}, {a: 3, b: 3}, {a: 4, b: 4}]console.log(array.findLast(n => n)); //result -> {a: 4,b: 4 }console.log(array.findLast(n => n.a * 5 === 20)); // result -> {a:4,b:4} console.log(array.findLast(n => n.a * 5 === 21)); //result -> undefined console.log(array.findLastIndex(n => n.a * 5 === 21)); // result -> -1 console.log(array.findLastIndex(n => n.a * 5 === 20)); // result -> 3剖析: ...

June 6, 2023 · 2 min · jiezi

关于javascript:判断一个值是否为NaN

在js中,NaN的意思是not a number,它是一个比拟非凡的值。 NaN的个性首先,它是number类型。 typeof NaN; // number其次,尽管是number类型,然而咱们没法确定它的值到底是多少。 1 < NaN; // false1 == NaN; // false1 > NaN; // false因为没法确定NaN的值,所以即便是NaN本人跟本人也不相等。 let a = NaN;let b = NaN;a == b; // false那么,如何判断一个值是不是NaN呢,直接判断必定不行啊。 let a = NaN;a == NaN; // false用全局函数isNaN()全局 isNaN() 函数将测试值转换为数字,而后对其进行测试。 isNaN(123) //falseisNaN(-1.23) //falseisNaN(5-2) //falseisNaN(0) //falseisNaN('123') //falseisNaN('Hello') //trueisNaN('2005/12/12') //trueisNaN('') //falseisNaN(true) //falseisNaN(undefined) //trueisNaN('NaN') //trueisNaN(NaN) //trueisNaN(0 / 0) //trueisNaN(null) //false本人实现一个咱们的思路是:尽管NaN的值不确定,它连本人都不等于本人,然而它转换为字符串后的值是确定的,就是'NaN'。 NaN.toString(); // 'NaN'所以咱们能够把测试值转换为数字后,再转换为字符串,用失去的值去跟字符串'NaN'做比拟。 function isNaNFake(val) { return `${Number(val)}` == 'NaN';}

June 6, 2023 · 1 min · jiezi

关于javascript:推荐一个新的excel处理库-zurmokeeperexceljs支持xlsx文件的解密功能

举荐一个新的excel解决库, @zurmokeeper/exceljs, 要害性能,反对xlsx文件的解密性能,文档地址,我的项目地址, 齐全兼容exceljs 应用办法: 齐全兼容exceljs 所以原来对exceljs const ExcelJS = require('exceljs');能够间接换成const ExcelJS = require('@zurmokeeper/exceljs');其它API的应用放弃不变-------------------------------------------------const ExcelJS = require('@zurmokeeper/exceljs');// 从文件读取const workbook = new Excel.Workbook();await workbook.xlsx.readFile(filename);// 从文件读取, 解密应用明码加密的excel文件const workbook = new Excel.Workbook();await workbook.xlsx.readFile(filename, {password:'123456'});// ... 应用 workbook// 从流读取const workbook = new Excel.Workbook();await workbook.xlsx.read(stream);// 从流读取, 解密应用明码加密的excel文件const workbook = new Excel.Workbook();await workbook.xlsx.read(stream, {password:'123456'});// ... 应用 workbook// 从 buffer 加载const workbook = new Excel.Workbook();await workbook.xlsx.load(data);// 从 buffer 加载, 解密应用明码加密的excel文件const workbook = new Excel.Workbook();await workbook.xlsx.load(data, {password:'123456'});// ... 应用 workbook起因:须要实现一个读取WPS带明码窃密的excel性能,找遍了社区所有的库,都没有找到,一开始发现 xlsx-populate 反对解密,前面发现只反对 ecma376 agile encrytion。是当初office xlsx格局的加密形式,不是WPS的加密办法,所以无奈解密. ...

June 6, 2023 · 1 min · jiezi

关于javascript:前端食堂技术周刊第-85-期

美味值: 口味:龙井酥 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly本期摘要5 月登陆浏览器的新性能TypeScript 5.1Rspack 0.2.0Parcel v2.9.0Next.js 企业级模板SupportsCSSuseHooks大家好,我是童欧巴。欢送来到前端食堂技术周刊,咱们先来看下上周的技术资讯。 技术资讯1. 5 月登陆浏览器的新性能Firefox 113、Chrome 113、Chrome 114、Safari 16.5 公布稳固版本,咱们来看下 Chrome 稳固版本中的新性能。 其中,Chrome 113 公布了 WebGPU。First-Party Sets 将分阶段推出。对于 CSS,Chrome 113 包含 overflow-inline、overflow-block 媒体性能,还有 linear()。 Chrome 114 中反对 CSS text-wrap: balance、CHIPS、Popover API。 2. TypeScript 5.1TypeScript 5.1 正式公布,自 RC 版本以来的变动: 自从 RC 版本以来,对内置的重构进行了一些小改变,将申明移到现有的文件中;然而,这个实现还须要一些改良。因而,你可能无奈在大多数编辑器中应用它,只能通过应用 TypeScript 的 nightly 版本来抉择应用。预计在 TypeScript 5.2 或 TypeScript 5.1 的将来补丁版本中将会从新引入这个重构。 3. Rspack 0.2.0Rspack 0.2.0 公布,新增了诸多性能,如 realContentHash、DataURI、ESM format 的反对等,同时增强了与 Webpack 的兼容性,优化了诸多细节。另外,得益于对 Webpack API 良好的兼容性,对周边生态也实现了进一步的兼容,例如,测试实现了对 vue-loader 17(对应 Vue3)和 15(对应 Vue2)版本的兼容,能够尝试在 Vue2 / 3 我的项目中应用 Rspack 了。 ...

June 5, 2023 · 1 min · jiezi

关于javascript:简单优雅的JavaScript代码片段三合并请求成批发出

简略优雅的JavaScript代码片段文章系列:简略优雅的JavaScript代码片段(一):异步控制简略优雅的JavaScript代码片段(二):流控和重试简略优雅的JavaScript代码片段(三):合并申请,成批收回 场景阐明后端提供的接口具备批量查问能力(比方,同时查问10个资源的详情信息),然而调用者每次只须要申请一个资源的详情信息。 比方: import React from "react";const List = ({ ids }: { ids: string[] }) => { return ( <div> {ids.map((id) => ( <ResourceDetail key={id} id={id} /> ))} </div> );};const ResourceDetail = ({ id }: { id: string }) => { // 在这个组件申请资源详情并渲染... // 留神在这个组件中,你只关怀这一个资源的信息,你不再具备”整个列表“的数据视角。};// 后端接口反对同时申请多个资源的信息declare function api(ids: string[]): Promise<Record<string, { details: any }>>;这个时候,个别只有2个计划: 间接应用批量接口来申请单个资源的信息。在ResourceDetail组件中,间接调用api来申请以后资源的信息:api([id]),只传入以后资源ID。 益处是简略间接,易于了解;害处是没有将接口自身的批量申请能力利用起来,收回过多申请,导致接口流控限度或效率低下。将申请逻辑晋升至更高的组件档次,在具备”整个列表“的数据视角的时候进行批量申请。在下层的List组件中,批量申请多个资源的信息:api([id1, id2, ...]),而后将后果传递给子组件进行渲染。 益处是将接口自身的批量申请能力利用起来;害处是代码耦合严密(ResourceDetail依赖父组件帮它申请资源信息);代码逻辑设计投合技术因素,不合乎直觉;造成List组件职责扩充、逻辑简单(比方接口每次最多只能反对10个资源批量申请,因而你要将列表分为10个一组,别离申请)。有没有两败俱伤计划呢?既能让组件职责简略清晰,又能将接口自身的批量申请能力利用起来? 解决方案这篇文章介绍一个工具函数,将一个【批量申请】的接口转换成【单个申请】的接口:wrapBatchProcess。示例用法: // 先应用wrapBatchProcess工具将api转换成单个申请的接口// const wrappedAPI: (input: string) => Promise<{details: any}>const wrappedAPI = wrapBatchProcess<string, { details: any }>( async (inputs, onResult, onError) => { // 工具函数将「会集」成一大批申请,调用你提供的这个回调函数 // 因而你就能够在这个回调中同时解决一大批申请了! const result = await api(inputs.map(({ input }) => input)) Object.keys(result).forEach((key) => { // 申请到后果当前,将后果提供给工具函数,而后工具函数就会将后果提供给调用者 onResult(result[key], key) }) }, // getKey函数,在这个场景下比较简单。实现中的代码正文有解释 (input) => input)// 调用wrappedAPI,每次只须要传入一个申请。工具会主动合并申请,通过api来批量收回。// 后果达到当前,wrappedAPI会将【对应于这个申请的后果】返回回来wrappedAPI(id) // Promise<{details: any}>wrappedAPI实质上是一个申请的缓冲队列(buffer),尽管它一个一个地承受申请,然而它不会立刻将申请收回,而是期待一段时间(debounce),将申请累积起来,而后将累积起来的申请成批收回。 ...

June 5, 2023 · 3 min · jiezi

关于javascript:关于ifelse的优化

转载:https://ths.js.org/2020/09/30/if-else%E9%80%BB%E8%BE%91%E5%88...原作者:杨静

June 5, 2023 · 1 min · jiezi

关于javascript:解决element表单控制台提示-Error-in-von-handler-Promiseasync-false

在开发过程中,当表单不符合条件的时候,控制台会弹出一片红: 呈现这个问题是因为我的代码这样写: async submitForm(formName) { await this.$refs[formName].validate(); },起初参照官网:element-ui官网 async submitForm(formName) { await this.$refs[formName].validate((valid) => { if (valid) { console.log('表单校验通过,能够调取表单提交接口'); } else { console.log('表单须要填写'); return false; } }); },在表单的validate()办法外面有回调,返回的valid为true阐明表单验证胜利。通过这样写的形式控制台就不会呈现红色的提醒了。

June 5, 2023 · 1 min · jiezi

关于javascript:常见JavaScript加密算法JS加密算法

一、SHA-256加密算法     SHA-256是一种明码散列函数,能够将任意长度的消息压缩成256位的摘要值。以下是应用JavaScript实现SHA-256加密算法的代码示例: function sha256(message) { const crypto = require('crypto'); const hash = crypto.createHash('sha256'); hash.update(message); return hash.digest();}应用办法: const message = 'Hello World';const hashedMessage = sha256(message);console.log(hashedMessage); // 输入:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9二、Base64编码算法     Base64编码是一种将二进制数据转换为ASCII字符的编码方式,罕用于在网络上传输数据。以下是应用JavaScript实现Base64编码算法的代码示例: function encodeBase64(binaryData) { const base64 = require('javajs').base64; return base64.encode(binaryData);}应用办法: const binaryData = new Buffer(10); // 创立一个长度为10的二进制数据缓冲区binaryData.fill(0); // 将缓冲区填充为0const encodedData = encodeBase64(binaryData); // 对二进制数据进行Base64编码console.log(encodedData); // 输入:SGVsbG8gV29ybGQh三、RSA加密算法     RSA加密算法是一种非对称加密算法,可用于对数据进行加密和解密。以下是应用JavaScript实现RSA加密算法的代码示例: function encryptRSA(plainText, privateKey) { const crypto = require('crypto'); const encryptedData = new Buffer(0); // 创立一个空的二进制数据缓冲区 const publicKey = privateKey.publicKey; // 获取私钥对应的公钥对象 for (let i = 0; i < plainText.length; i++) { // 对明文进行逐字节加密 const byte = plainText[i].charCodeAt(0); // 将明文字节转换为数字类型 const publicByte = publicKey.getInt(byte); // 从公钥中获取对应的加密后的字节数据 encryptedData = crypto.encrypt('RSA-OAEP', privateKey, {name: 'RSA-OAEP'}, encryptedData); // 对明文进行RSA加密,并将加密后的数据追加到缓冲区中 } return encryptedData; // 返回加密后的数据缓冲区}应用办法: ...

June 5, 2023 · 2 min · jiezi

关于javascript:JavaScript深度剖析之变量函数提升从表面到本质

JavaScript深度分析之变量、函数晋升:从外表到实质前言系列首发于公众号『前端进阶圈』 ,若不想错过更多精彩内容,请“星标”一下,敬请关注公众号最新消息。想要彻底了解晋升这篇文章,除非你曾经了解了作用域、词法作用域、动静作用域、编译器、引擎 之间的分割,否则倡议你先从之前的文章读起。在前几篇文章中提到的作用域中的变量申明呈现的地位有着某种奥妙的分割,而这个分割就是本篇文章所探讨的内容。先有鸡还是先有蛋在咱们的直觉上 JavaScript 代码在执行时是一行一行执行的,其实并不完全正确,有一种状况会导致这个假如是谬误的。思考以下代码: a = 2;var a;console.log(a); // ?这里会输入什么呢?可能会有人认为会输入 undefined,因为 var a 申明是在 a = 2; 赋值之后的,他们会自然而然地认为变量被从新赋值了,因为会被赋予默认值 undefined。但正确的输入后果为 2;再思考另外一段代码: console.log(a); // ?这里会输入什么呢?var a = 2;鉴于上一个代码片段所体现出的某种非自上而下的行为特点,你可能会认为这段代码会输入 2。或者还有人可能认为,因为变量 a 在应用前没有当时被申明过,会抛出 ReferenceError 异样。然而,两种猜想都不会,正确的输入后果为 undefined。那到底还是先有鸡还是先有蛋?到底是申明(蛋)在前,还是赋值(鸡)在前?,让咱们带着这个问题接着向下看。编译器阶段依据后面分享的几篇文章咱们可得悉,引擎会在解释 JavaScript 代码之前会首先对其进行编译。而编译阶段中的一部分工作就是先找到所有的申明,并用适合的作用域将他们关联起来。因而,包含变量和函数在内的所有申明都会在任何代码被执行前首先被解决。当你看到 var a = 2; 时,你可能会认为这是一个申明。但 JavaScript 会将他们看成两个申明。var a 和 a = 2;。第一个定义申明是在编译阶段进行的,第二个赋值申明会被留在原地期待执行阶段。第一段代码的解析过程: var a; // 被晋升后的申明a = 2;// var a; // 留神, var a 会被晋升到顶部, 也就是下面提到的申明console.log(a); // 2第二段代码的解析过程: // var a;console.log(a); // undefinedvar a = 2;因而,这个过程就如同变量和函数申明从他们的代码中呈现的地位被"挪动"到了最下面,这个过程就叫做晋升。换句话说,先有蛋(申明)后有鸡(赋值)只有申明自身会被晋升,而赋值或其余运行逻辑会留在原地。如果晋升扭转了代码的执行程序,会造成十分重大的毁坏。思考以下代码: ...

June 2, 2023 · 2 min · jiezi

关于javascript:有JSDoc还需要TypeScript吗

这听起来是不是很耳熟:你想写一个小型脚本,不论是为页面、命令行工具,还是其余什么类型。你从JavaScript开始,直到你想起写代码时没有类型是如许苦楚。所以你把文件从.js重命名为.ts。而后意识到你曾经关上了一个麻烦的玩意儿。 如果你在为一个网站或一个库写代码,你就须要引入编译的步骤。如果你在编写CLI脚本,你能够求助于Deno(它反对TypeScript,开箱即用),然而你须要设置你的IDE来了解Deno的API,而且混合和匹配Deno和node并不总是那么容易。 一旦你在本地实现了所有工作,你就须要思考如何散发你的代码。你会查看你编译的.js文件吗?你会创立一个CI管道来主动编译你的.ts文件吗?如果你在写一个库,你如何公布你的库,以便它能够被其余我的项目应用? 你实际上不须要TypeScript问题是......你不须要为了取得动态类型剖析而编写TypeScript! 你能够通过应用JSDoc在JavaScript中取得TypeScript的所有益处TypeScript所提供的是一个动态类型零碎。这意味着类型信息在运行代码中没有影响。当你的TypeScript被执行时,所有的类型信息都会齐全失落(这就是为什么你不写一个类型守卫,就不能测试一个变量是否是某个类型的起因)。 这也意味着TypeScript只是提供给TypeScript分析器的额定类型信息,对运行你代码的JavaScript引擎没有任何意义。当你把TypeScript编译成JavaScript时,它基本上只是从你的代码中删除了所有的类型信息,所以它又变成了无效的JavaScript代码。 JSDoc在JavaScript诞生25年多后,JSDoc作为一种正文JavaScript代码的形式被引入。它是一种正式的标记语言,容许IDE在开发者看到一个函数时提供额定的上下文。 相似的正文标记存在于大多数语言中,我置信你曾经晓得它了。这就是它的样子: /** * This is the JSDOC block. IDEs will show this text when you hover the * printName function. * * @param {string} name */function printName(name) { console.log(name)}TypeScript 和 JSDoc较少人晓得的是,JSDoc是你充沛应用TypeScript所须要的。TypeScript分析器可能了解用JSDoc写的类型,并给你提供与.ts文件雷同的动态剖析。 我不会在这里提供残缺的语法文档。最重要的是你要晓得,简直所有你能在.ts文件中做的事件,你都能用JSDoc来做。但这里有几个例子: 带有原生类型的函数参数: /** * @param {string} a * @param {number} b */function foo(a, b) {}应用TypeScript提供的开箱即用的类型: /** * @param {HTMLElement} element * @param {Window} window */function foo(element, window) {}/** @type {number[]} */let years定义对象字面量和函数: ...

May 31, 2023 · 1 min · jiezi

关于javascript:RN从0到1系统精讲与小红书APP实战2023版

download:RN从0到1零碎精讲与小红书APP实战(2023版)WebGL底层着色器编写WebGL是一种基于OpenGL的图形API,用于在浏览器中出现3D和2D图形。它依赖于着色器来解决数据并渲染图像。 在这里,咱们将深刻理解WebGL底层的着色器编写过程,以及如何编写自定义着色器来创立各种成果。 什么是WebGL着色器?在WebGL中,着色器是用于在GPU上解决数据的程序。它们被用来渲染场景中的几何图形,并决定每个像素的输入色彩。WebGL着色器由两种类型组成:顶点着色器和片元着色器。 顶点着色器顶点着色器是在渲染前对所有顶点进行计算的程序。它们承受输出顶点并转换它们的地位,大小和方向等属性,以及任何其余的自定义操作。最终输入的是顶点的变换坐标等信息。 以下是一个简略的顶点着色器示例: glslattribute vec3 position; void main() { gl_Position = vec4(position, 1.0);}在这个着色器中,咱们申明了一个名为position的顶点属性,并将其传递到着色器中。而后,咱们通过vec4(position, 1.0)计算出变换后的顶点坐标,并将其赋值给gl_Position变量。 片元着色器片元着色器是在顶点着色器实现后对每个像素进行计算的程序。它们承受输出像素并计算输入色彩和透明度等属性。最终输入的是渲染场景中每个像素的色彩值等信息。 以下是一个简略的片元着色器示例: glslvoid main() { gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);}在这个着色器中,咱们间接将红色色彩值vec4(1.0, 0.0, 0.0, 1.0)传递给gl_FragColor变量,以此渲染出场景中所有像素的红色。 如何编写自定义着色器?为了创立本人的WebGL着色器,您须要理解如何应用着色器语言GLSL(OpenGL Shading Language)。GLSL是一种基于C语言的语言,用于编写着色器程序。 以下是编写自定义WebGL着色器的步骤: 编写顶点着色器程序顶点着色器程序应该包含两个次要局部:顶点属性和main函数。首先,申明所有须要用到的顶点属性。而后,编写main函数来对每个顶点进行计算,并输入变换后的地位信息。 编写片元着色器程序片元着色器程序应该只包含一个main函数,它承受输出像素并计算输入色彩和透明度等属性。 将着色器程序与WebGL上下文链接应用createShader()办法创立一个新的shader对象,并应用shaderSource()办法将GLSL代码传递给它。而后,应用compileShader()办法编译着色器。最初,将顶点着色器和片元着色器链接在一起,造成一个可用于渲染场景的程序。 在WebGL上下文中启用着色器程序应用useProgram()办法启用您的着色器程序。这将使WebGL应用您的着色器来渲染

May 31, 2023 · 1 min · jiezi

关于javascript:面试题第一期

1.如何让3个元素的四个间距平分盒子 justify-content: space-evenly; space-between:两端对齐,我的项目之间的距离是相等的(n-1个距离)space-evenly:平均排列每个元素,每个元素之间的距离相等(n+1)第二种:margin-left:calc((100%-4*元素宽度)/4) 2.promise.all 个性是一个报错就进行 怎么让一个报错后拿到其余的数据 Promise.allSettled() 办法是 promise 并发性办法的其中之一。在你有多个不依赖于彼此胜利实现的异步工作时,或者你总是想晓得每个 promise 的后果时,应用 Promise.allSettled() 。相比之下,如果工作相互依赖,或者如果你想立刻回绝其中任何工作,Promise.all() 返回的3.写一个弹窗拖拽的性能 1.按下鼠标时触发onmousedown事件,获取元素地位(diffX=e.clientX - drag.offsetLeft)2.挪动时触发onmousemove事件,设置边界值(e.clientX - diffX)3.抬起鼠标时onmouseup(this.onmousemove = null this.onmouseup = null) window.onload = function() { //获取drag元素 let drag = document.getElementById("drag") //当鼠标按下时 drag.onmousedown = function(e) { //做到浏览器兼容 e = e || window.event let diffX = e.clientX - drag.offsetLeft let diffY = e.clientY - drag.offsetTop //当拉着box挪动时 document.onmousemove = function(e) { // 浏览器兼容 e = e || window.event let left = e.clientX - diffX let top = e.clientY - diffY if (left < 0) { left = 0 } else if (left > window.innerWidth - drag.offsetWidth) { left = window.innerWidth - drag.offsetWidth } if (top < 0) { top = 0 } else if (top > window.innerHeight - drag.offsetHeight) { top = window.innerHeight - drag.offsetHeight } drag.style.left = left + 'px' drag.style.top = top + 'px' } // 当鼠标抬起时 document.onmouseup = function(e) { this.onmousemove = null this.onmouseup = null } }}4.敞开弹窗的办法? ...

May 30, 2023 · 1 min · jiezi

关于javascript:实时音频播放

需要还是上个学校的我的项目,须要实时播放音频。 拾音器有一个rtsp的地址,而后去找了很多插件,前端能够间接解析用的,尝试了很多办法,ff什么的都没有实现,可能是没有找对办法,我感觉再这么上来必定不能按期交付了,所以和后盾沟通了一下,还是通过websocket传输二进制,前端拿到后再解析,而后去播放。ok,有思路了就开始实现。 实现步骤websocket连贯,这里websocket不做过多解释,具体可看上篇文章。// 因为需要是须要点击之后开始播放,所以须要在useEffect中写,而是在点击事件里。 const playAudio = async (data: any) => { const ws2 = new WebSocket(url2); setAudioSocket(() => ws2) }定义相干回调函数useEffect(() => { if (audioSocket) { audioSocket.binaryType = 'blob'; audioSocket.onopen = () => { console.log('音频链接上拉!!') }; audioSocket.onmessage = (data: any) => audioAcceptMessage(data); audioSocket.onclose = () => audioWebSocketOnClose(); audioSocket.onerror = () => audioWebSocketOnError(); return () => { audioSocket.close(); receivedBlobs = [] } } }, [audioSocket])3.解决音频数据,过后有尝试过各种缓存的api办法,然而都不现实。所以尝试了其余形式 // 该链接后盾返回的是blob对象,而且是不间断的始终传送,每次解析进去的音频只有0.05秒左右,所以须要思考做累加。const audioAcceptMessage = async ({ data }: any) => { if (data) { console.log(data, '数据失常传输中') // receivedBlobs为全局定义的数组,用来存储后盾的数据 receivedBlobs.push(data) } else { // 无接收数据 } }4.实现形式1,手动缓存,并解决播放。 ...

May 30, 2023 · 3 min · jiezi

关于javascript:iframe基本用法

子级(登录) <div class="login"> <form > <div class="form-item"> <label for="username">用户名:</label> <input type="text" name="username" id="username" placeholder="请输出用户名"> </div> <div class="form-item"> <label for="password">明码:</label> <input type="text" name="password" id="password" placeholder="请输出明码"> </div> <div class="form-item"> <input type="submit" value="登录"> </div> </form> </div><script> // 监听父级传递过去的数据 window.addEventListener('message', function(e) { console.log('父widonw传递过去的数据:',JSON.parse(e.data)); }) const form = document.querySelector('form'); form.addEventListener('submit', function(e) { e.preventDefault(); // 获取用户名 const username = document.querySelector('#username').value; // 获取明码 const password = document.querySelector('#password').value; window.parent.postMessage({username, password}, '*'); }) </script>父级<body> <iframe src="./login.html" id="iframeByLogin"></iframe> <script> // 监听子级传递过去的数据 window.addEventListener('message', function(e) { console.log('子(登录iframe)传递过去的数据:',e.data ); }) const _iframeLogin = document.querySelector('#iframeByLogin'); _iframeLogin.onload = function() { let param = { username: 'admin', password: '123456' } _iframeLogin.contentWindow.postMessage(JSON.stringify(param), '*'); } </script> </body>

May 29, 2023 · 1 min · jiezi

关于javascript:TS-分享一个类型支持非常完善的-object-path-package

之前用过波及到 object path 的一些 package ,然而发现这些 packages 的类型反对不是特地欠缺,比方 lodash, react-hook-form, formik, mongodb client 等。 这些 packages ,或多或少存在的几个问题是: 没有类型束缚,不能提供代码主动实现;生成的 path 不是规范的,大部分只反对 'a.b.c' 这种,这种 path 有一些毛病,与其余 package 不对立(例如 yup ),不能辨别 object/array ,大部分都是判断如果是数字就当成数组解决,然而理论可能是 number key 的 object ;不能通过 path 反推出对应的类型。因为我在写 react-happy-form 这个开源我的项目的时候,对 object path 这块需要比拟高,所以就本人独自写了 object-standard-path 这个 package: 提供了十分欠缺的类型反对(包含对一些非凡类型 any, Map 等的解决);生成的是规范的 path ;反对应用 path 对类型进行反推。应用起来也非常简单,没有任何依赖,1k 不到的包体积,如果有需要的话,大家能够试试 :) Repo 地址: https://github.com/react-earth/object-standard-path 能够的话,能够小点个 star ,每个 star 都是我当前继续更新的能源,感激! import { Path, PathValue, pathGet, pathSet } from 'object-standard-path';type Test = { value: string; array: { value: string; }[];};type TestPath = Path<Test>;// result: "value" | "array" | `array[${number}]` | `array[${number}].value`type TestPathValue = PathValue<Test, 'array[0]'>;// result: { value: string }const object = { array: [ { value: 1, }, ],};const result = pathGet(object, 'array[0].value');// result: 1pathSet(object, 'array[0].value', 2);// result: { array: [{ value: 2 }] }

May 29, 2023 · 1 min · jiezi

关于javascript:前端食堂技术周刊第-84-期

By Midjournery 美味值: 口味:葡萄冰萃美式 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly本期摘要第 96 届 TC39 会议Deno 五周年JavaScript 平安最佳实际介绍 popover API挪动端浏览器性能优化摸索2023 Node.js 性能现状一文彻底搞懂前端沙箱大家好,我是童欧巴。欢送来到前端食堂技术周刊,咱们先来看下上周的技术资讯。 技术资讯1. 第 96 届 TC39 会议近期举办了第 96 届 TC39 会议,咱们来看下处于 Stage 4 和 Stage 3 阶段的提案: Stage 4Atomics.waitAsyncRegExp v flagWell-Formed Unicode StringsStage 3Decorator MetadataFloat16Array2. Deno 五周年祝 Deno 五岁生快,上面是 Deno 最近的一些新动静: Deno 1.34Deno Deploy 反对导入 Node.js 内置模块新的 Deno Deploy ChangelogDeno KV 上面咱们来看技术材料。 技术材料1. JavaScript 平安最佳实际在网络威逼日益简单的时代,了解如何编写平安的 JavaScript 代码比以往任何时候都更重要。不仅仅是理解语法和 API,更重要的是了解生态系统,潜在的陷阱,歹意行为者应用的攻打路径,以及能够帮忙加重这些危险的策略。本文给出了事实世界中的例子,并探讨了解决方案。 2. 介绍 popover API浏览器原生反对 popover API。 ...

May 29, 2023 · 1 min · jiezi

关于javascript:记录websocket的使用实现断网重连和心跳机制

需要校园平安告警的我的项目,其中一个须要实现的性能就是能够实时告警,简略来说,是后盾通过接管校园里拾音器的关键词告警当前,推送到前端,前端弹窗提醒告警,做出解决。所以采纳了webSocket来实现。 根本应用这里用正则判断url地址的前缀并替换,前面是后盾接口地址,最初是用户ID(后盾所需参数)const url = `${baseURL.replace("https://", "ws://").replace("http://", "ws://")}/websocket/api/${userId}`;而后在useEffect中写入连贯,组件销毁的时候再去敞开连贯。// webSocket 连贯状态const [isConnect, setIsConnect] = useState<number>(-1);const [socket, setSocket] = useState<any>(null);useEffect(() => { const ws = new WebSocket(url); setSocket(ws); return () => { ws.close(); };}, []);3.在新的useEffect中定义各个状态的回调。 useEffect(() => { if (socket) { //onopen是webSocket连贯胜利后的回调,能够在这里打印一下,如果胜利打印,则代表连贯胜利 socket.onopen = () => { setIsConnect(1) }; //WebSocket协定只容许字符串或二进制类型的数据传输 //onmessage是承受到数据后的回调 socket.onmessage = (data: string) => acceptMessage(data); //onclose是连贯敞开后的回调。前面均为自定义函数,能够在新的函数里写本人的业务逻辑 socket.onclose = () => webSocketOnClose(); socket.onerror = () => webSocketOnError(); }}, [socket]);4.接管音讯,在这一步,后盾推送音讯过去后打印进去,就代表胜利接管,能够写本人业务逻辑了。 const acceptMessage = ({ data }: string) => { console.log(data)}5.前端断网重连性能,场景大略就是如果前端网络中断了当前,websocket就断开了,这时候网络复原后,是不会主动重连的,所以加上这两个监听就能够实现了。 ...

May 29, 2023 · 2 min · jiezi

关于javascript:从-0-开始编写一个vite打包产物分析插件vitepluginstatshtml

前言NPM地址:vite-plugin-stats-html源码地址:vite-plugin-stats-html 在本文中,咱们将解说如何从0开始编写一个Vite打包产物剖析插件工具,在你的vite构建的我的项目里,执行打包命令后,能生成一个打包产物剖析报告html页面,这个网页会从多个角度展现打包产物的细节信息,从资源文件信息到第三方依赖等等,该报告蕴含以下内容(如下图): 我的项目门路,打包一共破费工夫,打包日期打包总体积,JS 文件体积,CSS 文件体积,以及饼状图显示的打包产物占比打包出的文件数量,入口点指定的所有模块及其依赖项,产物中援用的第三方依赖的数量同时咱们也提供了相似 WebpackBundleAnalyzer/ rollup-plugin-visualizer 的工具,能够帮忙咱们更好的理解产物内容,可视化的依赖的援用关系表格展现打包的出的文件,蕴含文件类型,文件大小,外面援用第三方依赖数量 装置体验// npm npm install --save-dev vite-plugin-stats-html// or via yarnyarn add --dev vite-plugin-stats-html在 vite里配置 (vite.config.js) // esimport { visualizer } from "vite-plugin-stats-html";// or// cjsconst { visualizer } = require("vite-plugin-stats-html");module.exports = { plugins: [visualizer()],};通过在vite构建的我的项目中执行我的项目打包命令 npm run build// or yarn build...在打包完结后会在我的项目根目录下主动生成一个 stats.html文件,你能够在浏览器关上查看生成的报告。 本文目录(一)打包产物剖析的意义(二)Vite插件开发常识筹备(三)Vite插件性能开发合成(四)打包公布(五)Vite插件总结 本插件开发次要参考以下插件:(1) perfsee 性能剖析平台 (2) rollup-plugin-visualizer 一、打包产物剖析的意义作为前端人,优化和性能始终是绕不开的话题,对前端打包产物进行剖析是十分必要的环节,前端应用程序的打包产物通常蕴含了代码、款式、图片、字体等资源,这些资源的大小和依赖关系都会对应用程序的性能和用户体验产生影响。 在Webpack构建的我的项目理论开发中,咱们能够应用例如Webpack Bundle Analyzer、Source Map Explorer等工具来剖析打包产物,对于vite构建的我的项目中,罕用的也有rollup-plugin-visualizer等工具,生成一个交互式的依赖关系图表,用于展现应用程序的依赖关系和模块大小,帮忙咱们可视化剖析打包产物,从而理解应用程序的资源占用状况和依赖关系。 通过打包产物剖析,咱们能够理解以下内容: 打包产物的大小:理解应用程序的资源占用状况,从而优化应用程序的性能和用户体验。打包产物的依赖关系:理解应用程序的模块化水平,从而使得应用程序更加易于保护和扩大。打包产物的性能:理解应用程序的性能瓶颈,从而优化应用程序的性能和用户体验。打包产物的品质:理解应用程序的代码标准、可读性、可维护性等方面,从而进步应用程序的品质和可靠性。二、Vite插件开发常识筹备在编写插件之前,咱们必须先具备Vite插件开发前的常识筹备。 2.1 Vite构建机制Vite 应用 Rollup 作为生产环境的构建工具。Rollup 会对我的项目中的代码进行动态剖析,找出所有的模块依赖关系。这个过程中,Vite 会解决各种资源文件,如 CSS、图片等,并将它们转换为适合的模块。所以正如Vite官网上所形容,咱们能够失去论断,vite插件,它具备兼容rollup插件的钩子和领有本人的独有的钩子。 ...

May 29, 2023 · 3 min · jiezi

关于javascript:可视化搭建-场景实战

接下来用实战来阐明该可视化搭建框架是否好用,以下几条准则须要始终贯通在上面每个实战场景中: 简单的业务场景,背地应用的框架 API 是简略的。底层 API 并不为业务场景非凡编写,而是具备很强的抽象性,很容易挖掘出其余业务场景的用法。所有场景都是基于无限的几条根底规定实现,即背地实现的复杂度不随着业务场景复杂度晋升而晋升。上卷下钻上卷下钻其实是 组件作用于本身的筛选。 所以上卷下钻背地的实现原理应该与筛选、联动一样。利用 setValue 在点击下钻按钮时,批改组件本人的 value,而后通过 valueRelates 让该组件的联动作用于本身,剩下的逻辑就和一般筛选、联动没有太多区别了,区别仅仅是联动触发源是本人: import { ComponentMeta } from "designer";const chart: ComponentMeta = { componentName: "chart", element: Chart, // 利用 runtimeProps 将组件 value 映射到 props.value,将 props.onChange 映射为 setValue 批改本身 value runtimeProps: ({ selector, setValue, componentId }) => ({ value: selector(({ value }) => value), onChange: (value: string) => setValue(componentId, value), }), // 本人联动本人 valueRelates: ({ componentId }) => [ { sourceComponentId: componentId, targetComponentId: componentId, }, ], fetcher: ({ selector }) => { // relates 可能来自本人、其余筛选器组件实例,或者其余图表组件实例 const relates = selector(({ relates }) => relates); // 依据 relates 下钻 ... },};上卷下钻就是作用于本身的联动。 ...

May 29, 2023 · 3 min · jiezi

关于javascript:智能社原生的力量原生JavaScript开发高级课程等闲识得东风面

智能社原生的力量——原生JavaScript开发高级课程download:3w zxit666 com设计与落地利用:如何实现创意的变现设计是一个充斥创造力和想象力的畛域。然而,在真正将设计成绩转化为商业价值之前,必须将其落地利用。在这篇文章中,咱们将探讨如何将创意设计变成具备商业意义的产品,并让它们胜利地落地利用。 了解用户需要在设计初期,理解用户需要是至关重要的。如果设计师没有思考到指标用户的需要、偏好和行为,那么他们的设计可能会不足吸引力和市场竞争力。因而,发展用户考察和剖析至关重要,以确保设计合乎指标用户的冀望。 例如,如果你正在设计一款游览应用程序,那么你须要理解用户旅行时须要什么样的信息和性能。你能够通过市场调研、问卷调查和用户测试来获取这些信息,而后将其融入到你的设计中。 放弃简洁明了的设计在设计过程中,放弃简单明了的设计是十分重要的。不要试图在设计中增加太多简单或无关的元素,因为这样只会让用户感到困惑和不舒服。 相同,你应该专一于提供有用且易于应用的性能和信息。这意味着你须要将重点放在最重要的元素上,应用清晰的界面和设计语言,并尽可能减少冗余或多余的内容。 落地利用:确保技术实现一旦设计实现,就须要思考如何实现它。在这个阶段,你须要评估不同的技术实现计划,并抉择最适宜你的需要和估算的解决方案。 这包含抉择开发平台、编程语言和数据架构等。你还须要思考用户体验,确保应用程序在各种设施和屏幕尺寸下都可能良好地工作。 优化和测试实现技术实现后,你须要进行优化和测试,以确保应用程序在理论应用中表现出色。这包含测试应用程序的性能、安全性和可靠性,以及查看应用程序是否合乎用户需要和冀望。 如果发现任何问题或缺点,你须要对其进行修复和调整,以确保应用程序具备高质量和稳定性。 推广和营销最初,你须要思考如何推广和营销你的应用程序。这包含确定你的指标受众、创立无效的营销策略、制作丑陋的宣传材料和应用各种数字营销渠道进行推广。 通过无效的推广和营销,你能够让更多的用户理解你的应用程序,并将其下载和应用。这将为你的业务带来更多的收益,并使你的设计成绩最终落地胜利。 总之,设计与落地利用是一个非常复杂和多方面的过程。然而,如果你可能了解用户需要、放弃简单明了的设计、确保技术实现、优化和测试,并进行无效的推广和营销,那么你就可能将创意设计变成具备商业价值的产品并为业务带来胜利。

May 28, 2023 · 1 min · jiezi

关于javascript:基于-Axios-封装业务请求库

因为须要基于 axios 封装本人业务申请库,次要解决问题就是把通用操作封装,缩小反复操作,同样响应错误码进行集中管理,这样能够更加偏重在业务上的开发. 封装本人的业务插件,做到如下两点: 不减少用户应用老本(应用行为上同 axios 一样)可扩大保留原有行为假如插件的应用形式与 axios 齐全不一样,对于用户来说须要相熟老本,同样没方法做到平替(能够察看websocket-reconnect - npm第三方库,基于 websocket 进行封装,保留原生 websocket 相应的入参、事件。只是其根底上封装重连等性能)。 可扩大可扩大 毫无疑问也很重要: 能够提供默认值(缩小用户传参),容许内部去批改内部能够通过某种形式去干涉申请、响应(拦截器)接下来简略封装一下保留原有行为很好实现,咱们只须要把 axios 实例返回即可。 import axios, { AxiosRequestConfig } from 'axios';import { ResultCodeEnum, ErrorCodeMap } from './code';import { onRequestFulfilled, onRejected } from './requestInterceptor';import { onResponseFulfilled, onResponseRejected } from './responseInterceptor';// 默认参数const defaultOptions: AxiosRequestConfig = { baseURL: '', timeout: 15000,};// 扩大参数export interface Options extends AxiosRequestConfig { getToken?: () => string; loginOut?: () => void; notify: (msg: string) => void;}// 导出申请状态码export { ResultCodeEnum, ErrorCodeMap };// 导出申请办法export default function request(options?: Options) { // 合并选项 let optionsConfig: Options; if (options) { optionsConfig = { ...options, ...defaultOptions, notify: options?.notify && typeof options.notify === 'function' ? options.notify : (message) => { console.error(message); }, }; } else { optionsConfig = { ...defaultOptions, notify: (message) => { console.error(message); }, }; } // 创立实例 const instance = axios.create(optionsConfig); // 增加申请拦截器 instance.interceptors.request.use((config) => { return onRequestFulfilled(config, optionsConfig); }, onRejected); // 增加响应拦截器 instance.interceptors.response.use( (response) => { return onResponseFulfilled(response, optionsConfig); }, (error) => { return onResponseRejected(error, optionsConfig); } ); return instance;}// requestInterceptor.tsimport { AxiosError, AxiosRequestConfig } from 'axios';import { Options } from './request';export function onRequestFulfilled( config: AxiosRequestConfig, optionsConfig: Options) { if (config.headers) { if (optionsConfig && optionsConfig.getToken && optionsConfig.getToken()) { config.headers.Authorization = optionsConfig.getToken(); } } return config;}export function onRejected(error: AxiosError) { return Promise.reject(error);}// responseInterceptor.tsimport { AxiosError, AxiosResponse } from 'axios';import { ResultCodeEnum } from './code';import { Options } from './request';export function onResponseFulfilled( response: AxiosResponse, optionsConfig: Options) { const { data } = response; if (data.code !== ResultCodeEnum.SUCCESS) { optionsConfig.notify(data.message); if ( data.code === ResultCodeEnum.TOKEN_EXPIRE || data.code === ResultCodeEnum.TOKEN_FAIL ) { if (optionsConfig && optionsConfig.loginOut) { optionsConfig.loginOut(); } } return Promise.reject(new Error(data.message || 'Error')); } return data;}export function onResponseRejected(error: AxiosError, optionsConfig: Options) { // 解决 500 状态码 if (error.response) { const { status } = error.response; if (status === 500) { optionsConfig.notify('服务开小差了!!!'); } else if (status === 404) { optionsConfig.notify('资源找不到!!!'); } else if (status === 401) { optionsConfig.notify('无权限拜访!!!'); } else if (status === 403) { optionsConfig.notify('回绝拜访!!!'); } } else { // 申请超时 if (error.code === 'ECONNABORTED') { optionsConfig.notify('申请超时'); } } return Promise.reject(error);}// code.tsenum ResultCodeEnum { SUCCESS = 'SUCCESS', // 操作胜利 BIZ_ERROR = 'BIZ_ERROR', // 业务解决异样 INTERFACE_SYSTEM_ERROR = 'INTERFACE_SYSTEM_ERROR', // 内部接口调用异样 CONNECT_TIME_OUT = 'CONNECT_TIME_OUT', // 零碎超时 NULL_ARGUMENT = 'NULL_ARGUMENT', // 参数为空 ILLEGAL_ARGUMENT = 'ILLEGAL_ARGUMENT', // 参数不非法 ILLEGAL_REQUEST = 'ILLEGAL_REQUEST', // 非法申请 METHOD_NOT_ALLOWED = 'METHOD_NOT_ALLOWED', // 申请办法不容许 ILLEGAL_CONFIGURATION = 'ILLEGAL_CONFIGURATION', // 配置不非法 ILLEGAL_STATE = 'ILLEGAL_STATE', // 状态不非法 ENUM_CODE_ERROR = 'ENUM_CODE_ERROR', // 谬误的枚举编码 LOGIC_ERROR = 'LOGIC_ERROR', // 逻辑谬误 CONCURRENT_ERROR = 'CONCURRENT_ERROR', // 并发异样 ILLEGAL_OPERATION = 'ILLEGAL_OPERATION', // 非法操作 REPETITIVE_OPERATION = 'REPETITIVE_OPERATION', // 反复操作 NO_OPERATE_PERMISSION = 'NO_OPERATE_PERMISSION', // 无操作权限 RESOURCE_NOT_FOUND = 'RESOURCE_NOT_FOUND', // 资源不存在 RESOURCE_ALREADY_EXIST = 'RESOURCE_ALREADY_EXIST', // 资源已存在 TYPE_UN_MATCH = 'TYPE_UN_MATCH', // 类型不匹配 FILE_NOT_EXIST = 'FILE_NOT_EXIST', // 文件不存在 LIMIT_BLOCK = 'LIMIT_BLOCK', // 申请限流阻断 TOKEN_FAIL = 'TOKEN_FAIL', // token校验失败 TOKEN_EXPIRE = 'TOKEN_EXPIRE', // token过期 REQUEST_EXCEPTION = 'REQUEST_EXCEPTION', // 申请异样 BLOCK_EXCEPTION = 'BLOCK_EXCEPTION', // 接口限流降级 SYSTEM_ERROR = 'SYSTEM_ERROR', // ❌零碎异样}const ErrorCodeMap = { [ResultCodeEnum.SUCCESS]: '操作胜利', [ResultCodeEnum.BIZ_ERROR]: '业务解决异样', [ResultCodeEnum.INTERFACE_SYSTEM_ERROR]: '内部接口调用异样', [ResultCodeEnum.CONNECT_TIME_OUT]: '零碎超时', [ResultCodeEnum.NULL_ARGUMENT]: '参数为空', [ResultCodeEnum.ILLEGAL_ARGUMENT]: '参数不非法', [ResultCodeEnum.ILLEGAL_REQUEST]: '非法申请', [ResultCodeEnum.METHOD_NOT_ALLOWED]: '申请办法不容许', [ResultCodeEnum.ILLEGAL_CONFIGURATION]: '配置不非法', [ResultCodeEnum.ILLEGAL_STATE]: '状态不非法', [ResultCodeEnum.ENUM_CODE_ERROR]: '谬误的枚举编码', [ResultCodeEnum.LOGIC_ERROR]: '逻辑谬误', [ResultCodeEnum.CONCURRENT_ERROR]: '并发异样', [ResultCodeEnum.ILLEGAL_OPERATION]: '非法操作', [ResultCodeEnum.REPETITIVE_OPERATION]: '反复操作', [ResultCodeEnum.NO_OPERATE_PERMISSION]: '无操作权限', [ResultCodeEnum.RESOURCE_NOT_FOUND]: '资源不存在', [ResultCodeEnum.RESOURCE_ALREADY_EXIST]: '资源已存在', [ResultCodeEnum.TYPE_UN_MATCH]: '类型不匹配', [ResultCodeEnum.FILE_NOT_EXIST]: '文件不存在', [ResultCodeEnum.LIMIT_BLOCK]: '申请限流阻断', [ResultCodeEnum.TOKEN_FAIL]: 'token校验失败', [ResultCodeEnum.TOKEN_EXPIRE]: 'token过期', [ResultCodeEnum.REQUEST_EXCEPTION]: '申请异样', [ResultCodeEnum.BLOCK_EXCEPTION]: '接口限流降级', [ResultCodeEnum.SYSTEM_ERROR]: '❌零碎异样',};export { ResultCodeEnum, ErrorCodeMap };下面封装只做几件事: ...

May 27, 2023 · 5 min · jiezi

关于javascript:虚拟列表实现微信聊天记录查看功能

这个性能是pc端程序,实现手机端微信聊天记录查看性能性能问题点1,默认看到的记录是倒序排列,页面最底下一条是最近一条音讯2,聊天记录可能存在有限往上翻阅的状况,dom无奈承载如此多音讯,须要应用虚构列表3, 向上向下翻阅过程中,滑动到上一页或者下一页如何定位以后页面最初一条第一条在以后,丝滑加载,不呈现‘闪跳’状况4,动静加载,思考接口性能,一次申请数据不能太多,如何保护整个音讯列表信息 一,音讯记录数据结构须要一个msgData字段来存储所有从接口返回来的音讯,{data,random}随机数用于示意数据向下传递时示意是更新,初始值是0,每一条音讯都有一个msgId字段,用于标识以后收到的音讯记录中历史最远的一条记录id。音讯上滑下滑依据滑动方向,以及msgId能够判断是从内存取数据还是额定申请接口。 二,数据展现传入的random字段用于标识是第一次传入还是数据更新,如果是第一次传入,新建一个宏工作,计算传入数据展现成相应元素之后的高度, const virtualItems = document.getElementById('vir-scroll'); virtualItems.scrollTop = timeFilter ? 0 : virtualItems.scrollHeight; // 如果timefilter 为真,scroll到顶部 currentScroll = timeFilter ? 0 : virtualItems.scrollHeight;如果是更新,须要计算目前内存中数据条数(数量小于显示界面数据阈值就追加)以及滚动方向,来获取相应的显示数据。计算过程中,累加元素的getBoundingClientRect().height来计算以后展现元素的高度,计算高度的同时,还须要把对应的dom元素渲染到页面中。 滚动 const scrollTop = virtualRef.current.scrollTop; direction = scrollTop < currentScroll ? 'down' : 'up'; currentDirection = direction; currentScroll = scrollTop; // 计算滚动条到底部间隔,保障异步加载元素地位不变的要害 bottomDistance = virtualRef.current.scrollHeight - virtualRef.current.clientHeight - virtualRef.current.scrollTop; const lastMsgId = direction === 'up' ? +items[items.length - 1]?.key : +items[0]?.key; const indx = wrapperData?.data?.findIndex((elm:any) => elm.msgTime === lastMsgId);滚动时须要计算以后滚动方向,依据方向再进行上面的计算,这里须要分为上滑和下滑。下滑到底时,如果间隔顶部小于50,就要触发计算,依据以后页面元素第一条的索引值去内存中找15条,以后页面元素尾部去掉15条从新拼凑成须要展现到页面的残缺数据,而后计算出scrollHeight,实现顺滑滑动。上滑到顶,间隔底部小于50,触发计算,计算形式和下滑相同。 ...

May 27, 2023 · 1 min · jiezi

关于javascript:快捷转换互转-Markdown-文档和-TypeScriptTypeDoc-注释

背景作为文档工具人,常常须要把代码外面的正文转换成语义化的 Markdown 文档,有时也须要进行反向操作。以前是写正则表达式全局匹配,工夫长了这种形式也变得繁琐乏味。所以写了脚本来互转,减少一些便捷性。 解决方案正文转 Markdown下载地址:https://github.com/mazeyqian/go-gin-gee/releases/tag/v1.2.0 操作步骤: 跟本身零碎下载文件 convert-typedoc-to-markdown-mac-darwin-amd64/...在同个目录下新建一个文件夹 data在文件夹 data 内新建一个文件 td2md.js在将须要被转换的正文放在文件 td2md.js执行 convert-typedoc-to-markdown-mac-darwin-amd64/...在文件 data/td2md.md 内查看最新后果 Markdown 转正文下载地址:https://github.com/mazeyqian/go-gin-gee/releases/tag/v1.3.0 操作步骤: 跟本身零碎下载文件 convert-markdown-to-typedoc-mac-darwin-amd64/...在同个目录下新建一个文件夹 data在文件夹 data 内新建一个文件 md2td.md在将须要被转换的正文放在文件 md2td.md执行 convert-markdown-to-typedoc-mac-darwin-amd64/...在文件 data/md2td.js 内查看最新后果 应用案例GitHub:https://github.com/mazeyqian/mazey/tree/v3.7.4/scripts/convert 版权申明 本博客所有的原创文章,作者皆保留版权。转载必须蕴含本申明,放弃本文残缺,并以超链接模式注明作者后除和本文原始地址:https://blog.mazey.net/3494.html

May 26, 2023 · 1 min · jiezi

关于javascript:数组方法findfilterfindIndex简介

前言ES6提供了很多新的API,数组对象的尤为实用,然而如果咱们没有在绝对应的开发环境下,很难对这些API有深刻的理解,毕竟实际出真知。find、filter、findIndex这三个办法都是对于数组的查找,其中返回的值稍微相干,所以在这里做一个介绍。 Array.prototype.find()这是一个数组原型上的办法,调用格局应该是应用数组对象来调用,该办法接管一个回调函数callback,如:array.find(callback)。find办法用处是 查找符合条件的第一个数组元素例子: var array = [1,4,6,7,9,11,13];//需要: 查找大于10的第一个数function callback(elem){ return elem > 10;}var dayu10 = array.find(callback);console.log(dayu10); // 11如果找不到,返回undefined例子: var array = [1,4,6,7,9,11,13];//需要: 查找大于100的第一个数function callback(elem){ return elem > 100;}var dayu100 = array.find(callback);console.log(dayu100); // undefined很显然,这个办法比拟适宜用来 判断数组内是否蕴含某种条件的值的元素。或者进一步扩大,查找json数组内蕴含某个值的对象。如下: var array = [ {name:'xxa',age: 15}, {name:'xxb',age:18}];var xx = array.find(elem => elem.name === 'xxa');console.log(xx); // {name:'xxa',age: 15}Array.prototype.findIndex()作为原型上的办法,调用和参数与find雷同。顾名思义,这个比照find办法,这个办法返回的是符合条件的元素的下标index。例子: var array = [1,4,6,7,9,11,13];//需要: 查找大于10的第一个数function callback(elem){ return elem > 10;}var dayu10index = array.find(callback);console.log(dayu10index); // 5如果找不到,返回-1,这点相似字符串查找的indexOf或者正则表达式的search,总而言之,无论什么查找办法,找不到就是-1.例子: var array = [1,4,6,7,9,11,13];//需要: 查找大于100的第一个数function callback(elem){ return elem > 100;}var dayu100index = array.find(callback);console.log(dayu100index); // -1很显然,这个办法更适宜用来 判断数组内是否蕴含某种条件的值的元素。 ...

May 26, 2023 · 1 min · jiezi

关于javascript:深度剖析JavaScript中块级作用域与函数作用域

前言系列首发于公众号『前端进阶圈』 ,若不想错过更多精彩内容,请“星标”一下,敬请关注公众号最新消息。面试官必问系列:深刻了解JavaScript块和函数作用域在 JavaScript 中,到底是什么会生成一个新的作用域,只有函数才会生成新的作用域吗?那 JavaScript 其余构造能生成新的作用域吗? 3.1 函数中的作用域在之前的词法作用域中可见 JavaScript 具备基于函数的作用域,这也就意味着一个函数都会创立一个新的作用域。但其实并不完全正确,看以下例子: function foo(a) {var b = 2;function bar() { // ...}var c = 3;}以上代码片段中,foo() 的作用域中蕴含了标识符 a, b, c 和 bar。无论示意申明呈现在作用域中的何处,这个标识符所代表的变量和函数都从属于所处作用域的作用域中。bar() 中也领有属于本人的作用域,全局作用域也有属于本人的作用域,它只蕴含了一个标识符: foo()因为标识符 a, b, c 和 bar 都从属于 foo() 的作用域内,因而无奈从 foo() 的内部对它们进行拜访。也就是说,这些标识符在全局作用域中是无奈被拜访到的,因而如下代码会抛出 ReferenceError: bar(); // ReferenceError: bar is not definedconsole.log(a, b, c); // 全都抛出 ReferenceError但标识符 a, b, c 和 bar 可在 foo() 的外部被拜访的。函数作用域的含意:属于这个函数的全副变量都能够在整个函数的范畴内应用及复用(在嵌套的作用域中也能够应用)。这种设计方案可依据须要扭转值类型的 "动静" 个性。3.2 暗藏外部实现咱们对函数的传统认知就是先申明一个函数,而后再向外面增加代码,但反过来可带来一些启发:从所写的代码中挑选出一个任意片段,而后就用函数申明的形式对它进行包装,实际上就是把这些代码 "暗藏" 起来了。理论的后果就是在这个代码片段的四周创立了一个新的作用域,也就是说这段代码中的任何申明(变量或函数)都将绑定在这个新创建的函数作用域中,而不是先前所在的作用域中。换句话说,可把变量和函数包裹在一个函数的作用域中,而后用这个作用域来 "暗藏" 他们。为什么 "暗藏" 变量和函数是一个有用的技术? ...

May 26, 2023 · 4 min · jiezi

关于javascript:新人必看手把手教你如何使用浏览器表格插件上

摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供业余的开发工具、解决方案和服务,赋能开发者。 前言 | 问题背景作为一名优良的打工人,Excel是大家下班中必不可少的办公软件。随着互联网时代的到来,越来越多的公司开始应用各种B/S零碎来解决表格数据文件。那么有没有一种能够间接在浏览器中应用的Excel插件去解决数据呢?答案是必定的。本文小编将为大家介绍如何在Vue框架中集成SpreadJS在线表格插件(以下简称为“SpreadJS”)和在线表格编辑器(类Excel浏览器插件)实现在浏览器中应用Excel插件来解决数据。 在本教程中,咱们将应用node.js,请确保已装置最新版本,除此之外还须要应用软件Visual Studio Code(以下简称“VSCode”)作为编程环境,请您以管理员身份运行它。 如何在Vue框架中集成表格插件(SpreadJS)在本节内容中,小编将向大家展现如何在Vue框架引入SpreadJS资源并实现简略的 上传文件、下载文件两个性能。 在Vue中集成SpreadJS: 1.首先应用管理员权限关上VSCode软件,而后再用VSCode关上初始代码文件(文章下方资源包中)或者也能够抉择本人创立一个Vue我的项目,相干创立语法如下: \# npm 6.xnpm create vite@latest Vue3-spread-ts --template Vue-ts\# npm 7+, extra double-dash is needed:npm create vite@latest Vue3-spread-ts --template Vue-ts\# yarnyarn create vite Vue3-spread-ts --template Vue-ts\# pnpmpnpm create vite Vue3-spread-ts -- --template Vue-ts2.创立完Vue我的项目之后,关上我的项目中的package.json文件夹,这个时候咱们须要在文件夹中引入SpreadJS组件包: {"name": "vue3-spread-ts","private": true,"version": "0.0.0","scripts": {"dev": "vite","build": "vue-tsc --noEmit && vite build","preview": "vite preview"},"dependencies": {"@grapecity/spread-excelio": "15.1.0","@grapecity/spread-sheets": "15.1.0","@grapecity/spread-sheets-barcode": "15.1.0","@grapecity/spread-sheets-charts": "15.1.0","@grapecity/spread-sheets-languagepackages": "15.1.0","@grapecity/spread-sheets-pdf": "15.1.0","@grapecity/spread-sheets-pivot-addon": "15.1.0","@grapecity/spread-sheets-print": "15.1.0","@grapecity/spread-sheets-resources-zh": "15.1.0","@grapecity/spread-sheets-shapes": "15.1.0","@grapecity/spread-sheets-tablesheet": "15.1.0","@grapecity/spread-sheets-vue": "15.1.0","element-plus": "\^2.2.5","file-saver": "\^2.0.5","vue": "\^3.2.25"},"devDependencies": {"@vitejs/plugin-vue": "\^2.3.3","typescript": "\^4.5.4","vite": "\^2.9.9","vue-tsc": "\^0.34.7"}}(须要引入的spreadJS组件) ...

May 25, 2023 · 1 min · jiezi

关于javascript:JS理解了词法环境就理解了闭包

学习地址:https://zh.javascript.info/closure(本文的截图都来自此地址,这些图画得都很漂亮。) 闭包是一种编程思维,理解它之前要先理解上面相干的知识点: 变量作用域嵌套函数变量作用域❓ 什么是变量作用域呢?✅ 变量作用域就是变量起作用的区域。 ❓ 这个区域是怎么进去的呢?✅ 用大括号{}就能够划分出一个区域,这个区域叫做代码块。 ❓ 划进去的这个区域有什么用呢?✅ 在代码块内用let和const申明的变量(用var申明的变量在这里就不探讨了,最好不要用),能够在以后这个块内被拜访到,出了块就拜访不到了,也就是限定了变量起作用的区域。 示例代码: { let a = '哈哈' console.log(a) // 哈哈}console.log(a) // Uncaught ReferenceError: a is not definedif (true) { let a = '哈哈' console.log(a) // 哈哈}console.log(a) // Uncaught ReferenceError: a is not defined嵌套函数❓ 什么是嵌套函数呢?✅ 如果一个函数是在另一个函数中创立的,那么这个函数就叫嵌套函数。 ❓ 嵌套函数有什么特点呢?✅ 嵌套函数能够拜访内部变量。 示例代码: function func1() { let a = '张三' function func2() { return a } console.log(`姓名是:${func2()}`) // 姓名是:张三}func1()更有意思的是,能够返回一个嵌套函数:作为一个新对象的属性或作为后果返回。之后能够在其余中央应用。不管在哪里调用,它依然能够拜访雷同的内部变量。 function makeCounter() { let count = 0 return function() { return count++ }}let counter = makeCounter()console.log(counter()) // 0console.log(counter()) // 1console.log(counter()) // 2那么问题来了: ...

May 25, 2023 · 2 min · jiezi

关于javascript:请问-m-是如何生成的

{ key: "getPlaylistData", value: (m = Object(l.a)(o.a.mark((function t() { var n, r, c, l, f, d, v, m, h = arguments; return o.a.wrap((function(t) { for (; ; ) switch (t.prev = t.next) { case 0: return l = h.length > 0 && void 0 !== h[0] ? h[0] : {}, f = h.length > 1 && void 0 !== h[1] ? h[1] : {}, d = null !== (n = null === (r = this.req) || void 0 === r || null === (c = r.headers) || void 0 === c ? void 0 : c.cookie) && void 0 !== n ? n : "", v = O({ device_id: e.cookie.get("QC005", d) || "", timestamp: (new Date).getTime(), app_version: "1.0.0", src: "pcw", auth_cookie: e.cookie.get("P00001", d) || "", page_num: 1, page_size: 20 }, l), m = Object(x.c)(v, "&", "howcuteitis").toUpperCase(), v.sign = m, t.next = 8, this.http("mesh", "/tvg/play_list_detail", O({ params: v, withCredentials: !1, timeout: 1e3 }, f)); case 8: return t.abrupt("return", t.sent); case 9: case "end": return t.stop() } } ), t, this) } ))), function() { return m.apply(this, arguments) } ) }

May 25, 2023 · 1 min · jiezi

关于javascript:富文本编辑器-quilljs-开发四-自定义格式扩展

前言鉴于各种繁冗的需要,quill.js 编辑器也面临着各种挑战,例如咱们须要增加“table”布局款式以适应邮件发送格局,手动扩大表情符号性能等等。本文将对这些可定制化性能进行解说和实现。 辨别 format 和 module首先须要明确的是,咱们应该分明本人所需的扩大具体是什么? 比方想要新增一个自定义 emoji, 那么设想一下步骤: 点击工具栏弹出弹窗或者对应的 popover在 2 中选中 emoji这些步骤是一种常见的增加流程。 咱们须要明确的是,增加自定义表情符号必然须要一个相应的格局。 本文将以 format 为例,对此进行具体解说。 quill 的格局类型说起 quill 的格局类型, 他的罕用格局能够分成 3 类: Inline常见的有 Bold, Color, Font 等等, 不占据一行的标签, 相似于 html 里 span 的个性, 是一个行内款式, Inline格局之间能够相互影响Block增加 Block 款式, 必然会占据一整行, 并且 Block 款式之间不能兼容(共存), 常见的有 List, Header, Code Block 等等Embeds媒体文件, 常见的有 Image, Video, Formula, 这类格局扩大的比拟少, 然而本次要加的 emoji 然而这种格局自定义款式新增 emoji.ts 文件来存储格局, 对于他的类型, 咱们抉择 Embeds 格局, 应用这种格局有以下起因: 他是一种独特的类型, 不能和色彩, 字体大小等等用在一起须要和字体并列, 所以也不能是 Block 类型import Quill from 'quill';const Embed = Quill.import('blots/embed');class EmojiBlot extends Embed { static blotName: string; static tagName: string; static create(value: HTMLImageElement) { const node = super.create(); node.setAttribute('alt', value.alt); node.setAttribute('src', value.src); node.setAttribute('width', value.width); node.setAttribute('height', value.height); return node; } static formats(node: HTMLImageElement) { return { alt: node.getAttribute('alt'), src: node.getAttribute('src'), width: node.getAttribute('width'), height: node.getAttribute('height'), }; } static value(node: HTMLImageElement) { // 次要在有初始值时起作用 return { alt: node.getAttribute('alt'), src: node.getAttribute('src'), width: node.getAttribute('width'), height: node.getAttribute('height'), }; }}EmojiBlot.blotName = 'emoji';EmojiBlot.tagName = 'img';EmojiBlot.className = 'emoji_icon'export default EmojiBlot;因为还有失常的图片类型会应用 img, 这里就须要加上 className, 来打消歧义一般来说, 新开发的扩展性类型, 尽量都加上 className ...

May 25, 2023 · 3 min · jiezi

关于javascript:智能社原生的力量原生JavaScript开发高级

download:智能社原生的力量——原生JavaScript开发高级音视频根底 - 从采集到传输前言随着互联网的倒退,音视频技术曾经成为了人们日常生活中不可或缺的一部分。本文将介绍从音视频的采集、编码、传输和播放等方面来深刻了解音视频技术。 音视频采集音视频采集是指将声音和图像转换成数字信号的过程。在计算机中,通常应用麦克风和摄像头来进行音视频采集。采集后的数据须要通过解决能力用于后续的编码和传输。 音视频编码音视频编码是指将采集失去的音视频数据进行压缩的过程。在理论利用中,因为音视频数据量宏大,如果不进行压缩,将会占用大量存储空间和网络带宽。因而,须要应用一些编码器对音视频数据进行压缩。常见的音视频编码格局包含MP3、AAC、H.264和HEVC等。 音视频传输音视频传输是指将编码后的音视频数据通过网络传输到接收端的过程。在传输过程中,须要思考网络带宽、提早和丢包等问题。为了进步传输效率和升高提早,通常采纳一些专门的传输协定,如RTMP、HLS和WebRTC等。 音视频播放音视频播放是指在接收端将传输过去的音视频数据进行解码和播放的过程。在进行解码和播放时,须要思考硬件设施的性能和操作系统的反对状况。 总结本文介绍了音视频技术的采集、编码、传输和播放等方面的基础知识。通过深刻了解音视频技术的整个流程,咱们能够更好地利用音视频技术,并且在理论利用中能够更好地解决各种问题。 FFmpeg原理 - 实现音视频解决前言FFmpeg是一个开源的音视频解决库,它能够对音视频文件进行格局转换、剪辑、合并等操作。本文将介绍FFmpeg的基本原理和应用办法。 FFmpeg的基本原理FFmpeg蕴含了多个音视频解决工具,其中最外围的局部是libavcodec和libavformat两个库。libavcodec提供了各种音视频编码器和解码器,能够将不同格局的音视频文件进行相互转换。而libavformat提供了各种音视频文件的输出和输入格局反对,能够读取和写入各种音视频文件。 FFmpeg的应用办法应用FFmpeg进行音视频解决非常简单,只须要通过命令行输出相应的参数即可。上面是一个简略的例子: ffmpeg -i input.mp4 -vf "transpose=1" -an output.mp4该命令能够将input.mp4文件进行逆时针旋转90度后输入为output.mp4文件,并且去掉了音频轨道。 除了通过命令行应用FFmpeg外,也能够通过调用FFmpeg提供的API来进行音视频解决。例如,要将一段MP3格局的音频文件转换为WAV格局,能够应用以下代码: include <libavutil/avutil.h>include <libavcodec/avcodec.h>include <libavformat/avformat.h>int main(int argc, char *argv[]) { av_register_all();AVFormatContext *fmt_ctx = NULL;int ret = avformat_open_input(&fmt_ctx, argv[1], NULL, NULL);if (ret < 0) { return ret;}ret = avformat_find_stream_info(fmt_ctx, NULL);if (ret < 0) { return ret;}int audio_stream_index = -1;for (int i = 0; i < fmt_ctx->nb_streams; ++i) { if (fmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { audio_stream_index = i; break; }}AVCodecParameters *codec_par = fmt_ctx->streams[audio_stream_index]->codecpar;AVCodec *codec = avcodec_find_decoder(codec_par->codec_id);AVCodecContext *codec_ctx = avcodec_alloc_context3(codec);ret = avcodec_parameters_to_context(codec_ctx, codec_par);if (ret < 0) { return ret;}ret = avcodec_open2(codec_ctx, codec, NULL);if (ret < 0) { return ret;}AVPacket pkt;av_init_packet(&pkt);pkt.data = NULL;pkt.size = 0;AVFrame *frame = av_frame_alloc();while (av_read_frame(fmt_ctx, &pkt) >= 0) { if (pkt.stream_index == audio_stream_index) { ret = avcodec_send_packet(codec_ctx, &pkt); if (ret < 0) { break; } while (ret >= 0) { ret = avcodec_receive_frame(codec_ctx, frame); if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) { break; } else if (ret < 0) { break; } // 对音频帧进行解决,此处省略具体代码 } } av_packet_unref(&pkt);}avcodec_free_context(&codec_ctx);avformat_close_input(&fmt_ctx);return 0;}总结本文介绍了FFmpeg的基本原理和应用办法。通过深刻理解FFmpeg的API,咱们能够更加灵便地进行音视频解决,并且在理论利用中可能更好地满足各种需要。 ...

May 24, 2023 · 1 min · jiezi

关于javascript:如何使用Map处理Dom节点

本文浅析一下为什么Map(和WeakMap)在解决大量DOM节点时特地有用。 咱们在JavaScript中应用了很多一般的、古老的对象来存储键/值数据,它们解决的十分杰出: const person = { firstName: 'Alex', lastName: 'MacArthur', isACommunist: false};然而,当你开始解决较大的实体,其属性常常被读取、更改和增加时,人们越来越多地应用Map来代替。这是有起因的:在某些状况下,Map跟对象相比有多种劣势,特地是那些有敏感的性能问题或插入的程序十分重要的状况。 但最近,我意识到我特地喜爱用它们来解决大量的DOM节点汇合。 这个想法是在浏览Caleb Porzio最近的一篇博文时产生的。在这篇文章中,他正在解决一个假如的例子,即一个由10,000行组成的表,其中一条能够是"active"。为了治理不同行被选中的状态,一个对象被用于键/值存储。上面是他的一个迭代的正文版本。 import { ref, watchEffect } from 'vue';let rowStates = {};let activeRow;document.querySelectorAll('tr').forEach((row) => { // Set row state. rowStates[row.id] = ref(false); row.addEventListener('click', () => { // Update row state. if (activeRow) rowStates[activeRow].value = false; activeRow = row.id; rowStates[row.id].value = true; }); watchEffect(() => { // Read row state. if (rowStates[row.id].value) { row.classList.add('active'); } else { row.classList.remove('active'); } });});这能很好地实现工作。然而,它应用一个对象作为一个大型的类散列表,所以用于关联值的键必须是一个字符串,从而要求每个我的项目有一个惟一的ID(或其余字符串值)。这带来了一些额定的程序性开销,以便在须要时生成和读取这些值。 ...

May 24, 2023 · 2 min · jiezi

关于javascript:用了这么多年的Webpack和Vite你真的了解服务器的host配置吗

前言最近接手了很多我的项目,devServer的host配置十分凌乱,有配置'localhost',也有配置ip地址的,还有配置0.0.0.0的,尽管本人也工作了这么多年,然而配置他们的区别,我还真的没有认真思考过,明天我就通过概念和实战成果两个方面让大家理解下 概念公有IP(局域网)公有IP地址 通常称内网(即局域网)中的IP地址为公有地址。公有地址是非注册地址,用于组织机构外部应用。公有地址的范畴以下: A类IP地址中:10.0.0.0–10.255.255.255 B类IP地址中:172.16.0.0–172.31.255.255 C类IP地址中:192.168.0.0–192.168.255.255 公有地址与私有地址不一样,并非由Internet调配的,是不容许出现在Internet中的,咱们在公网中是看不到公有IP地址的,而且私有地址也不会应用上述的三类地址。因而,公有地址是不能间接与Internet链接的。在同一个局域网内,IP地址是惟一的;可是在不一样的局域网内,IP地址是可能反复呈现的 私有IP私有IP地址 通常称公网中的IP地址为私有地址。私有地址由Inter NIC(因特网信息中心)负责,这些IP地址调配给注册并向Inter NIC提出申请的组织机构。私有地址是寰球惟一的,公网中不可能存在两个雷同的IP地址。范畴:除了公有地址之外的地址,都属于私有地址 IPV4依据TCP/IP协定规定,咱们当初所用的IPv4地址是由32位二进制数组成,为了不便记忆,人们将组成IP地址的32位二进制分成四段,每段8位2进制数,两头用小数点隔开,而后将每八位二进制转换成十进制数(2^4=256 最大255),这样就有了咱们常见的IP地址,如:215.35.130.23。 IPv6IPv6是英文“Internet Protocol Version 6”(互联网协议第6版)的缩写,是互联网工程工作组(IETF)设计的用于代替IPv4的下一代IP协定IPv6的128位地址通常写成8组,每组为四个十六进制数的模式(十六进制是4个2进制,四个16进制就是16个2进制 也就是说每段有16个2进制 16*8=128位)。比方:AD80:0000:0000:0000:ABAA:0000:00C2:0002 是一个非法的IPv6地址localhost、127.0.0.1和0.0.0.0和本机IP的区别localhostlocalhost实际上是域名,通常windows零碎默认将localhost指向127.0.0.1,可是localhost并不等于127.0.0.1,localhost指向的IP地址是可能配置的批改localhost对应的IP地址以windows电脑为例 localhost的配置文件地址在上面门路 C:\Windows\System32\drivers\etc\hosts关上hosts文件咱们发现 # localhost name resolution is handled within DNS itself.# 127.0.0.1 localhost# ::1 localhost127.0.0.1首先咱们要先晓得一个概念,但凡以127结尾的IP地址,都是回环地址(Loop back address),其所在的回环接口通常被了解为虚构网卡,并非真正的路由器接口。 所谓的回环地址,艰深的讲,就是咱们在主机上发送给127结尾的IP地址的数据包会被发送的主机自身接管,基本传不进来,外部设备也没法通过回环地址拜访到本机。 失常的数据包会从IP层进入链路层,而后发送到网络上;而给回环地址发送数据包,数据包会间接被发送主机的IP层获取,不会进入链路层。 而127.0.0.1做为127结尾IP地址,也是个回环地址。只不过127.0.0.1经常被默认配置为localhost的IP地址。 通常会通过ping 127.0.0.1来测试某台机器上的网络设备是否工做失常。 0.0.0.0首先,0.0.0.0是不能被ping通的。在服务器中,0.0.0.0并非一个实在的的IP地址,它示意本机中全副的IPV4地址。监听0.0.0.0的端口,就是监听本机中全副IP的端口。 本机IP本机IP个别仅指在同一个局域网内,能同时被外部设备拜访和本机拜访的那些IP地址(可能不止一个)。像127.0.0.1这种通常是不被看老本机IP的。本机IP是与具体的网络接口绑定的,好比以太网卡、无线网卡或者PPP/PPPoE拨号网络的虚构网卡,想要失常工做都要绑定一个地址,不然其余设施就不晓得如何拜访它。 实际概念咱们也理解了,接下来,咱们以vite我的项目进行配置实际Vite.config.ts中的host配置咱们先来看下官网阐明server.host类型: string | boolean默认: 'localhost'指定服务器应该监听哪个 IP 地址。 如果将此设置为 0.0.0.0 或者 true 将监听所有地址,包含局域网和公网地址。也能够通过 CLI 应用 --host 0.0.0.0 或 --host 来设置。 我的本机局域网ip是10.15.0.50vite.config.ts server的配置默认的host是localhost,端口号3000如果host的配置是localhost或者不配置host export default defineConfig({ plugins: [vue()], server:{ host:'localhost', port:3000, },})localhost:3000 可拜访我的项目127.0.0.1:3000 可拜访我的项目10.15.0.50:3000 不可拜访我的项目127.0.0.2:3000 不可拜访我的项目如果host的配置是127.0.0.1 ...

May 24, 2023 · 1 min · jiezi

关于javascript:新的HTML标签-search

本文首发于微信公众号:大迁世界, 我的微信:qq449245884,我会第一工夫和你分享前端行业趋势,学习路径等等。更多开源作品请看 GitHub https://github.com/qq449245884/xiaozhi ,蕴含一线大厂面试残缺考点、材料以及我的系列文章。快来收费体验ChatGpt plus版本的,咱们出的钱体验地址:https://chat.waixingyun.cn能够退出网站底部技术群,一起找bug. 本文介绍了一种新的HTML元素搜寻办法,并提供了一个实用的工具来帮忙开发者疾速找到所需的元素。这对于那些须要解决大量HTML元素的开发者来说是十分有用的。文章还通过提供一些常见元素的用法示例,帮忙开发者更好地了解和利用这些元素。在泛滥元素中找到特定的元素。为了解决这个问题,文章介绍了一种新的HTML元素搜寻办法。 上面是注释 一个新的语义元素曾经退出了 HTML 规范 <search> 。它代表文档中用于搜寻或过滤的局部。它应该蕴含表单控件(如文本输出、下拉菜单、按钮等),搜寻/过滤的范畴能够是任何内容:从同一文档到整个互联网。 如何运作在 <search> 元素之前,咱们能够在 <form> 标签中增加 role="search" 以批示该表单用于搜寻: <form role="search" method="get" action="/search"> <input type="search" name="search-text" /> <button>Search</button></form>有了这个新增加的性能,咱们能够应用 <search> 标签来包装表单: 因为 <search> 是规范中的新内容,所有浏览器、屏幕阅读器和其余工具可能须要一段时间能力跟上。在此期间,咱们能够应用一个 hack,指定它曾经具备的 ARIA 角色(相似于 <nav> 所产生的状况)。这在将来可能会变得多余,但它可能会为咱们的代码做好筹备,以便在浏览器反对新标签时应用。 <search role="search"> ...</search>这看起来有些违反直觉:咱们正在移除 role="search" ,但咱们正在用 <search> 包装所有内容。总体而言,这是更多的文本/代码(仅三个字符)和更多的嵌套(一个更高的级别)。 舒适提醒:只管咱们在构建搜寻组件时并不强制须要 <form> 标签,然而应用它却能带来额定的益处(甚至是必须的)。这样,即便在无JavaScript环境下,搜寻性能也能放弃失常运行,或者说,这是一种实际渐进式加强策略的形式。另一个须要留神的关键点是,搜寻区域不肯定是网站或在线平台上带有搜寻按钮的文本输入框。咱们能够应用 <search> 来过滤后果或表格行。它的实用性不仅限于文本输出和搜寻框: <search> <h2>Filter results</h2> <form> <label for="cartype">Car type</label> <select id="cartype"> <option value="coupe">Coupe</option> <option value="sedan">Sedan</option> </select> <label for="electric">Electric?</label> <input type="checkbox" id="electric" /> </form></search>认识领有一个用于辨认搜寻区域的元素是很好的。正如Scott O'Hara在这篇文章中指出的那样,直到现在,这是惟一一个在HTML中没有语义等效项的ARIA地标角色: banner → <header>complementary → <aside>form → <form>main → <main>navigation → <nav>region → <section>search → ???应用 <search> 来标识应具备“搜寻”角色的局部,咱们将应用一些语义化的 HTML 元素笼罩所有 ARIA 地标角色。这很棒:它将进步可拜访性(只管如上所述,须要一段时间能力让所有浏览器跟上),并扩大了语言的语义。 ...

May 24, 2023 · 1 min · jiezi

关于javascript:web组态可视化编辑器

随着工业智能制作的倒退,工业企业对设施可视化、近程运维的需要日趋强烈,传统的单机版组态软件曾经不能满足越来越简单的管制需要,那么实现web组态可视化界面成为了次要的技术门路。 行业痛点对于软件服务商来说,将单机版软件转变为网页版软件曾经到了势在必行的阶段。然而,转变是一个简单的过程,尤其是软件外面的组态性能局部,对于公司或集体都会面临以下几方面的问题: 1、无相干组态开发教训,无技术积攒。 2、开发周期长,无奈在短时间内实现繁琐工作。 3、性能简单,必须破费很长时间的测试降级。 什么是组态软件组态软件,又称组态监控系统软件,是指用于数据采集和过程管制的专用软件,是主动控制系统监控级的软件平台和开发环境。实际上,这些软件也是一种通用级的软件工具,能够通过灵便的配置疾速建设工业主动控制系统的监控性能。组态软件广泛应用于机械、汽车、石油、化工、造纸、水解决、过程管制等畛域。 什么是web组态编辑器web组态编辑器是指通过浏览器操作组态工具、浏览组态画面,实现工程治理、组态编辑以及组态运行三大性能。通过实现图元组态、可视化图表组态、数据库组态的配置与关联,实现基于web服务的实时数据监控与服务端的多用户拜访等。 从用户操作与界面出现的角度来说,BY组态编辑器采纳规范HTML5技术,基于B/S架构进行开发,反对WEB端出现,反对在浏览器端实现便捷的人机交互,简略的拖拽即可实现可视化页面的设计。 从软件架构来说,BY组态编辑器具备高度的开放性。随着利用场景的逐步增多,零碎必然须要进行性能扩大,因而,BY组态编辑器不仅反对多种数据接口,更是提供了二次开发接口,能够由用户自行实现二次开发。实质上,BY组态软件在性能上集成了大量通用模块和个性化模块,以实现不同行业用户的需要。当然,针对具体的用户,BY组态反对定制化模块的开发与配置。 BY组态编辑器特点拖拽式场景编辑拖拽式操作,轻松搭建组态场景 便捷的工具栏,可疾速排版和批改款式 反对自定义动画,模仿实在动态效果 丰盛的组件模板内置工业组态、IT运维、电力、流程图等多种行业图形 丰盛精美模板,帮忙各行业用户疾速上手 反对自定义图形库,满足用户个性化绘图需要 反对多种数据源接入公网或本地数据源,可视化数据绑定,实现数图联动 轻量化的数据源治理,反对在线创立云数据接口 便捷的系统集成采纳HTML5技术,基于B/S架构,无需装置客户端 反对嵌入第三方零碎或者集成平台 BY组态编辑器经典示例污水处理web可视化零碎以实在污水厂为底本,建设数字孪生模型,实现污水处理厂的实景可视化,传统污水处理厂生产及配套零碎次要包含污水处理零碎、污泥解决零碎、加药零碎等。利用BY组态可视化编辑器搭建场景,多维度动静展现污水处理厂内景;工艺流程的实时监测、自动控制、智能调节、剖析决策、零碎互动等综合治理性能,一站式出现全厂经营态势。 供暖换热站智能监控零碎供暖换热站智能监控零碎是集监管、管制、预警、报警于一体的智能物联网监管平台,实现全天候24小时在线监测,每天超过4000次状态巡检,保障系统的良好运行,同时平台提供曲线、柱图、饼图、报表等数据分析工具,不便对系统整体运行状况更好的把握。 BY组态软件BY组态是一款功能强大的基于Web的可视化组态编辑器,采纳规范HTML5技术,基于B/S架构进行开发,反对WEB端出现,反对在浏览器端实现便捷的人机交互,简略的拖拽即可实现可视化页面的设计。可疾速构建和部署可扩大的SCADA、HMI、仪表板或IIoT零碎。应用BY组态编辑器,能够创立现代化、可视化、形象化的流程,来反映机器设备和实时数据的状态,为自动化工业工厂的管制仪表进行个性化设计。 官网网站:http://hcy-soft.com体验地址:http://94.191.39.192:8080/byzt-s/example.html

May 23, 2023 · 1 min · jiezi

关于javascript:倒水晃动的效果

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style> *{ padding: 0; margin: 0; box-sizing: border-box; } body{ height: 100vh; display: flex; justify-content: center; align-items: center; background-color: rgb(240, 228, 228); } .quan{ position: relative; width: 180px; height: 180px; border-radius: 50%; border: 3px solid rgb(246, 247, 248); box-shadow: 0 0 0 3px rgb(41, 134, 196); } .shui{ position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: rgb(23, 106, 201); overflow: hidden; } .shui::after{ content: ''; position: absolute; top: 0; left: 50%; width: 150%; height: 150%; border-radius: 40%; background-color: rgb(240, 228, 228); animation: shi 5s linear infinite; } @keyframes shi{ 0%{ transform: translate(-50%,-65%) rotate(0deg); } 100%{ transform: translate(-50%,-65%) rotate(360deg); } } .shui::before{ content: ''; position: absolute; top: 0; left: 50%; width: 150%; height: 150%; border-radius: 42%; background-color: rgb(240, 228, 228,0.2); animation: xu 7s linear infinite; } @keyframes xu{ 0%{ transform: translate(-50%,-60%) rotate(0deg); } 100%{ transform: translate(-50%,-60%) rotate(360deg); } }</style></head><body><div class="quan"> ...

May 23, 2023 · 1 min · jiezi

关于javascript:前端食堂技术周刊第-83-期TS-51-RCNuxt-35

By Midjournery 美味值: 口味:杏花乌龙拿铁 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly本期摘要TypeScript 5.1 RCNuxt 3.5INP 将成为新的 Core Web Vital 指标Kinp如何治理 GitHub 告诉WebXR 利用开发之 aframe 框架入门143 DevTools TipsWeb Vitals 插件实际大家好,我是童欧巴。欢送来到前端食堂技术周刊,咱们先来看下上周的技术资讯。 技术资讯1. TypeScript 5.1 RC自 Beta 版本以来的新变动: 修改了装璜器中 init hooks 的一些行为扭转了在 isolatedModules 下的 emit 行为,确保脚本文件不会被重写为模块。应用 transpileModule API 也将确保脚本文件不被解释为模块,因为它假设了isolatedModules 的应用增加了新的重构性能,能够将申明挪动到现有文件2. Nuxt 3.5次要个性如下: Vue3.3、Nitropack v2.4丰盛的 JSON payloads,各种丰盛的 JS 类型都反对开箱即用交互式服务器组件反对环境配置全类型化的路由Bundler 模块解析,反对 subpath 导出的类型server 类型拆散3. INP 将成为新的 Core Web Vital 指标FID 的局限性家喻户晓,第一次交互并不能代表页面整个生命周期中的所有交互。 所以 INP 将于 2024 年 3 月起被推广为新的外围网络因素指标,用来取代 FID。这篇文章中介绍了决策背地的动机、引起的变动以及如何开始应用。 上面咱们来看技术材料。 ...

May 22, 2023 · 1 min · jiezi

关于javascript:商城商品店铺搜索用户搜索记录功能设计OctShop

OctShop平台管理系统可对搜寻发现栏的店铺和商品搜寻关键字内容进行治理,如:增加相干热门的搜寻关键字,增加商家或平台的推广内容等。用户每次搜寻的内容零碎都将记录,商城的爱好举荐零碎将此数据作为一个重要的参加,向买家举荐感兴趣的商品或店铺。一、搜寻发现关键字的治理:管理员登录 -> 平台管理系统 -> 广告零碎 -> 搜寻发现展现 治理栏,能够进行如:增加,编辑,删除,搜寻,暗藏,排序等操作,快捷管理系统中所有的举荐关键字。如下图: 二、用户搜寻记录:商城搜索引擎会记录用户每一次搜寻的关键字与内容。依据不同用户展现在搜寻模块,不便用户疾速搜寻本人感兴趣的商品或店铺关键字,如果不想留下搜寻痕迹,买家也能够删除搜寻记录。搜寻记录是商城喜爱推送零碎的一个重要参考数据。搜寻包含两类一个是B2B2C模式,另一个是O2O模式的内容搜寻,不同模式的搜寻内容有所不同。如下图: 参考:https://pc.opencodetiger.com

May 22, 2023 · 1 min · jiezi

关于javascript:Babel成员更推荐的新配置方法你知道吗

前言在上一篇文章——Babel配置不要再“复制粘贴”了,带你本人配一个Babel 中,咱们晓得: 如果咱们开发的我的项目是应用程序,或者大型的我的项目,咱们能够利用@babel/preset-env的配置性能,对ES6+ API进行全局垫平。所以咱们个别这么配置: // babel.config.jsconst presets = [ [ '@babel/preset-env', { modules: false, useBuiltIns: 'entry', // 或者 useBuiltIns: 'usage' corejs: { version: '3.27.2', proposals: true } } ]];const plugins = [ '@babel/plugin-transform-runtime']module.exports = {plugins, presets};如果咱们是想开发一个第三方库,咱们能够利用@babel/plugin-transform-runtime的配置性能,对ES6+ API进行部分垫平,而不影响全局的环境。所以咱们个别这么配置: // babel.confing.jsconst presets = [ [ '@babel/preset-env', { modules: false } ]];const plugins = [ [ '@babel/plugin-transform-runtime', { corejs: { version: 3, proposals: true } } ]];module.exports = {plugins, presets};以上是咱们平时对于Babel见得最多的配置办法。然而这么配: 有时咱们要关注@babel/preset-env配置,有时又要关注@babel/plugin-transform-runtime配置,并且配置项那么多,这种配置办法其实还是挺繁琐的Babel内容知识点原本就非常多,如果咱们自身对Babel就“懵懵懂懂”的话,这无疑会很容易加深咱们对Babel的纳闷,让咱们感觉更懵圈。但其实还有一种新的Babel配置办法,它既能实现以上的配置,配置起来更加简洁,并且性能比下面的配置还要弱小,同时它也是Babel成员更举荐的配法。 学习是个循序渐进的过程,所以这篇文章接下来会带大家: ...

May 22, 2023 · 3 min · jiezi

关于javascript:Lodash-add方法源码解读

咱们先看下Lodash中文文档对add办法的解释: _.add(augend, addend)两个数相加。参数augend (number): 相加的第一个数。addend (number): 相加的第二个数。返回(number): 返回总和。例子 _.add(6, 4);// => 10接下来 咱们通过源码档次来看看add办法的具体用法 const add = createMathOperation((augend, addend) => augend + addend, 0)export default add从源码档次能够看出 add办法是createMathOperation办法返回的函数,createMathOperation办法传入两个参数:第一个参数是一个一般的add逻辑办法第二个参数是一个默认值0 function createMathOperation(operator, defaultValue) { //返回一个函数 value,other是调用lodash办法(例如_add)传入的参数 return (value, other) => { //如果第一个参数和第二个参数都没有定义 则返回默认值0 if (value === undefined && other === undefined) { return defaultValue } //如果第一个参数有值 第二个参数没有值 则返回第一个参数 if (value !== undefined && other === undefined) { return value } //如果第一个参数没有值 第二个参数有值 则返回第二个参数 if (other !== undefined && value === undefined) { return other } //如果第一个参数或者第二个参数为字符串(至多其中一个为字符串) 则将参数通过baseToString办法都转换为字符串 if (typeof value === 'string' || typeof other === 'string') { value = baseToString(value) other = baseToString(other) } else { //如果两个参数都不是字符串 则将参数通过baseToNumber办法都转换为数字 value = baseToNumber(value) other = baseToNumber(other) } //这个时候将被转换的参数传入createMathOperation办法的第一个操作函数,并返回后果 return operator(value, other) }}代码里的baseToString办法 ...

May 22, 2023 · 2 min · jiezi

关于javascript:能社原生的力量原生JavaScript开发高级课程忽闻海上有仙山

download:能社原生的力量——原生JavaScript开发高级课程原生的力量:摸索原生JavaScript的劣势 原生JavaScript是Web开发中最根底的技术之一,它能够实现各种性能和成果。与应用框架不同,原生JavaScript应用纯JavaScript编写,没有额定的依赖,这使得它在各种应用程序中具备许多劣势。 性能 原生JavaScript的执行速度往往比应用框架快得多。因为框架通常须要加载大量的代码和库,而原生JavaScript只须要加载必要的文件。此外,原生JavaScript容许咱们对代码进行优化,从而使其更加高效。 灵活性 原生JavaScript使咱们能够依照本人的需要编写代码,而不受框架限度。这意味着咱们能够更好地了解和控制代码,从而使其更加牢靠和平安。同时,因为没有第三方依赖,咱们能够防止版本抵触和兼容性问题。 学习曲线低 相比于应用框架,学习原生JavaScript通常更加容易。因为框架不断更新和变动,其文档和教程也须要不断更新和适应。然而,原生JavaScript曾经成为Web开发的核心技术之一,有大量的资源和文档可供学习和参考。 跨平台 原生JavaScript能够在各种平台和环境中运行,包含Web浏览器、挪动应用程序和桌面应用程序等。这使得它成为一种十分通用的技术,能够帮忙咱们开发各种类型的应用程序。 总结 原生JavaScript是Web开发中最根底、最弱小的技术之一。它具备高性能、灵活性、学习曲线低和跨平台等劣势。只管应用框架能够帮忙咱们更快地开发应用程序,然而原生JavaScript使咱们能够更好地管制和了解代码。如果你想成为一名优良的Web开发人员,那么深刻把握原生JavaScript相对是必不可少的。

May 22, 2023 · 1 min · jiezi

关于javascript:可视化搭建-自动批处理与冻结

性能在可视化搭建也是极为重要的,如何尽可能减少业务感知,最大水平的晋升性能是要害。 其实申明式肯定水平上能够说是就义了性能换来了可维护性,所以在一个齐全申明式的框架下做性能优化还是十分有挑战的。咱们采取了两种策略来优化性能,别离是主动批处理与解冻。 主动批处理首先,框架内任何状态更新都不会立刻触发响应,而是对立收集起来后,一次性触发响应,如上面的例子: const divMeta: ComponentMeta = { // ... fetcher: ({ selector, setRuntimeProps, componentId }) => { const name = selector(({ props }) => props.name) const email = selector(({ props }) => props.email) fetch('...', { data: { name, email } }).then((res) => { setRuntimeProps(componentId, old => ({ ...old ?? {}, data: res.data })) }) }}const App = () => { const { setProps } = useDesigner() const onClick = useCallback(() => { setProps('1', props => ({ ...props, name: 'bob' })) setProps('1', props => ({ ...props, email: '666@qq.com' })) }, [])}下面例子中,fetcher 通过 selector 监听了 props.name 与 props.email,当间断调用两次 setProps 别离批改 props.name 与 props.email 时,只会合并触发一次 fetcher 而不是两次,这种设计让业务代码缩小了反复执行的次数,简化了业务逻辑复杂度。 ...

May 22, 2023 · 2 min · jiezi

关于javascript:Rollup-基本概念及使用

Rollup是一款基于ESModule模块标准实现的JavaScript打包工具,在前端社区中赫赫有名,同时也在Vite的架构体系中施展着重要作用。不仅是Vite生产环境下的打包工具,其插件机制也被Vite所兼容,能够说是Vite的构建基石。 接下来,咱们将围绕Rollup的基本概念和外围个性开展,学习完本大节内容,你不仅能晓得Rollup是如何打包我的项目的,还能学会Rollup更高阶的应用形式,甚至可能通过JavaScriptAPI二次开发Rollup。 一、疾速上手首先,创立一个空的文件夹,而后应用npm init -y新建一个我的项目,此时,关上我的项目会发现多了一个package.json文件。 { "name": "demo", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo "Error: no test specified" && exit 1" }, "keywords": [], "author": "", "license": "ISC"}接着,持续装置 rollup 依赖,命令如下。 npm i rollup新增 src/index.js 和 src/util.js 和rollup.config.js 三个文件,目录构造如下所示。 .├── package.json├── pnpm-lock.yaml├── rollup.config.js└── src ├── index.js └── util.js其中,index.js 和 util.js 和rollup.config.js 文件的内容别离如下。 // src/index.jsimport { add } from "./util";console.log(add(1, 2));// src/util.jsexport const add = (a, b) => a + b;export const multi = (a, b) => a * b;// rollup.config.js// 以下正文是为了能应用 VSCode 的类型提醒/** * @type { import('rollup').RollupOptions } */const buildOptions = { input: ["src/index.js"], output: { // 产物输入目录 dir: "dist/es", // 产物格局 format: "esm", },};export default buildOptions;而后,在package.json中退出如下的构建脚本。 ...

May 21, 2023 · 4 min · jiezi

关于javascript:如何构建全栈-AI-应用

人工智能 (AI) 最近掀起了波澜,ChatGPT 通过 chat completion 性能彻底改变了互联网。 你能够用它做很多事件:起草电子邮件或其余文章、答复文档相干的问题、创立会话代理、为你的软件提供自然语言界面、辅导各种科目、翻译语言等等。 本文将教会你应用 chat completion 性能构建聊天应用程序的基础知识,让每个程序员都能轻松上手。 它并不像看起来那么难。 你将学到以下内容: 如何仅应用 Node.js 创立 CLI 聊天应用程序如何仅应用 React 构建聊天应用程序如何联合 React 和 Node.js 来创立更好的聊天 AI 软件本文的内容将基于 gpt-3.5-turbo 模型 所需常识本教程须要 JavaScript、CSS、React 和 Node.js 的基本知识。 你还须要在 chatGPT 的 OpenAI 平台上领有一个帐户。 你能够在这里创立一个 如何应用 Node.js 创立 CLI 聊天 AI 应用程序本节将重点介绍如何应用 Node.js 创立一个仅在终端上运行的聊天应用程序 首先为我的项目创立一个目录: mkdir nodejs-chatgpt-tutorial进入目录 cd nodejs-chatgpt-tutorial初始化我的项目 npm init -y这将创立一个 package.json 文件来跟踪我的项目详细信息 将以下代码行增加到文件中: "type": "module"这将使你可能应用 ES6 模块导入语句 应用上面的命令来装置 OpenAI npm i openai创立一个蕴含所有代码的文件。 将其命名为 index.js ...

May 19, 2023 · 6 min · jiezi

关于javascript:JavaScript中eval和with语句如何影响作用域链探索深度知识

前言系列首发于公众号『前端进阶圈』 ,若不想错过更多精彩内容,请“星标”一下,敬请关注公众号最新消息。JavaScript中eval和with语句如何影响作用域链:摸索深度常识前言在上篇文章中,咱们介绍了深度分析了作用域,并将其定义为一套规定,这套规定用来治理引擎如何在以后作用域以及嵌套的子作用域中依据标识符名称进行变量查找。 上篇文章入口:JavaScript作用域深度分析:从部分到全局一网打尽: https://mp.weixin.qq.com/s/zfTTVsgBRjoOk0Sm6Scb2w而作用域一共分为两种:词法作用域 和 动静作用域, 而本篇文章咱们将深刻 词法作用域,让咱们一起来理解一下吧。 2.1 词法阶段简略来说,词法作用域就是定义在词法阶段的作用域。换句话说,词法作用域是由你在写代码时将变量和块作用域写在哪里决定的。;上述代码作用域: 蕴含着整个全局作用域,其中只有一个标识符: foo蕴含着 foo 所创立的作用域,其中有三个标识符: a、bar、b蕴含着 bar 所创立的作用域,其中只有一个标识符:c在此,只有假如每个函数都会创立一个新的作用域气泡即可。记住:作用域查找会在找到第一个匹配的标识符时进行。在多层的嵌套作用域中可定义同名的标识符,这叫做"遮蔽效应"(外部标识符 "遮蔽" 了内部的标识符)。作用域查找规定:作用域查找始终从运行时所处的最外部作用域开始,逐级向外或者说向上进行,直到遇见第一个匹配的标识符为止。无论函数在哪里被调用,或如何被调用,它的词法作用域都只由函数被申明时所处的地位决定。 function foo(a) {var b = a * 2;function bar(c) { console.log(a, b, c);}bar(b * 3);}foo(2); // 2 4 12词法作用域只会查找一级标识符,比方a、b、c。如果代码中援用了 foo.bar.baz, 词法作用域查找只会试图查找 foo 标识符,找到这个变量后,对象属性拜访规定会别离接管与 bar 和 baz 属性的拜访。2.2 坑骗词法JavaScript 有两种机制来实现这个目标。 2.2.1 eval(不举荐应用)JS 中的 eval(...) 函数可接管一个字符串作为参数。换句话说,在此地位写的内容就如同是写在那个地位上的代码一样。依据这个原理来了解 eval(...) 它是如何通过代码坑骗和伪装成书写时代码就在那,来实现批改词法作用域环境的。在执行 eval(...) 之后的代码时,引擎并不 晓得 或 在意 后面的代码是否以动静模式插入进来的,并对词法作用域的环境进行批改的。引擎只会如平常地进行此法作用域查找。 function foo(str, a) {eval(str); // 坑骗!console.log(a, b); // 1 3}var b = 2;foo("var b = 3;", 1);eval(...) 调用中的 var b = 3; 这段代码就会被当做原本就在那里一样来解决。因为这段代码申明了一个新的变量 b,因而它对曾经存在的 foo(...) 词法作用域进行了批改。事实上,这段代码再 foo(...) 外部创立了一个变量 b,并遮蔽了内部(全局)作用域中的同名变量。当执行 console.log(...) 时,会在 foo(...) 的外部找到 a 和 b,但永远无奈找到内部的 b。因而会输入 1, 3, 而不是失常状况下输入的 1, 2。默认状况下,eval(...)中所执行的代码中蕴含一个或多个申明(无论是变量还是函数),都会对 eval(...) 所处的词法作用域进行批改。严格模式下:eval(...)在运行时有着本人的词法作用域,意味着其中的申明无奈批改所在的作用域。 ...

May 19, 2023 · 2 min · jiezi

关于javascript:从零开始使用-Astro-的实用指南

在这个实用的Astro指南中,我将领导你实现设置过程,并通知你如何结构你的文件。你将学习如何增加页面、交互式组件,甚至是markdown文章。我还会通知你如何从服务器上获取数据,创立布局,并应用vanilla JavaScript和其余框架增加互动性。筹备好享受一些入手的乐趣,因为咱们将一起创立一个小型的网站实例。咱们将构建一个多页面的网站,包含一个博客。 在这篇文章开端,你会很好地了解Astro是如何工作的,以及你如何应用它来更快地创立高效的网站。开始吧! 什么是Astro框架?Astro入门Astro我的项目构造Astro页面Astro组件增加脚本Astro布局<slot />元素Astro组件propsAstro中的款式获取数据治理内容嵌套布局加载本地文件增加脚本应用UI框架指令构建和公布总结什么是Astro框架?作为开发人员,咱们晓得,在建设网站时,发明一个良好的用户体验是要害。而用户最喜爱的是什么?疾速的网站,不节约他们的工夫。有了Astro,咱们能够通过向浏览器发送更少的代码来实现这一指标。 咱们都有本人喜爱的UI框架,使咱们的生存更轻松,但它们可能会以惨重的网站为代价。然而有了Astro,咱们就能够领有两个世界中最好的货色。它容许咱们用咱们最喜爱的框架甚至多个框架同时构建咱们的网站,但它在构建时将它们渲染成动态HTML。因而,咱们能够为咱们的用户创立一个疾速的网站,而不就义古代开发者的体验。 但Astro并没有止步不前。它还容许咱们在须要时退出动静的客户端JavaScript,这意味着咱们能够在网站上领有可交互的组件,但只在必要时进行。换句话说,Astro容许你从简略的开始,在须要时减少复杂性。 简而言之,Astro是一个弱小的框架,它同时反对动态网站生成(SSG)和服务端渲染(SSR),帮忙咱们建设疾速的、基于内容的网站,同时思考到开发人员的体验。它轻量、高效、灵便,使它成为创立内容丰盛的网站的适合抉择,如博客、投资组合、文档和一些电子商务网站。如果你想创立一个具备大量交互的简单应用程序,Astro可能不是你的正确抉择。相同,你能够思考其余工具比方Next.js。 很好,当初咱们对Astro是什么以及它能做什么有了很好的理解。接下来,让咱们持续钻研,看看咱们能一起结构些什么。 Astro入门首先,让咱们装置Astro并创立我的项目的模板。确保你的电脑上装置了Node.js v16.12.0或者更高版本。 npm create astro@latest或者: yarn create astro@latestCLI会询问你的项目名称和你是否要应用Typescript。此外,它还会给你几个选项,通知你如何设置你的我的项目。在本教程中,我抉择了"一个空我的项目 "选项。 以下是我与Astro CLI的小型对话: 一旦你在编辑器中关上你的我的项目,你能够装置Astro的扩大。因为Astro有本人的文件扩大和语法,你可能想为你的编辑器装置其扩大。这里是VSCode的Astro扩大的链接,它不仅仅为你高亮语法,还能做得更多。 当初你能够用以下命令来运行你的我的项目。不须要装置任何依赖。 npm run dev关上浏览器,拜访http://localhost:3000/ ,所有就绪。 Astro我的项目构造Astro的文件构造相当含糊其辞。 src:你的源码(组件、页面、款式等等)public:你的动态资源(字体、图标等等)在src/pages目录下,Astro创立了一个index.astro,你能够认为这是index.html。 值得注意的是,src/content/是Astro的一个保留目录。Astro v2.0引入了Collections API,用于将你的Markdown和MDX文件组织成内容汇合。这个API保留了src/content/作为一个非凡的文件夹。 Astro页面好了,让咱们来谈谈Astro的页面。Astro页面解决路由、数据加载以及网站上每个页面的整体布局。它们是具备不同扩展名的文件,存在于src/pages/子目录中。 在Astro中,咱们有不同类型的页面,包含.astro、.md、.mdx、.html甚至是.js/.ts。每种文件类型都有不同的用处,能够用不同的形式来创立你的页面。 Astro应用一种称为基于文件路由的路由策略,这意味着你的src/pages/目录中的每个文件都会依据其文件门路成为你网站上的一个端点。这使得你的页面具备灵活性,并易于组织。 在本教程中,咱们次要应用.astro和.md文件来创立页面。留神,如果你应用.html页面,一些要害的Astro个性在HTML组件中不被反对。 当初让咱们来创立第二个页面,看看它是如何工作的。你所须要做的就是在src/pages目录下创立一个紧挨着index.astro的文件。 我打算把它命名为about.astro,并在外面写上非常简单的标记语言: <html lang="en"> <head> <meta charset="utf-8" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <meta name="viewport" content="width=device-width" /> <title>About</title> </head> <body> <h1>About</h1> <p>Jamstack development agency.</p> </body></html>当初你能够拜访localhost:3000/about,在你的浏览器中看到这个页面。正如你所看到的,只有你把文件增加到pages文件夹中,/about路由就能立刻发挥作用。 你能够更新内容,甚至增加你本人的外部款式,Astro将为你实时预览。所以不须要装置任何实时重载的NPM包或此类货色。 为了可能在页面之间轻松导航,我打算在我的index.astro和about.astro文件中增加导航: <body> <nav> <a href="/">Home</a> <a href="/about">About</a> </nav> <h1>About</h1> <p>Jamstack development agency.</p></body>但你不心愿每次在导航中减少一个链接时都要更新所有的页面,对吗? 这就是组件发挥作用的中央,让你不要反复你本人(DRY)。 Astro组件Astro组件是任何Astro我的项目的根本形成模块。它们有两个次要局部: 组件脚本组件模板Astro组件长这样: ...

May 18, 2023 · 5 min · jiezi

关于javascript:js实现图片无缝循环跑马灯

<!DOCTYPE html><html><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,height=device-height,initial-scale=1,minimum-scale=1,user-scalable=no"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title></title> <link rel="stylesheet" type="text/css" rel="external nofollow" /> <style type="text/css"> *{ margin: 0; padding: 0; } .marquee{ width: 100%; height: 36px; line-height: 36px; margin: 50px auto 0; } .marquee .marquee_text { width: 100%; height: 36px; margin: 0 auto; overflow: hidden; white-space: nowrap; background: #E3E3E3; color: #a6a6a6; } .marquee .scroll_begin, .marquee .scroll_end, .marquee .scroll_begin ul, .marquee .scroll_end ul, .marquee .scroll_begin ul li, .marquee .scroll_end ul li { display: inline-block; } .marquee .scroll_begin ul li, .marquee .scroll_end ul li { display: inline-block; min-width: 200px; margin-right:20px } .marquee .scroll_begin ul li a:hover, .marquee .scroll_end ul li a:hover { text-decoration: underline; } </style></head><body><div class="marquee wrapper"> <div class="marquee_text" > <div class="scroll_begin"> <ul> <li>✨<b>New Member Exclusive Offer</b>✨Free register to enjoy <b>2000 points points</b> for your purchase (no minimum spends&nbsp;required)</li> <li><b><a href="#" style="color:#000000;">Click here</a></b>: Just 7 easy steps to sell your Products! Get a free valuation for your collections now.</li> <li>Under the law of Hong Kong, intoxicating liquor must not be sold or supplied to a minor in the course of business.根據香港法律,不得在業務過程中,向未成年人售賣或供應令人醺醉的酒類。</li> </ul> </div> <div class="scroll_end"> </div> </div></div></body><script src="https://cdn.51cto.com/jquery/jquery-2.2.4.min.js"></script><script> $(function(){ // 自动播放 定时器 getScroll(); function getScroll(){ // 1.抓取元素 var marquee_text = $('.marquee_text')[0]; console.log(marquee_text); var scroll_begin = $('.scroll_begin')[0]; console.log(scroll_begin); var scroll_end = $('.scroll_end')[0]; console.log(scroll_end); // 向end这个盒子中 搁置存储 内容 scroll_end.innerHTML = scroll_begin.innerHTML; // 跑马灯成果 function Marquee(){ if(scroll_end.offsetWidth - marquee_text.scrollLeft <= 0){ marquee_text.scrollLeft -= scroll_end.offsetWidth; }else{ marquee_text.scrollLeft++; } } var timer = setInterval(Marquee,30) // 鼠标移入div盒子上的时候,咱们要革除定时器 $('.marquee_text').mouseover(function(){ clearInterval(timer); }) // 鼠标移出div盒子的时候,咱们要启动定时器 $('.marquee_text').mouseout(function(){ timer = setInterval(Marquee,30) }) } })</script></html>

May 17, 2023 · 2 min · jiezi

关于javascript:探究-JavaScript-前端热点面试题三让你在面试中游刃有余

前言系列首发于公众号『前端进阶圈』 ,若不想错过更多精彩内容,请“星标”一下,敬请关注公众号最新消息。探索 JavaScript 前端热点面试题(三):让你在面试中熟能生巧!1. 什么是 BOM 和 DOM?DOM:文档对象模型,指把文档当做了一个对象,这个对象中蕴含了解决网页的办法和接口BOM:浏览器对象模型,把浏览器当成了一个对象,这个对象次要定义了与浏览器交互的办法和接口,BOM 的外围是 window, 而 window 具备双重角色,既是通过 js 调用浏览器窗口的一个接口,也是一个 Global 对象。这也就意味着在网页中定义的任何对象,变量和函数,都会作为全局对象的一个属性或办法存在。2. for...in 和 for...of 的区别?for...of 是 ES6 新增的遍历形式,可遍历数组和对象等。for...in 是 ES3 呈现的。对于数组来说:for in 和 for of 都能够循环数组,for…in 输入数组的索引 index。for...of 输入数组每一项的值。对于对象来说:for in 能够遍历对象,for of 不能遍历对象,只能遍历带有 iterator 接口的,例如 Set,Map,String,Array总结: for...in 次要遍历对象,不适用于遍历数组。for...of 可用来遍历数组,类数组,字符串,Set, Map 以及 Generator 对象。次要区别在于他们的迭代形式不同3. ajax, axios, fetch 的区别?ajax: 一个 JavaScript 技术,外部基于 XHRHttpRequest 来实现axios: 一个申请框架,也是基于 XHRHttpRequest 封装和 promise 对象,反对同步和异步,提供了较多办法fetch: 一个原生申请 API,基于 Promise 来实现ajax 没有主动转换数据类型的机制,而 axios 和 fetch 反对主动将返回的数据转换为 JSON 数据格式或其余类型ajax: 一种创立交互式网页的开发技术,可做到无需从新加载整个网页的状况下,更新局部网页,也叫部分更新。 ...

May 17, 2023 · 3 min · jiezi

关于javascript:已开源超震撼数字孪生智慧园区IOC运营经典案例工程源码分享

近乎不堪设想的数字孪生智慧园区IOC经营实例——深圳某大型园区的工程源码现已收费赠送!赶快获取,理解其超强操控效力吧! 我的项目介绍本文将介绍深圳某大型园区的数字孪生智慧园区我的项目。通过数字孪生技术进行数据和场景的整合,实现了园区三维场景的残缺克隆,从而使场景和数据的实在出现成为可能。 利用最新的3D重建技术进行数字孪生技术的利用,对园区进行三维建模,胜利实现了园区三维场景的残缺克隆,在虚拟环境中进行园区的经营、监测、预警等操作 功能分析该我的项目提供了四个外围模块,别离是园区总览、梯控系统、安防预警、停车治理,上面将具体介绍这四个模块的性能:园区总览展现了园区中的所有监控点位,包含视频监控、传感器等。同时,该模块还标注了园区的次要修建、路线和绿化带等信息,使用户能够轻松理解园区整体布局。 梯控系统展现了梯控系统的运行状况,包含电梯实时运行状态、运行轨迹、运行工夫等信息。同时,该模块还提供了实时告警性能,可疾速响应异常情况,并及时采取措施,从而防止事变的产生。 安防治理该模块利用数字孪生技术进行可视化模仿,实现了对园区内安全事件的实时监测和预警。通过这一模块,用户能够及时理解园区内的安全事件,并采取措施进行应答,保障园区内平安生产。 停车治理该模块提供了停车场停车状况的可视化信息,包含空车位数量、车辆进出工夫、停车楼层、免费等信息。同时,该模块还提供了车位预约、缴费等性能,使用户能够更加便捷地进行停车。 综上所述,该数字孪生智慧园区我的项目提供了多个功能强大的模块,笼罩了园区经营、平安治理、停车治理等多个方面,为用户提供了全面的、精准的数据反对,帮忙用户更好地进行管理决策和应答事件。须要源码请一键三连,私聊【源码】

May 16, 2023 · 1 min · jiezi

关于javascript:HHDBCS及HHDESK的资源加密功能

安全性,是头等重要的事件。HHDBCS及HHDESK均有一项实用功能,资源加密。 HHDBCS关上HHDBCS,呈现连贯治理界面(或者在运行过程中,点击连贯治理),点击如下图箭头所指处的图标即可 HHDESK点击主页上的连贯治理,在连贯上右键,抉择锁定即可

May 16, 2023 · 1 min · jiezi

关于javascript:前端食堂技术周刊第-82-期Vue33

By Midjournery 美味值: 口味:冰玫瑰拿铁 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly本期摘要Vue3.3Google I/O 2023CSS In 2023Remix Conf 2023vite-plugin-vue-devtoolsRollup 中文文档React 中文文档重学编辑器大家好,我是童欧巴。欢送来到前端食堂技术周刊,咱们先来看下上周的技术资讯。 技术资讯1. Vue3.3Vue3.3 如期公布,版本代号为 “Rurouni Kenshin”。本次公布次要改良了 DX (开发者体验)、新增一些语法糖和宏,以及 TypeScript 上的改善。 具体内容除了官网公布的博文,也能够看 Vue 外围团队成员三咲智子的这篇博文:Vue 3.3 次要新个性详解,有更多个性背地的故事。 2. Google I/O 2023又一年 Google I/O 大会,以下是一些 Web 平台相干的内容: Web 平台的新动静2023 年外围网页指标九大优化Web 动画的新动静Web 界面的新动静WebGPU 使 Javascript 可拜访旧式 GPUWebAssembly:全新 Web 开发范式做好筹备,终止第三方 Cookie打造个性化 Web 体验携手单干,打造稳固的 Web3. CSS In 2023大漠老师解读 What's new in CSS and UI: I/O 2023 Edition,新个性有 20 多个,类别包含下一代 Web 响应式、CSS 根底原理、可定制组件、交互等。 ...

May 15, 2023 · 1 min · jiezi

关于javascript:面试题‘1′2′3mapparseInt

原文链接:Fancy的技术 拆解:map办法中第一个参数为回调办法,接管2个参数,一个是value,一个是index;parseInt办法中,第一个参数为待处理的数字或者字符串,第二个参数为进制(radix)等价于代码: const a = ['1','2','3'].map(function (value, index) { return parseInt(value, index)});当radix未定义或者为0且value不是0x结尾,默认依照10进制解决,由此可得: parseInt('1',0);parseInt('2',1);parseInt('3',2);因为数值不得大于进制数字,即 2进制最大个位数为1, 1进制没有意义,所以后果别离为1,NaN,NaN

May 15, 2023 · 1 min · jiezi

关于javascript:再见了-ReduxRecoilMobXZustandJotai-还有-Valtio状态管理还可以这样做

保持在一线写前端代码大略有七八年了,写过一些我的项目,有过一些反思,越来越确信素日里始终用得心安理得某些的货色兴许存在着问题,比方:在 状态治理 上始终比拟风行的实际 ,所以试着分享进去探讨一下。 为什么要辞别 Redux、Recoil、MobX、Zustand、Jotai 还有 Valtio明天风行的状态治理库有很多,尤其在 React 中。为了把问题说得清晰一些,我想以 React 中的几个支流库切入聊起。 首先看一下 Redux。对于单个状态的变动,能够 dispatch 简略 action。想晓得这个简略 action 会扭转什么状态,依据 Redux 的设计,查看它申明在哪个 slice 里就能够了: const checkboxSlice = createSlice({ name: 'checkbox', initialState: { checked: false, }, reducers: { check(state) { // ... }, },});const { check } = checkboxSlice.actions;// ...dispatch(check());// 因为 `check` 申明在 `checkboxSlice` 里,依据 Redux 的设计能够晓得 `check` 扭转的是 `checkboxSlice` 代表的状态。而对于多个状态的变动,须要 dispatch 简单 action。想晓得这个简单 action 会扭转什么状态,只查看它申明在哪里是不够的: const checkboxSlice = createSlice({ name: 'checkbox', initialState: { checked: false, }, reducers: { check(state) { // ... },++ uncheck(state) {+ // ...+ } },});-const { check } = checkboxSlice.actions;+const { check, uncheck } = checkboxSlice.actions;// 先构建简单 action `uncheckWithTextCleaned` 要调用的底层简略 action `uncheck`,而这个简略 action 大概率不会在别的中央用到了。const textareaSlice = createSlice({ name: 'textarea', initialState: { text: '', }, reducers: { setText(state, action: PayloadAction<string>) { // ... }, },});const { setText } = textareaSlice.actions;function uncheckWithTextCleaned(): AppThunk { return (dispatch) => { // ... };}// ...dispatch(uncheckWithTextCleaned());// 在只查看 `uncheckWithTextCleaned` 的函数申明的状况下,无奈晓得这个简单 action 会扭转什么状态。如果不追踪函数体,就无奈晓得简单 action 会扭转什么状态,那么状态变动就变得不可预测了。如果追踪了函数体,只管能够晓得会扭转什么状态,但应用上的总体开发老本也就随着减轻了: ...

May 15, 2023 · 3 min · jiezi

关于javascript:JS将秒数转换成对人类友好的格式数组

需要给你一个xxxxxx秒的数值,你想方法把它转换成xx年xx小时xx分xx秒这种格局对人类敌对、可读的文字。 思路先定义好转换规则,比方1年是多少秒,1天是多少秒,1小时是多少秒等等。 而后把每一个规定放到数组中,大的工夫单位放在前边,越小的工夫单位越往后放,这样做的目标是:应用的时候,先从大的工夫单位开始转换(做除法运算),转换完剩下的不够1个工夫单位的秒数(即余数),给下个稍小的工夫单位,让它再做转换操作,而后再把转换完剩下的不够1个工夫单位的秒数,给下一个更小的工夫单位去操作,如此重复,直到最小的工夫单位,那就是秒了。 这种迭代操作用数组的reduce()办法很适合,它就是从头到尾对每个数组元素先做一些操作,而后把某些数据给下一次操作应用。 代码代码如下: // 将秒数转换成对人类敌对的格局数组function friendlyTime(seconds) { // 转化规定 const RULES = [{ title: '年', multiple: 365 * 24 * 60 * 60 }, {title: '天', multiple: 24 * 60 * 60 }, { title: '小时', multiple: 60 * 60, }, { title: '分', multiple: 60, }, { title: '秒', multiple: 1 }] let friendlyArr = [] RULES.reduce((pre, current) => { // 商取整数 const quotient = Math.floor(pre / current.multiple) // 商大于0,才算是有意义的工夫,将其和其对应的工夫单位一并放入数组中 if (quotient > 0) { friendlyArr.push(`${quotient}${current.title}`) } // 返回余数,给下次计算用 return pre % current.multiple }, seconds) return friendlyArr}

May 15, 2023 · 1 min · jiezi

关于javascript:js常用方法整理

1、实现全屏 function fullScreen() { const el = document.documentElement const rfs = el.requestFullScreen || el.webkitRequestFullScreen || el.mozRequestFullScreen || el.msRequestFullscreen if(typeof rfs != "undefined" && rfs) { rfs.call(el) }}fullScreen()2、退出全屏 function exitScreen() { if (document.exitFullscreen) { document.exitFullscreen() } else if (document.mozCancelFullScreen) { document.mozCancelFullScreen() } else if (document.webkitCancelFullScreen) { document.webkitCancelFullScreen() } else if (document.msExitFullscreen) { document.msExitFullscreen() } if(typeof cfs != "undefined" && cfs) { cfs.call(el) }}exitScreen()3、页面打印 window.print()4、打印内容款式更改 <style>/* 应用@media print能够调整你须要的打印款式 */@media print { .noprint { display: none; }}</style><div class="print">print</div><div class="noprint">noprint</div>5、阻止敞开事件 ...

May 15, 2023 · 3 min · jiezi

关于javascript:OT算法浅析

协同编辑当初的前端将来倒退得从陈词滥调的Vue, React等支流技术开始深刻各种细分畛域(webgl,视频剪辑,音视频直播等等);而协同编辑也是一个比拟炽热的细分畛域,面向企业用户很多时候业务场景都须要提供文档协同的能力,所以无论是应用开源的工具库或者本人实现,可能理解协同编辑的各种实现还是有不少的劣势。另外协同编辑的确也很有挑战性,毕竟多用户,实时,版本控制,操作回滚等这些词语堆在一起就曾经头皮发麻;要设计一款高体验,高稳固的协同编辑相对是有相当高的难度。而目前支流协同编辑计划次要还是以OT或者CRDT计划为主;例如石墨文档、腾讯文档、飞书文档、Google Docs都是基于OT协同算法的,Atom编辑器应用的是CRDT协同算法; 分析OT算法一些思考很多时候我在想相似git或者svn这些工具是否就是另外一种模式的协同编辑,只不过没方法那么实时,也没方法各种状况下都主动解决抵触,时常须要人工干预。例如:当近程和本地同时有一个commit的时候,咱们大多时候就是要本地解决抵触,而后产生一个新的commit(补丁),而后提交仓库,代码就到了一个大家都认可的统一状态(谁的代码逻辑都没有失落,可喜可贺)。假如有一个很智能的工具,可能在远端和本地也能主动合并解决任何抵触(无论提交之间的程序如何),而且跟你手动人工本地解决抵触后的代码也是齐全的统一,那么:哇塞,妈妈再也不必放心你跟他人的代码抵触了,世界霎时美妙了许多!甚至当前还能随时主动提交代码同步代码,这不就是实现一个繁难版本的协同代码编辑了吗?所以这个“某个智能合并工具”就是OT算法中,transform的外围,实质上也是遍历各种单个操作状况下如何主动合并,所以这个智能合并工具没有固定的实现的算法,真正的智能是靠咱们开发去保障解决了所有的逻辑分支;而且也意味着只有不停有新的操作减少,整个“智能合并”的复杂度也会疾速减少。 个别OT算法都是采纳地方服务的解决形式,毕竟有地方服务器染指无论再多用户退出,都能够转变为Server和User的单对单交互,那么解决复杂度也会升高很多; Transform依据后面的思考,集体给transform下一个定义: transofrm过程就是输出两个操作:A和B,并且会产出两个新的变形的操作A',B',两边别离利用A',B';可能让两边状态同步统一,无论这两个操作理论的先后顺序是怎么(因为间接利用操作十有八九呈现抵触,就算不发生冲突也难以保障最初状态统一,所以trasform外围就是让本来的操作进行一些扭转,而这种扭转指标是能够让两个状态同步统一)。而实在的外围公式: A', B' = transform(A, B)apply(apply(S, A), B') = apply(apply(S, B), A')用最简略的状况阐明,对于文本字符串操作,能够简化为insert和del两个原子操作,如果退出一个nop就是3个原子操作,那么了解两两配对有9种形式组合。假如原始字符串“123”,例如: A: insert(1, 'a'),B: insert(0, 'b'); 通过transform后产生B': insert(0, 'b') , A': insert(2, 'a'); 最终达到统一的状态:“b1a23”A: del(1),B: insert(2, 'b') ; 通过transform后产生B': insert(1, 'b'), A': del(1); 最终统一状态:“1b3”还有其余7种状况,如果操作类型更多,这些组合更加多,大脑都要裂开。然而至多这里能够明确transform操作理论就是一种主动解决抵触的形式,而且要保障单方利用批改后最终状态重归统一。利用和交互那么理论状况应该怎么利用OT算法,Client跟Server之间交互过程应该是怎么的,这里就参考ot.js来开展说说。Client次要有三种状态: 有两个变量outstanding 和 buffer示意待确认的操作和缓存的本地操作 再举一个交互例子: 从全时序的操作:C -> A -> B -> D然而服务端理论接管到的操作: A -> B,C的操作可能因为网络问题有提早,所以理论服务器所看到的程序跟全时序可能很不一样,然而依然能够通过{A, B}和C上进行transform可能达到一个统一的状态: A_, C_ = transform(A, C) B_, C' = transform(B, C_) applyServer(C')对于客户端在发送C操作后,连随又触发了D的操作,然而这个操作没有立刻发送到服务端,因为C的操作要期待服务端的确认,也就是目前oustanding: C, buffer: D;接着服务端A操作同步过去,在{C, D}和A根底上进行transform: ...

May 14, 2023 · 1 min · jiezi

关于javascript:开源之夏-2023欢迎报名-DragonflyKata-ContainersNydus-社区项目

开源之夏是由“开源软件供应链点亮打算”发动并长期反对的一项暑期开源流动,旨在激励在校学生积极参与开源软件的开发保护,促成优良开源软件社区的蓬勃发展,造就和挖掘更多优良的开发者。 流动联结国内外各大开源社区,针对重要开源软件的开发与保护提供我的项目工作,并面向寰球高校学生凋谢报名。 Dragonfly 我的项目介绍 Dragonfly 是一个基于 P2P 技术的文件散发和镜像减速零碎,并且是云原生架构中镜像减速畛域的规范解决方案以及最佳实际。自 2017 年开源以来,Dragonfly 被许多大规模互联网公司选用并投入生产应用,并在 2018 年 10 月正式进入 CNCF,成为中国第三个进入 CNCF 沙箱我的项目 (Sandbox) 。2020 年 4 月,CNCF 技术监督委员会 (TOC) 投票决定承受 Dragonfly 作为孵化我的项目 (Incubating) 。通过多年生产实践经验打磨的下一代产品,吸取了 Dragonfly 1.x 的长处并针对已知问题做了大量的优化,在解决大规模文件散发场景下有着无可比拟的劣势。基于 P2P 技术的劣势,在 AI Inference 散发模型场景能够解决大文件散发过程中的性能瓶颈。并且能够通过集成 Dragonfly P2P 技术缩小源站压力,进步模型散发效率。在将来,Dragonfly 会联合 AI 畛域生态进行拓展,服务 AI 畛域并且成为其重要基础设施。 Kata Containers 我的项目介绍 自 2013 年 Docker 问世以来,容器技术立即让寰球的开发者为之着迷,并逐步成为古代应用程序、构建、公布和运维的支流形式。容器以规范格局对应用程序进行封装,应用程序可从一个计算环境疾速、平安地切换到另一个计算环境,这对于想要疾速构建、测试和部署软件的开发者而言至关重要。然而传统的以 runC 为代表的容器计划基于共享内核技术,通过 Linux 提供的 Cgroups 和 Namespace 等计划进行隔离和管制,如果某一容器中的恶意程序利用了零碎缺点从容器中逃逸,则会对宿主机零碎形成严重威胁。尤其是在私有云环境,这一潜在威逼成为了容器技术遍及和落地的一大阻碍。如果将不同容器再嵌套放入到不同的虚拟机,通过减少一层绝对平安、成熟的隔离技术,就能大大提高零碎的安全性,缩小零碎被攻破的可能。基于这种思维的开源技术也随之呈现,代表性的两个我的项目为 Intel 开源技术核心的 Clear Containers 和 Hyper.sh 的 runV。2017 年,这两个开源我的项目合并,独特创立了开源我的项目 Kata Containers,其指标是将虚拟机的平安劣势与容器的高速及可管理性相结合,为用户提供标准化、平安、高性能的容器解决方案。Kata Containers 创立的不同 Pod (容器) 运行在不同的虚拟机 (Kernel) 之中,比传统容器提供了更好的隔离性和安全性,同时继承了容器疾速启动和标准化等长处。 ...

May 14, 2023 · 2 min · jiezi

关于javascript:JavaScript作用域深度剖析从局部到全局一网打尽

前言系列首发于公众号『前端进阶圈』 ,若不想错过更多精彩内容,请“星标”一下,敬请关注公众号最新消息。JavaScript作用域深度分析:从部分到全局一网打尽1.1 编译原理JavaScript 事实上是一门编译语言。在传统编译语言中,一段源代码执行前会经验三个步骤: 分词/词法剖析(Tokenizing/Lexing) var a = 2;// 合成后:var、a、=、2、;// 空格是否会被当做词法单元,取决于空格在这门语言中是否具备意义。期间通过两个过程:分词(tokenizing)和词法剖析(Lexing) 、两者的次要差异在于词法单元的辨认是通过有状态还是无状态的形式进行的。解析/语法分析(Parsing) 这个过程就是将词法单元流(数组)转换为一个由元素逐级嵌套组成的代表了程序语法结构的树,这个树被称为"形象语法树"。(Abstract Syntax Tree, AST)。代码生成 将 AST 转换为可执行代码的过程被称为代码生成。也就是说有某种办法将 var a = 2; 的 AST 转换为一组机器指令,用来创立一个叫做 a 的变量(蕴含分配内存等),将一个值贮存于 a 中。比起其余编译过程只有这三个步骤的语言的编译器,JavaScript 引擎要简单得多,在语法分析和代码生成阶段有着特定的步骤来比照运行性能进行优化,包含对冗余元素进行优化等。简略来说,任何 JavaScript 代码片段在执行前都要进行编译(通常就在执行前)1.2 了解作用域1.2.1 演员表引擎:从头到尾负责整个 JavaScript 程序的编译及执行过程。编译器:引擎的好敌人之一,负责语法分析及代码生成等脏活累活。作用域:引擎的另一个好敌人,负责收集并保护由所有申明的标识符(变量)组成的一系列查问,并履行一套严格的规定,确定以后执行的代码对这些标识符的拜访权限。1.2.2 对话var a = 2; 这段代码是一句申明。但会通过编译器和引擎的解决来进行。S: 变量的赋值操作会执行两个动作,首先编译器会在以后作用域中申明一个变量(如果之前没有申明过),而后在运行时引擎会在作用域中查找该便令,如果可能找到就会对它进行赋值。1.2.3 编译器有话说编译器在编译过程中的第二步中生成了代码,引擎执行它时,会通过查找变量 a 来判断他是否已申明过。查找的过程由作用域进行帮助,然而引擎执行怎么的查找会影响最终的查找后果。引擎常应用的查问类型为:LHS和RHS LHS: 赋值操作的指标是谁RHS: 谁是赋值操作的源头1.2.5function foo(a) { var b = a; return a + b;}var c = foo(2);// 对话:1. 申明 var c2. 对 c 进行 LHS3. 对 foo(2) 进行 RHS4. function foo(a) 期间会进行 a = 2, 对 a 进行 LHS5. 申明 var b6. 对 b 进行 LHS7. 对 a 进行 RHS8. return a + b; 别离对 a、b 进行 RHS// 答案:1. 所有的 LHS(一共有3处) 1. c =..; 2. a = 2(隐士变量调配) 3. b = ..2. 所有的 RHS (一共有4处) 1. foo(2.. 2. = a; 3. a.. 4. .. b1.3 作用域嵌套作用域是依据名称查找变量的一套规定。当一个块或函数嵌套在另一个块或函数中时,就会产生作用域的嵌套。因而在以后作用域中无奈找到某个变量时,引擎就会在外层作用域中持续查找,直到找到该变量,或到达最外层的作用域(也就是全局作用域)为止。 ...

May 14, 2023 · 2 min · jiezi

关于javascript:js计算一个矩形内部有一个等比缩放的矩形如何判断宽和高那个先溢出外层的矩形

最近在做js canvas绘图需要时,遇到一个矩形图形重叠逻辑判断问题。一个任意矩形外部,有一个任意等比缩放的矩形,如何判断宽和高那个先溢出外层的矩形?宽和高那个先贴到边上? 能够依据两个矩形的比例关系来判断宽和高那个先溢出。首先计算出两个矩形的宽高比,而后比拟它们的大小关系。若外层矩形的宽高比大于内层矩形的宽高比,则内层矩形先溢出的是宽;反之,先溢出的是高。 具体实现的代码示例如下: function checkOverflow(outerWidth, outerHeight, innerWidth, innerHeight) { // 父矩形比例 let outerRatio = outerWidth / outerHeight; // 子矩形比例 let innerRatio = innerWidth / innerHeight; if (outerRatio > innerRatio) { // 宽先溢出 return "width"; } else { // 高先溢出 return "height"; }}亲测试验能够

May 13, 2023 · 1 min · jiezi

关于javascript:我的网站中了马

前言&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp其实我网站中马应该能够追朔到去年的八月份,过后如同是在 xx 平台有用户给我留言说网站上的游戏进不去了 (五子棋多人联机)。于是我关上一看发现首页被动态化了,为了疾速能拜访就从新提交了入口文件也没持续理睬。        &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp直到起初,隔一断工夫就又有人留言说打不开,我才开始排查起因了。进入我的项目代码里,我发现有些文件被批改了。另一方面呢,网站的收录也在一直变少,甚至搜寻进去的词和形容都变了,有赌博的,也有体育,迷彩之类的,我猜想应该是中马了。        &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp然而有一点想不通,这人是不是闲得无聊。网站上除了技术类文章,还有就是一些 H5 单机游戏,资源城和多人联机游戏因为没有其余支出撑持,到期后就敞开了。剩下的就是一些收费应用的小工具了,有必要在我网站上挂马吗,带着这个疑难就全都排查了一下代码,终于找到了两个文件能解释这个问题了。  文件一,篡改的入口文件&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp他是间接拿动态化的首页加了一些脚本放在了入口文件上,导致我导航栏的跳转全副生效,以下就是我截取的局部文件代码,再阐明一下外面放了什么。  1.TDK 局部 &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp也就是题目,形容和关键词都改了,就是下面的模样通过 ascii 编码,能够通过脚本之家的工具 ascii 转中文查看。他改的大略都是一些体育,迷彩之类的词,这也就解释了为什么网站的搜索词都变了,因为没有跳转收录也就变少了。 2.JavaScript 局部&nbsp&nbsp&nbsp&nbsp&nbsp&nbspJs 次要是上面那一长串数字,是 unicode 编码了。我一个数字一个数字转完之后,发现原来是一个 Js 脚本引入,最初 ducument.write 就是每次进入都引入脚本,脚本如下。原来是给他的网站做引流,所以我也关上了他网站,就是上面这个。 文件二,PHP 大马&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp这个文件就是他们挂上去的,可能是之前通过留言表单的 bug 提交的,文件名 dama.php,网络上搜寻应该就能够理解到,代码如下:     \x62\x61\x73\x65\x36\x34\x5f\x64\x65\x63\x6f\x64\x65 像这个是十六进制,能够通过 JS 的 console.log 或 alert 显示进去,其实就是 base64_deocde 函数名,而 \nc\n3\nR\ny\nX\n3\nJ\nv\nd\nD\nE\nz\n 同样打印进去是如下一串换行的字母,所以就是 base64_decode () 那串,解码后是一个 str_rot13 () 函数         所以那一串长长的就是被 ROT13 编码了,能够通过以下形式批改,还原出那一串是些什么货色,也能够把 dama.php 在本地我的项目里间接运行。     运行后的样子如下,登陆密码就是他代码里的那个 $password, 其实大略猜的到是 Admin 通过 md5 的,登陆后如下。 ...

May 13, 2023 · 1 min · jiezi

关于javascript:个人如何搭建Rtmp服务结合uniapp开发直播APP

前言因为本人有一个IM类的利用,为了欠缺它所以决定也加上直播和短视频性能。做直播目前有两种办法,一是间接对接第三方的直播服务产品,二是本人搭服务再开发。所以这里也从这两个办法举荐简略的实现形式,阿里云和腾讯云之类的大厂产品就不安利了。 选型第三方,PHP+Uni-App+LiveQing本人开发,PHP+Uni-app+Nginx-rtmp-module实现流程1.客户端采集视频流。(开摄像头,录屏等) 2.客户端推流到rtmp服务器上。 3.rtmp推流到某个特定端口。 4.其余客户端再对该视频流进行拉流,实现直播。 第三方形式第三方这次举荐的是一个叫LiveQing的平台,有点是搭建快捷不便,功能完善。在服务器上运行了他们的包后除了能实现支流业务场景的直播,而且还提供短视频的点播服务。还包含API调用,通过接口实现直播的创立,删除,直播数据统计。然而是要免费,该软件包在一台物理机或云服务器上只能收费试用一个月。 1.找到该官网,抉择rtmp直播点播流媒体,下载试用把对应零碎解压到本人服务器。 2.目录如下,将start.sh受权为777。而后./start.sh 运行该文件。 3.运行前能够关上liveqing.ini进行设置,比方后盾登录明码,端口号等。 4.默认须要开启10080和10085,所以须要用防火墙放行,操作如下。 systemctl start firewalld.service // 开启防火墙firewall-cmd add-port=10080/tcp --permanentfirewall-cmd add-port=10082/tcp --permanentfirewall-cmd --reload // 重启firewall-cmd --list-ports // 查看放行的所有端口5.端口放行,而后在运行start.sh呈现上面图标示意胜利。 6.浏览器输出服务器的外网IP:10080,就能够进入控制面板了。 7.创立一个直播,设置名称和ID,而后抉择编辑获取推流地址。 8.为了测试能够本地下载一个OBS软件推流到该地址,只有一推流,直播状态就会显示直播中并且点击编辑能够获取拉流的地址。 9.同样为了不便能够应用VLS软件进行拉流或者wowza在线网站测试直播。 代码实现不应用第三方的话,就须要搭建rtmp服务,配置Nginx,APP视频采集推流,拉流等等。如果是大型平台,须要进行分流集群等。流媒体服务器依赖的服务,1.nginx 服务器;2.nginx服务器装置须要依赖的服务 OpenSSL、pcre、zlib、 c++、gcc等,服务器环境是Centos 7.3 64 位。 1.进入根目录,mkdir source #创立源码目录,前面的源码都放在这个目录。cd source进入该目录。 2.下载git,yum -y install git,而后通过网络下载须要的包。 git clone https://github.com/nginx/nginx.git #从github服务器上将nginx的源代码下载下来git clone https://github.com/arut/nginx-rtmp-module.git #将rtmp模块的源码下载下来wget https://www.openssl.org/source/openssl-1.1.0.tar.gz #下载OpenSSL源码包wget https://ftp.pcre.org/pub/pcre/pcre-8.39.tar.gz #下载pcre源码包wget http://www.zlib.net/zlib-1.2.11.tar.gz #下载zlib包源码3.tar -zxvf 包名 #解压各个包源码 4.在将nginx和须要的包编译前须要先装置gcc,装置过能够省过。 yum -y install gcc #确保依赖的gcc装置yum -y install gcc-c++ #确保依赖的c++曾经装置5.而后cd命令进入source下的nginx目录,输出上面命令。 ...

May 12, 2023 · 7 min · jiezi