탭을 많이 남겨 두는 사람에게 시작할 때마다 전부 로드하지 말라고 요구하는 대신, 목록은 보존하고 필요한 문서부터 불러올 수 있다고 봤다. 북극성의 탭 지연 복원은 탭을 지우는 정리 기능이 아니다. 무엇을 계속 기억하고 무엇의 실행을 미룰지 나눈 설계다.
탭 한 개의 정체성과 renderer는 다르다
저장된 탭에는 ID·주소·제목·프로필·프로젝트·고정과 그룹, 음소거·배율 같은 정보가 있다. 문서를 아직 읽지 않았어도 이 목록은 복원할 수 있다. 현재 소스는 저장 탭을 deferred로 만들고 원래 ID를 전달한다. 화면의 새 탭 순서가 임의 ID로 다시 만들어지는 방식이 아니다.
가벼운 WebContentsView와 기록을 둔다는 말이 메모리를 전혀 쓰지 않는다는 뜻은 아니다. 모든 문서의 renderer를 동시에 실행하지 않도록 한 것이다. 실행 여부와 기억 여부를 분리하면 기존 탭이 사라졌다는 오해 없이 시작 부담을 줄일 수 있다. 실제 줄어든 양은 별도 프로세스 측정으로 확인해야 한다.
마지막 선택을 찾은 뒤 필요한 탭부터 로드한다
복원 단계는 프로필에 속한 정상 저장 탭을 만들고 이전 제목·계정 묶음·고정·수동 배율을 옮긴다. 이전 task lease는 재시작 뒤 살아 있는 작업으로 취급하지 않고 사람이 소유한 페이지로 복원한다. 새 작업은 필요할 때 명시적으로 탭을 채택해야 한다.
그다음 현재 프로필·프로젝트에서 기억한 activeTabId를 찾고 없으면 해당 범위의 첫 탭을 고른다. select는 wake를 부른다. 그래서 저장된 스무 개가 목록에 있더라도 처음 로드하는 문서는 선택한 것부터 시작한다. 재시작 전의 실행 권한까지 탭 ID와 함께 무조건 복원하지 않는 부분도 같은 설계의 중요한 경계였다.
깨울 때도 같은 세션과 문서 수명을 따른다
wake는 원래 프로필 세션이 준비된 뒤 URL이나 보관한 이동 이력을 복원한다. 명시적으로 첨부한 배경 탭도 실제 표시 영역 크기를 받아야 읽을 수 있다. 크기가 0인 채 문서를 읽어서 내용이 없는 것처럼 판단하지 않도록 한 연결이다. 현재 탭을 바꿔야만 읽는 구조와는 다르다.
휴면 뒤에는 문서를 다시 불러오므로 일시적인 스크립트 상태와 스크롤까지 완전 복원한다고 보장하지 않는다. 보관한 이동 이력도 URL·제목의 제한된 범위이며 POST 본문을 재생하지 않는다. 로그인 저장소를 복제하거나 캐시를 삭제해서 가볍게 만든 기능도 아니다. 남기는 자료와 다시 읽는 자료를 구분했다.
시험은 탭 수보다 같은 ID와 선택을 본다
기존 시작 시험은 같은 스무 개 탭과 특정 activeTabId, 작성창 메모를 준비한다. 지연 로딩에서는 열아홉 개 dormant와 renderer PID 0을 확인하고, 실제 다른 탭을 눌러 같은 ID·수동 배율로 문서가 로드되는지 본다. 다시 시작해 마지막 선택과 탭 목록이 남는지도 검사하도록 작성돼 있다.
과거 0.1.61·0.1.62 결과에는 그 차이가 기록돼 있다. 이번에는 원자료의 버전·renderer 수와 측정 표본을 다시 읽고 계산했으며 새 앱을 띄운 시험은 아니다. 탭 목록만 맞아도 마지막 선택이 초기화되면 사용자는 일을 다시 찾아야 한다. 저장 탭 개수가 같다는 한 가지 숫자 대신 어떤 정체성과 사용자 상태가 이어졌는지를 근거로 읽었다.
공유 예제는 복원기가 아니라 정책을 읽는 도구다
함께 공개한 합성 모듈은 어떤 탭을 휴면 후보로 삼을지와 읽기 캐시를 얼마 동안 보관할지 시험한다. 실제 renderer를 만들거나 탭을 깨우지 않는다. 탭 목록 복원과 같은 프로필 세션의 연결은 원래 호스트 코드의 책임이다. 작은 예제의 candidate를 실제 탭 닫기 완료로 표시하지 않았다.
다른 업무 도구에 적용할 때도 문서 목록과 실행 중 자원을 나눠 볼 수 있다. 다만 입력 중 자료를 지키는 보호 조건과 다시 열었을 때 잃는 상태를 먼저 명시해야 한다. 나는 탭을 적게 쓰게 만드는 대신 작업의 흔적을 보존하면서 실행을 미루는 선택을 이 제작 기록에 남겼다.