编程笔记

这里记录了我在编程学习过程中的笔记、代码片段和技术要点,便于自己查阅也希望能帮到其他开发者。

前端开发笔记

React Hooks最佳实践
2023-12-01

在React函数组件中,Hooks提供了强大的状态管理和生命周期控制能力。以下是一些使用Hooks的最佳实践:

1. 使用自定义Hooks抽象逻辑
// 自定义Hook: useWindowSize
function useWindowSize() {
  const [size, setSize] = useState({ width: 0, height: 0 });
  
  useEffect(() => {
    const handleResize = () => {
      setSize({
        width: window.innerWidth,
        height: window.innerHeight
      });
    };
    
    window.addEventListener('resize', handleResize);
    handleResize(); // 初始化
    
    return () => window.removeEventListener('resize', handleResize);
  }, []);
  
  return size;
}
2. 使用useCallback避免不必要的渲染
const memoizedCallback = useCallback(
  () => {
    doSomething(a, b);
  },
  [a, b],
);
3. 使用useMemo缓存计算结果
const memoizedValue = useMemo(() => {
  return computeExpensiveValue(a, b);
}, [a, b]);

记住:Hooks只能在函数组件的顶层调用,不能在循环、条件或嵌套函数中调用。

CSS Grid布局实战技巧
2023-11-15

CSS Grid是一种强大的二维布局系统,可以轻松创建复杂的网格布局。以下是一些使用技巧:

1. 基本网格设置
.container {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: auto;
  gap: 20px;
}
2. 响应式网格布局
.responsive-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
  gap: 1rem;
}

使用minmax()和auto-fill/auto-fit可以创建灵活的响应式布局,无需媒体查询。

后端开发笔记

Java Stream API使用技巧
2023-11-28

Java 8引入的Stream API提供了强大的集合处理能力,以下是一些常用技巧:

1. 基本操作:过滤、映射和收集
List filtered = people.stream()
  .filter(person -> person.getAge() > 18)
  .map(Person::getName)
  .collect(Collectors.toList());
2. 分组和统计
Map> byDept = employees.stream()
  .collect(Collectors.groupingBy(Employee::getDepartment));

Map countByDept = employees.stream()
  .collect(Collectors.groupingBy(
    Employee::getDepartment, 
    Collectors.counting()));

Stream API大大简化了集合处理代码,使其更具声明性和可读性。

SpringBoot自动配置原理
2023-11-10

SpringBoot的自动配置是其核心特性之一,它使得开发人员可以快速搭建应用程序而无需大量配置。

1. @SpringBootApplication注解解析
@SpringBootApplication 等同于:
@Configuration
@EnableAutoConfiguration
@ComponentScan
2. 条件注解
@ConditionalOnClass(DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
public class DataSourceAutoConfiguration {
    // 配置数据源的bean
}

了解自动配置原理有助于更好地使用SpringBoot,并在必要时进行自定义配置。

数据库笔记

MySQL性能优化笔记
2023-11-25

数据库性能对应用系统至关重要,以下是一些MySQL性能优化的关键点:

1. 索引优化
-- 为常用查询字段添加索引
CREATE INDEX idx_user_email ON users(email);

-- 复合索引的列顺序很重要
CREATE INDEX idx_lastname_firstname ON users(last_name, first_name);
2. 查询优化
-- 使用EXPLAIN分析查询
EXPLAIN SELECT * FROM users WHERE email = 'example@domain.com';

-- 避免SELECT *,只查询需要的列
SELECT id, name, email FROM users WHERE active = 1;

定期使用EXPLAIN分析慢查询,并对表结构和查询语句进行优化,可以显著提升数据库性能。

MongoDB聚合管道实例
2023-11-05

MongoDB的聚合管道是一个强大的数据处理工具,它可以对数据进行转换和计算:

1. 基本聚合操作
db.orders.aggregate([
  { $match: { status: "completed" } },
  { $group: { _id: "$customer", total: { $sum: "$amount" } } },
  { $sort: { total: -1 } }
])
2. 使用$lookup进行关联查询
db.orders.aggregate([
  {
    $lookup: {
      from: "customers",
      localField: "customer_id",
      foreignField: "_id",
      as: "customer_info"
    }
  },
  { $unwind: "$customer_info" }
])

聚合管道可以在数据库端完成复杂的数据处理,减少应用端的计算负担。

DevOps笔记

Docker多阶段构建
2023-11-22

Docker多阶段构建是一种优化Docker镜像大小的技术,特别适用于编译型语言:

1. 多阶段构建示例
# 构建阶段
FROM golang:1.17 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# 运行阶段
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]

通过多阶段构建,最终镜像只包含运行应用所需的文件,不包含构建环境,大大减小了镜像体积。

CI/CD流水线配置
2023-11-01

持续集成/持续部署(CI/CD)是现代软件开发的重要实践,以下是一个基于GitHub Actions的简单配置:

1. GitHub Actions工作流配置
name: CI/CD Pipeline

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Set up JDK 11
      uses: actions/setup-java@v2
      with:
        java-version: '11'
    - name: Build with Maven
      run: mvn -B package --file pom.xml
    - name: Run tests
      run: mvn test

通过自动化构建和测试,CI/CD流水线可以提高开发效率和代码质量。

移动开发笔记

Flutter状态管理
2023-10-25

在Flutter应用中,状态管理是一个核心概念。Provider是一个简单而强大的状态管理解决方案:

1. 创建一个简单的ChangeNotifier
class CounterModel extends ChangeNotifier {
  int _count = 0;
  int get count => _count;

  void increment() {
    _count++;
    notifyListeners();
  }
}
2. 在应用中使用Provider
void main() {
  runApp(
    ChangeNotifierProvider(
      create: (context) => CounterModel(),
      child: MyApp(),
    ),
  );
}

Provider提供了一种声明式的方式来管理状态,使得状态逻辑与UI逻辑分离。