块编辑器开发文档

@wordpress/asset-loader

💡 云策文档标注

概述

@wordpress/asset-loader 是一个用于动态加载 WordPress 脚本和样式并解析依赖关系的实用工具包。它通过拓扑排序处理依赖图,支持并行加载和顺序执行,模拟 wp_enqueue_script/wp_enqueue_style 行为。

关键要点

  • 提供 loadAssets 函数,动态注入脚本和样式到 DOM,支持依赖解析、并行加载和顺序执行
  • 支持内联脚本和样式,可配置 before/after 内容,兼容 WordPress 核心的 enqueue 机制
  • 通过拓扑排序(深度优先搜索)处理依赖关系,确保加载顺序正确
  • 外部脚本并行加载(async=false 保持顺序),内联脚本在对应外部脚本加载后执行
  • 可结合 @wordpress/core-data 从 REST API 获取资产数据,实现动态加载

代码示例

import loadAssets from '@wordpress/asset-loader';

const assets = {
    scripts: {
        'wp-blocks': {
            src: 'https://example.com/wp-includes/js/dist/blocks.min.js',
            deps: [ 'wp-element', 'wp-data' ],
            version: '1.0.0',
            in_footer: true,
        },
    },
    styles: {
        'wp-block-library': {
            src: 'https://example.com/wp-includes/css/dist/block-library/style.min.css',
            deps: [],
            version: '1.0.0',
            media: 'all',
        },
    },
    inline_scripts: {
        before: {},
        after: {
            'wp-blocks': 'wp.blocks.registerBlockType(...)',
        },
    },
    inline_styles: {
        before: {},
        after: {},
    },
};

await loadAssets(
    assets.scripts,
    assets.inline_scripts,
    assets.styles,
    assets.inline_styles
);

注意事项

  • loadAssets 函数接受四个参数:scriptsData、inlineScripts、stylesData 和 inlineStyles,返回 Promise
  • Script 和 Style 类型定义包括 src、deps、version 等属性,需按规范配置
  • 安装方式为 npm install @wordpress/asset-loader --save,遵循 GPL-2.0-or-later 许可证

📄 原文内容

Utility to dynamically load WordPress scripts and styles with dependency resolution.

Overview

This package provides a function to dynamically inject WordPress assets (scripts and styles) into the DOM with:

  • Dependency resolution – Respects WordPress dependency graphs via topological sort
  • Parallel loading – External scripts load in parallel for performance
  • Sequential execution – Inline scripts execute in the correct order
  • Inline scripts/styles – Supports before/after inline content per handle
  • WordPress compatibility – Mimics wp_enqueue_script/wp_enqueue_style behavior

Installation

Install the module:

npm install @wordpress/asset-loader --save

Usage

Basic Usage

import loadAssets from '@wordpress/asset-loader';

const assets = {
    scripts: {
        'wp-blocks': {
            src: 'https://example.com/wp-includes/js/dist/blocks.min.js',
            deps: [ 'wp-element', 'wp-data' ],
            version: '1.0.0',
            in_footer: true,
        },
    },
    styles: {
        'wp-block-library': {
            src: 'https://example.com/wp-includes/css/dist/block-library/style.min.css',
            deps: [],
            version: '1.0.0',
            media: 'all',
        },
    },
    inline_scripts: {
        before: {},
        after: {
            'wp-blocks': 'wp.blocks.registerBlockType(...)',
        },
    },
    inline_styles: {
        before: {},
        after: {},
    },
};

await loadAssets(
    assets.scripts,
    assets.inline_scripts,
    assets.styles,
    assets.inline_styles
);

With @wordpress/core-data

import { resolveSelect } from '@wordpress/data';
import { store as coreDataStore } from '@wordpress/core-data';
import { unlock } from './lock-unlock';
import loadAssets from '@wordpress/asset-loader';

async function loadEditorAssets() {
    // Get assets from the REST API endpoint
    const assets = await unlock(
        resolveSelect( coreDataStore )
    ).getEditorAssets();

    // Load them into the DOM
    await loadAssets(
        assets.scripts || {},
        assets.inline_scripts || { before: {}, after: {} },
        assets.styles || {},
        assets.inline_styles || { before: {}, after: {} }
    );
}

API

loadAssets(scriptsData, inlineScripts, stylesData, inlineStyles)

Loads WordPress assets with dependency resolution.

Parameters

  • scriptsData Record<string, Script> – Map of script handles to script data
  • inlineScripts Record<'before' | 'after', Record<string, string | string[]>> – Inline scripts
  • stylesData Record<string, Style> – Map of style handles to style data
  • inlineStyles Record<'before' | 'after', Record<string, string | string[]>> – Inline styles

Returns

Promise<void> – Resolves when all assets are loaded and executed

Types

type Script = {
    src: string;
    deps?: string[];
    version?: string;
    in_footer?: boolean;
};

type Style = {
    src: string;
    deps?: string[];
    version?: string;
    media?: string;
};

How It Works

  1. Topological Sort – Orders assets based on dependencies using depth-first search
  2. Stylesheet Loading – Loads CSS files in dependency order with inline styles
  3. Script Loading – Separates head/body scripts based on in_footer flag
  4. Parallel Execution – External scripts load in parallel (with async=false for order)
  5. Inline Scripts – Execute after their corresponding external scripts load

Contributing

See CONTRIBUTING.md.

License

GPL-2.0-or-later