服务端2月17日 20:06
TypeORM 查询太慢怎么优化?N+1、索引和批量插入实战TypeORM 性能问题主要来自三个地方:N+1 查询、缺少索引、大量数据操作用了逐条插入。逐一解决后,大部分应用的数据库性能就够了。
## 1. 解决 N+1 查询
最常见也最致命的性能问题。查询用户列表后逐个查用户的文章:
```typescript
// N+1:1 次查用户 + N 次查文章
const users = await userRepo.find();
for (const user of users) {
user.posts = await postRepo.find({ where: { authorId: user.id } });
}
```
...服务端2月17日 20:07
npm 是什么?包管理器核心概念和 package.json 详解npm(Node Package Manager)是 Node.js 的默认包管理器,负责安装、管理和发布 JavaScript 包。npm 由三部分组成:命令行工具、在线仓库(registry)和网站(npmjs.com)。
## npm 做什么
**安装别人写的包**:`npm install react` 从 registry 下载 react 及其依赖到 node_modules 目录。一个项目通常有几十到上百个依赖,手动下载不现实。
**管理项目依赖**:package.json 记录项目需要哪些包和版本范围,package-lock.json 锁定精确版本。任何人 cl...服务端2月17日 20:08
npm 版本号 ^ 和 ~ 有什么区别?SemVer 和 package-lock 详解npm 用语义化版本(SemVer)管理包版本,package.json 声明版本范围,package-lock.json 锁定精确版本。理解版本范围符号能避免"昨天还好好的今天就挂了"的问题。
## 语义化版本号
版本号格式:`主版本.次版本.补丁版本`(Major.Minor.Patch)
- **Patch**(1.0.x):Bug 修复,不改变 API
- **Minor**(1.x.0):新增功能,向后兼容
- **Major**(x.0.0):破坏性变更,不向后兼容
npm install 默认安装最新版本,但 package.json 里记录的是版本范围,不是精确版...服务端2月17日 20:11
npm、Yarn 和 pnpm 怎么选?2025 年包管理器对比npm 和 Yarn 都是 JavaScript 包管理器,做的事情一样(安装依赖、管理版本、运行脚本),区别在于速度、稳定性和锁文件机制。2025 年的实际情况:npm 够用,pnpm 值得切换,Yarn 1 已过时。
## 核心差异
| 维度 | npm | Yarn 1 (Classic) | Yarn 2+ (Berry) | pnpm |
|------|-----|-------------------|-----------------|------|
| 锁文件 | package-lock.json | yarn.lock | yarn.lock | pnpm-lo...服务端2月17日 20:13
.npmrc 怎么配?registry 镜像、私有包和常用配置项详解.npmrc 是 npm 的配置文件,控制 registry 源、代理、认证信息等。分三层:全局、项目、用户级,优先级从高到低。
## 三层 .npmrc
| 文件位置 | 作用范围 | 优先级 |
|----------|----------|--------|
| 项目根目录/.npmrc | 只对当前项目生效 | 最高 |
| ~/.npmrc | 对当前用户所有项目生效 | 中 |
| $PREFIX/etc/npmrc | 全局,对所有用户生效 | 最低 |
项目级配置覆盖用户级,用户级覆盖全局。大多数配置写在项目级或用户级就够了。
## 最常用的配置
**1. 切换...服务端2月17日 20:16
npm link 怎么用?本地包开发链接和常见坑`npm link` 让你在本地开发时把一个包"链接"到另一个项目,改了代码立即生效,不用反复 npm publish + npm install。
## 工作原理
npm link 分两步:
**第一步**:在要开发的包目录里执行 `npm link`,把当前包注册到全局 node_modules。
```bash
cd ~/projects/my-ui-lib
npm link
# 把 my-ui-lib 链接到 /usr/local/lib/node_modules/my-ui-lib
```
**第二步**:在使用这个包的项目里执行 `npm link my-ui-li...服务端2月17日 20:20
npm 常用命令速查:安装、版本管理、脚本和高效技巧日常开发用到的 npm 命令其实不多,核心就 10 个左右。记住这些够用 90% 的场景,剩下的需要时再查。
## 安装和卸载
```bash
npm install # 根据 package.json 安装所有依赖
npm install react # 安装到 dependencies
npm install -D jest # 安装到 devDependencies
npm install -g typescript # 全局安装
npm uninstall react # 从 dependencies 移除
```
...服务端2月17日 20:36
Python 装饰器是怎么工作的?@ 语法糖、执行时机和 wraps 详解装饰器的本质是一个接收函数作为参数并返回新函数的高阶函数。`@decorator` 语法糖等价于 `func = decorator(func)`。理解装饰器的关键:它只是函数替换,在定义时执行,不是调用时。
## 装饰器做了什么
```python
def log(func):
def wrapper(*args, **kwargs):
print(f"Calling {func.__name__}")
return func(*args, **kwargs)
return wrapper
@log
def hello(name):...服务端2月17日 20:37
Python GIL 是什么?为什么多线程不能利用多核?怎么绕过?GIL(Global Interpreter Lock)是 CPython 的一把全局互斥锁,同一时刻只允许一个线程执行 Python 字节码。这意味着 Python 多线程无法利用多核 CPU 做计算密集型任务。但 IO 密集型任务不受影响——线程等待 IO 时会释放 GIL。
## GIL 为什么存在
CPython 的内存管理(引用计数)不是线程安全的。如果多个线程同时修改 `ob_refcnt`,可能导致内存泄漏或提前释放。GIL 是最简单的解决方案——一个线程执行 Python 代码时,其他线程不能运行。
为什么不去掉?Python 核心开发者试过多次,去掉 GIL 会导...服务端2月17日 20:38
Python 迭代器和生成器有什么区别?yield 和迭代器协议详解迭代器是实现了 `__iter__` 和 `__next__` 方法的对象,生成器是用 `yield` 关键字自动创建的迭代器。生成器是迭代器的子集——所有生成器都是迭代器,但迭代器不一定是生成器。核心区别:生成器更简洁,且天然支持惰性求值。
## 迭代器协议
迭代器必须实现两个方法:
- `__iter__`:返回 self(让迭代器本身也可迭代)
- `__next__`:返回下一个值,没有值时抛出 StopIteration
```python
class Countdown:
def __init__(self, start):
self.curr...