CSSStyleSheet에서 CSSRules 속성을 읽지 못했습니다 오류를 수정하는 방법

Originally posted on my Medium blog »
사진은Graham RuttanUnsplash촬영했습니다.
최근 일부 고객들이 Angular 웹 응용 프로그램에서 문제를 만났는데 그 중 이상이 발생했다.이 문제로 인해 프로그램의 대부분을 사용할 수 없습니다.개발자로서 나는 시간 낭비를 피하기 위해 어떻게 문제를 재현하는지에 대해 명확한 설명을 하고 싶다.좋은 고객 지원이나 고객이 더 많은 세부 사항을 공유하기를 원할 뿐만 아니라'나에게 맞지 않는다'는 의미있는 정보를 제공하여 개발자의 생활을 더욱 가볍게 할 수 있다.고객 지원 부서는 그들의 설비에서 이 문제를 재현할 수 없지만, 여전히 소수의 고객이 이런 상황을 겪고 있다.
이 문제를 언급했을 때, 나는 내가 이런 문제에 부딪혔을 때 통상적으로 하는 일을 했다.본고는 이 특정한 문제와 디버깅의 관건적인 문제를 토론할 것이다.

근본 원인을 찾다

  • 저는 Instana를 사용했습니다. 이것은 마이크로서비스와 사이트를 감시하는 데 사용되는 우수한 SaaS입니다.우리의 모니터링 도구를 통해 나는 일부 고객과 문제를 초래한 사용자의 조작에 오류가 발생했음을 확인할 수 있다.설령 이런 정보가 있다 하더라도 나는 처음부터 이 문제를 재현할 수 없었다.
  • 우리의 감시 도구 때문에 나는 잘못된 창고 추적을 받았다.이것을 통해 나는 이상을 일으키는 코드를 찾았다.아래에서 보듯이 이 코드는 DOM의 모든 스타일시트를 조회하고 각 스타일시트의 CSS 규칙을 처리하고 있습니다.


  • Uncaught DOMException: Failed to read the 'cssRules' property from 'CSSStyleSheet': Cannot access rules
    

    • 우리의 모니터링 도구도 브라우저 데이터를 제공하기 때문에 나는 어떤 브라우저가 가장 큰 영향을 받았는지 검사했다.사실은 구글 크롬과 같은 크롬 브라우저의 최신 버전을 기반으로 하고 있다는 것을 증명한다.나의 많은 동료들은 구글 브라우저를 개발의 주요 브라우저로 사용하지만, 이상하게도 아직 다른 개발자가 우연히 이 점을 발견하지 못했다

    • 이 기능을 테스트하지 않았습니다.나는 Jest로 단원 테스트를 해서 이 문제를 복제하려고 했지만, 테스트는 성공적으로 완성되었다

    • 저는 인터넷에서 이 특정한 오류 메시지를 검색하여 크롬의 최근 변화에 관한 유용한 게시물을 찾았습니다.최신 버전의 Chrome에서도 Iframe 규칙과 같은 스타일시트에 CORS 보안 규칙이 적용됩니다.다른 도메인에서 로드된 컨텐트 스타일시트는 JavaScript를 통해 로드하고 표시할 수 없습니다.비록 이 정보들은 매우 유용하지만, 나는 왜 이것이 문제가 되는지 여전히 이해하지 못한다


    오류 수정 방법


    위에서 언급한 모든 지식을 가지고 내 머릿속에 이론이 형성되었다. 만약에 어떤 스타일시트가 DOM에 불러온다면 이런 스타일시트는 우리의 것이 아니겠는가?이것은 내가 생각할 수 있는 유일한 이 문제를 초래할 수 있는 일이다. 그래서 나는'우리가 제공하지 않은 스타일시트를 어떻게 DOM에 불러올 것인가?'라고 생각하기 시작했다.


    정답은: 브라우저 확장.웹 확장은 웹 사이트에서 광고를 삭제하거나 브라우저에 없는 기능을 제공할 수 있다는 것을 알 수 있다.브라우저 확장은 일반적으로 HTML, CSS, JavaScript 등 웹 기술을 기반으로 합니다.이것은 웹 확장이 다른 영역에서 스타일시트를 불러올 수 있음을 의미합니다. 이러한 확장을 사용하지 않는 한


    CDN과 같은 다른 도메인을 가리키는 CSS 파일의 스타일(예: Chrome 개발 도구)을 주입하여 쉽게 복사할 수 있습니다.CSS 스타일시트가 HTML과 같은 도메인에서 온 경우 문서에 액세스할 수 있습니다.styleSheets .가져오기 (인덱스)cssRules 재산.그렇지 않으면 다음 오류가 발생합니다.



    Uncaught DOMException: Failed to read the 'cssRules' property from 'CSSStyleSheet': Cannot access rules
    

    우리가 근본 원인을 이해하고 찾았으니 이 문제를 해결하는 것은 매우 쉽다. 같은 역이나 href가null인 곳에서만 불러오는 스타일시트(스타일시트가 내부적으로 연결되어 있다면, 예를 들어Angular를 사용할 때 이런 상황이 발생할 수 있다):





    복구 프로그램이 발표된 후, 우리는 영향을 받은 고객에게 연락을 했는데, 그들은 문제가 다시는 발생하지 않도록 확인할 수 있다.그 밖에 우리의 감시 도구도 이 문제의 어떤 다른 사건도 보고하지 않았기 때문에 우리는 우리가 안전하다는 것을 안다


    Conclusion


    이 단문을 읽어 주셔서 감사합니다.보시다시피 문제의 복구는 몇 분 안에 이루어질 수 있지만, 문제의 근본 원인을 이해하는 데는 일반적으로 우리가 예상한 것보다 더 긴 시간이 필요합니다


    이게 도움이 돼요?댓글로 알려주세요

    좋은 웹페이지 즐겨찾기