Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(feat) Disable most automatic revalidations by default #1157

Merged
merged 3 commits into from
Sep 20, 2024

Conversation

denniskigen
Copy link
Member

@denniskigen denniskigen commented Sep 19, 2024

Requirements

  • This PR has a title that briefly describes the work done including the ticket number. Ensure your PR title includes a conventional commit label (such as feat, fix, or chore, among others). See existing PR titles for inspiration.

For changes to apps

If applicable

  • My work includes tests or is validated by existing tests.
  • I have updated the esm-framework mock to reflect any API changes I have made.

Summary

These changes to the global SWR config disable automatic revalidations by default. The idea is to set up a conservative caching strategy that minimizes automatic data revalidations. In practice, it is very unlikely that the data in a chart will change frequently, so it makes sense to limit the number of revalidations to a bare minimum.

Note that the SWRConfig component merges the configuration from the parent context. This means that alternative configurations provided further down the line will override the parent values.

One potential benefit of this approach is a quieter network tab in developer tools, making it easier to identify when a request is actually being made, and to spot any unnecessary requests. It also reduces the likelihood of pending network requests slowing down the UI during mutations.

Screenshots

Related Issue

https://openmrs.atlassian.net/browse/O3-4012

Other

Copy link
Contributor

github-actions bot commented Sep 19, 2024

Size Change: -84.6 kB (-1.46%)

Total Size: 5.72 MB

Filename Size Change
packages/shell/esm-app-shell/dist/4135ed4f22b33971.js 0 B -63.3 kB (removed) 🏆
packages/shell/esm-app-shell/dist/openmrs.c9785cb423ee5b2b.js 0 B -21.4 kB (removed) 🏆
ℹ️ View Unchanged
Filename Size Change
packages/apps/esm-devtools-app/dist/593.js 149 kB 0 B
packages/apps/esm-devtools-app/dist/642.js 21.1 kB 0 B
packages/apps/esm-devtools-app/dist/657.js 7.02 kB 0 B
packages/apps/esm-devtools-app/dist/735.js 2.63 kB 0 B
packages/apps/esm-devtools-app/dist/762.js 4.1 kB 0 B
packages/apps/esm-devtools-app/dist/788.js 42.9 kB 0 B
packages/apps/esm-devtools-app/dist/875.js 11.6 kB 0 B
packages/apps/esm-devtools-app/dist/889.js 324 kB +13 B (0%)
packages/apps/esm-devtools-app/dist/988.js 326 B 0 B
packages/apps/esm-devtools-app/dist/main.js 3.23 kB 0 B
packages/apps/esm-devtools-app/dist/openmrs-esm-devtools-app.js 3.28 kB 0 B
packages/apps/esm-help-menu-app/dist/167.js 1.07 kB 0 B
packages/apps/esm-help-menu-app/dist/248.js 7.07 kB 0 B
packages/apps/esm-help-menu-app/dist/611.js 2.45 kB 0 B
packages/apps/esm-help-menu-app/dist/642.js 21.1 kB 0 B
packages/apps/esm-help-menu-app/dist/657.js 7.02 kB 0 B
packages/apps/esm-help-menu-app/dist/662.js 147 kB 0 B
packages/apps/esm-help-menu-app/dist/735.js 2.63 kB 0 B
packages/apps/esm-help-menu-app/dist/788.js 42.9 kB 0 B
packages/apps/esm-help-menu-app/dist/889.js 324 kB +11 B (0%)
packages/apps/esm-help-menu-app/dist/958.js 3.74 kB 0 B
packages/apps/esm-help-menu-app/dist/main.js 8.56 kB 0 B
packages/apps/esm-help-menu-app/dist/openmrs-esm-help-menu-app.js 3.23 kB 0 B
packages/apps/esm-implementer-tools-app/dist/271.js 723 B 0 B
packages/apps/esm-implementer-tools-app/dist/289.js 14.1 kB 0 B
packages/apps/esm-implementer-tools-app/dist/319.js 639 B 0 B
packages/apps/esm-implementer-tools-app/dist/336.js 137 kB 0 B
packages/apps/esm-implementer-tools-app/dist/36.js 2.49 kB 0 B
packages/apps/esm-implementer-tools-app/dist/426.js 27.8 kB 0 B
packages/apps/esm-implementer-tools-app/dist/441.js 4.38 kB 0 B
packages/apps/esm-implementer-tools-app/dist/448.js 4.66 kB 0 B
packages/apps/esm-implementer-tools-app/dist/460.js 748 B 0 B
packages/apps/esm-implementer-tools-app/dist/491.js 134 kB 0 B
packages/apps/esm-implementer-tools-app/dist/574.js 584 B 0 B
packages/apps/esm-implementer-tools-app/dist/587.js 2.93 kB 0 B
packages/apps/esm-implementer-tools-app/dist/625.js 564 B 0 B
packages/apps/esm-implementer-tools-app/dist/642.js 21.1 kB 0 B
packages/apps/esm-implementer-tools-app/dist/644.js 723 B 0 B
packages/apps/esm-implementer-tools-app/dist/657.js 7.03 kB 0 B
packages/apps/esm-implementer-tools-app/dist/667.js 121 kB 0 B
packages/apps/esm-implementer-tools-app/dist/735.js 2.63 kB 0 B
packages/apps/esm-implementer-tools-app/dist/757.js 563 B 0 B
packages/apps/esm-implementer-tools-app/dist/788.js 42.9 kB 0 B
packages/apps/esm-implementer-tools-app/dist/807.js 562 B 0 B
packages/apps/esm-implementer-tools-app/dist/833.js 691 B 0 B
packages/apps/esm-implementer-tools-app/dist/845.js 6.43 kB 0 B
packages/apps/esm-implementer-tools-app/dist/859.js 3.09 kB 0 B
packages/apps/esm-implementer-tools-app/dist/873.js 3.67 kB 0 B
packages/apps/esm-implementer-tools-app/dist/889.js 324 kB +13 B (0%)
packages/apps/esm-implementer-tools-app/dist/main.js 20.8 kB 0 B
packages/apps/esm-implementer-tools-app/dist/openmrs-esm-implementer-tools-app.js 3.4 kB 0 B
packages/apps/esm-login-app/dist/202.js 2.57 kB 0 B
packages/apps/esm-login-app/dist/236.js 272 B 0 B
packages/apps/esm-login-app/dist/240.js 366 B 0 B
packages/apps/esm-login-app/dist/271.js 962 B 0 B
packages/apps/esm-login-app/dist/272.js 266 B 0 B
packages/apps/esm-login-app/dist/319.js 879 B 0 B
packages/apps/esm-login-app/dist/336.js 233 B 0 B
packages/apps/esm-login-app/dist/415.js 26.7 kB 0 B
packages/apps/esm-login-app/dist/460.js 967 B 0 B
packages/apps/esm-login-app/dist/539.js 300 B 0 B
packages/apps/esm-login-app/dist/574.js 687 B 0 B
packages/apps/esm-login-app/dist/593.js 149 kB 0 B
packages/apps/esm-login-app/dist/625.js 762 B 0 B
packages/apps/esm-login-app/dist/63.js 16.5 kB 0 B
packages/apps/esm-login-app/dist/642.js 21.1 kB 0 B
packages/apps/esm-login-app/dist/644.js 962 B 0 B
packages/apps/esm-login-app/dist/657.js 7.02 kB 0 B
packages/apps/esm-login-app/dist/673.js 286 B 0 B
packages/apps/esm-login-app/dist/676.js 2.23 kB 0 B
packages/apps/esm-login-app/dist/7.js 3.03 kB 0 B
packages/apps/esm-login-app/dist/735.js 2.62 kB 0 B
packages/apps/esm-login-app/dist/755.js 3.36 kB 0 B
packages/apps/esm-login-app/dist/757.js 908 B 0 B
packages/apps/esm-login-app/dist/788.js 42.9 kB 0 B
packages/apps/esm-login-app/dist/80.js 30.6 kB 0 B
packages/apps/esm-login-app/dist/807.js 1.13 kB 0 B
packages/apps/esm-login-app/dist/833.js 902 B 0 B
packages/apps/esm-login-app/dist/859.js 3.08 kB 0 B
packages/apps/esm-login-app/dist/889.js 324 kB +13 B (0%)
packages/apps/esm-login-app/dist/93.js 2.04 kB 0 B
packages/apps/esm-login-app/dist/main.js 58.9 kB 0 B
packages/apps/esm-login-app/dist/openmrs-esm-login-app.js 3.46 kB 0 B
packages/apps/esm-offline-tools-app/dist/271.js 1.19 kB 0 B
packages/apps/esm-offline-tools-app/dist/319.js 1.13 kB 0 B
packages/apps/esm-offline-tools-app/dist/460.js 1.3 kB 0 B
packages/apps/esm-offline-tools-app/dist/574.js 1.03 kB 0 B
packages/apps/esm-offline-tools-app/dist/601.js 142 kB 0 B
packages/apps/esm-offline-tools-app/dist/625.js 1.03 kB 0 B
packages/apps/esm-offline-tools-app/dist/63.js 16.5 kB 0 B
packages/apps/esm-offline-tools-app/dist/642.js 21.1 kB 0 B
packages/apps/esm-offline-tools-app/dist/644.js 1.19 kB 0 B
packages/apps/esm-offline-tools-app/dist/645.js 91.4 kB 0 B
packages/apps/esm-offline-tools-app/dist/657.js 7.02 kB 0 B
packages/apps/esm-offline-tools-app/dist/703.js 6.32 kB 0 B
packages/apps/esm-offline-tools-app/dist/735.js 2.63 kB 0 B
packages/apps/esm-offline-tools-app/dist/757.js 1.19 kB 0 B
packages/apps/esm-offline-tools-app/dist/788.js 42.9 kB 0 B
packages/apps/esm-offline-tools-app/dist/807.js 1.1 kB 0 B
packages/apps/esm-offline-tools-app/dist/833.js 1.21 kB 0 B
packages/apps/esm-offline-tools-app/dist/859.js 3.09 kB 0 B
packages/apps/esm-offline-tools-app/dist/889.js 324 kB +13 B (0%)
packages/apps/esm-offline-tools-app/dist/947.js 8.66 kB 0 B
packages/apps/esm-offline-tools-app/dist/main.js 107 kB 0 B
packages/apps/esm-offline-tools-app/dist/openmrs-esm-offline-tools-app.js 3.39 kB 0 B
packages/apps/esm-primary-navigation-app/dist/271.js 270 B 0 B
packages/apps/esm-primary-navigation-app/dist/319.js 232 B 0 B
packages/apps/esm-primary-navigation-app/dist/460.js 266 B 0 B
packages/apps/esm-primary-navigation-app/dist/482.js 15.2 kB 0 B
packages/apps/esm-primary-navigation-app/dist/513.js 146 kB 0 B
packages/apps/esm-primary-navigation-app/dist/574.js 231 B 0 B
packages/apps/esm-primary-navigation-app/dist/577.js 7.64 kB 0 B
packages/apps/esm-primary-navigation-app/dist/619.js 6.45 kB 0 B
packages/apps/esm-primary-navigation-app/dist/625.js 231 B 0 B
packages/apps/esm-primary-navigation-app/dist/63.js 16.5 kB 0 B
packages/apps/esm-primary-navigation-app/dist/644.js 270 B 0 B
packages/apps/esm-primary-navigation-app/dist/657.js 7.03 kB 0 B
packages/apps/esm-primary-navigation-app/dist/735.js 2.63 kB 0 B
packages/apps/esm-primary-navigation-app/dist/757.js 237 B 0 B
packages/apps/esm-primary-navigation-app/dist/788.js 42.9 kB 0 B
packages/apps/esm-primary-navigation-app/dist/807.js 291 B 0 B
packages/apps/esm-primary-navigation-app/dist/833.js 258 B 0 B
packages/apps/esm-primary-navigation-app/dist/889.js 324 kB +11 B (0%)
packages/apps/esm-primary-navigation-app/dist/933.js 3.63 kB 0 B
packages/apps/esm-primary-navigation-app/dist/958.js 24.3 kB 0 B
packages/apps/esm-primary-navigation-app/dist/main.js 29.8 kB 0 B
packages/apps/esm-primary-navigation-app/dist/openmrs-esm-primary-navigation-app.js 3.38 kB 0 B
packages/framework/esm-api/dist/openmrs-esm-api.js 16.2 kB 0 B
packages/framework/esm-config/dist/openmrs-esm-module-config.js 8.41 kB 0 B
packages/framework/esm-context/dist/openmrs-esm-context.js 1.16 kB 0 B
packages/framework/esm-dynamic-loading/dist/openmrs-esm-dynamic-loading.js 2.89 kB 0 B
packages/framework/esm-error-handling/dist/openmrs-esm-error-handling.js 891 B 0 B
packages/framework/esm-expression-evaluator/dist/openmrs-esm-expression-evaluator.js 8.54 kB 0 B
packages/framework/esm-extensions/dist/openmrs-esm-extensions.js 24.8 kB 0 B
packages/framework/esm-feature-flags/dist/openmrs-esm-feature-flags.js 1.66 kB 0 B
packages/framework/esm-framework/dist/278.openmrs-esm-framework.js 14.5 kB 0 B
packages/framework/esm-framework/dist/530.openmrs-esm-framework.js 2.93 kB 0 B
packages/framework/esm-framework/dist/588.openmrs-esm-framework.js 2.15 kB 0 B
packages/framework/esm-framework/dist/619.openmrs-esm-framework.js 6.49 kB 0 B
packages/framework/esm-framework/dist/645.openmrs-esm-framework.js 9.3 kB 0 B
packages/framework/esm-framework/dist/735.openmrs-esm-framework.js 2.65 kB 0 B
packages/framework/esm-framework/dist/746.openmrs-esm-framework.js 6.14 kB 0 B
packages/framework/esm-framework/dist/788.openmrs-esm-framework.js 42.9 kB 0 B
packages/framework/esm-framework/dist/openmrs-esm-framework.js 453 kB +4 B (0%)
packages/framework/esm-globals/dist/openmrs-esm-globals.js 791 B 0 B
packages/framework/esm-navigation/dist/openmrs-esm-navigation.js 9.34 kB 0 B
packages/framework/esm-offline/dist/openmrs-esm-offline.js 34.4 kB 0 B
packages/framework/esm-react-utils/dist/openmrs-esm-react-utils.js 21.9 kB +39 B (+0.18%)
packages/framework/esm-routes/dist/openmrs-esm-utils.js 4.67 kB 0 B
packages/framework/esm-state/dist/openmrs-esm-state.js 926 B 0 B
packages/framework/esm-styleguide/dist/openmrs-esm-styleguide.js 144 kB 0 B
packages/framework/esm-translations/dist/openmrs-esm-core-translations.js 1.87 kB 0 B
packages/framework/esm-utils/dist/openmrs-esm-utils.js 45.5 kB 0 B
packages/shell/esm-app-shell/dist/0320f3310a8e6ffd.js 624 B 0 B
packages/shell/esm-app-shell/dist/0e69d9ec4853cfe2.js 958 B 0 B
packages/shell/esm-app-shell/dist/108de29b7c1b7ac8.js 6.99 kB 0 B
packages/shell/esm-app-shell/dist/20ee3ecb5d9c7be1.js 2.58 kB 0 B
packages/shell/esm-app-shell/dist/2b553874176a2d5e.js 912 B 0 B
packages/shell/esm-app-shell/dist/2cc5179a2a17e577.js 911 B 0 B
packages/shell/esm-app-shell/dist/2ddface0d88d7441.js 43 kB 0 B
packages/shell/esm-app-shell/dist/3644c66a25798faa.js 168 kB 0 B
packages/shell/esm-app-shell/dist/39c27dcaf13969ce.js 6.77 kB 0 B
packages/shell/esm-app-shell/dist/4600ae74dce9320d.js 1.17 kB 0 B
packages/shell/esm-app-shell/dist/47b4569526a565e6.js 3.04 kB 0 B
packages/shell/esm-app-shell/dist/4d55947c2d077956.js 1.19 kB 0 B
packages/shell/esm-app-shell/dist/4ef81ca673948056.js 18.3 kB 0 B
packages/shell/esm-app-shell/dist/5aadd684d60c6888.js 2.23 kB 0 B
packages/shell/esm-app-shell/dist/80edf3c24e151133.js 63.3 kB 0 B
packages/shell/esm-app-shell/dist/82b941b0585ccaed.js 624 B 0 B
packages/shell/esm-app-shell/dist/85bbfd1b2f124ed9.js 3.33 kB 0 B
packages/shell/esm-app-shell/dist/85d9e1ec051fd113.js 2.84 kB 0 B
packages/shell/esm-app-shell/dist/8711659b05d659a3.js 9.36 kB 0 B
packages/shell/esm-app-shell/dist/8c7c69fc0e32ca48.js 2.6 kB 0 B
packages/shell/esm-app-shell/dist/9306486d6a162aea.js 1.59 kB 0 B
packages/shell/esm-app-shell/dist/9e544f6471561cb4.js 912 B 0 B
packages/shell/esm-app-shell/dist/a05840be5ec988e7.js 1 kB 0 B
packages/shell/esm-app-shell/dist/a0e789646c4db6de.js 15.1 kB 0 B
packages/shell/esm-app-shell/dist/ab0d9ae7cd44af81.js 3.69 kB 0 B
packages/shell/esm-app-shell/dist/b83e4961d0a5a387.js 934 B 0 B
packages/shell/esm-app-shell/dist/b88532bde74b513a.js 9.41 kB 0 B
packages/shell/esm-app-shell/dist/bd742565375867e5.js 172 kB 0 B
packages/shell/esm-app-shell/dist/c3d4e870c5c4226d.js 6.9 kB 0 B
packages/shell/esm-app-shell/dist/d61d5c756d73fd81.js 40.3 kB 0 B
packages/shell/esm-app-shell/dist/d7b53090c51a6e8e.js 1.19 kB 0 B
packages/shell/esm-app-shell/dist/dc69812e79e05b45.js 3.08 kB 0 B
packages/shell/esm-app-shell/dist/f3254390a777963b.js 3.23 kB 0 B
packages/shell/esm-app-shell/dist/f74be95a974424f5.js 3.38 kB 0 B
packages/shell/esm-app-shell/dist/fc5c1c25e4d213ea.js 5.63 kB 0 B
packages/shell/esm-app-shell/dist/openmrs.4b99e2d93d63d2ea.js 21.4 kB 0 B
packages/shell/esm-app-shell/dist/service-worker.js 46.4 kB 0 B
packages/tooling/openmrs/dist/cli.js 2.96 kB 0 B
packages/tooling/openmrs/dist/commands/assemble.js 3.31 kB 0 B
packages/tooling/openmrs/dist/commands/build.js 1.34 kB 0 B
packages/tooling/openmrs/dist/commands/debug.js 543 B 0 B
packages/tooling/openmrs/dist/commands/develop.js 2.71 kB 0 B
packages/tooling/openmrs/dist/commands/index.js 437 B 0 B
packages/tooling/openmrs/dist/commands/start.js 850 B 0 B
packages/tooling/openmrs/dist/index.js 517 B 0 B
packages/tooling/openmrs/dist/runner.js 640 B 0 B
packages/tooling/openmrs/dist/utils/config.js 726 B 0 B
packages/tooling/openmrs/dist/utils/debugger.js 575 B 0 B
packages/tooling/openmrs/dist/utils/dependencies.js 643 B 0 B
packages/tooling/openmrs/dist/utils/helpers.js 397 B 0 B
packages/tooling/openmrs/dist/utils/importmap.js 3.07 kB 0 B
packages/tooling/openmrs/dist/utils/index.js 443 B 0 B
packages/tooling/openmrs/dist/utils/logger.js 368 B 0 B
packages/tooling/openmrs/dist/utils/npmConfig.js 831 B 0 B
packages/tooling/openmrs/dist/utils/untar.js 725 B 0 B
packages/tooling/openmrs/dist/utils/variables.js 192 B 0 B
packages/tooling/openmrs/dist/utils/webpack.js 278 B 0 B
packages/tooling/webpack-config/dist/index.js 3.61 kB 0 B

compressed-size-action

@denniskigen denniskigen marked this pull request as draft September 20, 2024 13:50
@denniskigen denniskigen marked this pull request as ready for review September 20, 2024 14:00
// only revalidate once every 10 minutes
focusThrottleInterval: 600000,
// disable automatic revalidations by default
revalidateIfStale: false,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm a little more hesitant about turning on revalidateIfStale. Maybe we leave that out for now?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree. If revalidateIfStale, revalidateOnFocus, revalidateOnReconnect are all set to false, there is no longer a distinction between useSWR and useSWRInfinite.

https://swr.vercel.app/docs/revalidation#disable-automatic-revalidations

Side note: Should we have a convention where the SWRConfig values are override-able on a per-app basis? Maybe an edge case, but I'm thinking about multiple clinician using the queues / appointments / ward app and we might want faster re-validate internals.

Copy link
Member Author

@denniskigen denniskigen Sep 20, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, @chibongho. As I mentioned here, SWRConfig merges the configuration from the parent context. This means that alternative configurations provided further down the line will override the parent values. I've linked to an example video there showing SWRConfig overriding the global configuration at the ESM-level in the Active Visits app.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tbh, actually, using SWR configuration instead of useSWRImmutable actually has some advantages (the global mutate() function cannot invalidate content loaded with either useSWRInfinite() or useSWRImmutable() and we've tended to use Immutable in a few inappropriate places).

Should we have a convention where the SWRConfig values are override-able on a per-app basis?

I mean, those decisions are always possible to make, but I'd rather focus on doing so locally where it makes sense to explore whether some kind of app-wide configuration even makes sense (these sort of technical details definitely shouldn't be part of the standard configuration system).

These changes to the global SWR config disable automatic revalidations by default. The idea is to set up a conservative caching strategy that minimizes automatic data revalidations. In practice, it is very unlikely that the data in a chart will change frequently, so it makes sense to limit the number of revalidations to a bare minimum.

Note that the SWRConfig component merges the configuration from the parent context. This means that alternative configurations provided further down the line will override the parent values.
@denniskigen denniskigen force-pushed the feat/disable-automatic-revalidations branch from 36d18dc to c990889 Compare September 20, 2024 16:52
@denniskigen denniskigen changed the title (feat) Disable automatic revalidations by default (feat) Disable most automatic revalidations by default Sep 20, 2024
@denniskigen denniskigen merged commit 455c56b into main Sep 20, 2024
14 checks passed
@denniskigen denniskigen deleted the feat/disable-automatic-revalidations branch September 20, 2024 17:59
@denniskigen denniskigen mentioned this pull request Dec 5, 2024
4 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants