AMD(requirejs) 사용 관련 질문드립니다

아래 토픽에 답글로 v1.0.35 이상부터 AMD를 지원한다고 나오는데, 막상 해보면 에러가 발생함.

증상은

require( [‘kakao’], function(Kakao) {
// kakao init
});

이렇게 kakao 모듈을 로드하고 나면 이 직후에 require( [‘some-module’] ); 호출 당하는 모듈은 반드시 Mismatched anonymous define() 에러가 발생하게 되어 있음.

더불어 위에서 kakao 모듈 로드하면 이상하게도 AMD 호출이면서도 글로벌 변수 Kakao로도 할당되버림. (뭐지 ㅡㅡ^)

이걸 해결할려고 내 시간 3일을 삽질했음…
별수를 다 썼음… 안 됨!!!
프로젝트 오픈은 다가오는데, 똥줄 타 죽는줄 알았음…

해결 방법은

require( [‘kakao’], function(Kakao) {
require( [‘DUMMY’], function() {});

// kakao init
});

이렇게 콜백 최초에 존재하지 않는 더미를 호출하여 강제로 먼저 미스매치 에러가 발생되도록 하는 것임.

그러면 이 직후에 로드될 모듈은 안전하게 호출될 수 있음.

왠지 .js 파일 미니파이드 하는 과정에서 발생한 버그일 수도 있겠다 생각이 들지만…
그게 아니라 코딩시부터 실수라면…

카카오 개발자들 혼난다!!!

@lhy0110
리포트 감사합니다, 화가 많이 나셨나 보네요~ 확인하도록 하겠습니다!
글로벌 변수로도 할당되는 것은, 기존에 글로벌 변수로 할당하도록 동작하고 있었기 때문에, 이부분을 변경해 버리면 이미 SDK를 적용하고 있는 웹사이트들에 문제가 될수 있기 때문입니다.

(그런데 해당 기능 배포한지 24시간이 되었는데, 3일동안 고생하셨다는 건…???)

@lhy0110
requirejs 이용하여 Kakao Javascript SDK를 로딩한 간단한 샘플을 만들어 보았습니다!
https://github.com/yeonhoyoon/requirejs-test

적용시 잘 안되시던 부분이 어떤 부분인지 좀더 자세히 알려 주실 수 있을까요? 재연이 가능한 간단한 샘플을 주실 수 있으면 큰 도움이 될 것 같습니다.

Mismatched anonymous define() 에러는 requirejs 의 에러로 문제 원인 및 해결 방안은 아래 문서 확인해보시면 될 것 같습니다.
http://requirejs.org/docs/errors.html#mismatch

AMD를 지원하지만 global namespace에도 Kakao 가 존재하는 것은 하위호환 이슈와, UMD 방식으로 제공되고 있기 때문입니다. UMD는 global, AMD, commonjs 등 다양한 모듈 형태를 동시에 지원하기 위한 방법입니다.
https://github.com/umdjs/umd

그리고 정확한 요구사항은 알수없지만 중첩된 require() 호출보다는 한번에 필요한 디펜던시들을 읽어오는 편이 나을 것 같습니다.

require(['kakao'], function (Kakao) {
    require(['some-module'], function (SomeModule) {
        // ...
    });
});

=> 

require(['kakao', 'some-module'], function (Kakao, SomeModule) {
    // ...
});

마지막으로 재현가능한 샘플코드가 있다면 문제를 해결하는데 큰 도움이 될 것 같습니다~! :blush:

1개의 좋아요

저도 require.js 잘 안되는 군요…

제 경우엔, 다른 스크립트 들에서 random 하게 에러가 발생하네요.
kakao require 시 제대로 로딩이 안되는 것 같습니다.

우선은 그냥 require 없이 사용해야 할 듯 하네요.
샘플 만들어 보여드리긴 좀 어려울듯;;

위에서 말씀하신 샘플코드를 추가해서 올립니다.

https://asamaru7.github.io/requirejs-test/

https://github.com/yeonhoyoon/requirejs-test 를 fork해서 오류가 나는 상황으로 일부 코드를 수정했습니다.

화면을 열었을 때 TEST 버튼을 누르면 Uncaught Error: Mismatched anonymous define() module: function (){return dt} 오류가 납니다. 위에 다른 분이 질문하셨던 것 처럼 Kakao를 requirejs에서 호출 후에 다른 모듈을 부르면 이 오류가 나는 겁니다. 그리고 또 윗분 말씀처럼 TEST를 다시 눌러 실행하면 정상적으로 결과가 나옵니다. 결과적으로 Kakao를 호출하고 처음 호출되는 requirejs는 오류가 납니다.

두번째 링크는 카톡 공유하기 링크인데 이것도 처음 누르면 오류가 납니다. 이미 로드된 Kakao를 부름에도 불구하고 동일한 오류가 납니다. 당연히 다시 누르면 됩니다.

마지막 링크는 윗분이 해결하셨다는 방법처럼 Kakao 로딩 후 임의로 다른 모듈을 로드 후 Kakao를 부르면 정상적으로 처리되는 것을 확인해주는 테스트 링크입니다.

저희도 이 문제로 인해 페이지 전체가 엉망이되는 문제를 겪었습니다. 윗분 말씀처럼 임의로 다른 모듈을 부르도록 하여 사용중에 있으나 조속히 수정되기를 바랍니다.

그리고 한가지더. “탐색이 차단됨 오류 테스트” 링크를 누르면 새로운 오류가 발생하는 것을 테스트 할 수 있도록 작성한 페이지를 보실 수 있습니다.

이 페이지는 필히 모바일 기기에서 테스트 바랍니다. 모바일 크롬에서 이 페이지를 열고 “KAKAO link” 버튼을 누르면 “탐색이 차단됨: intent:kakaolink://send?appkey=TGIF&appver=1.0&apiver=3.0&linkver=3.5&extras=%7B%2…b.io%22%7D&objs=%5B%5D&forwardable=false#Intent;package=com.kakao.talk;end;” 라는 오류가 발생합니다. 아마도 팝업 차단처럼 event(onclick event) 스코프 내에서 커스텀 스키마 호출이 처리되지 않으면 차단하는 것으로 보입니다. 그런데 requirejs의 특성상 스코프를 벗어나게 되므로 문제 해결이 되지 않을 수 있을 것으로 보이나 확인 부탁드립니다. 저희는 그래서 일단 Kakao.init을 페이지 시작시 미리 해두고 사용하고는 있으나 이렇게되면 requirejs를 사용하는 의미가 없어집니다.

1개의 좋아요

자세한 설명과 확인 감사합니다. 덕분에 SDK에서 이슈가 될만한 사항을 찾아냈고 다음 버전에서 패치할 수 있도록 하겠습니다.

탐색이 차단됨 오류 테스트의 경우 몇몇 모바일(아이폰, 안드로이드) 기기에서 테스트를 해보았는데요 현상이 재현이 안되네요.
비동기로 SDK를 로딩을 하니 click event scope과는 다른 scope 이 되어서 의심이 갈 것 같기도 한데요.
Chrome 의 패치 내용을 보면 탐색 차단됨 오류가 안 날 것 같아서요. 해당 이슈는 조금 더 살펴보도록 하겠습니다.

관심가지고 도움주셔서 감사합니다

오류 재현이 안된다고 하셔서 제 기기 정보를 남겨 봅니다. 제 기기에서만 발생하는 문제는 아니고 다른 기기에서도 발생 합니다만 말씀하신 것처럼 오류가 나지 않는 기기도 있습니다.

삼성 갤럭시 노트3
Android 5.0.0; SM-N000L Build/LRX21V
Chrome 46.0.2490.76