Make WordPress Core

Changeset 59083


Ignore:
Timestamp:
09/24/2024 07:33:55 AM (2 years 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.