 .../src/Render/Placeholder/BigPipeStrategy.php      | 21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

diff --git a/core/modules/big_pipe/src/Render/Placeholder/BigPipeStrategy.php b/core/modules/big_pipe/src/Render/Placeholder/BigPipeStrategy.php
index 91ad604..686e98a 100644
--- a/core/modules/big_pipe/src/Render/Placeholder/BigPipeStrategy.php
+++ b/core/modules/big_pipe/src/Render/Placeholder/BigPipeStrategy.php
@@ -258,10 +258,25 @@ protected static function generateBigPipePlaceholderId($original_placeholder, ar
     // Generate a BigPipe placeholder ID (to be used by BigPipe's JavaScript).
     // @see \Drupal\Core\Render\PlaceholderGenerator::createPlaceholder()
     if (isset($placeholder_render_array['#lazy_builder'])) {
-      $callback = $placeholder_render_array['#lazy_builder'][0];
-      $arguments = $placeholder_render_array['#lazy_builder'][1];
+      $render_config = \Drupal::container()->getParameter('renderer.config');
+      $debug = !empty($render_config['debug']);
+
       $token = hash('crc32b', serialize($placeholder_render_array));
-      return UrlHelper::buildQuery(['callback' => $callback, 'args' => $arguments, 'token' => $token]);
+      // When debug mode is on, generate a placeholder ID that lists the lazy
+      // builder for easier debugging. Otherwise, just use a consistently hashed
+      // token as the placeholder ID.
+      if ($debug) {
+        $callback = $placeholder_render_array['#lazy_builder'][0];
+        $arguments = $placeholder_render_array['#lazy_builder'][1];
+        return UrlHelper::buildQuery([
+          'callback' => $callback,
+          'args' => $arguments,
+          'token' => $token
+        ]);
+      }
+      else {
+        return $token;
+      }
     }
     // When the placeholder's render array is not using a #lazy_builder,
     // anything could be in there: only #lazy_builder has a strict contract that
