You named Navigation Timing and found the User Timing with performance.mark()
but missed the Resource Timing API. All three is parts of the Performance Timing API.
Navigation Timing measures the homepage or app. Resource Timing API is similar but it’s provided for each individual asynchroniously loaded resource to get them compaired in relation to the navigation times.
Think about this: Asynchroniously loaded files has no DOM to run! That means dom-properties is missing in resource timing. But the beginning part is same as in navigation timing:

How about startTime that is the most important property of Performance Timing API? Each asychronious call has their own! The startTime is 0
for document and >0
ms for Javascript files and resources.
The startTime is the first recorded timestamp - an origin of measures. It marks the time when the browser first starts the process of loading the resource. In resource timing startTime is same as fetchStart or redirectStart (if not zero) when timing a resource.
Resources as CSS or images has neither dom or execution, but resources with .js
extension executes Javascript, so there is a user timing possible with performance.mark()
as you already found out.
- Can the NavigationTimingAPI be used on asynchronous calls?
Yes and No. Resource Timing get marks automatically that can be relative to Navigation Timing that make very useful comparisions. So yes - but no: Measuring index.html (navigation) and measuring asynchronious calls (resources) is not the same:
Change performance.getEntriesByType("navigation")
to performance.getEntriesByType("resource")
.