ESLint Flat Config 新配置格式 is becoming increasingly widespread in frontend development. This article dives into its core principles and best practices from real projects.
Basic Usage
Let's start with the basic implementation:
javascript
type DeepPartial<T> = T extends object ? { [P in keyof T]?: DeepPartial<T[P]> } : T
interface AppConfig {
api: { baseUrl: string; timeout: number; retries: number }
ui: { theme: 'light' | 'dark'; language: string; pageSize: number }
}
type PartialConfig = DeepPartial<AppConfig>
function mergeConfig(defaults: AppConfig, overrides: PartialConfig): AppConfig {
const result = { ...defaults }
for (const key of Object.keys(overrides) as (keyof AppConfig)[]) {
if (overrides[key] && typeof overrides[key] === 'object') {
result[key] = { ...defaults[key], ...overrides[key] } as any
}
}
return result
}
这段代码展示了基本的使用方式。实际项目中还需要考虑错误处理和边界条件。
Advanced Usage
Building on this foundation, we can further optimize:
javascript
:root {
--bg: light-dark(#fff, #1a1a2e);
--text: light-dark(#333, #e0e0e0);
--accent: light-dark(#2563eb, #60a5fa);
color-scheme: light dark;
}
.carousel {
display: flex; gap: 1rem; overflow-x: auto;
scroll-snap-type: x mandatory;
scroll-padding: 1rem;
}
.carousel__item {
flex: 0 0 80%; scroll-snap-align: start;
border-radius: 12px; transition: scale 0.3s ease;
}
This pattern is very practical in large projects and can significantly reduce maintenance costs.
Practical Cases
实际项目中的用法会更复杂一些:
javascript
import { useState, useEffect, useCallback } from 'react'
function DataList({ endpoint, pageSize = 20 }) {
const [data, setData] = useState([])
const [page, setPage] = useState(1)
const [loading, setLoading] = useState(false)
const fetchData = useCallback(async () => {
setLoading(true)
try {
const res = await fetch(`${endpoint}?page=${page}&size=${pageSize}`)
setData(await res.json())
} finally { setLoading(false) }
}, [endpoint, page, pageSize])
useEffect(() => { fetchData() }, [fetchData])
return <div>{loading ? <Spinner /> : <List items={data} />}</div>
}
Through this approach, both the testability and scalability of the code are improved.
Performance Optimization
Here is a complete example:
javascript
type DeepPartial<T> = T extends object ? { [P in keyof T]?: DeepPartial<T[P]> } : T
interface AppConfig {
api: { baseUrl: string; timeout: number; retries: number }
ui: { theme: 'light' | 'dark'; language: string; pageSize: number }
}
type PartialConfig = DeepPartial<AppConfig>
function mergeConfig(defaults: AppConfig, overrides: PartialConfig): AppConfig {
const result = { ...defaults }
for (const key of Object.keys(overrides) as (keyof AppConfig)[]) {
if (overrides[key] && typeof overrides[key] === 'object') {
result[key] = { ...defaults[key], ...overrides[key] } as any
}
}
return result
}
Pay attention to boundary condition handling, which is critical in production.
Summary
- In team collaboration, conventions and documentation are more important than the technology itself
- Stay updated with the community; technical solutions need continuous iteration
- Don't adopt new technology just for the sake of it