Оптимизация FCP/LCP за счет кэширования поиска модулей raw-view

патч lookupView

Теперь реализован через Map вместо Array.

Время, затрачиваемое на запуск приложения в lookupView (для экземпляра разработки):

  • без патча: 124 мс
    Firefox Profiler (стек вызовов отфильтрован по lookupView)

  • с патчем: 9 мс
    Firefox Profiler (стек вызовов отфильтрован по lookupView)

Экономия времени: ~115 мс

Это сокращает время, затрачиваемое внутри appendOutletView, с 1,083 мс до 946 мс (для экземпляра разработки).


патч для необработанных хелперов Handlebars

Да, это фактически копирование с одним изменением: используется недорогая проверка isPath.

      // заменяет @ember/-internals/utils isPath
      // @see: https://github.com/emberjs/ember.js/blob/3537670c14883346e11e841fcb71333384fcbc87/packages/%40ember/-internals/metal/lib/path_cache.ts#L5-L7
      // @see: https://github.com/emberjs/ember.js/blob/255a0dd3c7de1187f4a2f61a97cf78bfff8f66a8/packages/%40ember/-internals/glimmer/lib/utils/bindings.ts#L70
      let isPath = context.indexOf('.') > -1;

Например, renderTopicListItem в конечном итоге вызывает множество вызовов _getPath (ещё 50–100 мс экономии):
Firefox Profiler (стек вызовов отфильтрован по _getPath внутри renderTopicListItem)

Возможно, дорогие вызовы _getPath — это то, что нужно оптимизировать в Ember.js, а не в Discourse.


Также обратите внимание на Firefox Profiler, чтобы получить представление о выполнении JavaScript: