Make WordPress Core


Ignore:
Timestamp:
10/14/2025 12:10:31 AM (12 months ago)
Author:
westonruter
Message:

Editor: Avoid enqueueing assets for blocks which do not render content.

This change prevents scripts, styles, and script modules from being enqueued for blocks that do not render any HTML content. This is common for hidden blocks or blocks like the Featured Image block when no image is present. This change reduces the amount of unused CSS and JavaScript on a page, improving performance.

A new filter, enqueue_empty_block_content_assets, is introduced to allow developers to override this behavior and enqueue assets for empty blocks if needed.

The implementation involves capturing the asset queues before and after a block is rendered. The newly enqueued assets are only merged if the block's rendered content is not empty. This is done recursively for nested blocks to ensure that assets for inner blocks are also not enqueued if a parent block is hidden.

Developed in ​https://github.com/WordPress/wordpress-develop/pull/9213.

Props westonruter, aristath, peterwilsoncc, gziolo, krupajnanda, dd32, jorbin.
See #50328.
Fixes #63676.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/script-modules/wpScriptModules.php

    r60729 r60930  
    13451345
    13461346        /**
     1347         * Tests that directly manipulating the queue works as expected.
     1348         *
     1349         * @ticket 63676
     1350         *
     1351         * @covers WP_Script_Modules::queue
     1352         * @covers WP_Script_Modules::dequeue
     1353         */
     1354        public function test_direct_queue_manipulation() {
     1355                $this->script_modules->register( 'foo', '/foo.js' );
     1356                $this->script_modules->register( 'bar', '/bar.js' );
     1357                $this->script_modules->register( 'baz', '/baz.js' );
     1358                $this->assertSame( array(), $this->script_modules->queue, 'Expected queue to be empty.' );
     1359                $this->script_modules->enqueue( 'foo' );
     1360                $this->script_modules->enqueue( 'foo' );
     1361                $this->script_modules->enqueue( 'bar' );
     1362                $this->assertSame( array( 'foo', 'bar' ), $this->script_modules->queue, 'Expected two deduplicated queued items.' );
     1363                $this->script_modules->queue = array( 'baz' );
     1364                $this->script_modules->enqueue( 'bar' );
     1365                $this->assertSame( array( 'baz', 'bar' ), $this->script_modules->queue, 'Expected queue updated via setter and enqueue method to have two items.' );
     1366                $this->script_modules->dequeue( 'baz' );
     1367                $this->script_modules->dequeue( 'bar' );
     1368                $this->assertSame( array(), $this->script_modules->queue, 'Expected queue to be empty after dequeueing both items.' );
     1369        }
     1370
     1371        /**
    13471372         * Gets registered script modules.
    13481373         *
Note: See TracChangeset for help on using the changeset viewer.