Virtualisation automatique du rendu de disposition personnalisée

Bonjour, je m'appelle Dmitry Karlovsky et je ... suis venu vers vous d'un proche avenir. Pas loin, car tout est déjà là et tout le monde ralentit. Le scribe s'approcha de nous imperceptiblement: d'abord, la puissance des ordinateurs a cessé de croître, puis la bande passante des réseaux. Et les utilisateurs ... ils ont continué à générer du contenu comme si ce n'était pas en eux-mêmes. En conséquence, en quelques années, l'UX des interfaces s'est tellement dégradée qu'il est devenu impossible de les utiliser, et de nombreux utilisateurs se sont précipités pour passer au cloud streaming de leurs navigateurs, qui fonctionnent sur des supercalculateurs appartenant à des entreprises qui empêchent les gens d'installer des bloqueurs de publicité sur eux. Par conséquent, je suis venu vers vous maintenant, en ce moment, alors que le problème est déjà perceptible, mais vous pouvez toujours tout régler avant qu'il ne soit trop tard.





- HolyJS'20 Moscow. , , … , , , ..





:

. , . , virtal scroll. . , .





:

, , 200 . , , UX .









, , - , - . .





: $mol

, , , . .. . .





mol.hyoo.ru





, , , , . , . , , , React .





:





  • .





  • .





  • .





  • .





  • .





- . , , , . . . .





:

:





timeline . 50 DOM, 5 , .





. . , , . .





:

"" , .





( ) 3 . . ..





:

, . , . , , . , , . 4 - .





  • - .





  • - .





  • .





:

, , , , , .





  • .





  • .





  • .





  • .





:

, , SSR.





SSR 10





.





https://nin-jin.github.io/habrcomment/#article=423889





: GitLab

- GitLab.









. 5 100 . - . , . 10 , . , , .





HTML

, .





HTML . . , HTML , , . . DOM, .





, . , 3 .





GitLab-

. ? ! , . , , , .





. , 3 . 10 . , , - !





, , , , .





" $mol , ?" , . , .





- DOM . - -, $mol.





$mol: 4





, 8 DOM 3.





<div class="amount">
    <h3 class="heading ...">
        <span>
            <span class="amount__major">1 233</span>
            <div class="amount__minor-container">
                <span class="amount__separator">,</span>
                <span class="amount__minor">43</span>
            </div>
            <span class="amount__currency"> ₽</span>
        </span>
    </h3>
</div>

      
      



<h3 class="amount">
    <span class="amount__major">1233</span>
    <span class="amount__minor">,43 ₽</span>
</h3>

      
      



. 5 .





, DOM 2. …





, . 30 . , 10 . 3 30 . .













, , - .





- , . ..





















:

, - .





- . …





- - . - : , . , - .





, . , , , . , - - . .





, .





, - , . .





, , , , .





































  • , ✅





, . ..





:





:

, , .





https://nin-jin.github.io/my_gitlab/#collapse=true





. , . , , . , . , , . , , : , .













  • , ❌

















:

? , , , , .





.. . , , , 3 . , , DOM , . , , , .





















:

- , , , . , .





https://bvaughn.github.io/react-virtualized/#/components/WindowScroller





DOM , . . - . , , , , .

















:





































, , , . ..





















:

time slicing. Holy JS , 16 , - . , ..





JS





. , . , , 16 , , . . javascript , , . , , , . , , $mol .













  • JS ❌





:

, DOM . . , , Catberry..





catberry.github.io





$mol , , , , , DOM .









  • JS ❌









:

, $mol . , , . , , , , DOM .





https://nin-jin.github.io/my_gitlab/#lazy=true





, , . . - . , DOM, . , DOM . .

















:

- , . . , , , .





https://nin-jin.github.io/my_gitlab/









  • , , ✅





:

: time slicing React, catberry $mol. , x ? .













:

. , .









?





























, , - , . , . ""..





content-visibility: auto;
contain-intrinsic-size: 1000px;
      
      



. , , layout , , . , , - , . - , - DOM. , . .





.





. . , . / DOM. , , , . .





.





, , . . , , . - , , . , , , , .





. , , , , . , . , , . , .





- . . , . , , . - . , , .

















:

. .





, 2424, 24 .





:

, , , . , " " - , , , .





.





:

, . .





:

, , .





:

. . - , , . - . - , .





. , , .





, .





, . . , . , , . .





, , . , . . , .





:

, , - .





- . - .





:

, 4 , .





















, , . JS, .





: onScroll

, DOM. - scroll



..





document.addEventListener( 'scroll', event => {
    // few times per frame
}, { capture: true } )
      
      



onScroll

2 . , - , 60 . , , . , - DOM. , , , .









  • DOM ❌

















: IntersectionObserver

IntersectionObserver



, , . , . body



, .





const observer = new IntersectionObserver(

    event => {
        // calls on change of visibility percentage
        // doesn't call when visibility percentage doesn't changed
    },

    { root: document.body  }

)

observer.observe( watched_element )
      
      



IntersectionObserver

, , , . , , . , , , , 5 10, 10 15.





  • , ❌





: requestAnimationFrame

- requestAnimationFrame. 60 , , - .





, , DOM. - . , .





DOM. DOM, layout.





function tick() {

    requestAnimationFrame( tick )

    for( const element of watched_elements ) {
        element.getBoundingClientRect()
    }

    render()   
}
      
      



requestAnimationFrame

. - - . 5% , . requestAnimationFrame , . - , .













:

  • onScroll ❌





  • IntersectionObserver ❌





  • requestAnimationFrame ✅





, . . - .





https://nin-jin.github.io/my_gitlab/#anchoring=false





. , . - . , . .





:

..





https://codepen.io/chriscoyier/embed/oWgENp?theme-id=dark&default-tab=result





. , . , - . , .





, . , , .





:

, DOM , . . . . . ..





1



, . 2



, . 2.2



, 2.3



, . 2.2.2



, , . .





:

- , . . , overflow-anchor



, , css .





  • overflow-anchor: none







  • top



    , left



    , right



    , bottom







  • margin



    , padding







  • Any width



    or height



    -related properties





  • transform







:

, , - , . , , , . , . , .





:

. , . 3, 4 5, - .





- . , . 1 .





- requestAnimationFrame DOM: . , , .





- , 4 -. .





:

. , , DOM, .





:

, .





, , , .





:

: . , DOM . - DOM - . DOM .





:

, . , , . , . - , .





, , , . , . . , .





, , , - , .





https://nin-jin.github.io/my_gitlab/





:

, , .









overflow-anchor





Chrome









Firefox









Safari









:

, , , DOM , .





const anchoring_support = CSS.supports( 'overflow-anchor:auto' )


if( anchoring_support ) {
    virtual render
} else {
    lazy render
}
      
      



:

CSS , , - . .





https://nin-jin.github.io/habrcomment/#article=423889





DOM , , , . CSS ..





[mol_scroll] {
    contain: content;
}

      
      



, . .





, , , . , , . , . ..





[mol_scroll] > * {
    transform: translateZ(0);
}
      
      



: , , , , .





( )

..





https://nin-jin.github.io/habrcomment/#article=423889





.. . , , . , , , . , .





- , , , ? , DOM, . - Ctrl+F



, . , , , .





*find_path(
    check: ( view : View )=> boolean,
    path = [] as View[],
): Generator&lt; View[] > {

    path = [ ... path, this ]

    if( check( view ) ) return yield path

    for( const item of this.kids ) {
        yield* item.find_path( check, path )
    }

}

      
      



  • .





  • .





  • .





, , . , , , DOM, API .





scroll_to_view( view: View ) {

    const path = this.find_path( v => v === view ).next().value

    this.force_render( new Set( path ) )

    view.dom_node.scrollIntoView()

}
      
      



. , : , , , .





force_render( path : Set< View > ): number {

    const items = this.rows

    const index = items.findIndex( item => path.has( item ) )

    if( index >= 0 ) {
        this.visible_range = [ index, index + 1 ]
        items[ index ].force_render( path )
    }

    return index
}
      
      



, , .





, , .





https://nin-jin.github.io/habrcomment/#article=423889/search=vin





. $mol_dimmer, , .





, . , . . . ? , , . , , , , . .





https://nin-jin.github.io/my_gitlab/





, NVDA .





, ..





  • .





  • .





  • .





  • .





  • .





  • .





, ..





  • .





  • Scroll Anchoring .





  • .





:

, . , . , - - 170 " 170". , DOM VueJS , , .





$mol . , , , , : , . DOM , .





: 4 .





:

- . , dbmon.





https://mol.js.org/perf/dbmon/-/





20 , $mol 60.





:

. VueJS 170 40 JS. , 3 , . $mol, , , 40 JS . , - DOM .









JS









VueJS: 170





40 MB





150 MB





$mol: + 2500





40 MB





90 MB





, $mol , , , , . DOM, , DOM . , .





: !

, , - 25 ..





https://showcase.hyoo.ru/





. material design . . 6 . , 3 . , , , , , , , , .





, - . , . ..





  • : - .





  • : - .





Angular : - . React - - .





, , , ..





  • .





  • .





  • .





, .





. - - . ", ?" .





Column
    Row
        Search
        Icon
    Scroll
        Column
            Task
            Task
            Task
      
      



- - HTML . , html . - , , , , . .





<main class="panel">
    <div class="header">
        <input class="search">
        <img src="..." class="icon">
    </div>
    <div class="scroll">
        <div class="card">
        <div class="card">
        <div class="card">
    </div>
</main>
      
      



, , React, - . , . .





React Native, HTML . html .





Angular, Vue, Svelte , - . , , , .





$mol , .

















React













React Native













Vue













Angular













Svelte













$mol













$mol. , , "" - - . .





- , . , , , .





  • nin-jin/slides/virt - .





  • nin-jin/slides - .





  • habhub.hyoo.ru - .





  • _jin_nin_



    - .





  • nin-jin/my_gitlab - $mol.





  • nin-jin/habrcomment - $mol.





  • mol_news - $mol .





: 34%

  • , .





  • .





  • .





  • , . . : ( - ). ( , ), . , , "", . . , - . , ?





  • $mol , / . , - " " ( ) - - , . , . , - .





  • , , , , .





  • $mol )





: 42%

  • , , , ).





  • .





  • , . "".





: 18%





  • , .





  • , . , , . - GitLab.





: 6%

  • , , . , .





  • La note a été donnée en raison de l'écart entre mes attentes et la réalité =) Attentes: je pourrai appliquer les connaissances acquises à mon projet. Réalité: démonstration de votre framework. Pour les projets sur tout autre cadre, les informations obtenues ne sont pas applicables. Si cela était clair d'après le titre et la description, je ne perdrais pas de temps et je passerais à un autre rapport.












All Articles