forked from cybrespace/pinafore
		
	add perf marks
This commit is contained in:
		
							parent
							
								
									2c31746ae7
								
							
						
					
					
						commit
						95290afca7
					
				
					 9 changed files with 44 additions and 28 deletions
				
			
		
							
								
								
									
										5
									
								
								package-lock.json
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										5
									
								
								package-lock.json
									
										
									
										generated
									
									
									
								
							| 
						 | 
				
			
			@ -3970,6 +3970,11 @@
 | 
			
		|||
        "object-visit": "1.0.1"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "marky": {
 | 
			
		||||
      "version": "1.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.0.tgz",
 | 
			
		||||
      "integrity": "sha1-lhftZHu76o9F0ZUm2jPexwYG30I="
 | 
			
		||||
    },
 | 
			
		||||
    "math-expression-evaluator": {
 | 
			
		||||
      "version": "1.2.17",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,6 +27,7 @@
 | 
			
		|||
    "intersection-observer": "^0.5.0",
 | 
			
		||||
    "intl-relativeformat": "^2.1.0",
 | 
			
		||||
    "lodash": "^4.17.4",
 | 
			
		||||
    "marky": "^1.2.0",
 | 
			
		||||
    "node-fetch": "^1.7.3",
 | 
			
		||||
    "node-sass": "^4.7.2",
 | 
			
		||||
    "npm-run-all": "^4.1.2",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,12 +12,14 @@
 | 
			
		|||
 | 
			
		||||
  import debounce from 'lodash/debounce'
 | 
			
		||||
  import throttle from 'lodash/throttle'
 | 
			
		||||
  import { mark, stop } from '../_utils/marks'
 | 
			
		||||
 | 
			
		||||
  const SCROLL_EVENT_DELAY = 300
 | 
			
		||||
  const RESIZE_EVENT_DELAY = 700
 | 
			
		||||
 | 
			
		||||
	export default {
 | 
			
		||||
	  oncreate() {
 | 
			
		||||
      mark('onCreate Layout')
 | 
			
		||||
      this.observe('innerHeight', debounce(() => {
 | 
			
		||||
        // respond to window resize events
 | 
			
		||||
        this.store.set({
 | 
			
		||||
| 
						 | 
				
			
			@ -29,6 +31,7 @@
 | 
			
		|||
        scrollHeight: this.refs.node.scrollHeight,
 | 
			
		||||
        offsetHeight: this.refs.node.offsetHeight
 | 
			
		||||
      })
 | 
			
		||||
      stop('onCreate Layout')
 | 
			
		||||
    },
 | 
			
		||||
		components: {
 | 
			
		||||
			Nav
 | 
			
		||||
| 
						 | 
				
			
			@ -36,7 +39,11 @@
 | 
			
		|||
    store: () => virtualListStore,
 | 
			
		||||
    events: {
 | 
			
		||||
      scroll(node, callback) {
 | 
			
		||||
        const onScroll = throttle(callback, SCROLL_EVENT_DELAY, {
 | 
			
		||||
        const onScroll = throttle(event => {
 | 
			
		||||
          mark('onScroll')
 | 
			
		||||
          callback(event)
 | 
			
		||||
          stop('onScroll')
 | 
			
		||||
        }, SCROLL_EVENT_DELAY, {
 | 
			
		||||
          leading: true,
 | 
			
		||||
          trailing: true
 | 
			
		||||
        })
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -182,6 +182,7 @@
 | 
			
		|||
</style>
 | 
			
		||||
<script>
 | 
			
		||||
  import Avatar from './Avatar.html'
 | 
			
		||||
  import { mark, stop } from '../_utils/marks'
 | 
			
		||||
  import IntlRelativeFormat from 'intl-relativeformat'
 | 
			
		||||
  const relativeFormat = new IntlRelativeFormat('en-US');
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -192,15 +193,12 @@
 | 
			
		|||
    computed: {
 | 
			
		||||
      createdAtDate: (status) => status.created_at,
 | 
			
		||||
      relativeDate: (createdAtDate) => {
 | 
			
		||||
        return relativeFormat.format(new Date(createdAtDate))
 | 
			
		||||
        mark('compute relativeDate')
 | 
			
		||||
        let res = relativeFormat.format(new Date(createdAtDate))
 | 
			
		||||
        stop('compute relativeDate')
 | 
			
		||||
        return res
 | 
			
		||||
      },
 | 
			
		||||
      original: (status) => status.reblog ? status.reblog.account : status.account
 | 
			
		||||
    },
 | 
			
		||||
    methods: {
 | 
			
		||||
      alert: function (e) {
 | 
			
		||||
        e.preventDefault()
 | 
			
		||||
        window.alert(e.target)
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
</script>
 | 
			
		||||
| 
						 | 
				
			
			@ -15,6 +15,7 @@
 | 
			
		|||
  import StatusListItem from './StatusListItem.html'
 | 
			
		||||
  import VirtualList from './VirtualList.html'
 | 
			
		||||
  import { splice, push } from 'svelte-extras'
 | 
			
		||||
  import { mark, stop } from '../_utils/marks'
 | 
			
		||||
 | 
			
		||||
  let i = -1
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -37,31 +38,13 @@
 | 
			
		|||
      splice: splice,
 | 
			
		||||
      push: push,
 | 
			
		||||
      addMoreItems() {
 | 
			
		||||
        console.log('addMoreItems')
 | 
			
		||||
        mark('addMoreItems')
 | 
			
		||||
        let statuses = this.get('statuses')
 | 
			
		||||
        if (statuses) {
 | 
			
		||||
          let itemsToAdd = createData()
 | 
			
		||||
          if (itemsToAdd.length) {
 | 
			
		||||
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          let importantFirstItem = itemsToAdd
 | 
			
		||||
          this.splice('statuses', statuses.length, 0, ...itemsToAdd)
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      addTheseItems(items) {
 | 
			
		||||
        if (!items.length) {
 | 
			
		||||
          return
 | 
			
		||||
        }
 | 
			
		||||
        this.push(items.pop())
 | 
			
		||||
        while (items.length) {
 | 
			
		||||
          this.addItemLazily(items.pop())
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      addItemLazily(item) {
 | 
			
		||||
        requestIdleCallback(() => {
 | 
			
		||||
          this.push(item)
 | 
			
		||||
        })
 | 
			
		||||
        stop('addMoreItems')
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,15 +16,18 @@
 | 
			
		|||
<script>
 | 
			
		||||
  import VirtualListItem from './VirtualListItem'
 | 
			
		||||
  import { virtualListStore } from '../_utils/virtualListStore'
 | 
			
		||||
  import { mark, stop } from '../_utils/marks'
 | 
			
		||||
 | 
			
		||||
  const DISTANCE_FROM_BOTTOM_TO_FIRE = 400
 | 
			
		||||
 | 
			
		||||
  export default {
 | 
			
		||||
    oncreate () {
 | 
			
		||||
      this.observe('items', (items) => {
 | 
			
		||||
        mark('set items')
 | 
			
		||||
        this.store.set({
 | 
			
		||||
          items: items
 | 
			
		||||
        })
 | 
			
		||||
        stop('set items')
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      let observedOnce = false
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,6 +20,7 @@
 | 
			
		|||
</style>
 | 
			
		||||
<script>
 | 
			
		||||
  import { virtualListStore } from '../_utils/virtualListStore'
 | 
			
		||||
  import { mark, stop } from '../_utils/marks'
 | 
			
		||||
 | 
			
		||||
  let updateItemHeights = {}
 | 
			
		||||
  let promise = Promise.resolve()
 | 
			
		||||
| 
						 | 
				
			
			@ -44,6 +45,7 @@
 | 
			
		|||
          if (!updatedKeys.length) {
 | 
			
		||||
            return
 | 
			
		||||
          }
 | 
			
		||||
          mark('batch update VirtualListItem')
 | 
			
		||||
          // batch all updates to itemHeights for better perf
 | 
			
		||||
          let itemHeights = this.store.get('itemHeights')
 | 
			
		||||
          for (key of updatedKeys) {
 | 
			
		||||
| 
						 | 
				
			
			@ -53,6 +55,7 @@
 | 
			
		|||
            itemHeights: itemHeights
 | 
			
		||||
          })
 | 
			
		||||
          updateItemHeights = {}
 | 
			
		||||
          stop('batch update VirtualListItem')
 | 
			
		||||
        })
 | 
			
		||||
      }
 | 
			
		||||
      intersectionObserver.observe(this.refs.node)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										13
									
								
								routes/_utils/marks.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								routes/_utils/marks.js
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,13 @@
 | 
			
		|||
import { mark as markyMark, stop as markyStop } from 'marky'
 | 
			
		||||
import noop from 'lodash/noop'
 | 
			
		||||
 | 
			
		||||
const enableMarks = typeof window !== 'undefined' &&
 | 
			
		||||
  new URLSearchParams(location.search).get('marks') === 'true'
 | 
			
		||||
 | 
			
		||||
const mark = enableMarks ? markyMark : noop
 | 
			
		||||
const stop = enableMarks ? markyStop : noop
 | 
			
		||||
 | 
			
		||||
export {
 | 
			
		||||
  mark,
 | 
			
		||||
  stop
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,4 +1,5 @@
 | 
			
		|||
import { Store } from 'svelte/store.js'
 | 
			
		||||
import { mark, stop } from '../_utils/marks'
 | 
			
		||||
 | 
			
		||||
class VirtualListStore extends Store {
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -11,6 +12,7 @@ const virtualListStore = new VirtualListStore({
 | 
			
		|||
virtualListStore.compute('visibleItems',
 | 
			
		||||
    ['items', 'scrollTop', 'itemHeights', 'offsetHeight'],
 | 
			
		||||
    (items, scrollTop, itemHeights, offsetHeight) => {
 | 
			
		||||
  mark('compute visibleItems')
 | 
			
		||||
  let renderBuffer = 3 * offsetHeight
 | 
			
		||||
  let visibleItems = []
 | 
			
		||||
  let totalOffset = 0
 | 
			
		||||
| 
						 | 
				
			
			@ -38,6 +40,7 @@ virtualListStore.compute('visibleItems',
 | 
			
		|||
      index: i
 | 
			
		||||
    })
 | 
			
		||||
  }
 | 
			
		||||
  stop('compute visibleItems')
 | 
			
		||||
  return visibleItems
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue