안감 성능의 HTML 스타일:처리 방법

4175 단어 webdevjavascript
최초의 간단한 a 프로젝트의 일부로서, 나는 전자메일에 붙일 때 내장된 스타일을 보존하려면 그것들을 보존해야 하며, 만족스러운 결과가 없다는 것을 발견했다.그래서 저는 원래 자바스크립트 솔루션을 선택했습니다.
그러나 이런 안감 스타일은 결코 유행하지 않는다는 사실이 증명되었다.나는 크롬의 원생 방법을 제외하고 한 줄Select and Copy에서 다른 방법이 더 빠른지 확실하지 않다.
이것은 작은 수수께끼이다. 브라우저가 렌더링하는 것과 같은 성능을 얻을 수 있어야 하기 때문이다. (브라우저는 모든 요소의 CSS를 설명하고, 그 위치를 어떻게 그리는지 찾아내고, 그 중의 하위 집합을 간단하게 계산하고, 그 안에 연결하는 노력이 매우 빨라야 하기 때문이다.)그러나 우리는 본 브라우저의 성능을 얻지 못한 것 같다. (사람들은 본 브라우저의 C나 C++ 브라우저가 설명된 자바스크립트 구현보다 우세하다고 생각할 수도 있다.)

그것을 분석해도 주요한 문제를 발견하지 못했다. 여기는 밀리초, 저기는 밀리초, 성능도 괜찮다.내가 복제하고 싶은 상당히 일반적인 요소 (표 한 장) 에는 약 3500개의 요소가 있는데, 복사 단추를 누르고 복사본을 클립보드에 넣은 후, 이 요소들의 양식이 약 1초의 지연 시간 안에 한 줄로 배열되는 것은 참을 수 없는 것이 아니라, 인상적이지 않으면 받아들일 수 있다.
하지만 우리가 대량으로 복제하고 싶다면?내가 복제할 수 있는 가장 큰 데이터 집합 중 하나에 나는 약 10만 개의 원소를 가지고 있는데, 이 원소들은 약 30초 안에 양식을 배열했다.적어도 이것은 좀 서투르다고 말할 수 있다.이것은 '복사' 단추를 누르고 어디에 붙여넣으면 아직 사용할 수 없을 수도 있지만, 클립보드가 아닌 줄에 있을 수도 있다는 것을 의미한다.

어떤 더 좋은 이유가 자바스크립트 기교를 연구하여 이 과정을 간소화하고 우리의 기술을 연마하여 체험을 더욱 원활하게 할 수 있습니까?
이렇게 큰 복제본(30초의 준비 시간 필요)에 대한 주요 전략 개선UX은 다음과 같습니다.

작업 분리


내 첫 번째 생각은 내장 스타일과 클립보드로 복사하는 작업을 분리하는 것이다.페이지를 불러올 때 스타일을 맞추면 '복사' 단추를 누르면 바로 클립보드에 복사본을 넣을 수 있습니다.

에이, 만약 우리가 페이지의javascript에서 이렇게 한다면 우리는 몇 가지 작은 문제에 부딪힐 것이다.
  • Javascript는 악명 높은 단일 라인으로 사용자 인터페이스를 30초 동안 동결하여 이 스타일들을 연결시킨다.네가 나보다 너의 복제에 더 욕심이 있어도...(더 큰 HTML 요소 복사)
  • 논의한 요소 자체가 자바스크립트에서 생성된 것이거나 (나처럼) 자바스크립트AJAX를 통해 얻어진 것이라면 리드의 양식은 심지어 진실하고 완전하지 않다. lining이 실행될 때 요소가 완전히 나타나지 않았기 때문이다.
  • 따라서 이상적인 상황에서 우리는 페이지를 완전히 보여주고 완성한 후에 내장하기를 희망한다. 즉, 이를 이후에 배치하는 것이다.

    임무 배정


    가장 일반적인 방법은 DOM이 완전히 불러온 후에 실행될 뿐만 아니라, 모든 동적 자바스크립트가 보여준 요소가 해결된 후에 실행될 수 있도록 페이지 ready state 가 '완성' 될 때 삽입할 수 있도록 하는 것이다.Document: readystatechange event에 연결된 사용자 정의 프로세서를 사용하여 준비 상태의 변경 사항을 관찰하면 쉽게 할 수 있다.

    하지만...렌더링이 끝날 때 UI를 30초 동안 잠글 수도 있습니다. 이 기능은 대화식 페이지에서 상당히 큰 문제이며 이 과정에서 응답하지 않고 잠겨 있는 것처럼 보입니다.따라서 이러한 스타일을 정렬할 때 UI를 해제하는 것이 좋습니다.

    사용자 인터페이스 준수


    스크립트가 실행될 때 UI 상호 작용을 처리하려면 Javascript를 해제하는 것이 좋습니다.이것이 바로 스크립트가 따라야 할 UI입니다...

    실제로 널리 사용되고 참조되는 작은 자바스크립트 코드 세그먼트가 있습니다.
    function defer() {return new Promise(r => setTimeout(r, 0));}
    
    await defer();
    
    그러나 나는 이것이 어떻게 된 일인지, 왜 이러는지 명확한 해석을 찾지 못했다. 나는 다음 글에서 이 점을 탐구할 것이다.

    좋은 웹페이지 즐겨찾기