지난 일주일 사이에 Discourse에 적용된 변경 사항 중 하나가 제 플러그인을 깨뜨렸고, 실제로 무엇이 잘못되었는지 또는 어떻게 수정해야 하는지 파악이 안 됩니다. 이 시점까지 플러그인은 수년간 정상적으로 작동했습니다.
플러그인은 여러 기능을 수행하지만, 여기에서 관련 있어 보이는 부분은 사용자 프로필 페이지에 버튼을 추가하는 것입니다.
이제 어떤 사용자의 해당 페이지를 방문해도 페이지의 대부분이 렌더링되지 않습니다(플러그인이 추가하려는 버튼을 포함하여):
(플러그인의 설정 버튼을 통해 비활성화하면 페이지가 정상적으로 렌더링됩니다.)
Chrome의 JavaScript 콘솔에는 이 페이지가 새로고침될 때마다 다음과 같은 예외와 스택 트레이스가 표시됩니다:
이 오류가 제 코드가 아닌데다, 예외가 발생한 줄이나 그 근처에 not a function이라고 표시된 t가 존재하지 않아서 이 오류를 어떻게 해석해야 할지 모르겠습니다. 꽤 혼란스럽네요. 하지만 저는 JS 전문가가 아니므로 단순히 무언가를 놓치고 있는 것일 수도 있습니다.
Chrome 디버거로 단계별로 추적해 보니, 문제가 플러그인의 템플릿을 처리하는 동안 해당 줄에서 발생하지만, 실제로 문제를 일으키는 원인이 무엇인지, 아니면 제가 변경/업데이트해야 할 사항인지, 아니면 Discourse 자체의 버그인지 확인할 수 없습니다.
관련되어 있다고 생각하는 플러그인의 JS 코드와 HBS 템플릿은 제 user-profile-primary 커넥터에 있으며, 여기에서 찾을 수 있습니다:
확실하지는 않지만, 아마도 최근의 Discourse 커밋 중 일부가 관련이 있을 수 있다고 생각되었습니다:
어떤 제안이라도 큰 도움이 될 것입니다!
david
(David Taylor)
12월 1, 2022, 10:01오후
2
안녕하세요 @LeoDavidson - 이 문제를 제기해 주셔서 감사합니다. 해당 커밋들과 관련이 있다는 지적이 거의 확실합니다. 어떤 부분이 변경되었는지 조사해 보겠습니다. 의도치 않게 동작이 변경되는 문제를 도입한 것은 아닙니다.
그동안 이 PR은 플러그인 커넥터를 더 일반적인 디렉터리 구조로 이동시켜 문제를 해결할 것입니다:
master ← davidtaylorhq:move-connectors
merged 10:25PM - 01 Dec 22 UTC
Having these connectors nested under `/user` is unusual and is causing issues on… the latest version of Discourse. Even if/when the change in behaviour is reverted in Discourse, moving these templates to the standard location is a good idea.
정말 감사합니다! PR도 감사드리고, 이렇게 빨리 처리해 주셔서 감사합니다. 방금 적용해 보았는데 이제 모든 것이 정상적으로 작동합니다!
david
(David Taylor)
12월 2, 2022, 1:05오후
5
이 동작 변화의 원인을 조사해 보았습니다. 커넥터는 다음과 같은 위치에 있었습니다:
assets/javascripts/discourse/templates/user/connectors/{outlet-name}/{unique-name}.js
assets/javascripts/discourse/templates/user/connectors/{outlet-name}/{unique-name}.hbs
경로에 포함된 추가적인 /user/ 디렉터리로 인해 우리의 unColocateConnectors 로직에 의해 감지되지 않습니다.
const COLOCATED_CONNECTOR_REGEX =
/^(?<prefix>.*)\/connectors\/(?<outlet>[^\/]+)\/(?<name>[^\/\.]+)\.(?<extension>.+)$/;
// Having connector templates and js in the same directory causes a clash
// when outputting es6 modules. This shim separates colocated connectors
// into separate js / template locations.
function unColocateConnectors(tree) {
return new Funnel(tree, {
getDestinationPath: function (relativePath) {
const match = relativePath.match(COLOCATED_CONNECTOR_REGEX);
if (
match &&
match.groups.extension === "hbs" &&
match.groups.prefix.split("/").pop() !== "templates"
) {
const { prefix, outlet, name } = match.groups;
return `${prefix}/templates/connectors/${outlet}/${name}.hbs`;
}
if (
match &&
This file has been truncated. show original
all-the-plugins와 all-the-themes를 검색해 보았지만, 이 디렉터리 구조의 다른 발생 사례는 보이지 않습니다. 따라서 더 많은 문제 보고가 들어오지 않는 한, 당분간 현재 상태를 유지할 예정입니다.