阅读视图
React上下文之useContext
useContext 使用场景
. 组件的嵌套层级很深,当父组件想把数据共享给最深层的子组件时向组件树深层传递数据
. 图示:
useContext 语法格式
import React, { useContext } from 'react'
const [theme, setTheme] = useState(null);
//1. 在全局创建 Context 对象
const ThemeContext = React.createContext(theme)
//2. 在父组件中使用 Context 提供数据
const App = () => {
return <ThemeContext value={theme}> ...
</ThemeContext>
}
//3. 在子组件中使用 useContext 使用数据
const Son = () => {
const myCtx = useContext(ThemeContext)
return <div></div>
}
Context 基础用法
- 在父组件中,调用 React.createContext 向下共享数据;在子组件中调用 useContext() 获取数据。
import React, { useState, useContext } from 'react'
// 声明 TS 类型
type ContextType = { count: number; setCount: React.Dispatch<React.SetStateAction<number>> }
// 1. 创建 Context 对象
const AppContext = React.createContext<ContextType>({} as ContextType)
export const LevelA: React.FC = () => {
const [count, setCount] = useState(0)
return (
<div style={{ padding: 30, backgroundColor: 'lightblue', width: '50vw' }}>
<p>count:{count}</p>
<button onClick={() => setCount((prev) => prev + 1)}>+1</button>
<AppContext.Provider value={{ count, setCount }}>
<LevelB />
</AppContext.Provider>
</div>
)
}
export const LevelB: React.FC = () => {
return (
<div style={{ padding: 30, backgroundColor: 'lightgreen' }}>
<LevelC />
</div>
)
}
export const LevelC: React.FC = () => {
const ctx = useContext(AppContext)
return (
<div style={{ padding: 30, backgroundColor: 'lightsalmon' }}>
<p>count值是:{ctx.count}</p>
<button onClick={() => ctx.setCount((prev) => prev + 1)}>+1</button>
<button onClick={() => ctx.setCount(0)}>重置</button>
</div>
)
}
非侵入式 Context
- 把 Context 封装到独立的 Wrapper 函数式组件中- 非侵入式 Context 不会影响组件的结构,只会在组件树中创建一个共享的 Context 对象。
// 声明 TS 类型
type ContextType = { count: number; setCount: React.Dispatch<React.SetStateAction<number>> }
// 创建 Context 对象
const AppContext = React.createContext<ContextType>({} as ContextType)
// 定义独立的 Wrapper 组件,被 Wrapper 嵌套的子组件会被 Provider 注入数据
export const AppContextWrapper: React.FC<React.PropsWithChildren> = (props) => {
// 1. 定义要共享的数据
const [count, setCount] = useState(0)
// 2. 使用 AppContext.Provider 向下共享数据
return <AppContext value={{ count, setCount }}>{props.children}</AppContext>
}
- 在 App.tsx 中使用 AppContextWrapper 包裹
import React from 'react'
import { AppContextWrapper } from '@/xxx.tsx'
const App: React.FC = () => {
return (
<AppContextWrapper>
<!-- AppContextWrapper 中嵌套使用了 LevelA 组件,形成了父子关系 -->
<!-- LevelA 组件会被当做 children 渲染到 Wrapper 预留的插槽中 -->
<LevelA />
</AppContextWrapper>
)
}
export default App
- LevelC 组件中使用 useContext 获取数据
export const LevelC: React.FC = () => {
// 使用 useContext 接收数据
const ctx = useContext(AppContext)
return (
<div style={{ padding: 30, backgroundColor: 'lightsalmon' }}>
<p>count值是:{ctx.count}</p>
<button onClick={() => ctx.setCount((prev) => prev + 1)}>+1</button>
<button onClick={() => ctx.setCount(0)}>重置</button>
</div>
)
}
进阶 useContext 结合 useReducer 使用场景
- 定义 reducer 函数
function tasksReducer(tasks, action) {
switch (action.type) {
case 'added': {
return [...tasks, {
id: action.id,
text: action.text,
done: false
}];
}
case 'changed': {
return tasks.map(t => {
if (t.id === action.task.id) {
return action.task;
} else {
return t;
}
});
}
case 'deleted': {
return tasks.filter(t => t.id !== action.id);
}
default: {
throw Error('Unknown action: ' + action.type);
}
}
}
const initialTasks = [
{ id: 0, text: 'Philosopher’s Path', done: true },
{ id: 1, text: 'Visit the temple', done: false },
{ id: 2, text: 'Drink matcha', done: false }
];
- 在根组件中创建 Context 对象 并抽离成独立组件
import { createContext, useContext, useReducer } from 'react';
export const TasksContext = createContext(null);
export function TasksProvider({ children }) {
const [tasks, dispatch] = useReducer(
tasksReducer,
initialTasks
);
return (
<TasksContext value={{ tasks , dispatch }}>
{children}
</TasksContext>
);
}
- 在根组件中使用 TasksProvider 包裹子组件
export default function TaskApp() {
return (
<TasksProvider>
<AddTask />
<TaskList />
</TasksProvider>
);
}
- 在子组件中使用 useContext 获取数据
import { useState, useContext } from 'react';
import { TasksContext } from './TasksContext.js';
export default function AddTask() {
const [text, setText] = useState('');
const { dispatch } = useContext(TasksContext);
function handleAdd() {
setText('');
dispatch({
type: 'added',
id: nextId++,
text: text,
});
}
return (
<>
<input
placeholder="Add task"
value={text}
onChange={e => setText(e.target.value)}
/>
<button onClick={() => handleAdd()}>Add</button>
</>
);
}
React 浏览器重新绘制之前副作用之useLayoutEffect
8.12实验室 指尖魔法变出艺术感 Excalidraw:cpolar内网穿透实验室第495个成功挑战
软件名称:Excalidraw
操作系统支持:Windows/macOS/Linux/手机浏览器(全平台无压力)
软件介绍:
Excalidraw 是一款“手残党救星”级的电子白板工具,主打极简操作和自然画风。无论是随手涂鸦、会议记录还是架构设计,都能像在真实纸张上画画一样流畅。支持实时协作、链接分享,甚至能导出成PNG/JPG/PDF等格式,适合学生、职场人、教育者和创意工作者。
Excalidraw × 手绘魔法:你的创意永不掉线!
- “手残友好”模式:线条自动平滑但保留手写质感,连画直线都不用担心歪斜。
- 超级协作:链接一甩,队友就能在线帮你补全脑暴图,比微信传照片快十倍。
- 一键变身专业工具:支持插入文本框、数学公式甚至Markdown代码块,从涂鸦到PPT配图无缝衔接。
手绘魔法的三大应用场景
-
学生党课后救星:
- 爽点:用Excalidraw随手画出带表情包的思维导图,复习时笑到崩溃!
-
团队远程头脑风暴:
- 爽点:Excalidraw+共享链接=实时协作的“云端草稿本”,连老板都能用手机涂鸦批注。
-
设计师快速原型测试:
- 爽点:5分钟画出带箭头和备注的UI草稿,导出高清图直接发给开发。
cpolar × Excalidraw = 手绘自由不设限!
- 突破局域网限制:如果把Excalidraw部署到本地服务器,用Cpolar一行命令就能生成外网访问链接。
- 场景示例:公司内网禁止使用第三方协作工具?用Cpolar让远程同事也能实时帮你画“老板想要的那张图”!
- 安全放心:Cpolar支持自定义域名和加密通道,手绘创意不被偷走。
cpolar将内网穿透简单到只要三步! 1.下载安装 → 2. 输入要穿透的端口号 → 3. 立刻获得专属访问链接。
组合优势
Excalidraw是当代人的“数字素描本”,用最自然的方式把脑中的创意变现实;而Cpolar则像给它装上翅膀,让协作突破物理限制。无论是学生、职场人还是设计师,这对CP都能让你的灵感从指尖飞向世界!
这么好的组合赶紧去安装吧,教程如下👇
本文主要介绍如何在Ubuntu系统使用Docker部署开源白板工具Excalidraw,并结合cpolar内网穿透工具实现公网远程访问绘制流程图。
1. 安装Docker
本教程操作环境为Linux Ubuntu系统,在开始之前,我们需要先安装Docker。
在终端中执行下方命令:
添加Docker源
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
安装Dokcer包
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
通过运行映像来验证 Docker 引擎安装是否成功
sudo docker run hello-world
2. 使用Docker拉取Excalidraw镜像
sudo docker pull excalidraw/excalidraw
然后执行查看镜像命令:
sudo docker images
可以看到成功拉取了Excalidraw镜像。
3. 创建并启动Excalidraw容器
成功拉取Excalidraw镜像后,我们可以使用该镜像创建并运行一个Excalidraw容器。
在终端执行以下命令:
$ sudo docker run -d --name excalidraw -p 5000:80 excalidraw/excalidraw
参数说明:
- –name excalidraw:本例容器名称为excalidraw,大家可以自己起名。
- -p 5000:80: 端口进行映射,将本地 5000 端口映射到容器内部的 80 端口。
- -d :设置容器在在后台一直运行。
然后执行下方命令查看容器是否正在运行:
sudo docker ps
可以看到刚才创建的Excalidraw容器正在运行中。
4. 本地连接测试
现在我们可以通过浏览器直接访问 localhost:5000
端口的 Excalidraw 服务:
可以看到,本地连接 Excalidraw 服务测试成功。
5. 公网远程访问本地Excalidraw
不过我们目前只能在本地连接刚刚使用docker部署的Excalidraw服务,如果身在异地,想要远程访问在本地部署的Excalidraw容器,但又没有公网ip怎么办呢?
我们可以使用cpolar内网穿透工具来实现无公网ip环境下的远程访问需求。
5.1 内网穿透工具安装
下面是安装cpolar步骤:
cpolar官网地址: www.cpolar.com
- 使用一键脚本安装命令
curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash
- 向系统添加服务
sudo systemctl enable cpolar
- 启动cpolar服务
sudo systemctl start cpolar
cpolar安装成功后,在外部浏览器上访问Linux 的9200端口即:【http://服务器的局域网ip:9200】,使用cpolar账号登录,登录后即可看到cpolar web 配置界面,结下来在web 管理界面配置即可。
5.2 创建远程连接公网地址
登录cpolar web UI管理界面后,点击左侧仪表盘的隧道管理——创建隧道:
- 隧道名称:可自定义,注意不要与已有的隧道名称重复,本例使用了:exdraw
- 协议:http
- 本地地址:5000
- 域名类型:随机域名
- 地区:选择China Top
点击创建
创建成功后,打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了两个公网地址,接下来就可以在其他电脑(异地)上,使用任意一个地址在浏览器中访问即可。
如下图所示,成功实现在公网环境访问本地部署的Excalidraw服务!
小结
为了方便演示,我们在上边的操作过程中使用了cpolar生成的HTTP公网地址隧道,其公网地址是随机生成的。
这种随机地址的优势在于建立速度快,可以立即使用。然而,它的缺点是网址是随机生成,这个地址在24小时内会发生随机变化,更适合于临时使用。
如果有长期远程访问本地Excalidraw服务的需求,但又不想每天重新配置公网地址,还想地址好看又好记,那我推荐大家选择使用固定的二级子域名方式来远程访问。
5.3 使用固定公网地址远程访问
登录cpolar官网,点击左侧的预留,选择保留二级子域名,地区选择China VIP,设置一个二级子域名名称,点击保留,保留成功后复制保留的二级子域名名称,这里我填写的是exdraw,大家也可以自定义喜欢的名称。
保留成功后复制保留成功的二级子域名的名称:exdraw,返回登录Cpolar web UI管理界面,点击左侧仪表盘的隧道管理——隧道列表,找到所要配置的隧道exdraw,点击右侧的编辑:
修改隧道信息,将保留成功的二级子域名配置到隧道中
- 域名类型:选择二级子域名
- Sub Domain:填写保留成功的二级子域名:exdraw
- 地区:选择China VIP
点击更新
(注意,点击一次更新即可,不需要重复提交)
更新完成后,打开在线隧道列表,此时可以看到公网地址已经发生变化,地址名称也变成了固定的二级子域名名称的域名:
最后,我们使用任意一个固定公网地址在浏览器访问,可以看到访问成功,这样一个固定且永久不变的公网地址就设置好了,随时随地都可以远程访问本地部署的Excalidraw服务了!
以上就是如何在Ubuntu系统使用Docker部署Excalidraw容器,并结合cpolar内网穿透工具实现公网远程访问内网本地服务的全部流程,感谢您的观看。
当便捷部署遇上稳定穿透技术,Excalidraw正在重新定义专业绘图工具的使用边界。
本篇文章知识点来源cpolar官网
- cpolar博客:配置二级子域名: www.cpolar.com/blog/config…
- cpolar博客:配置自定义域名: www.cpolar.com/blog/config…
- cpolar博客:配置固定TCP端口地址: www.cpolar.com/blog/config…
- cpolar博客:配置固定FTP地址: www.cpolar.com/blog/config…
Leanote你的知识库+云脑图:cpolar内网穿透实验室第490个成功挑战
软件名称:蚂蚁笔记(又名 Leanote)
操作系统支持:Linux、Windows、macOS(推荐Docker部署,一键启动无压力!)
软件介绍
开源全能型知识管理工具:支持Markdown编辑器、LaTeX公式渲染、思维导图,可自建私有云笔记库。既是程序员的代码灵感仓库,也是学生的课程整理神器。
Leanote × Markdown+Vim:让笔记变成你的知识宇宙!
- Markdown+Vim双模式:技术人用Vim快捷键飞速输入,学生党用Markdown优雅排版。
- 公式编辑器秒变爱因斯坦:输入“a2+b2a2+b2”瞬间生成数学公式的视觉盛宴!
- 脑图与文档无缝切换:边写大纲边画思维导图,逻辑混乱?不存在的!
cpolar × Leanote:你的私有笔记冲出内网!
-
痛点:本地部署后只能在局域网访问?想在家修改公司笔记却连不上服务器?
-
解决方案:一条命令全球随时访问自己的知识库。
-
cpolar将内网穿透简单到只要三步! 1.下载安装 → 2. 输入要穿透的端口号 → 3. 立刻获得专属访问链接。
-
效果提升:出差路上、咖啡馆办公也能编辑文档,告别“只能在办公室改稿”的枷锁。
总结
Leanote是“知识管理的瑞士军刀”,而Cpolar让它突破物理限制。两者组合不仅实现私有云的安全性(数据不存第三方服务器),还让笔记成为可共享的知识库,适合技术人、学生党、自媒体创作者等群体。
安装教程在下面呦😊
本篇文章介绍如何使用Docker部署Leanote蚂蚁笔记,并且结合cpolar内网穿透实现公网远程访问本地笔记编辑并制作个人博客等。
1. 安装Docker
本文演示环境:CentOS 7,Xshell7远程ssh
没有安装Docker的小伙伴需安装Docker,已有Docker可跳过以下步骤。
如没有安装Docker,需先安装Docker:
-
安装软件包(提供实用程序)并设置存储库
$ sudo yum install -y yum-utils $ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装Docker引擎
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
启动Docker
sudo systemctl start docker
通过运行映像来验证 Docker 引擎安装是否成功
sudo docker run hello-world
2. Docker本地部署Leanote蚂蚁笔记
检查Docker服务状态
检查Docker服务是否正常运行,确保Docker正常运行。
systemctl status docker
检查Docker版本
docker -v
下载Leanote镜像,本次使用Leanote容器镜像从dockerhub拉取,版本为latest版本
docker pull axboy/leanote
部署Leanote应用
创建Leanote容器挂载的数据目录
mkdir -p /data/leanote/{db,conf,files,upload}
cd /data/leanote/
使用docker-cli命令快速创建Leanote容器
docker run -d -p 9800:9000 \
-e "TZ=Asia/Shanghai"\
--restart=always\
-v /data/leanote/db:/data/db \
-v /data/leanote/conf/:/data/leanote/conf \
-v /data/leanote/files:/data/leanote/files \
-v /data/leanote/upload:/data/leanote/public/upload \
-m 50M --oom-kill-disable --memory-swap=-1\
--name leanote \
axboy/leanote
检查Leanote容器状态状态
docker ps
检查Leanote容器所在系统资源
docker stats --no-stream leanote
打开新的浏览器直接访问:http://192.168.149.143:9800/ (本地IP:9800)进入Leanote首页
设置简体中文
点击右上角简体中文
管理员登录Leanote
用户名填写:admin 密码:abc123
进入到后台编辑界面
新建笔记
编辑完文章后公开为博客
点击右上角我的博客
点击博客设置
选择博客设置,进入博客管理页面
修改博客主题
我们就成功在本地搭建了Leanote蚂蚁笔记,但如果想在外随时随地编辑自己的蚂蚁笔记,就需要借助cpolar内网穿透工具来实现公网访问了!接下来介绍一下如何安装cpolar内网穿透并实现蚂蚁笔记公网访问!
3. 安装cpolar内网穿透
下面是安装cpolar步骤:
cpolar官网地址: www.cpolar.com
- 使用一键脚本安装命令
curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash
- 向系统添加服务
sudo systemctl enable cpolar
- 启动cpolar服务
sudo systemctl start cpolar
cpolar安装成功后,在外部浏览器上访问Linux 的9200端口即:【http://服务器的局域网ip:9200】,使用cpolar账号登录,登录后即可看到cpolar web 配置界面,结下来在web 管理界面配置即可。
接下来配置一下Leanote蚂蚁笔记的公网地址,
登录后,点击左侧仪表盘的隧道管理——创建隧道,
创建一个蚂蚁笔记的公网http地址隧道
- 隧道名称:可自定义命名,注意不要与已有的隧道名称重复
- 协议:选择http
- 本地地址:9800 (本地访问的地址)
- 域名类型:免费选择随机域名
- 地区:选择China Top
点击创建
隧道创建成功后,点击左侧的状态——在线隧道列表,查看所生成的公网访问地址,有两种访问方式,一种是http 和https
使用上面的Cpolar https公网地址,在任意设备的浏览器进行访问,即可成功看到Leanote蚂蚁笔记界面,这样一个公网地址且可以远程访问就创建好了,使用了cpolar的公网域名,无需自己购买云服务器,即可到公网进行远程访问蚂蚁笔记了!
小结
如果我们需要长期异地远程访问蚂蚁笔记,由于刚才创建的是随机的地址,24小时会发生变化。另外它的网址是由随机字符生成,不容易记忆。如果想把域名变成固定的二级子域名,并且不想每次都重新创建隧道来听歌,我们可以选择创建一个固定的http地址来解决这个问题。
4. 固定Leanote蚂蚁笔记公网地址
我们接下来为其配置固定的HTTP端口地址,该地址不会变化,方便分享给别人长期查看你的博客,而无需每天重复修改服务器地址。
配置固定http端口地址需要将cpolar升级到专业版套餐或以上。
登录cpolar官网,点击左侧的预留,选择保留二级子域名,设置一个二级子域名名称,点击保留,保留成功后复制保留的二级子域名名称
保留成功后复制保留成功的二级子域名的名称
返回登录Cpolar web UI管理界面,点击左侧仪表盘的隧道管理——隧道列表,找到所要配置的隧道,点击右侧的编辑
修改隧道信息,将保留成功的二级子域名配置到隧道中
- 域名类型:选择二级子域名
- Sub Domain:填写保留成功的二级子域名
点击更新
(注意,点击一次更新即可,不需要重复提交)
更新完成后,打开在线隧道列表,此时可以看到公网地址已经发生变化,地址名称也变成了固定的二级子域名名称的域名
最后,我们使用固定的公网https地址访问,可以看到访问成功,这样一个固定且永久不变的公网地址就设置好了,可以异地远程自己的蚂蚁笔记来进行编辑和学习了!
当知识管理遇见技术赋能,Leanote正重新定义个人数字资产的价值边界——让思考沉淀更安全、分享传播更自由。
编辑器也有邪修?盘点VS Code邪门/有趣的扩展
VS Code 之所以成为最受欢迎的编辑器之一,很大程度上得益于其丰富的扩展生态。本人精选 20 个实用or有趣的 VS Code 扩展,覆盖摸鱼放松,文件管理、代码规范、效率工具等等多个场景,干货满满,下面正片开始:
1 看小说漫画:any-reader
- 核心功能: 在 VS Code 中阅读小说、文档,支持 TXT/EPUB 格式、章节导航、字体调整。
- 适用场景:利用碎片时间阅读技术文档或轻小说,避免频繁切换应用。
- 隐藏技巧:支持自定义快捷键翻页,可设置阅读定时提醒。
2 偷偷在状态栏看小说:Thief-Book
- 核心功能:在状态栏显示小说,支持阅读进度。
- 适用场景:利用碎片时间阅读技术文档或轻小说,避免频繁切换应用。
- 隐藏技巧:支持快捷键翻页。
3 看股票基金期货:韭菜盒子
-
核心功能:
- 基金实时涨跌,实时数据,支持海外基展示
- 股票实时涨跌,支持 A 股、港股、美股
- 期货实时涨跌,支持国内期货
- 底部状态栏信息
- 开市自动刷新,节假日关闭轮询
- 支持升序/降序排序、基金持仓金额升序/降序
- 基金实时走势图和历史走势图
- 基金排行榜
- 基金持仓信息
- 支持维护持仓成本价,自动计算收益率
- 基金趋势统计图
- 基金支持分组展示等等...
-
注意:投资有风险,入市需谨慎!
4 小霸王
- 核心功能:一款基于vscode的nes游戏插件,主打本地与远程游戏资源管理,让你在编辑器内就能完成游戏的添加、下载、启动全流程。
- 不建议上班玩哈!
5. JSON 变可视化树图:JSON Crack
- 核心功能:将 JSON 数据转换为交互式树状可视化图表,支持折叠/展开节点、搜索内容。
- 适用场景:分析复杂 JSON 结构(如 API 响应、配置文件)、快速定位数据层级。
- 优势:比原生 JSON 格式化更直观,支持大体积 JSON 数据渲染。
6. 改变工作区的颜色来快速识别当前项目:Peacock
- 核心功能:为不同工作区设置独特的颜色主题(标题栏、活动栏颜色),快速区分多个 VS Code 窗口。
- 适用场景:同时打开多个项目时,通过颜色直观识别当前操作的项目(如生产环境项目用红色,测试环境用绿色)。
- 个性化选项:支持按项目自动切换颜色,可自定义颜色饱和度和亮度。
7. 编码时长统计:Time Master
- 核心功能:自动记录代码编写时间、文件修改统计,生成每日/每周编程报告,分析编码效率。
- 适用场景:跟踪项目开发时间、了解自己的编码习惯、评估任务耗时。
- 特色:支持集成到 VS Code 状态栏实时显示当前编码时长,数据本地存储保护隐私。
8. 生成文件夹树结构:file-tree-generator
- 核心功能:一键生成项目文件夹结构并复制为文本,支持自定义忽略文件和格式。
- 适用场景:编写 README 文档、项目说明时快速插入目录结构,或向团队展示项目架构。
- 使用技巧:右键文件夹选择「Generate File Tree」,可通过配置文件自定义输出格式。
9. 轻松切换项目:Project Manager
- 核心功能:快速保存和切换多个项目,支持按标签分类、搜索项目,无需反复通过文件管理器打开文件夹。
- 适用场景:同时开发多个项目时,减少切换成本;整理常用项目集合。
- 特色功能:支持从 Git 仓库、本地文件夹导入项目,可配置项目启动命令。
10. 将文件保存到本地历史记录:Local History
- 核心功能:自动为文件创建本地历史版本,支持对比不同版本差异、恢复误删内容。
- 适用场景:防止代码意外丢失、追踪文件修改记录、找回被覆盖的代码。
- 优势:无需依赖 Git,即使未提交的更改也能保存,历史记录默认保留 90 天。
11. 生成文件头部注释和函数注释:koroFileHeader
- 核心功能:自动生成文件头部注释(作者、日期、描述等)和函数注释,支持自定义注释模板。
- 适用场景:统一团队代码注释规范,快速生成符合 JSDoc、JavaDoc 等标准的注释。
-
高级用法:通过配置文件定义不同语言的注释模板,支持快捷键触发(默认
Ctrl+Alt+i
生成函数注释)。
12. 复制 JSON 粘贴为代码:Paste JSON as Code
- 核心功能:将 JSON 数据粘贴为指定语言的类型定义或实体类(支持 TypeScript、Go、C#、Python 等 20+ 语言)。
- 适用场景:根据 API 返回的 JSON 结构快速生成接口类型定义,避免手动编写类型。
-
使用技巧:复制 JSON 后执行命令「Paste JSON as Code」,选择目标语言和变量名即可生成代码。
13. 把代码块框起来:Blockman - Highlight Nested Code Blocks
- 核心功能:用彩色边框高亮嵌套的代码块(如函数、循环、条件语句),直观区分代码层级。
- 适用场景:阅读复杂代码、调试嵌套逻辑时,快速定位代码块边界。
- 特色:支持自定义边框样式、透明度和颜色,兼容大多数代码主题。
14. SVG 预览和编辑:SVG Preview
- 核心功能:在 VS Code 中实时预览 SVG 图片,支持直接编辑 SVG 代码并即时查看效果。
- 适用场景:前端开发中处理 SVG 图标、调整 SVG 路径、优化 SVG 代码。
- 特色:支持放大缩小预览、复制 SVG 代码,兼容大多数 SVG 特性。
15. 程序员鼓励师:Rainbow Fart
- 核心功能:在编码过程中根据输入的关键字触发语音赞美,例如输入 function 时播放 “写得真棒!”,输入 if 时播放 “逻辑清晰,太厉害了!”。支持多语言语音包(中文、英文等),赞美内容与代码语境关联。
- 适用场景:单人开发时缓解编码疲劳,增添趣味性;团队协作时活跃开发氛围;新手学习编程时获得正向反馈。
- 高级功能:支持自定义语音包(可录制个人或团队专属鼓励语音)、配置触发关键字规则、调整音量和触发频率,兼容多种编程语言。
- 文档:传送门
16. 命名风格转换:Name Transform
- 核心功能:一键转换变量名、函数名的命名风格,支持 camelCase(小驼峰)、PascalCase(大驼峰)、snake_case(下划线)、kebab-case(短横线)等常见格式的相互转换。
- 适用场景:接手不同风格的代码时统一命名规范;调用第三方 API 时适配参数命名格式;重构代码时批量修改命名风格。
- 高级功能:支持选中区域批量转换、配置默认转换规则、自定义命名风格映射表,可集成到右键菜单或快捷键(默认 Alt+Shift+T)快速触发。
17. 代码拼写检查器:Code Spell Checker
- 核心功能:实时检查代码中的单词拼写错误(如变量名、注释、字符串中的英文单词),通过下划线标记错误,并提供修正建议。
- 适用场景:避免因拼写错误导致的 Bug(如变量名拼写错误 usre 而非 user);优化代码注释和文档的可读性;英文非母语开发者提升代码规范性。
- 高级功能:支持添加自定义词典(忽略项目专属术语或缩写)、配置语言规则(支持英语、法语等多语言)、批量修复重复拼写错误,可集成到 CI/CD 流程中进行拼写检查。
18. 自动修改标签名:Auto Rename Tag
- 核心功能:在 HTML、XML、JSX、Vue 等标记语言中,修改开始标签时自动同步更新对应的结束标签,无需手动修改配对标签。
-
适用场景:前端开发中修改 HTML/JSX 标签(如将 改为 时,结束标签自动变为 );编辑 XML 配置文件或 Vue 模板时避免标签不匹配问题。
- 高级功能:支持自定义匹配的标签语言(默认覆盖 HTML、Vue、React 等)、配置标签同步延迟时间、忽略自闭合标签,兼容嵌套标签结构。
19. 快速调试打印:Console Helper
- 核心功能:一键生成格式化的调试打印语句(如 console.log()、console.error()),自动填充变量名和上下文信息,支持快捷键快速插入。
- 适用场景:前端开发中快速添加调试日志;后端开发调试变量值或函数执行流程;临时排查代码逻辑问题时减少重复输入。
- 高级功能:支持自定义打印模板(如添加时间戳、文件名、行号)、一键注释 / 取消所有打印语句、自动删除冗余打印,兼容 JavaScript、TypeScript、Python 等多种语言。
20. 彩虹括号:Rainbow Brackets
- 核心功能:为嵌套的括号(圆括号、方括号、花括号)添加不同颜色,增强代码层次感。
- 适用场景:编写嵌套较深的代码(如 JSON 结构、条件语句、函数嵌套)时,快速识别括号配对关系。
- 自定义选项:支持调整颜色主题、忽略特定文件类型、配置括号样式。
如果看了觉得有帮助的,我是鹏多多,欢迎 点赞 关注 评论;
往期文章
- flutter-使用AnimatedDefaultTextStyle实现文本动画
- js使用IntersectionObserver实现目标元素可见度的交互
- Web前端页面开发阿拉伯语种适配指南
- 让网页拥有App体验?PWA 将网页变为桌面应用的保姆级教程PWA
- 助你上手Vue3全家桶之Vue3教程
- 使用nvm管理node.js版本以及更换npm淘宝镜像源
- 超详细!Vue的十种通信方式
- 手把手教你搭建规范的团队vue项目,包含commitlint,eslint,prettier,husky,commitizen等等
个人主页