欢迎来到【gdb 源码行号】【发送邮箱php源码】【绝地逃生透视源码】轮子源码_轮子代码-皮皮网网站!!!

皮皮网

【gdb 源码行号】【发送邮箱php源码】【绝地逃生透视源码】轮子源码_轮子代码-皮皮网 扫描左侧二维码访问本站手机端

【gdb 源码行号】【发送邮箱php源码】【绝地逃生透视源码】轮子源码_轮子代码

2024-11-19 07:35:26 来源:{typename type="name"/} 分类:{typename type="name"/}

1.java byte[] 和ByteBuffer作为中间缓存各有什么特点?
2.cookieAPI真难用,轮源你造过相关的码轮轮子吗
3.Luy 1.0 :一个React-like轮子的诞生
4.Python 自己简单地造一个轮子.whl文件
5.轮子篇Joystick

轮子源码_轮子代码

java byte[] 和ByteBuffer作为中间缓存各有什么特点?

       byteBuffer就是在byte[]基础上发明的轮子。抽象上高一级,代码原理一样。轮源

       如果用byte[]能直接实现,码轮用byte[]是代码gdb 源码行号最直接有效的。

       bytebuffer主要和NIO配套使用,轮源让自己的码轮代码融入NIO,不一定适用于脱离NIO相关的代码自制环境。

cookieAPI真难用,轮源你造过相关的码轮轮子吗

       前言

       歌德说过:读一本好书,就是代码在和高尚的人谈话。同理,轮源读优秀的码轮开源项目的源码,就是代码在和优秀的大佬交流,是站在巨人的肩膀上学习——今天我们将通过读js-cookie的源码,来学会造一个操作cookie的轮子~

1.准备简单介绍一下cookie

       Cookie是直接存储在浏览器中的一小串数据。它们是HTTP协议的一部分,由RFC规范定义。最常见的用处之一就是身份验证我们可以使用document.cookie属性从浏览器访问cookie。

这个库,是干啥的?不用这个库时?

       cookie的原生API,非常“丑陋”:

修改

       我们可以写入document.cookie。但这不是一个数据属性,它是一个访问器(getter/setter)。对其的发送邮箱php源码赋值操作会被特殊处理。对document.cookie的写入操作只会更新其中提到的cookie,而不会涉及其他cookie。例如,此调用设置了一个名称为user且值为John的cookie:

document.cookie?=?"user=John";?//?只会更新名称为?user?的?cookiedocument.cookie?=?"user=John;?path=/;?expires=Tue,??Jan??::?GMT"

       赋值时传入字符串,并且键值对以=相连,如果多项还要用分号;隔开...

删除

       将过期时间设置为过去,自然就是删除了~

//?删除?cookie(让它立即过期)document.cookie?=?"expires=Thu,??Jan??::?GMT";document.cookie?=?"user=John;?max-age=0";

       但是很明显,这语义化也太差了..

js-cookieAPI

       我们先来了解一下API

//?setCookies.set('name',?'value',?{ ?expires:?7,?path:?''?})//?get?Cookies.get('name')?//?=>?'value'Cookies.get()?//?=>?{ ?name:?'value'?}//?removeCookies.remove('name')

       OK我们大概可以知道是这样子

set(key,?value)get(key)remove(key)

       简洁方便多了,并且一眼就知道这行代码是在干什么~

2.读源码三部曲?

       这段可能有点太细了,如果嫌啰嗦,只想看实现可以直接跳到下面的实现部分~

一?READMEwhy

       一个简单、轻量级的JavaScriptAPI,用于处理cookie适用于所有浏览器?接受任何字符大量的测试?不依赖支持ES模块支持AMD/CommonJSRFC兼容的有用的Wiki?启用自定义编码/解码<字节gzip!

       优点多多呀

表示后文会详细提及~

BasicUsage

       大概就是前面写过的API介绍

二package.json依赖

       确实是很少依赖,并且只有开发依赖,没有生产依赖,很nice~

scripts"scripts":?{ "test":?"grunt?test","format":?"grunt?exec:format","dist":?"rm?-rf?dist/*?&&?rollup?-c","release":?"release-it"?},exportsexports":?{ ".":?{ ?"import":?"./dist/js.cookie.mjs",?"require":?"./dist/js.cookie.js"},

       看来入口在/dist/js.cookie这点从index.js也能看出

module.exports?=?require('./dist/js.cookie')

       当然,目前是没有dist这个目录的。这需要打包~

.mjs

       另外我们刚才看到了.mjs这个后缀,这我还是第一次见,你呢

       .mjs:表示当前文件用ESM的方式进行加载

       .js:采用CJS的方式加载。

ESM和CJS

       ESM是将javascript程序拆分成多个单独模块,并能按需导入的标准。和webpack,babel不同的是,esm是绝地逃生透视源码javascript的标准功能,在浏览器端和nodejs中都已得到实现。也就是熟悉的import、exportCJS也就是commonJS,也就是module.exports、require。

       更多介绍以及差别不再赘述~

三src进入src,首当其冲的就是api.mjs,这一眼就是关键文件啊?emm..一个init方法,其中包含set和get方法,返回一个Objectremove方法藏在其中~乍一看,代码当然还是能看得懂每行都是在做啥的呀~但是总所周知?

       开源项目也是不断迭代出来的~也不是一蹴而就的——若川哥

       okok,我们来一步步"抄"一下源码

3.实现?

       下面为了传参返回值更加清晰用了TS语法~

3.1最简易版本set

       设置一个键值对,要这样

document.cookie?=?`${ key}=${ value};?expires=${ expires};?path=${ path}`

       除了键值对还有后面的属性~可别把它忘记了我们用写一个接口限制一下传入的属性:

interface?Attributes?{ ?path:?string;?//可访问cookie的路径,默认为根目录?domain?:?string;?//可访问?cookie?的域?expires?:?string?|?number?|?Date?//?过期时间:UTC时间戳string?||?过期天数?[`max-age`]?:number?//ookie?的过期时间距离当前时间的秒数?//...}const?TWENTY_FOUR_HOURS?=?e5?//h的毫秒数//源码中是init的时候传入defaultAttributes,这里先暂做模拟const?defaultAttributes:?Attributes?=?{ path:?'/'}function?set(key:?string,?value:?string,?attributes:?Attributes):?string?|?null?{ ?attributes?=?{ ...defaultAttributes,?...attributes}?//?if?(attributes.expires)?{ //如果有过期时间//?如果是数字形式的,就将过期天数转为?UTC?stringif?(typeof?attributes.expires?===?'number')?{ ?attributes.expires?=?new?Date(Date.now()?+?attributes.expires?*?TWENTY_FOUR_HOURS)?attributes.expires?=?attributes.expires.toUTCString()}?}?//遍历属性键值对并转换为字符串形式?const?attrStr?=?Object.entries(attributes).reduce((prevStr,?attrPair)?=>?{ const?[attrKey,?attrValue]?=?attrPairif?(!attrValue)?return?prevStr//将key拼接进去prevStr?+=?`;?${ attrKey}`//?attrValue?有可能为?truthy,所以要排除?true?值的情况if?(attrValue?===?true)?return?prevStr//?排除?attrValue?存在?";"?号的情况prevStr?+=?`=${ attrValue.split(';?')[0]}`return?prevStr?},?'')?return?document.cookie?=?`${ key}=${ value}${ attrStr}`}get//?删除?cookie(让它立即过期)document.cookie?=?"expires=Thu,??Jan??::?GMT";document.cookie?=?"user=John;?max-age=0";0

       我们知道document.cookie长这个样子,那么就根据对应规则操作其字符串获得键值对将其转化为Object先

//?删除?cookie(让它立即过期)document.cookie?=?"expires=Thu,??Jan??::?GMT";document.cookie?=?"user=John;?max-age=0";1

       要注意的有意思的一个点是,可能value中就有'='这个字符,所以还要特殊处理一下~

       比如他就是"颜文字==_="?(~~应该不会有人真往cookie里面放表情吧hh~~但是value中有'='还是真的有可能滴~?其实一开始我真没想过这个问题,是看了源码才知道的

Record

       接收两个参数——keys、values,使得对象中的key、value必须在keys、values里面。微信模版源码

remove

       remove就简单啦,用set把过期时间设置为过去就好了~

//?删除?cookie(让它立即过期)document.cookie?=?"expires=Thu,??Jan??::?GMT";document.cookie?=?"user=John;?max-age=0";.2接受任何字符

       从技术上讲,cookie的名称和值可以是任何字符。为了保持有效的格式,它们应该使用内建的encodeURIComponent函数对其进行转义~再使用ecodeURIComponent函数对其进行解码。还记得README中写的接收任何字符吗~这就需要我们自己来在里面进行编码、解码的封装~

set//?删除?cookie(让它立即过期)document.cookie?=?"expires=Thu,??Jan??::?GMT";document.cookie?=?"user=John;?max-age=0";3get//?删除?cookie(让它立即过期)document.cookie?=?"expires=Thu,??Jan??::?GMT";document.cookie?=?"user=John;?max-age=0";.3封装编码和解码两个操作

       源码中converter.mjs封装了这两个操作为write和read,并作为defaultConverter导出到api.mjs,最后作为converter传入init——降低了代码的耦合性,为后面的自定义配置做了铺垫~前面编码解码变成了这样:

//?删除?cookie(让它立即过期)document.cookie?=?"expires=Thu,??Jan??::?GMT";document.cookie?=?"user=John;?max-age=0";.4启用自定义编码/解码

       我们是具有内置的encodeURIComponent和decodeURIComponent,但是也并不是必须使用这两个来进行编码和解码,也可以用别的方法——也就是前面README中说的可以自定义编码/解码~除了这两个方法可自定义,其余的属性也可以自定义默认值,并且配置一次后,后续不用每次都传入配置——所以我们需要导出时有对应的两个方法

//?删除?cookie(让它立即过期)document.cookie?=?"expires=Thu,??Jan??::?GMT";document.cookie?=?"user=John;?max-age=0";6

       封装在其中,利用对象合并时有重复属性名的情况是后面的覆盖掉前面的这一特性完成该自定义配置属性以及转换方法的功能。现在的cookie大概是这样的一个对象

//?删除?cookie(让它立即过期)document.cookie?=?"expires=Thu,??Jan??::?GMT";document.cookie?=?"user=John;?max-age=0";.5防止全局污染

       现在的cookie直接在全局上下文下,很危险,谁都能更改,而且还不一定能找到,我们将其设置为局部的,封装到init函数中,调用init传入相应的自定义属性以及自定义转换方法得到一个初始化的cookie对象现在大概就是源码的架构形状了~

//?删除?cookie(让它立即过期)document.cookie?=?"expires=Thu,??Jan??::?GMT";document.cookie?=?"user=John;?max-age=0";.6确保一些属性不会给改变

       用Object.create来生成对象,并用Object.freeze把对象atributes和converter冻结。

//?php 入门源码删除?cookie(让它立即过期)document.cookie?=?"expires=Thu,??Jan??::?GMT";document.cookie?=?"user=John;?max-age=0";9

       Obecj.create的第二个参数

       属性描述符

       现在你就不能修改Cookie的attributes、converter属性了~

4.总结&收获?总结init及其中属性&返回而用init函数生成对象是为了解决全局污染问题,并且更新对象时也是用的init

       现在你再回头看源码是不是就更加清晰了~

扩展

       说到cookie这个在浏览器中存储数据的小东西,就不得不提一下localstorage、sessionStorage

cookie、localstorage、sessionStorage的区别

       Web存储对象localStorage和sessionStorage也允许我们在浏览器上保存键/值对。

       那他们的区别呢

       在页面刷新后(对于sessionStorage)甚至浏览器完全重启(对于localStorage)后,数据仍然保留在浏览器中。默认情况下cookie如果没有设置expires或max-age,在关闭浏览器后就会消失

       与cookie不同,Web存储对象不会随每个请求被发送到服务器,存储在本地的数据可以直接获取。因此,我们可以保存更多数据,减少了客户端和服务器端的交互,节省了网络流量。大多数浏览器都允许保存至少2MB的数据(或更多),并且具有用于配置数据的设置。

       还有一点和cookie不同,服务器无法通过HTTPheader操纵存储对象。一切都是在JavaScript中完成的。

       以及..他们的原生API比cookie的"好看"太多~[doge]

CookiesessionStoragelocalstorage生命周期默认到浏览器关闭,可自定义浏览器关闭除非自行删除或清除缓存,否则一直存在与服务器通信/post/

Luy 1.0 :一个React-like轮子的诞生

       在过去的月余,我从零开始构建了一个类React的框架——Luy,以此深入学习React内部算法与数据结构。今日,Luy的首个版本终于发布,通过实测一个小型项目,证明其可行性。您可访问动态简历luy版本进行预览,或访问仓库主页获取源码,期待您的支持。

       实则并非从零开始,Luy利用官方解析器处理jsx。面对这一项目,我感到既困惑又畏惧,但通过研读源码及搜索文章,逐渐理解了React的复杂之处。

       构建Luy时,挑战尤其集中在更新机制上,这是虚拟DOM实现的关键。了解inverno.js的快速性能,可发现其算法优势。Luy采用的是snabbdom源码学习算法,其执行效率令人满意。与官方React相比,速度优势明显。

       对于希望深入学习React源码的朋友,建议先动手构建一个框架,再阅读源码。理解框架中每行代码背后解决问题的逻辑,是掌握React内核的关键。Google搜索辅助理解,阅读源码过程虽艰难,但收获巨大。

       Luy的未来充满可能。最初目标为学习React原理,但随着项目进展,我决定持续维护并跟进React官方更新。Luy支持如createPortal等特性,适合作为学习React套路的工具。面对公司新项目,我决定尝试使用Luy,以实践所学。

       Luy框架总计约行代码,简洁明了,可作为学习React框架的入门选择。访问Luy框架地址获取源码。代码实践是学习编程的基石,正如@vczh所言,热爱编程的年轻人应铭记学习的重要性。

Python 自己简单地造一个轮子.whl文件

       Python的世界中,我们常常依赖众多高效的第三方库,但有时网络问题会阻碍我们的使用。这时,为何不尝试自己动手制作一个.whl文件呢?这不仅能提升效率,也是一种贡献社区的方式。

       当我们通过pip install来引用库时,通常是在网络环境中。然而,当网络状况不佳时,我们可以选择先将库下载到本地,使用pip install本地路径/包名.whl的方式加载。要实现这一点,首先需要整理你的项目结构。将代码和数据分开存放,为每个子目录添加__init__.py,以便于调用和打包。例如,你可能有shuru.py和data文件夹,其中data文件夹包含文本文件,代码中通过绝对路径处理。

       接下来,编写setup.py和MANIFEST.in文件是关键步骤。setup.py用来定义项目信息和打包设置,MANIFEST.in用于指定要包含的文件。执行命令行中的setup.py build,你的项目和数据就会被打包到.whl文件中。在build文件夹里,你会看到创建好的.whl文件,可以直接通过pip install命令安装。

       为了验证成功,新建一个项目,导入你的.whl文件,运行后,它会出现在pip list的列表中。如果你需要源代码或工程文件,可以通过微信号bdb_获取。自己动手造轮子,既实用又充满成就感!

轮子篇Joystick

       轮子篇Joystick 实现指南

       在开发过程中,我曾针对摇杆交互遇到不舒适的问题,决定自定义一个轻量级的解决方案。目标是创建一个类似《王者荣耀》风格的摇杆,包括背景、摇杆头以及方向指示。以下是整个过程的概述:

       UI设计与搭建

       首先,根据需求草图,我们使用UGUI构建了一个结构,仅需四个Image组件:Touch区、背景、摇杆头和方向指示。Touch区保持透明以接收触控事件,Dir区在摇杆操作时显示方向。

       事件处理

       借鉴NGUI的经验,利用IEventSystemHandler的OnPointerDown、OnDrag和OnPointerUp事件,定义JoystickEvent类,携带一个Vector2方向数据,以及对应的按下、移动和抬起回调函数。

       摇杆操作逻辑

       关键在于计算摇杆的移动,即向量b(摇杆头中心)与向量a(背景中心)之间的差值,形成向量c,这模拟了摇杆操作的实际效果。

       注意事项

       在Drag回调中,确保正确处理向量计算,确保摇杆移动的准确性。

       总结与源码分享

       这个过程虽然简单,但通过编写代码和分享,我找到了调整心态的方式。最后,我想提醒大家:坚持不易,但放弃就意味着失败。源码已上传至Git,欢迎各位Fork或Star,地址如下:

       ...