From 4933c46e0f7188371d4707ff2b8202622028781d Mon Sep 17 00:00:00 2001 From: Nolan Lawson Date: Mon, 4 Jul 2022 11:06:58 -0700 Subject: [PATCH] fix: use native performance object in Node 18 (#38) Fixes #17 --- .github/workflows/test_node.yml | 2 +- src/index.js | 12 +++++++++++- src/now.js | 10 +++++----- src/performance.js | 5 +---- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/.github/workflows/test_node.yml b/.github/workflows/test_node.yml index ea6eab1..2b75934 100644 --- a/.github/workflows/test_node.yml +++ b/.github/workflows/test_node.yml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node: [ '12', '14', '16' ] + node: [ '12', '14', '16', '18' ] steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 diff --git a/src/index.js b/src/index.js index 8375d1b..1c90803 100644 --- a/src/index.js +++ b/src/index.js @@ -31,9 +31,19 @@ let clear if ( perf && perf.mark && + perf.measure && perf.getEntriesByName && perf.getEntriesByType && - perf.clearMeasures + perf.clearMarks && + perf.clearMeasures && + // In Node, we want to detect that this perf/correctness fix [1] is available, which + // landed in Node 16.15.0, 17.6.0, and 18.0.0. However, it's not observable, and + // we don't want to rely on fragile version checks. + // So we can rely on this observable change [2] to add clearResourceTimings, which + // landed a bit later (18.2.0), but is close enough for our purposes. + // [1]: https://github.com/nodejs/node/pull/42032 + // [2]: https://github.com/nodejs/node/pull/42725 + (process.browser || perf.clearResourceTimings) ) { mark = name => { throwIfEmpty(name) diff --git a/src/now.js b/src/now.js index 913780f..7927478 100644 --- a/src/now.js +++ b/src/now.js @@ -1,6 +1,6 @@ import perf from './performance' -let nowForNode +let nowPolyfillForNode if (!process.browser) { // implementation borrowed from: @@ -11,9 +11,9 @@ if (!process.browser) { return hr[0] * 1e9 + hr[1] } const loadTime = getNanoSeconds() - nowForNode = () => ((getNanoSeconds() - loadTime) / 1e6) + nowPolyfillForNode = () => ((getNanoSeconds() - loadTime) / 1e6) } -export default process.browser - ? perf && perf.now ? () => perf.now() : () => Date.now() - : nowForNode +export default perf && perf.now + ? () => perf.now() + : process.browser ? () => Date.now() : nowPolyfillForNode diff --git a/src/performance.js b/src/performance.js index c934219..d1dc070 100644 --- a/src/performance.js +++ b/src/performance.js @@ -1,5 +1,2 @@ /* global performance */ - -// TODO: Node's built-in performance API has poor performance for getEntriesByName() -// so currently we avoid it: https://github.com/nolanlawson/marky/issues/29 -export default process.browser && typeof performance !== 'undefined' && performance +export default typeof performance !== 'undefined' && performance