
useMemo와 useCallback으로 생각하도록 스스로를 훈련했습니다. 과도한 리렌더링을 유발할 수 있는 모든 값을 찾아내는 내부 컴파일러를 머릿속에 구축했습니다. 그것은 제2의 천성과도 같았습니다.useCallback이 필요한가?.map(...) 내부의 props를 안정화하기 위해 이것을 별도의 ComponentItem.tsx 파일로 추출해야 하는가?useMemo로 감싸야 하는가?fetch로 리팩터링하면서, try 블록 안에 null 병합 연산자(nullish coalescing)가 포함된 try/catch를 추가했습니다. 그로 인해 React Compiler와 호환되지 않게 되었고, 입력값에 대한 ref 콜백이 계속해서 요동치는 이상한 리렌더링 루프가 발생했습니다. case ErrorCategory.Todo: { return { category, severity: ErrorSeverity.Hint, name: 'todo', description: 'Unimplemented features', preset: LintRulePreset.Off, }; }todo이므로, 대부분의 설정에서(eslint-plugin-react-hooks를 다른 이름으로 설정하지 않은 한) 규칙의 전체 이름은 react-hooks/todo입니다. 우리가 찾을 수 있는 그 어디에도(예: 이러한 React Compiler ESLint 규칙들) 문서화되어 있지 않지만, 이를 에러로 활성화하면 컴파일러가 아직 처리할 수 없는 구문이 있는 모든 컴포넌트에서 빌드가 중단됩니다. const handleGeneration = useEffectEvent(async (fetchURL: string) => { try { const response = await fetch(fetchURL); const data = (await response.json()) as { response?: string }; const finalResult = (data.response ?? '').trim(); const prompt = getPromptFromResponse(finalResult); if (!prompt) { handleError(); } else { setPromptSuggestion(prompt); setEventSourceURL(''); } } catch (error) { logError('Home fetch error', error); } });/outlyne/app/components/Home.tsx 86:34 error Todo: Support value blocks (conditional, logical, optional chaining, etc) within a try/catch statement/outlyne/app/components/Home.tsx:86:34 84 | const response = await fetch(fetchURL); 85 | const data = (await response.json()) as { response?: string };> 86 | const finalResult = (data.response ?? '').trim(); | ^^^^ Support value blocks (conditional, logical, optional chaining, etc) within a try/catch statement 87 | const prompt = getPromptFromResponse(finalResult); 88 | if (!prompt) { 89 | handleError();import reactHooks from 'eslint-plugin-react-hooks';export default [ { files: ['**/*.{js,jsx,ts,tsx}'], plugins: { 'react-hooks': reactHooks }, // ... rules: { // 아래의 특정 규칙들로 인해 덮어씌워지는 것을 방지하기 위해 프리셋을 전개(spread)합니다. ...reactHooks.configs.recommended.rules, // https://github.com/facebook/react/blob/3640f38/compiler/packages/babel-plugin-react-compiler/src/CompilerError.ts#L807-L1111 'react-hooks/todo': 'error', // 기타 유용한 규칙들: 'react-hooks/capitalized-calls': 'error', // 대문자로 시작하는 함수 호출 방지 (JSX를 사용해야 함) 'react-hooks/hooks': 'error', // "rules-of-hooks" 비컴파일러 규칙을 대부분 다시 구현함 'react-hooks/rule-suppression': 'error', // 다른 규칙의 억제(suppression) 여부를 검증함 'react-hooks/syntax': 'error', // 잘못된 구문을 검증함 'react-hooks/unsupported-syntax': 'error',// 기본값은 `warn`, 빌드를 중단시키려면 `error` 사용 // ... } },];function MyComponent({ value }) { // value가 undefined인 경우, 상태값으로 대체 value = value ?? someStateValue; // 또는 값 정규화 value = normalizeValue(value); // value 사용...}function MyComponent({ value: valueFromProps }) { const value = valueFromProps ?? someStateValue; // value 사용...}try 또는 catch 블록 내의 조건문throw 문try { const response = await fetch(url); if (response.ok) { // 컴파일 중단 setResponse(await response.json()); } else { setError(`Error ${response.status}`); }} catch (error) { setError(`${error}`);}Support ThrowStatement inside of try/catch todo 에러 앞에는 다음과 같은 주석이 달려 있다는 점을 언급해야겠습니다:/* * 참고: 이를 지원할 수도 있지만, try/catch 내부의 `throw`는 제어 흐름을 위해 예외를 사용하는 것이며 * 일반적으로 안티 패턴으로 간주됩니다. 어떤 이유로 정말 필요해지지 않는 한, * 이 패턴은 지원하지 않을 가능성이 높습니다. */try 블록 내부에서 안전하지 않은 속성 접근에 의존함으로써 Support value blocks… 에러를 우회해 왔으며, 이는 제어 흐름을 위해 던져진 예외에 암묵적으로 의존하는 방식이었습니다./* eslint-disable react-hooks/todo */function NonCriticalPathComponent() { // 이 컴포넌트는 앱의 성능을 위해 컴파일될 필요가 없으며, // try/catch 로직을 리팩터링할 의사도 없습니다.}아직 댓글이 없습니다.
첫 번째 댓글을 작성해보세요!

프로그래밍 언어로서의 TypeScript 타입
Inkyu Oh • Front-End

at:// 프로토콜을 아시나요?
Inkyu Oh • Back-End

GraphQL: 엔터프라이즈의 허니문은 끝났다
Inkyu Oh • Back-End

React Server Components 성능 입문
Inkyu Oh • Front-End