PGN(체스판과 대국 기록)을 표시하기 위한 테마 컴포넌트를 만들고 있습니다.
이 컴포넌트는 이론적으로는 어렵지 않으며, 이를 위한 JS 컴포넌트(PGNViewer.js)가 있습니다. 저는 [wrap] 태그를 적절한 <script>var x='pgn here'; ...</script> 및 <div class='pgn-blahblah'></div> 블록으로 변환하는 데 성공했습니다.
지금까지는 잘 진행되고 있지만, 이제 JS를 로드해야 합니다. import loadScript from "discourse/lib/load-script";와 await loadScript(settings.theme_uploads_local.pgnviewer_js);를 사용하여 초기화 시점에 /assets/ 디렉터리에서 파일을 로드할 수 있다는 것을 알게 되었습니다.
하지만 여기에서 몇 가지 문제가 있습니다.
개발 환경에서는 컴포넌트를 로드할 수 있지만, 프로덕션 서버에서는 에셋이 너무 크다고 나와서 로드할 수 없습니다. 이 문제를 해결할 방법이 있을까요?
두 번째로, 개발 환경에서는 /theme-javascripts/dist.js.map를 로드할 수 없다는 경고가 표시됩니다. 이 경고가 어디서 오는지 전혀 모르겠습니다. 제가 제공해야 할 것이 있나요?
제 이해가 맞다면, 이 방식은 페이지에서 스크립트를 로드할 필요(아마도 loadScript를 사용하여??)가 없고, 테마 js에 단순히 import만 하면 되는 것 같습니다. 아니면 제가 완전히 잘못 이해하고 있는 걸까요?
즉, loadScript와 단순한 import의 차이는 무엇인가요?
이 부분을 더 잘 이해할 수 있는 웹 자료가 있다면 추천해 주실 수 있을까요?
질문이 사소하거나 멍청한 것 같아 다시 한번 죄송합니다!
또 다른 문제로는, 제한 값이 기본적으로 10M인데 제 에셋은 약 300kb이고 전체 zip 파일은 337kb인데도 업로드 시 512kb를 초과한다고 표시됩니다.
좋아요, 해냈어요. 다만 ’ … 헐… 어쨌든, 제 스크립트가 거의 작동했어요. 모든 것을 main에 push했는데 어떻게든 돌아갔어요. 렌더링에 문제가 있는 것 같지만, 적어도 메인 컴포넌트는 호출되고 있어요 (문제가 있는 곳이라고 의심합니다).
모두 감사합니다… 곧 더 많은 질문으로 돌아올게요 ㅋㅋ. 감사합니다!
거의 다 끝났습니다. "무언가"는 표시되긴 하는데, 랜덤하게 작동합니다.
제가 사용하는 JS 라이브러리는 다음과 같이 동작합니다:
먼저 고유한 id를 가진 <div id='board'> 블록을 정의해야 합니다. 그런 다음 div를 채우기 위해 함수를 실행해야 하는데, 예를 들어 다음과 같습니다. PGNV.pgnBoard('board', {});. 이 스크립트는 같은 id를 사용하여 내용을 채웁니다.
제가 이해하기로는, cooked block을 데코레이팅하는 동안에는 이 작업을 수행할 수 없는 것 같습니다. 문서가 아직 채워지지 않았기 때문에 PGNV 객체가 해당 블록을 찾을 수 없기 때문입니다. 그래서 처음에는 위젯을 사용했지만(HTML 함수가 블록을 반환해야 하는데, 제가 그것을 가지고 있지 않아서 작동하지 않았습니다), 이후에는 디바운스된 함수로 전환했습니다: debounceFunction(this, renderPgn, attrs, 200);.
Hawn님, 힌트 주셔서 감사합니다!
제가 찾던 바로 그 것 같습니다. 두 가지 다른 접근법을 시도해 보았습니다:
먼저 일반적인 "decorateCooked"를 사용하여 div 블록을 파싱하고 첨부한 다음, PGNV.pgnviewer()를 호출하여 afterAdopt로 렌더링하거나
afterAdopt 옵션만 사용하여 첨부와 렌더링을 모두 수행
아직 작동하지 않았습니다. 제가 완전히 파악하지 못하는 또 다른 문제가 있는 것 같습니다. 내부 라이브러리가 DOM 요소에서 className 속성을 찾을 수 없어 오류로 충돌하는 것 같습니다. 조금 헤매고 있습니다 . 누군가가 loadScript를 사용하는 것을 봤지만, 저는 단순히 라이브러리를 import하고 debounce 함수를 사용하니 잘 작동했습니다. 두 방법의 차이점은 무엇인가요?
안녕하세요 @hawm, 작동하지 않는 이유를 찾았지만 막혀 있습니다.
물론 저는 Ember와 최신 JS 전반에 대해 완전히 초보입니다. 그래서 조금 공부해 보니 원인을 파악했습니다.
PgnViewerJs는 가상 DOM이 아닌 실제 DOM에서 작동하도록 설계되어 있습니다. 따라서 cooked 요소가 채택된 후에도 실제 DOM에는 존재하지 않으며, PGNV는 document.getElementById를 사용하여 ID를 검색합니다.
찾을 수 있는 모든 자료를 공부해 봤는데, Ember 컴포넌트가 제 요구사항에 맞는 것 같지만 어떻게 처리해야 할지 확신이 서지 않습니다.
아니면 API.onAppEvent를 사용하는 것이 좋을까요?