최신 Ember 버전으로 Discourse를 업그레이드하는 프로젝트의 일환으로, Discovery(즉, ‘토픽 목록’) 라우트에 대한 대규모 리팩터링 작업을 진행해 왔습니다.
이 토픽은 테마/플러그인 개발자를 대상으로 하며, 리팩터링에 영향을 받을 수 있는 테마/플러그인 활동의 종류를 나열하는 것을 목표로 합니다.
배경
이 리팩터링은 최신 Ember가 {{outlet "topics"}}와 같은 '명명된 아웃렛(named outlets)'을 더 이상 지원하지 않기 때문에 필요합니다. 우리는 이 라우트에서 이를 광범위하게 사용해 왔습니다. 기본적으로, 이전에 명명된 아웃렛으로 렌더링되던 모든 컨트롤러/템플릿은 이제 컴포넌트로 변환되었습니다.
이 과정에서 관련 코드를 현대화하고 통합할 기회도 가졌습니다(예: 모든 유형의 discovery 라우트가 이제 동일한 컨트롤러와 템플릿을 공유합니다).
코어에서의 변경 사항 구현은 아직 최종 확정되지 않았지만, 진행 중인 작업은 이 브랜치에서 확인할 수 있습니다. 병합에 대한 구체적인 날짜는 아직 없지만, 향후 몇 주 내에 이루어질 것으로 예상됩니다. 질문이나 우려 사항이 있으시면 알려 주세요!
어떤 테마/플러그인 활동이 영향을 받나요?
이 리팩터링은 주로 ‘컨트롤러’ 계층에 영향을 미칩니다. 라우트는 대부분 변경되지 않았으며, <TopicList /> 컴포넌트 아래에 있는 모든 것도 영향을 받지 않습니다.
영향은 코어 코드를 깊숙이 다루는 테마/플러그인(예: modifyClass 및 템플릿 오버라이드를 통해)에 한정될 것으로 예상됩니다. 정의된 API와 아웃렛은 영향을 받지 않습니다.
템플릿 오버라이드
이 템플릿들은 컴포넌트로 리팩터링되었습니다. 기존 오버라이드는 조용히 작동이 중단됩니다.
navigation/categoriesnavigation/categorynavigation/defaultnavigation/filterdiscovery/topics
이 템플릿들은 대폭 리팩터링되었습니다. 기존 템플릿 오버라이드는 사이트에 치명적인 오류를 일으킬 가능성이 높습니다.
discoverytag/showuser-topics-listuser/messagesdiscovery/categoriescomponents/basic-topic-listcomponents/d-navigation
기술적으로는 이 변경 사항으로 도입된 새로운 템플릿을 오버라이드하는 것이 가능합니다. 그러나 템플릿 오버라이드는 권장되지 않으며 폐지되고 있습니다.
따라서 모든 템플릿 오버라이드는 제거되고 더 견고한 확장 API(예: 플러그인 아웃렛)로 대체되어야 합니다. Discourse의 기존 확장 지점으로는 불가능해 보이는 작업이 있다면 알려 주세요!
modifyClass 및 lookup() 호출
이 클래스들은 더 이상 존재하지 않습니다. modifyClass는 조용히 작동이 중단됩니다. 조회(lookup)는 null을 반환합니다(따라서 오류로 이어질 수 있음). 가장 인기 있는 경우를 위해 하위 호환성을 위한 shim을 도입했습니다(각주 참조).
controller:discoverycontroller:discovery/topics[1]controller:discovery-sortable( →controller:discovery/list)controller:discovery-filter( →controller:discovery/filter)controller:navigation/categoriescontroller:navigation/category[2]controller:navigation/defaultcontroller:tag/show[3]controller:discovery.*( →controller:discovery/list)
이 클래스들은 상당한 리팩터링을 거쳤습니다. modifyClass 및 lookup 호출에 리팩터링이 필요할 수 있습니다:
route/discoveryroute/discovery.*route/tag-show
라우트
라우트 이름(즉, router.currentRouteName)은 변경되지 않았습니다.
Discovery 라우트의 model() 훅(즉, router.currentRoute.attributes)은 대부분 변경되지 않았습니다.
플러그인 아웃렛
모든 플러그인 아웃렛 및 그 인수는 변경되지 않았습니다.
HTML / CSS
HTML 구조와 클래스는 대부분 영향을 받지 않습니다.