몇 달 전 Tech Twitter를 스크롤하다가 악명 높은 Brandon의 다음 트윗을 보았습니다.
모르신다면 Brandon이 NextJS와 유사한 Angular용 메타 프레임워크인 AnalogJS를 만들었습니다. 나는 그가 Angular 커뮤니티를 위해 하는 일의 열렬한 팬이므로 응답해야 했습니다. 리졸버로 모든 걸 해결하고 싶다고 가장 먼저 말해줄 거예요.
그리고...
한 번도... 한 번도... 좋아요나 반응이 없습니다.
저는 트위터에 글을 많이 올리지도 않고, 팔로워도 없는 편이라 별 생각이 없었습니다.
그런데 우연히 이 글을 발견하고 댓글을 읽어보니 아무도 내 의견에 동의하지 않는다는 것을 깨달았습니다! 솔직히 그들이 내 말을 이해하고 있는지 궁금합니다.
실제로 JavaScript에는 데이터 로드에 널리 사용되는 두 가지 패러다임이 있습니다.
이것이 제가 Angular를 처음 배운 방법이었습니다. 처음 Fireship의 Original Angular Course를 수강했을 때 리졸버에 대해 전혀 배우지 못했습니다. 리졸버는 대중적이지 않고, 굉장히 오해받고 있는 것 같아요.
위 Brandon의 예는 구성 요소가 렌더링된 후 로드되는 데이터를 보여줍니다. 이는 다른 프레임워크에서도 동일한 패턴입니다.<script> // Detect dark theme var iframe = document.getElementById('tweet-1836847595806732317-750'); if (document.body.className.includes('dark-theme')) { iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1836847595806732317&theme=dark" } </script>
여기서 패턴을 발견하셨나요? 서버 측 프레임워크는 로드 기능(해석기)을 선호하는 반면, 클라이언트 프레임워크는 반응적으로 신호의 데이터를 가져옵니다. 그런데...
Angular는 서버측 프레임워크가 아닙니다!
문제는 Angular가 SSR 프레임워크가 아니라는 것이 아니라 SSR 프레임워크인 척하는 것입니다.
이제 Angular 팀이 내가 요청한 기능을 모두 추가할 것이라고는 기대하지 않습니다. 그러나 기본 빌더에서 기본 .env 지원과 Angular Router로 엔드포인트를 만드는 기능이 있으면 좋을 것입니다. 나머지는 Brandon이 처리할 수 있습니다.
기본 Angular SSR 애플리케이션을 Vercel에 배포할 수 없다는 점도 여전히 제게는 미친 일입니다.
2019년에 리졸버 사용 사례가 '매우 드물다'는 리졸버 관련 기사를 읽었습니다. 기본적으로 빠르게 로드할 수 있는 데이터를 가져올 때만 사용해야 합니다. 알았어, 동의했어. 실제로는 드문 사용 사례에서만 느린 데이터를 로드합니다. 사이트나 애플리케이션이 빠르게 진행되기를 원합니다.
? 대체 뭐야...
조시 모로니는 뭐라고 말할까요?
경합 조건이 있는 비동기 이벤트를 처리하거나 복잡한 데이터 흐름을 조정해야 하는 경우가 아니라면 Angular에서 RxJS를 사용하면 안 됩니다.
그는 거기에서 Signals VS Observable을 언급하고 있었기 때문에 잘 모르겠습니다. 그럼에도 불구하고 이러한 고급 사용 사례가 있을 때까지 기본적으로 리졸버를 가져와야 한다고 생각합니다.
전문 SSR 애플리케이션을 구축하는 경우 데이터베이스에서 생성된 SEO가 필요합니다. 리졸버를 사용하거나 매우 특이한 PendingTask로 구성요소 로드를 수동으로 일시 중지해야 합니다.
아날로그에서는 사람들이 파일 기반 엔드포인트 내에서만 가져오거나 중요하지 않은 정적 페이지를 생성하는 것 같습니다.
내가 가장 좋아하는 두 프레임워크의 프로그래밍 패턴은 정반대입니다.
리졸버의 느린 로딩에 대한 인기 있는 대답 중 하나는 HTTP 스트리밍입니다. NextJS와 SvelteKit은 이를 지원하지만 Angular에서는 지원되지 않습니다.
?
현재 리졸버의 모든 항목은 두 번 가져옵니다(서버 클라이언트). 이 문제는 앞으로도 처리되어야 합니다. ? 해석기는 자동으로 상태를 전달해야 합니다. 이를 위해서는 해석기에서 내 useAsyncTrasferState 함수를 사용하세요.
간결함을 위해 데모에는 ngxtension을 사용했지만 결과는 같습니다.
id = injectParams('id'); idNumber = computed(() => Number(this.id())); todo = derivedAsync<Todo>(() => fetch(`https://jsonplaceholder.typicode.com/todos/${this.id()}`).then( (response) => response.json() ) ); prevId = computed(() => Math.max(this.idNumber() - 1, 1)); nextId = computed(() => this.idNumber() + 1);
todo = injectRouteData<Todo>('data'); idNumber = computed(() => this.todo()!.id); prevId = computed(() => Math.max(this.idNumber() - 1, 1)); nextId = computed(() => this.idNumber() + 1);
리졸버에서 로드됩니다.
import { ResolveFn } from '@angular/router'; export const routeResolverResolver: ResolveFn<boolean> = async (route) => { const todoId = route.paramMap.get('id'); if (!todoId) { throw new Error('Todo ID is missing in the route!'); } // Fetch the todo from the API const response = await fetch(`https://jsonplaceholder.typicode.com/todos/${todoId}`); if (!response.ok) { throw new Error('Failed to fetch the todo'); } return await response.json(); };
이 특정 데모에서는 효과 버전에 "깜박임"이 있는 반면 리졸버 버전에는 깜박임이 없습니다. 이 사용 사례에서는 리졸버가 더 좋다고 생각합니다.
어떻게 생각하시나요?
? Vercel은 SSR 배포를 지원하지 않기 때문에 데모에서는 클라이언트에만 확인자를 로드합니다. 이는 라우팅이 홈 페이지에서만 작동함을 의미합니다.
비동기 가져오기에 대한 생명 유지에 관한 것이라고 말하고 싶습니다. 실제로 Angular SSR 사용자는 이 사용 사례에 대해 해석기를 더 고려해야 하며 SvelteKit 사용자는 더 많은 사용 사례에 대해 $ effect()에 로드하는 것을 고려해야 합니다. 하지만 그게 요점이 아닐까요? 사용자층이 다릅니다.
저는 아직 배우는 중이지만 이러한 질문이 저를 매료시킵니다. 두 생태계 모두에서 더 많은 변화가 일어나기를 바랍니다.
제이
위 내용은 Angular Resolver는 생명 유지에 도움이 됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!