全部后端前端产品运维设计测试开发者客栈
最新 最热 官方 加精

Qbian | 2022-11-09 | 开发者客栈

TODO(待办)新功能上线啦 !!! 🎉🎉🎉

地址:[https://www.developers.pub/todo/doing](https://www.developers.pub/todo/doing) 使用场景 生活中 帮忙取快递提醒:下班路过小区快递点,帮家人取个快递,家人可以分配个任务给你,在你快到家的时间定时提醒不要忘记; 重要日期提醒:生活中重要的时刻(生日、纪念日等),可以提前创建好任务,做好定时提醒别错过; 待办事项提醒:生活中看到的一些好看的电影,记录下来周末找个完整的时间刷一刷; 记录想法:生活中随时冒出来的一些奇思妙想,可能过会就会忘掉,可以快速记录下来,事后回顾; 工作中 自动生成日报并推送:工作中每天都需要写日报,可以把当天的工作罗列出来,当天工作内容更明确,效率更高,下班点还会自动生成并推送日报; 自动生成周报并推送:工作中每周都需要写周报,本周完成的工作,在本周结束后,自动生成周报并推送,高效快捷,还不会遗忘; 工作内容定期回顾总结:自定义时间范围,项目标签等统计任务,做工作复盘总结,不断反思进步; 功能列表 个人使

 3153 |  10 |  29 开发者客栈

晚风 | 1小时前 | TypeScript

6 个 TypeScript 的高级技巧,帮你写出更清晰的代码

前言 在本文中,我们将介绍六个 TypeScript 的高级技巧,每个技巧都有例子展示其如何实现和使用。使用这些技巧,您不仅可以提高您的代码质量,也可以提高您作为一名 TypeScript 程序员的技能水平。 1 — 高级类型(Advanced Types) 使用 TypeScript 的高级类型,如映射类型和条件类型,可以基于现有类型构建新类型。通过使用这些类型,您可以在强类型系统中更改和操作类型,从而使您的代码具有更大的灵活性和可维护性。 映射类型 映射类型会遍历现有类型的属性,并应用变换来创建新类型。一个常见的用例是创建一个类型的只读版本。 type Readonly<T  = {   readonly [P in keyof T]: T[P]; }; interface Point {   x: number;   y: number; } type ReadonlyPoint = Readonly<Point ; 在这个例子中,我们定义了一个叫做 Readonly 的映射类型,它以类型 T 为泛型参数,并使其所有属

 6 |  0 |  0 TypeScript

石昊 | 1小时前 | JavaScript前端相关

JavaScript 奇技淫巧:debugger 拦截

debugger 指令,一般用于调试,在如浏览器调试执行环境中,可以在 JavaScript 代码中产生中断。 如果想要拦截 debugger,是不容易的,常用的函数替代、proxy 方法均对它无效,如: window.debugger = (function() { var origDebug = console.debugger; return function() { // do something before debugger statement execution origDebug.apply(console, arguments); // do something after debugger statement execution }; })(); 或: var handler = { get: function(target, prop, receiver) { if (prop = 'debugger') { throw new Er

 5 |  0 |  0 JavaScript前端相关

晴天 | 1小时前 | TypeScript

15个Typescript 5.0 中重要的新功能快速了解一下

作为一种在开发人员中越来越受欢迎的编程语言,TypeScript 不断发展,带来了大量的改进和新功能。在本文中,我们将深入研究 TypeScript 的最新迭代版本 5.0,并探索其最值得注意的更新。 1.装饰器 TypeScript 5.0 引入了改进的装饰器系统,改进了类型检查和元数据生成。 装饰器现在可以更无缝地与类型系统一起工作,使您能够编写更清晰、更健壮的代码。下面是方法装饰器如何工作的一个简单示例: function log<This, Args extends any[], Return ( target: (this: This, ...args: Args) = Return, context: ClassMethodDecoratorContext< This, (this: This, ...args: Args) = Return ) { const methodName = String(context.name); function replacementMethod(this: T

 5 |  0 |  0 TypeScript

青木 | 1天前 | 后端相关

从0到1实现短链系统

短链很常见,在互联网营销场景以及移动端信息传播等场景下起着重要的作用。同时,也是经常被来拿考察选手系统设计水平的一个场景。 对于服务端研发,关于前端访问时的长短转换,其实只要知道有 30X 重定向基本也就可以了。 相较于重定向,我更关注的,是 短链生成方式选型 、 存储选型 、 系统性能应对 等方面的方案和设计。 Part one 短链系统分析 短链系统的最根本能力: 是可以根据长链计算得到短链,以方便外部访问 : 判断对应短链已存在,则直接返回 判断对应短链不存在,则生成短链,并存储 <span 长链 短链</span 的映射关系 也可以根据短链映射到长链,寻找真实服务地址提供服务 : 根据 <span 短链 长链</span 查询存储,获取对应的长链 条条大路通罗马,系统方案有很多,但采取哪种最合适,还需要和存储策略以及访问性能联合起来一起

 40 |  0 |  0 后端相关

OOM | 1天前 | JavaScript前端相关

V8是如何执行JavaScript代码的?

前言 一般来讲,电脑是不能直接运行我们的 javascript 代码的,它需要一个翻译程序将人类能够理解的编程语言 JavaScript,翻译成机器能够理解的机器语言。目前市面上有很多种 JavaScript 引擎,诸如 SpiderMonkey、V8、JavaScriptCore 等。而由谷歌开发的开源项目 V8 是当下使用最广泛的 JavaScript 虚拟机,全球有超过 25 亿台安卓设备,而这些设备中都使用了 Chrome 浏览器,所以我们写的 JavaScript 应用,大都跑在 V8 上。 什么是V8 在 V8 出现之前,所有的 JavaScript 虚拟机所采用的都是解释执行的方式,这是 JavaScript 执行速度过慢的一个主要原因。而 V8 率先引入了即时编译(JIT)的双轮驱动的设计,这是一种权衡策略,混合编译执行和解释执行这两种手段,给 JavaScript 的执行速度带来了极大的提升。 「通俗点理解就是:V8是一个高性能的JavaScript解析执行引擎」 ![图片](https://static.developers.pub/8...

 12 |  1 |  0 JavaScript前端相关

女王范 | 1天前 | Java后端相关

从Java BIO到NIO再到多路复用,看这篇就够了

本文从基础概率到引出业界通用c10k问题,然后通过代码演示从BIO,到NIO再到多路复用的演进历程。 从一次优化说起 近期优化了一个老的网关系统,在dubbo调用接口rt1000ms时吞吐量提升了25倍,而线程数却由64改到8。其他的优化手段不做展开,比较有意思的是为什么线程数减少,吞吐量却可以大幅提升?这就得从IO模型说起,貌似工作中很少使用IO,更别提NIO,但实际上我们工作中每天都在和IO打交道。我们所用到的中间件redis,rocketMq,nacos,mse,dubbo等等存在文件操作,存在网络通信的地方就存在IO。所以深入了解IO模型重要性可想而知,IO操作作为计算机系统中一个基本操作,几乎所有应用程序都需要,了解不同IO模型可助我们理解应用程序中IO操作底层原理,从而更好地优化应用程序的性能和可靠性。 接下来我会结合一些例子和代码,以最简单易懂的方式把IO的演进历程和大家探讨。 IO模型分类 分类 首先来谈下IO模型的分类: 1.BIO(Blocking I/O):同步阻塞I/O,传统的I/O模型。在进行I/O操作时,必须等待数...

 14 |  0 |  0 Java后端相关

念旧。 | 1天前 | Vue前端相关

十分钟,带你了解 Vue3 的新写法

本文的目的,是为了让已经有 Vue2 开发经验的 人 ,快速掌握 Vue3 的写法。 因此, 本篇假定你已经掌握 Vue 的核心内容 ,只为你介绍编写 Vue3 代码,需要了解的内容。 一、Vue3 里 script 的三种写法 首先,Vue3 新增了一个叫做组合式 api 的东西,英文名叫 Composition API。因此 Vue3 的 script 现在支持三种写法, 1、最基本的 Vue2 写法 <template   <div {{ count }}</div   <button @click="onClick"     增加 1   </button </template <script export default {   data() {     return {       count: 1,     };   },   methods: {     onClick() {       this.count += 1;     },   }, } </scr

 60 |  0 |  0 Vue前端相关

奈我何 | 1天前 | 后端相关

缓存数据一致性探究

就像每一次发布上线修复问题的同时,也极易引入新的问题,自缓存诞生的第一天起,缓存与数据库的数据一致性问题就深深困扰着开发者们。 缓存是一种较低成本提升系统性能的方式,自它面世第一天起就备受广大开发者的喜爱。然而正如《人月神话》中的那句经典的“没有银弹”中所说,软件工程的设计没有银弹。 就像每一次发布上线修复问题的同时,也极易引入新的问题,自缓存诞生的第一天起, 缓存与数据库的数据一致性问题 就深深困扰着开发者们。 关键词: 原子性、事务性、数据一致性、双写一致性 缓存的查询 先查询缓存,如果查询失败,那么去查询DB,之后重建缓存,基本上不存在异议。 缓存的更新 先更新DB还是先更新缓存?是更新缓存还是删除缓存?在常规情况下,怎么操作都可以,但一旦面对高并发场景,就值得细细思量了。 1、先更新数据库再更新缓存 线程A:更新数据库(第1s)—— 更新缓存(第10s) 线程B:更新数据库 (第3s)—— 更新缓存(第5s) 并发场景下,这样的情况是很容易出现的,每个线程的操作先后顺序不同,这样就导致请求B的缓存值被请求A给...

 48 |  0 |  0 后端相关

流苏 | 1天前 | JavaScript

十个超级好用的Javascript技巧

概览:在实际的开发工作过程中,积累了一些常见又超级好用的Javascript技巧和代码片段,包括整理的其他大神的JS使用技巧,今天筛选了10个,以供大家参考。 动态加载JS文件 在一些特殊的场景下,特别是一些库和框架的开发中,我们有时会去动态的加载JS文件并执行,下面是利用Promise进行了简单的封装。 function loadJS(files, done) {   // 获取head标签   const head = document.getElementsByTagName('head')[0];   Promise.all(files.map(file =  {     return new Promise(resolve =  {       // 创建script标签并添加到head       const s = document.createElement('script');       s.type = "text/javascript";       s.async = true;       s.src = file;       //

 31 |  0 |  0 JavaScript

柚香 | 2天前 | Redis

扒一扒Redis6的客户端缓存

简介 客户端缓存是Redis6众多新特性中比较实用的一项新功能,我们看看官方文档,了解一下它的作用: 客户端缓存是一种用于创建高性能服务的技术,它可以利用 应用服务器 上的可用内存(这些服务器通常是一些不同于数据库服务器的节点),在这些应用服务端来直接存储数据库中的一些信息。 与访问数据库等网络服务相比,访问本地内存所需要的时间消耗要少得多,因此这个模式可以大大缩短应用程序获取数据的延迟,同时也能减轻数据库的负载压力。 看到这,我心想这不是和其他本地缓存Guava、Caffeine啥的一样吗,换汤不换药,都是使用的应用服务的内存罢了。要说有什么好处,可能就是我在项目中能少引入一个中间件了。 不过,我这点浅薄的猜想,在看完客户端缓存的具体应用模式后,彻底被颠覆了。 两种模式 在了解了客户端缓存的基本功能后,我们来看看它的两种基本应用模式。Redis的客户端缓存支持被称为 tracking ,个人感觉翻译为对key的 追踪 就很好理解,它具有两种模式: 默认模式,服务端会记录某个客户端具体访问过哪一些 key ,当这些 key 对...

 12 |  0 |  0 Redis

iron Man | 3天前 | 后端相关

WebAssembly 模块化与动态链接

1. 前言 模块化编程(modular programming)是一种软件设计模式,它将软件分解为若干独立的、可替换的、具有预定功能的模块,每个模块实现一个功能,各模块通过接口(输入输出部分)组合在一起形成最终程序。当下流行的JavaScript、Python、Rust、Java 等语言都有具有模块(包)管理,甚至 C 20 开始都引入了模块化系统。 模块化编程从 1980 年代开始广泛传播,是 SoC (Separation of concerns)[1] 原则的理想目标,主要有如下特点: 易设计:较大的复杂问题分解为若干较小的简单问题,使我们可以从抽象的模块功能角度而非具体的实现角度去理解软件系统,从而整个系统的结构非常清晰、容易理解,设计人员在设计之初可以更加关注系统的顶层逻辑而非底层细节。 易实现:模块化设计适合团队开发,因为每个团队成员不需要了解系统全貌,只需关注所分配的小任务。另外团队可以灵活地增加人手,新人只需直接接手某个模块,不会影响系统其他模块的开发。 易测试:每个模块不但可以独立开发,也可以独立测试,最后组装时再进行联合测试。 易维护:

 16 |  0 |  0 后端相关

花小染 | 3天前 | JavaScript

JS数值存储运算原理

前言 相信大家都看过这些曾经在社区比较火的文章: 0.1 + 0.2 与 0.3 为什么不相等? 为什么 3.0000000000000002 = 3 表达式为 true ? 等... 造成这些问题的背后原因都是由于javaScript采用了 IEEE754 标准,全称 IEEE 二进制浮点数算术标准。所以说这个问题其实不止是会在javaScript中出现,而是 「其他遵循 [IEEE 754]标准的语言也会出现这个问题」 并且自己在最近的工作中也遇到了这个问题,由于javaScript精度丢失而造成诡异问题! javaScript车祸现场 上面三个例子在我们在控制台里面验证一遍,是不是瞬间觉得奇怪的知识又增加了? javaScript 这令人窒息的操作是不是让很多后端人员口吐芬芳了,甚至是很多前端人员都觉得明明都是送分题,却成了JS的送命题,工作中许多不经意间写出的bug,往往是由于

 50 |  0 |  0 JavaScript

孤音 | 3天前 | 后端相关

骚操作,在JVM上运行其他语言

一 在Java的平台里,其实是可以执行其他的语言的。包括且不仅限于jvm发展出来的语言。 有的同学可能会说,在java项目里执行其他语言,这不吃饱了撑着么,java体系那么庞大,各种工具一应俱全,放着好好的java不写,还要去执行其他语言干嘛。 写java的都知道,java是需要事先编译的,这意味着你很难去在运行中改变编译好的class信息,除非你用字节码等技术栈,但是这也是需要很大的成本的。要想在运行中很方便的改变业务逻辑,其实用java去执行其他的脚本语言是一个好办法。况且有的脚本语言有着比java更简洁的语法特性。 二 在java中执行其他语言,可能你会觉得这应该很复杂,需要去学习每种语言包相关的api。可以负责任的说,在Java平台中调用其他脚本语言,其实一点都不复杂,你无需关心每种语言的实际api。 这一切都归功于一个规范: <span JSR223</span 。 相信有大部分人没听过这个Java平台的规范。 JSR223规范最初在Java6平台被提出,提供了一套标准的API为脚本语言的执行提供了内置支持。 也就是说,你只要熟悉这一套API...

 31 |  0 |  0 后端相关

观云 | 3天前 | 后端相关

Mybatis-Plus 自定义SQL注入器,非常实用!

一、什么是SQL注入器 我们在使用Mybatis-Plus时,dao层都会去继承BaseMapper接口,这样就可以用BaseMapper接口所有的方法,BaseMapper中每一个方法其实就是一个SQL注入器 在Mybatis-Plus的核心(core)包下,提供的默认可注入方法有这些: 那如果我们想自定义SQL注入器呢,我们该如何去做? 比如在Mybatis-Plus中调用updateById方法进行数据更新默认情况下是不能更新空值字段的。 而在实际开发过程中,往往会遇到需要将字段值更新为空值的情况。 那如何让Mybatis-Plus支持空值更新呢? 如果仅是想实现支持更新空值字段并不需要我们自定义SQL注入器,因为Mybatis-Plus提供了几个扩展SQL注入器。 二、内置扩展SQL注入器有哪些? 1、自带扩展SQL注入器 Mybatis-Plus 扩展SQL注入器在扩展包下,为我们提供了可扩展的...

 28 |  0 |  0 后端相关

大牛猫 | 3天前 | TypeScript

TypeScript 5.1 正式发布!

6 月 1 日,TypeScript 5.1 正式发布。以下是该版本中新增的主要功能: 改进函数返回值类型 undefined 的类型推断 getter 和 setter 支持设置不同类型 JSX 元素和 JSX 标签类型之间解耦类型检查 带命名空间的 JSX 标签 typeRoots 在模块解析中被查询 JSX 标签支持链接光标 @Param JSDoc 标签中支持代码补全 优化 可以通过以下 npm 命令来安装最新版本: npm install -D typescript 改进函数返回值类型 undefined 的类型推断 在 JavaScript 中,如果函数没有返回值,就会返回 undefined : function foo() {   // 没有 return } // x = undefined let x = foo(); 然而,在以前版本的 TypeScript 中,只有返回值类型为 void 和 any 的函数可以没有 return 语句。这意味着即使

 34 |  0 |  0 TypeScript

蔡文姬 | 4天前 | 前端相关

探索主流前端框架的响应式原理!

本文将探索主流前端框架中的响应式是如何工作的并比较这些框架的不同之处以更好地理解它们。 前置准备 响应式 响应式可以被广义地定义为应用状态变化时自动更新UI 。作为开发者,我们只需要关注应用的状态,并让框架将该状态反映到UI 上。但是,框架如何反映该状态可能会对代码的性能和懒加载产生影响,下面会进行深入探讨。 粗粒度 vs 细粒度 在响应式框架之间进行比较的一个维度是 粗粒度与细粒度的响应性 。 粗粒度 :框架必须执行大量应用或框架代码来确定哪些 DOM 节点需要更新。 细粒度 :框架不需要执行任何代码,就知道哪些 DOM 节点需要更新。 这是一个框架可以处于连续的维度,不过仅仅是众多可以比较的维度之一。本文中也将涉及渲染。在这里,渲染意味着框架确定要更新哪个 DOM 的方式,而不是浏览器因 DOM 更新而执行的实际浏览器渲染。 下面是跟 颗粒度 得出的一个结论(从左到右表示粗粒度到细粒度): ![图片](https://static.developers.pub/7630074317ee4b6eae...

 119 |  0 |  0 前端相关

布朗熊 | 4天前 | DDD

领域驱动设计DDD|从入门到代码实践

在本文中,作者将借鉴《实现领域驱动设计》的做法,介绍领域驱动设计的基本概念的同时,用一个虚拟的公司和一个虚拟的项目,把领域驱动设计进行落地实践。 背景 为什么要写这篇文章 我是从2018年开始接触领域驱动设计(DDD),当时在前辈的推荐下拜读过Eric Evans的《领域驱动设计》,这本书是领域驱动设计的开山鼻祖,但是读完后依然一头雾水,有一种不明觉厉,但是又不得其法的迷茫感。 后面我又阅读了Vaughn Vernon的《实现领域驱动设计》,跟随着作者在虚拟公司SaaSOvation下用DDD实践了CollabOvation和ProjectOvation两个虚拟项目,算是窥得了领域驱动设计的门径。但是这本书成书时间在2013年,距今已经10多年了,这其间业界技术早已发生翻天地覆的变化,书中的实践项目已经显得有些过时了。 学习领域驱动设计一路跌跌撞撞,我希望把自己的理解和思考沉淀下来,如果同时能够对你有帮助就更好了。在本文中,我将借鉴《实现领域驱动设计》的做法,介绍领域驱动设计的基本概念的同时,用一个虚拟的公司和一个虚拟的项目,把领域驱动设计进行落地实践。 ...

 20 |  1 |  1 DDD

追风少年 | 5天前 | 设计模式后端相关

设计模式详解之策略模式

策略模式是一种应用广泛的行为型模式,核心思想是对算法进行封装,委派给不同对象来管理,本文将着眼于策略模式进行分享。 01概述 我们在进行软件开发时要想实现可维护、可扩展,就需要尽量复用代码,并且降低代码的耦合度,而设计模式就是一种可以提高代码可复用性、可维护性、可扩展性以及可读性的解决方案。 大家熟知的23种设计模式,可以分为创建型模式、结构型模式和行为型模式三大类。其中,行为型模式可用于描述程序中多个类和多个对象如何协作完成复杂的任务,涉及不同对象间的职责分配、算法的抽象化。策略模式是一种应用广泛的行为型模式,本文将着眼于策略模式进行学习分享。 02基本概念 策略模式的核心思想是对算法进行封装,委派给不同对象来管理。这样,我们就可以定义一系列算法,将每个算法封装到具...

 39 |  0 |  0 设计模式后端相关

渣渣辉 | 5天前 | 后端相关

字节二面:引入RabbitMQ后,你如何保证全链路数据100%不丢失?

我们都知道,消息从生产端到消费端消费要经过3个步骤: 1. 生产端发送消息到RabbitMQ; 2. RabbitMQ发送消息到消费端; 3. 消费端消费这条消息; 这3个步骤中的每一步都有可能导致消息丢失,消息丢失不可怕,可怕的是丢失了我们还不知道,所以要有一些措施来保证系统的可靠性。 这里的可靠并不是一定就100%不丢失了,磁盘损坏,机房爆炸等等都能导致数据丢失,当然这种都是极小概率发生,能做到99.999999%消息不丢失,就是可靠的了。下面来具体分析一下问题以及解决方案。 生产端可靠性投递 生产端可靠性投递,即生产端要确保将消息正确投递到RabbitMQ中。 生产端投递的消息丢失的原因有很多,比如消息在网络传输的过程中发生网络故障消息丢失,或者消息投递到RabbitMQ时RabbitMQ挂了,那消息也可能丢失,而我们根本不知道发生了什么。 针对以上情况,RabbitMQ本身提供了一些机制。 事务消息机制 事...

 115 |  0 |  0 后端相关

推荐标签

后端相关 前端相关 Java JavaScript 算法 Spring 全家桶 React Vue