探索TypeScript辅助工具类型的应用场景与最佳实践
前言👉 TypeScript中的辅助工具类,主要是用于帮助开发者创建可维护性高的代码自动检测机制,举个例子说明以下: 在项目过程中,我们一般需要将环境定义到环境变量中,然后整体项目的编译、打包运行,都依赖于该环境变量,TypeScript中的辅助工具类就是用来基于该环境变量来创建对应的类型,从基准类型中创建新的类型!!
🌠 这边整理了关于TypeScript中所提供的辅助工具类型清单,并根据实际的应用场景进行的划分, 👇 下面将进行一一的分析与场景应用举例!
属性修饰符转换
Required<Type>
Required
用于将类型Type中的所有可选属性变为必选属性,一般接受一个有可选属性的类型,然后返回一新的类型,这个新的类型中的所有属性都是必须属性,比如有 👇 的一个例子:
12345type MyType = { foo?: string, bar?: number}type RequiredMyType = Required<MyType>
🌟 从上述的运行结果,我们可以看出RequireMyType已经是所有属性都必须传递的了!
R ...
mongodb中的query查询以及聚合管道查询
前言
在看完mongodb的官方文档之后,还是有点一头雾水,对于一些相关的查询以及聚合管道很多不能够信手拈来,而且查询文档的时候也发现难以入手,本文主要针对相关的查询选择器以及聚合管道操作进行分类筛选,让自己对mongodb所提供的操作 🈶 一定的概念,然后通过这个分类来进行查询使用,加深理解印象!
mongodb中的查询语句分类
一切以db.collections.find()方法入手,mongodb给我们抽象出来了这个统一的查询入口⚠ 在mongodb中,我们可以通过mongosh程序,通过db.collections.method不带括号的方式来查看一个方法的描述,如下图所示;🌟 通过这种方式,可以查看到该方法的定义与返回值等相关信息
在开始详细介绍这个查询过滤器分类之前,先看一下 👇 的一个分类结构图:👽 从上图可以看出,针对不同的查询筛选操作,进行了以下对应类目的分类:
比较/范围筛选
逻辑操作
属性匹配
数组匹配
地理位置运算匹配
数学运算匹配
投影相关
位运算匹配
其他匹配操作
比较/范围筛选
主要用来筛选某个字段是否满足大于、小于、相等、不等于、大于 ...
Mongodb与Mongoose关于schemaType的差异性
前言
mongodb是一个机遇分布式文件存储的开源数据库系统,使用的非关系型数据库的设计,其提供了一种高性能、高可用一集易扩展的数据库解决方案。其主要的特点有:文档导向、无模式、索引支持、复制与高可用性、自动分片、丰富的查询语言、聚合工具等特性。mongoose是一个开源的对象文档映射器(ODM)库,主要为node.js提供了一种高效的方式来管理mongodb数据库中的数据,其通过模型定义(Schema definition)、数据验证(Data validation)、查询构建(Query building)、中间件(Middleware)、插件体系(Plugins)等功能,极大的简化了使用mongodb的复杂性!schema作为mongodb与mongoose的抽象单元,提供了基础的抽象服务!
什么是schemaType?它有什么作用?
在mongodb中最基本单元是文档(doc),而文档则由一个个的字段构成,mongodb中采用schema的抽象概念来对文档进行抽象化,而schemaType则是对schema中每一个字段的属性的描述,理解了mongodb与mongoose中关于 ...
如何给你的CMS项目添加搜索服务
前言
😕 我们平时在浏览一些开源的在线文档的时候,经常会使用到这个搜索功能,方便自己快速检索到感兴趣的信息,本文将具体带一把,关于如何在自己的文章管理系统中加入此服务,先瞄一眼以下的一个集成后的效果:
是不是觉得也很好用,想要在自己的文档中使用这个吗?下面将一步一步带你进入algolia搜索的世界!!
什么是algolia
algolia 是一家提供搜索和发现解决方案的公司。他们的主要产品是 algolia search,这是一个用于网站、移动应用和其他应用程序的搜索引擎服务。algolia 的搜索引擎旨在提供快速、可定制和易于集成的搜索体验。
algolia 的搜索引擎基于分布式架构,利用了云计算和搜索算法来提供高性能的搜索服务。它支持全文搜索、模糊搜索、过滤、排序和其他高级搜索功能,使开发人员能够创建强大的搜索体验,提高用户在应用程序中找到所需信息的效率。
如何集成algolia
这里以我的hexo博客文档为例,在当前项目中集成三方库 hexo-algoliasearch,通过借助于这个库,可以快速地在我们的项目中集成这个文档搜索服务
😕 这里假定我们已经注册好了 ...
Hexo安装与配置服务升级
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
Quick StartCreate a new post1$ hexo new "My New Post"
More info: Writing
Run server1$ hexo server
More info: Server
Generate static files1$ hexo generate
More info: Generating
Deploy to remote sites1$ hexo deploy
More info: Deployment
Nuxt3.0的学习与使用
前言
之前已经学习过关于Nuxt2.0Nuxt2.0知识文档的相关知识点,也在实际的该框架下进行过对应的项目开发,现在迁移至Nuxt3.0的学习(本文简称Nuxt),并在此框架上进行对应的项目实战,在实战之前,很有必要进行关于Nuxt的使用文档简单的说明!!之前已经针对2.0版本进行一个详细的分析过了,因此本文仅针对3.0的使用特性进行一些补充说明。在开始进行该框架的介绍时,这边想先抛出几个关键词:自动导入(auto-imported)、模块集成、插件集成!!
目录与文件介绍
👇 将进行额外的目录与文件介绍,阐述关于Nuxt在使用上 🈶 什么不同之处
.nuxt
.nuxt目录将是Nuxt运行时的产物,一旦我们run这个命令的时候,将自动生成对应的资源文件。生成的文件内容如下: 从上面的截图我们可以解答这个问题:为什么在Nuxt环境中,可以免导入来直接使用全局组件以及全局API, 👉 因为自动导入的原因!!
components
该目录是放置所有的SFC组件的地方,所有的组件将会被自动注册到全局中,在实际的项目业务开发过程中,可以无需导入来直接使用!默认情况下,该目录的配 ...
如何使用tailwindcss来管理项目的样式
前言😕 大家可以看到之前我们项目(比如使用vue全家桶+某个UI库)中打包出来的结果css内容,可以发现,我们在项目中经常使用的那就那么些样式,但是打包出来的最终效果确是像 ☝ 的一样,将有关的和无关的样式都给怼进来了,搞得整个css样式表非常的大。 更 🐶 的是如果我们要做响应式的交互效果,我们基本上都得一个个媒体查询都得用起来,并维护一套套的不同的样式表,来确保在对应的屏幕上能够按照既定的目标来展示对应的效果。 还有更 🐕 的是作为开发者,还必须想好每个样式的名字,如果按照 css中的BEM命名规范 的话,还得去想好每个样式的名称。当然在实际的coding过程中还有其他比较繁琐的事情,让我们从css样式代码管理工作中释放出来!
👉 因此,tailwindcss 官网 应运而生,就是为了解决上述提及到的相关问题,以及根据更多的使用业务应用场景来管理项目中的样式!!
什么是tailwindcss?
tailwind css的工作原理就是扫描所有的HTML文件、JavaScript组件以及任何其他模版来获取其中出现的类型,生成对应的样式,然后将它们写入到静态的css文件中,也 ...
从vue2迁移到vue3的编码实战思考
前言
习惯了vue2全家桶项目的开发,突然转向vue3,如果单纯的使用选项式的模式来编写vue3的项目的话,与vue2并没有太大的差别,无非是将data从原本的data(){}函数中转移到了setup()函数中而已,但在vue3中提供了另外一种组合式编程的模式,让我们能够以函数调用的方式来编写对应的项目,下面将通过实际的项目编码方式上的对比,来进行整理两者之间的一个区别,加深对vue3项目的理解!
项目实战
👇 基于 1⃣ 开源的项目进行学习与分析:☝ 是对应的项目的源码目录,主要 🈶 api、assets、components、hooks、icons、locates、plugins、router、store、styles、utils、views,下面将一一分析每个文件夹中都代表着什么意义,以及以下都有哪些文件资源,都有各自对应的什么内容!
1、api
一般是前端项目中与业务相关的接口定义,可根据实际业务场景情况进行定义,一般是通过调用公共的axios工具类,来对外暴露业务本地化调用的接口,但是在以前我们所编写的方法中,我们一般是通过接收url+params的方式,来发起的接口 ...
vue3全家桶学习
前言
在从以前vue2项目中转向vue3的领域,据网上说好像有很大的性能以及编码速度的提升空间,感觉已经迫不及待要来接触这个领域,看看vue3是如何“征服”vue2的开发者的,它与之前使用vue2所开发出来的项目 🈶 什么区别? 🈶 什么优势???
在通读了一遍vue3的官方文档 vue3官方文档 之后,感觉编码习惯 🈶 一定的区别,虽然vue3支持“选项式(与vue2编码方式类似)”与“组合式”的编码方式,但在经过简单的练手之后发现,组合式的编码方式能够在一定程度上减少代码量,而且更多地是以函数的思维来编写代码,而且与vue3的其他框架能够无缝衔接!!
😕 但是,这边也 🈶 几个问题,结合以前所开发的项目来进行提问,并在后续的学习过程中将来分析解决这些问题:
vue3中通过import语法来引入vue3的相关API方法(比如ref),然后直接调用,在以前vue2中是直接在data函数中返回的对象中声明,其他API方法也是如此,因为在编写vue3的SFC组件的时候,这些API应该都会被直接调用,那么是否可以将这个import给去掉,然后直接来调用呢?
vue3中通 ...
验证json-web-token的koa中间件:koa-jwt
前言
JSON Web Token(以下简称JWT)是一个开放标准,它定义了一种紧凑且自包含的方式,用于作为JSON对象在各方之间安全地传输信息。此信息可以被验证和信任,因为它是数字签名的。JWT可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对来签名。简而言之,就是使用一个加密的以及base64编码组成的字符串,用于解决跨域认证问题的一个机制!
传统的用户认证流程
传统的用户认证流程一般如下:
用户想服务器端发送用户名以及密码;
服务器端认证通过后,将用户信息存储于当前会话(session)中,比如有用户信息、登录时间等等;
服务器端向用户返回一个sessionId,写入到用户的cookie中;
随后用户的每一次请求,都会通过cookie来携带上sessionId,传回给服务器,告知已认证通过,并进行认证通过许可后的资源访问;
服务器从cookie中捞到sessionId之后,认证通过后,放行继续往下执行;
😕 这里方式是拥有一定的弊端的,加入是单机的,一般没有什么太大的问题,但是如果是集群或者是跨域多服务的情况下,就需要将sessionId来进行共享, ...
koa用户认证抽象层中间件
前言
koa-userauth用户认证抽象层中间件,主要用于在某些场景下,某些资源是必须授权(一般是登录)通过之后才能够访问的,当未登录去访问需要的资源时,由于该资源是需要授权才能够访问到的(可选择从session中获取),因此将自动重定向到,再重定向到原本目标资源的访问
如何使用123456789101112131415161718const koa = require('koa');const userauth = require('koa-userauth');const session = require('koa-generic-session');const app = new koa();app.keys['I am secret'];app.use(session());app.use(userauth({ match: '/user', loginURLFormatter: (url) => { return '即将重定向的登录页面?redirect=' + url }, getUser: async ctx => { const t ...
文件上传中间件:koa-multer
前言
文件上传,应该是web应用开发中最常见的动作了,一般有单文件上传、多文件上传、文件与数据一同上传等方式,而koa中使用了koa-multer来进行文件的上传服务,下面让我们来了解一波关于文件上传服务的使用!
如何使用123456789101112131415161718192021222324252627const Koa = require('koa');const Router = require('@koa/router');const multer = require('@koa/multer');const app = new Koa();const router = new Router();const upload = multer({}); // 这里可以通过传递参数来控制文件上传的配置// 以下是定义的文件上传路由router.post('/upload-multiple-files', upload.fields([ { name: 'avatar', maxCount: 1 }, { name: 'boop', maxCount: 2 }]), ct ...
外部存储会话管理:koa-generic-session
前言
之前我们介绍了关于koa-session的简单运用,了解了其中关于内存缓存级别(cookies)控制的客户端会话管理,现在我们来了解一波关于外部存储(koa-redis)的相关运用,来以免服务重启导致缓存数据丢失的问题!这里的koa-generic-session其实就是针对原本的koa-session进行一个一层包装,通过追加的固定的配置以及对应额外的属性来丰富这个session原本提供的功能!这里可以简单的理解是将原本应该存储在内存中的数据,现在都存储到了数据库,而且数据结构就是以简单的key: value键值对的方式来存储的,如下图所示
如何使用12345678910111213141516171819202122232425const session = require('koa-generic-session');const redisStore = require('koa-redis');const koa = require('koa');const app = new koa();app.keys = ['自定义keys'];app.use(session({ ...
会话管理中间件:koa-session
前言koa-session官网
对于浏览器端的session,通常会使用cookie来存储session标识。在用户首次访问服务端时,服务端会生成一个唯一的session标识,并将其存储在cookie中返回给浏览器。随后,每次浏览器发送请求到服务端时,会自动携带上一次存储在cookie中的session标识。服务端通过解析请求中的session标识,可以识别出当前请求属于哪个session。服务端会根据session标识来查找相应的session数据,并进行相应的处理。在处理完请求之后,服务端会更新session数据,并将最新的session标识返回给浏览器,以便下次请求使用。这种基于cookie的session机制可以确保同一个浏览器在一次会话中持续保持与服务端的连接,并共享会话数据。通过每次请求携带最新的session标识,可以保证同一个session会话的持续性和一致性。此外,为了防止篡改或伪造session标识,可以结合使用签名(sig)等方式,增加session的安全性。Koa简单的会话管理中间件,基于cookie机制,并支持外部存储(比如redis、db数据库等存储方式) ...
路由配置中间件:koa-router
前言koa-router官网
Koa自身并没有提供关于对于不同的path、不同的method的处理中间件配置,假如我们在程序中采用一系列if判断,来识别不同的路径、不同的请求方式对应于不同的中间件函数的话,那么随着项目的迭代,产生的结果将会是毁灭性的!!因此,需要 🈶 那么一个中间件,能够帮助我们管理好不同的路径、不同的请求方式下对应的中间件:koa-router,通过koa-router,可以满足这个情况的同时,还能够满足路由的叠加、嵌套,下面让我们来一一剖析一波!
如何使用12345678910const Koa = require('koa');const Router = require('@koa/router');const app = new Koa();const router = new Router();router.get('/', (ctx, next) => { // ctx.router available});app .use(router.routes()) .use(router.allowedMethods());
这里我们 � ...
解析请求body中间件:koa-bodyparser
前言bodyparser官网
作为消息请求体(body)的解析器,基于co-body进行的body的解析,可支持json、form、text、xml类型的body的解析!在处理程序之前,在中间件中解析传入的请求体,解析完成后,将在Koa上下文ctx.request中追加body参数,使得后续所有的中间件可以通过ctx.request.body属性来访问到解析后的参数,从而获取请求参数!!
如何使用12345678const Koa = require('koa');const bodyParser = require('@koa/bodyparser');const app = new Koa();app.use(bodyParser({}));app.use(ctx => { ctx.body = ctx.request.body console.info(ctx.request.rowBody)})
🌠 上述代码是bodyparser的简单运用,通过bodyParser函数的运行结果(应该是接收ctx+next作为参数的函数),来作为响应的中间,这里bodyPars ...
koa的使用与常用中间件一览
前言Koa官网
Koa,基于Node.js平台的下一代web开发框架!致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。通过利用 async 函数,Koa`` 帮你丢弃回调函数,并有力地增强错误处理。 Koa`` 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。
koa是什么?
Koa 应用程序是一个包含一组中间件函数的对象,它是按照类似堆栈的方式组织和执行的。Koa 类似于你可能遇到过的许多其他中间件系统,例如 Ruby 的 Rack ,Connect 等,然而,一个关键的设计点是在其低级中间件层中提供高级“语法糖”。这提高了互操作性,稳健性,并使书写中间件更加愉快。这包括诸如内容协商,缓存清理,代理支持和重定向等常见任务的方法。尽管提供了相当多的有用的方法 Koa 仍保持了一个很小的体积,因为没有捆绑中间件。
如何使用koa?123456const Koa = require('koa');const app = new Koa();app.use(async ctx => { ctx.bo ...
vue源码学习与分析(三):vue指令
前言
在编写vue项目的过程中,指令应该是相当的熟悉的了Vue 指令是一种特殊的 HTML 属性,具有 v- 前缀,用于在模板中声明性地绑定数据并对 DOM 进行操作。指令可以被绑定到 HTML 元素、组件和相应的模板语法中。在 Vue 中,指令本质上就是实现了一个自定义操作的 JS 函数,该函数接受两个参数:绑定元素 (el) 和指令对象 (binding)。指令对象包含了一些指令相关的信息,例如指令名称、表达式、修饰符等。
官方的v指令都有哪些
官方指令一览
指令
描述
条件指令
用于做条件渲染,包括整个if家庭(v-if、v-else、v-else-if)
v-text
用于对整个节点赋值文本内容
v-html
用于更新元素的innerHTML
v-show
用于切换一个元素的显示与隐藏
v-for
类似于array.map(),用于将一个列表数据转换为元素列表
v-on
缩写:@,用于捆绑事件监听
v-bind
缩写::,用于将变量与属性进行捆绑,使得属性参数化
v-model
在表单控件或者组件上创建双向绑定
v-slot
缩写 ...
vue-router的用法与源码学习
前言
在之前vue全家桶项目中,对于vue-router的使用,爽得不要不要的,😕 那么,我们是否有思考过,这个vue-router的工作过程是怎样的?它是如何设计的?为什么我们简单通过配置一张“路由表”,就可以实现整个web应用的路由控制功能?在路由表中它与component组件的关联是如何被建立起来的?懒加载机制是如何实现的?为什么在任意组件中通过watcher $route就可以自动检测到路由发生了变化,并触发监听函数的?这个RouterView究竟是何方神圣,凭什么它能够“装载”component,并让component按照自身的钩子函数去执行?👇 将通过分析vue-router的源码执行过程,顺带resolve这些问题!
Vue Router 是 Vue.js (opens new window)官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。包含的功能有:
嵌套的路由/视图表
模块化的、基于组件的路由配置
路由参数、查询、通配符
基于 Vue.js 过渡系统的视图过渡效果
细粒度的导航控制
带有自动激活的 CSS class 的链 ...
Vuex的用法与源码学习
前言
在使用vue全家桶来开发前端站点的时候,对于vue组件间通信,有那么一种方式(也是普遍使用的方式),就是使用vuex来实现跨组件间的通讯,本文章旨在通过使用vuex解决实际项目的同时,从源码层面解析关于vuex是如何做到远程触发的相关原理的!Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。🌠 从上面可以看出这个vuex的工作流是单向的,主要包含有3个元素:
状态(state): 驱动应用的数据源;
视图(view): 以声明方式将状态映射到视图;
操作(action): 响应在视图上的用户输入导致的状态变化
🌠 而实际在使用过程中,vuex的设计理念是:把组件的共享状态抽取出来,以一个全局单例模式管理,组件树构成了一个巨大的“视图”,不管在树的哪个位置,任何组件都能获取状态或者触发行为
Vuex的一般用法
😕 这里的一般流程如下:
源码分析
😕 这个Store对象是如何被“植入到”vue实例中的呢?为什么可以在vue实例中就 ...