diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index b01c6a590be50ee9f3fa4928145aa595df4b0eb8..0a1510f847c06fac13002e15ab87bf9e6484968d 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -115,6 +115,18 @@ default:
   # exist.
   - 'curl --location --output core/.cspellcache "https://git.drupalcode.org/api/v4/projects/$CI_PROJECT_ID/jobs/artifacts/{$CACHE_TARGET}/raw/core/.cspellcache?job=Lint%20cache%20warming" || true'
 
+.eslint-cache: &eslint-cache
+  # Fetch the eslint cache from the artifacts of the latest successful job from
+  # the target branch. Allow the job to proceed and pass if the file doesn't
+  # exist.
+  - 'curl --location --output core/.eslintcache "https://git.drupalcode.org/api/v4/projects/$CI_PROJECT_ID/jobs/artifacts/{$CACHE_TARGET}/raw/core/.eslintcache?job=Lint%20cache%20warming" || true'
+
+.stylelint-cache: &stylelint-cache
+  # Fetch the stylelint cache from the artifacts of the latest successful job from
+  # the target branch. Allow the job to proceed and pass if the file doesn't
+  # exist.
+  - 'curl --location --output core/.stylelintcache "https://git.drupalcode.org/api/v4/projects/$CI_PROJECT_ID/jobs/artifacts/{$CACHE_TARGET}/raw/core/.stylelintcache?job=Lint%20cache%20warming" || true'
+
 .core-spellcheck: &core-spellcheck
   - cd core
   - corepack enable
@@ -271,14 +283,21 @@ default:
   script:
     - *phpstan-cache
     - *cspell-cache
+    - *eslint-cache
+    - *stylelint-cache
     - composer install
     - vendor/bin/phpstan --version
     - php vendor/bin/phpstan -vvv analyze --configuration=./core/phpstan.neon.dist
     - *core-spellcheck
+    - yarn run lint:core-js-passing --cache --cache-strategy content
+    - yarn run build:css --check
+    - yarn run lint:css --cache --cache-location .stylelintcache --cache-strategy content
   artifacts:
     paths:
       - core/phpstan-tmp/resultCache.php
       - core/.cspellcache
+      - core/.eslintcache
+      - core/.stylelintcache
 
 '🧹 PHP Static Analysis (phpstan)':
   <<: [ *default-job-settings-lint ]
@@ -357,11 +376,12 @@ default:
     - when: manual
       allow_failure: true
   script:
+    - *eslint-cache
     - cd core
     - corepack enable
     - yarn install
     - yarn run check:ckeditor5
-    - yarn run lint:core-js-passing --format gitlab
+    - yarn run lint:core-js-passing --cache --cache-strategy content --format gitlab
   artifacts:
     reports:
       codequality: eslint-quality-report.json
@@ -383,11 +403,12 @@ default:
     - when: manual
       allow_failure: true
   script:
+    - *stylelint-cache
     - corepack enable
     - cd core
     - yarn install
     - yarn run build:css --check
-    - yarn run lint:css --color --custom-formatter=node_modules/stylelint-formatter-gitlab
+    - yarn run lint:css --cache --cache-location .stylelintcache --cache-strategy content --color --custom-formatter=node_modules/stylelint-formatter-gitlab
   artifacts:
     reports:
       codequality: stylelint-quality-report.json
diff --git a/core/.gitignore b/core/.gitignore
index f6b3bbea0fe3e4d80ee50347b770a946977d694b..164465dc429ac0ec2b88dab6e0b3d5ad5f01ec95 100644
--- a/core/.gitignore
+++ b/core/.gitignore
@@ -29,3 +29,9 @@ nightwatch.settings.json
 
 # Ignore phpstan cache
 phpstan-tmp
+
+# Ignore eslint cache
+.eslintcache
+
+# Ignore stylelint cache
+.stylelint-cache
diff --git a/core/misc/cspell/dictionary.txt b/core/misc/cspell/dictionary.txt
index 232320fd0874d44b8fd5c8a04826adb3983fa803..8b686e2213470665dc62ed5d70af04347fb88766 100644
--- a/core/misc/cspell/dictionary.txt
+++ b/core/misc/cspell/dictionary.txt
@@ -213,6 +213,7 @@ endtrans
 enoki
 entityviewedit
 errmode
+eslintcache
 etag
 eurozone
 evenodd
@@ -588,6 +589,7 @@ strs
 sttid
 styleguide
 stylelint
+stylelintcache
 stylescombo
 subarrays
 subchild