探索 JSON Schema:2025 年现代表单生成的核心支柱在快速发展的 Web 开发领域,能够简化数据校验和表单创建的工具一直备受青睐。其中,JSON Schema 作为一项基础标准,已经成为构建动态、可配置界面的重要基石。本文将介绍 JSON Schema 的起源、主要版本、实用示例,以及目前主流的实现库。同时,我们还会对比这些库的社区活跃度,并针对中小型团队(尤其是游戏开发工具 GMT 低代码平台)给出务实的选型建议。
1. JSON Schema 简介:起源与使用场景JSON Schema 是一套用于描述 JSON 数据结构、约束和校验规则的声明式标准。它就像一份“数据蓝图”,让不同系统之间的数据保持一致,而无需为每种校验都写自定义代码。
起源JSON Schema 起源于 2010 年代初,由 Kris Zyp 等人在 IETF(互联网工程任务组)推动,受到 XML Schema(XSD)的启发。目的是为 JSON 提供一种机器可读的描述方式,便于 API、配置和数据交换的规则统一。经过多年社区迭代,json-schema.org 已成为官方维护站点。到 2025 年,它 ...
PHP 闭包实战:从基础原理到优雅解决“匿名函数传参”难题前言在 PHP 开发中,我们经常会遇到需要“把逻辑作为参数传递”的情况,比如 array_map、usort 或是框架中的中间件。但你是否遇到过:底层的回调接口只允许传一个参数,而你的业务逻辑偏偏需要三个参数?
最新项目中遇到一个例子,用到了闭包完美解决了需要匿名函数传参的问题。
场景是项目中之前封装了一个格式化excel表格字段类型的函数,后面需要扩展一个字段关联另一个excel,把关联的excel数据格式化以后转成json返回。格式换函数需要传递一个条件去过滤关联excel中满足记录。之前的函数没有考虑到这一点,我就通过Closure可以用use传递参数的方式实现了。最近在处理一个 Excel 字段格式化项目时,我利用 PHP 闭包(Closure)的特性优雅地解决了这个问题。本文将带你从基础出发,逐步深入到这个实战案例。
一、 夯实基础:匿名函数与闭包在 PHP 中,这两个概念经常被混用,但理解它们的细微差别能帮你更好地设计代码。
1. 匿名函数 (Anonymous Functions)匿名函数就是没有名字的函数。它可以 ...
彻底搞懂 JavaScript 原型链 (一篇就够了)你是否曾经想过,为什么你创建一个简单的 JavaScript 对象 const obj = {},明明它“什么都没有”,但你却可以调用 obj.toString() 或者 obj.hasOwnProperty() 这样的方法?
这些方法是从哪里来的?
答案就是 原型链 (Prototype Chain)。
核心思想:它不是复制,而是“委托”在很多面向对象语言(比如 Java 或 C#)中,“继承”通常意味着“复制”。子类会把父类的属性和方法复制一份作为自己的。但在 JavaScript 中,继承的机制完全不同。它不是复制,而是委托 (Delegation)。一个简单的比喻:向上级求助
你(实例 instance)接到了一个任务(比如 toString())。
你先看自己的任务列表(自身属性)里有没有这个任务。
有:你立刻自己搞定。
没有:你不会说“我不会”,而是把任务“委托”给你的直属上司(原型 prototype)。
你的上司(原型)也重复这个过程:
有:他来搞定。
没有:他再“委托”给他的上司(原型的原型)。
...
React 钩子(Hooks)概览React 钩子(Hooks)是 React 16.8 引入的功能,允许在函数组件中使用状态和其他 React 特性。以下是 React 常用的内置钩子及其功能描述。
组件生命周期beforMount:挂载前didmount: 挂载完成unmount:卸载
1. 基础钩子useState
功能:在函数组件中添加状态管理。用法:const [state, setState] = useState(initialState);示例:
123456789101112131415161718192021import React, { useState } from 'react';function App() { // 初始状态为 0 const [count, setCount] = useState(0) const handleClick = () => { setCount(count + 1); } return ( <> < ...
Dockerfile介绍Dockerfile 是一个文本文件,其中包含一系列用于构建Docker 镜像的指令和配置。它定义了镜像的构建规则、运行环境,以及容器启动时需要执行的操作。通过Dockerfile,可以实现镜像构建的自动化和标准化,方便快速部署和管理应用程序。
常用命令
基础镜像和构建环境:
FROM <image>:指定基础镜像,例如 FROM ubuntu:latest 或 FROM centos
WORKDIR <path>:设置工作目录,所有后续指令都将在此目录下执行.
ENV <key> <value>:设置环境变量,例如 ENV MYSQL_USER user
ARG <name>[=<default value>]:定义构建参数,可以在构建镜像时传入.
文件操作:
COPY <src>... <dest>:将文件从构建上下文复制到镜像中.
ADD <src>... <dest>:类似于 COPY,但支持从URL下载文件和自动解压缩.
VOLU ...
安装前准备docker基本都不用介绍是干什么的了,确认自己的wsl和Ubuntu版本信息。使用这个版本来安装docker
安装wsl2
配置Linux发行版
配置wsl.conf, 开启systemd。配置完重启wsl,使用systemctl status确保已经启动。
12[boot]systemd=true
安装使用官方提供的shell脚本进行安装,官方文档
下载脚本并执行
12curl -fsSL https://get.docker.com -o get-docker.shsudo sh ./get-docker.sh --dry-run
添加docker用户组,把用户添加到docker组
123456789101112# 查看用户信息jean@jean:~/src$ iduid=1002(jean) gid=1002(jean) groups=1002(jean),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),33(www-data),44(video),46(plugdev) ...
WSL
未读介绍适用于 Linux 的 Windows 子系统(WSL)是 Windows 的一项功能,可用于在 Windows 计算机上运行 Linux 环境,而无需单独的虚拟机或双重启动。 WSL 旨在为想要同时使用 Windows 和 Linux 的开发人员提供无缝高效的体验。
什么是 WSL 2?安装 Linux 分发版时,WSL 2 是默认发行版类型。 WSL 2 使用虚拟化技术在轻型实用工具虚拟机(VM)内运行 Linux 内核。 Linux 分发版作为 WSL 2 托管 VM 内的独立容器运行。 通过 WSL 2 运行的 Linux 分发版将共享同一网络命名空间、设备树(而非 /dev/pts)、CPU/内核/内存/交换、 /init 二进制文件,但有自己的 PID 命名空间、装载命名空间、用户命名空间、Cgroup 命名空间和 init 进程。
安装
以管理员身份打开cmd
执行 wsl --install默认安装的是Ubuntu系统,如果不想安装默认系统可以使用 wsl --list --online 查看所有可用版本
...
介绍
计算机技术
未读常见概念
已经有多线程了,为什么还要异步?多线程与异步是不同的概念,异步并不意味着多线程,单线程同时可以异步。异步默认借助线程池,多线程经常阻塞,而异步要求不阻塞。多线程和异步的使用场景不同:
多线程:CPU密集型,长期运行的任务,线程的创建与销毁的开销都比较大提供更多底层控制,操作线程,锁,信号量等,线程不易于传参及返回,线程的代码书写较为繁琐
异步:适合IO密集型操作,适合短暂的小任务,避免线程阻塞,提高系统的响应能力
什么是异步任务(Task)包含了异步任务的各种状态的一个引用类型,正在运行、完成、结果和报错
123456789101112131415var task = new Task<string>(() =>{ // Simulate some work System.Threading.Thread.Sleep(1500); return "Task completed!";});Console.WriteLine(task.Status.ToString()); task.Start ...
计算机技术
未读概念什么是线程?线程是操作系统中能够独立运行的最小单位,也是程序中能够并发执行一段指令的序列。线程是进程的一部分,一个进程可以包含多个线程,这些线程共享进程的资源。进程又入口线程,也可以创建更多的线程。
为什么要多线程?批量重复任务希望同时执行(比如:对一个数组中的每个元素都同时进行且耗时的操作)多个不同任务希望同时进行,互不干扰(比如又多个后台线程需要做轮询等操作)
什么是线程池? 一组预先创建的线程,可以重复使用来执行多个任务。 避免频繁的创建和销毁线程,从而减少了线程创建和销毁的开销,提高了系统的性能和效率。 异步编程默认使用线程池
什么是线程安全?
线程安全:多个线程共享资源时,对共享资源的访问不会导致数据不一致或不可预期的结果。
12345678910111213141516171819202122const int total = 100_000;int count = 0;var thread1 = new Thread(ThreadMethod);var thread2 = new Thread(ThreadMethod);thread1.Start();thread ...



















