Make WordPress Core

Changeset 59083


Ignore:
Timestamp:
09/24/2024 07:33:55 AM (4 months ago)
Author:
gziolo
Message:

Build: Prepare for more Script Modules

This is a companion to https://github.com/WordPress/gutenberg/pull/65460 that requires syncing in WordPress Core. Namely, the block-library changes require registration with their updated script module IDs so that the blocks continue to work correctly.

They key improvement is script modules registration is handled in one central place, and a combined asset file is used to improve the performance by avoiding multiple disk operations for every individual file.

Props jonsurrell, gziolo, wildworks, noisysocks.
See #60647, #59462.

Location:
trunk
Files:
2 added
1 deleted
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/.gitignore

    r59038 r59083  
    3232/src/wp-includes/assets/*
    3333!/src/wp-includes/assets/script-loader-packages.min.php
     34!/src/wp-includes/assets/script-modules-packages.min.php
    3435/src/wp-includes/js
    3536/src/wp-includes/css/dist
  • trunk/Gruntfile.js

    r59072 r59083  
    5757            'wp-includes/blocks/**/*.css',
    5858            '!wp-includes/assets/script-loader-packages.min.php',
     59            '!wp-includes/assets/script-modules-packages.min.php',
    5960        ],
    6061
  • trunk/src/wp-includes/assets

    • Property svn:ignore
      •  

        old new  
        11script-loader-packages.php
        22script-loader-react-*.php
         3script-modules-packages.php
  • trunk/src/wp-includes/default-filters.php

    r58944 r59083  
    571571add_action( 'wp_default_scripts', 'wp_default_scripts' );
    572572add_action( 'wp_default_scripts', 'wp_default_packages' );
     573add_action( 'wp_default_scripts', 'wp_default_script_modules' );
    573574
    574575add_action( 'wp_enqueue_scripts', 'wp_localize_jquery_ui_datepicker', 1000 );
  • trunk/src/wp-includes/interactivity-api/class-wp-interactivity-api.php

    r58825 r59083  
    282282     * Registers the `@wordpress/interactivity` script modules.
    283283     *
     284     * @deprecated 6.7.0 Script Modules registration is handled by {@see wp_default_script_modules()}.
     285     *
    284286     * @since 6.5.0
    285287     */
    286288    public function register_script_modules() {
    287         $suffix = wp_scripts_get_suffix();
    288 
    289         wp_register_script_module(
    290             '@wordpress/interactivity',
    291             includes_url( "js/dist/interactivity$suffix.js" )
    292         );
    293 
    294         wp_register_script_module(
    295             '@wordpress/interactivity-router',
    296             includes_url( "js/dist/interactivity-router$suffix.js" ),
    297             array( '@wordpress/interactivity' )
    298         );
     289        _deprecated_function( __METHOD__, '6.7.0', 'wp_default_script_modules' );
    299290    }
    300291
     
    303294     *
    304295     * @since 6.5.0
    305      * @since 6.7.0 Use the {@see "script_module_data_{$module_id}"} filter to pass client-side data.
    306296     */
    307297    public function add_hooks() {
    308         add_action( 'wp_enqueue_scripts', array( $this, 'register_script_modules' ) );
    309         add_action( 'admin_enqueue_scripts', array( $this, 'register_script_modules' ) );
    310 
    311298        add_filter( 'script_module_data_@wordpress/interactivity', array( $this, 'filter_script_module_interactivity_data' ) );
    312299    }
  • trunk/src/wp-includes/script-modules.php

    r58200 r59083  
    124124    wp_script_modules()->deregister( $id );
    125125}
     126
     127/**
     128 * Registers all the default WordPress Script Modules.
     129 *
     130 * @since 6.7.0
     131 */
     132function wp_default_script_modules() {
     133    $suffix = defined( 'WP_RUN_CORE_TESTS' ) ? '.min' : wp_scripts_get_suffix();
     134
     135    /*
     136     * Expects multidimensional array like:
     137     *
     138     *     'interactivity/index.min.js' => array('dependencies' => array(…), 'version' => '…'),
     139     *     'interactivity/debug.min.js' => array('dependencies' => array(…), 'version' => '…'),
     140     *     'interactivity-router/index.min.js' => …
     141     */
     142    $assets = include ABSPATH . WPINC . "/assets/script-modules-packages{$suffix}.php";
     143
     144    foreach ( $assets as $file_name => $script_module_data ) {
     145        /*
     146         * Build the WordPress Script Module ID from the file name.
     147         * Prepend `@wordpress/` and remove extensions and `/index` if present:
     148         *   - interactivity/index.min.js  => @wordpress/interactivity
     149         *   - interactivity/debug.min.js  => @wordpress/interactivity/debug
     150         *   - block-library/query/view.js => @wordpress/block-library/query/view
     151         */
     152        $script_module_id = '@wordpress/' . preg_replace( '~(?:/index)?(?:\.min)?\.js$~D', '', $file_name, 1 );
     153
     154        switch ( $script_module_id ) {
     155            /*
     156             * Interactivity exposes two entrypoints, "/index" and "/debug".
     157             * "/debug" should replalce "/index" in devlopment.
     158             */
     159            case '@wordpress/interactivity/debug':
     160                if ( ! SCRIPT_DEBUG ) {
     161                    continue 2;
     162                }
     163                $script_module_id = '@wordpress/interactivity';
     164                break;
     165            case '@wordpress/interactivity':
     166                if ( SCRIPT_DEBUG ) {
     167                    continue 2;
     168                }
     169                break;
     170        }
     171
     172        $path = "/wp-includes/js/dist/script-modules/{$file_name}";
     173        wp_register_script_module( $script_module_id, $path, $script_module_data['dependencies'], $script_module_data['version'] );
     174    }
     175}
  • trunk/tests/phpunit/tests/interactivity-api/wpInteractivityAPI.php

    r58825 r59083  
    213213
    214214    /**
     215     * Test that the deprecated register_script_modules method is deprecated but does not throw.
     216     *
     217     * @ticket 60647
     218     *
     219     * @expectedDeprecated WP_Interactivity_API::register_script_modules
     220     */
     221    public function test_register_script_modules_deprecated() {
     222        $this->interactivity->register_script_modules();
     223    }
     224
     225    /**
    215226     * Sets up an activity, runs an optional callback, and returns a MockAction for inspection.
    216227     *
     
    222233    private function get_script_data_filter_result( ?Closure $callback = null ): MockAction {
    223234        $this->interactivity->add_hooks();
    224         $this->interactivity->register_script_modules();
    225235        wp_enqueue_script_module( '@wordpress/interactivity' );
    226236        $filter = new MockAction();
  • trunk/tools/webpack/shared.js

    r58577 r59083  
    103103    '@wordpress/interactivity-router',
    104104];
     105const SCRIPT_AND_MODULE_DUAL_PACKAGES = [
     106    '@wordpress/block-library',
     107];
    105108const WORDPRESS_NAMESPACE = '@wordpress/';
    106109
     
    112115    BUNDLED_PACKAGES,
    113116    MODULES,
     117    SCRIPT_AND_MODULE_DUAL_PACKAGES,
    114118    WORDPRESS_NAMESPACE,
    115119};
  • trunk/webpack.config.js

    r58271 r59083  
    33const mediaConfig = require( './tools/webpack/media' );
    44const packagesConfig = require( './tools/webpack/packages' );
    5 const modulesConfig = require( './tools/webpack/modules' );
     5const scriptModulesConfig = require( './tools/webpack/script-modules' );
    66const vendorsConfig = require( './tools/webpack/vendors' );
    77
     
    2020        mediaConfig( env ),
    2121        packagesConfig( env ),
    22         modulesConfig( env ),
     22        scriptModulesConfig( env ),
    2323        ...vendorsConfig( env ),
    2424    ];
Note: See TracChangeset for help on using the changeset viewer.