Developer Experience (DX) Tools
The DX Plugin provides modern development tooling for WordPress projects, enabling TypeScript, SCSS compilation, and enhanced block development.
Overview
The DX Plugin enhances WordPress development with:
- Laravel Mix - Asset compilation for TypeScript and SCSS
- SCSS Variables - Auto-generated from theme.json design tokens
- ACF Blocks - Automated block registration
- Pattern System - Enhanced block pattern development
- BEM Methodology - Enforced component-based styling
Installation
Requirements
- WordPress 6.0+
- PHP 8.0+
- Node.js 18+
- ACF Pro
Setup Steps
-
Install the DX Plugin
# Via WP CLI
wp plugin install developer-experience --activate -
Create dx/ folder in theme
wp-content/themes/your-theme/
└── dx/
├── acf-blocks/
├── patterns/
├── scss/
│ ├── _variables.scss # Auto-generated
│ ├── blocks/
│ └── patterns/
└── ts/
├── blocks/
└── global/ -
Initialize package.json
cd wp-content/themes/your-theme/dx
npm init -y
npm install laravel-mix sass typescript --save-dev -
Configure webpack.mix.js
const mix = require('laravel-mix');
mix.ts('ts/global/main.ts', 'dist/js')
.sass('scss/main.scss', 'dist/css')
.setPublicPath('dist');
SCSS Integration
Auto-Generated Variables
The DX Plugin automatically generates SCSS variables from theme.json:
// dx/scss/_variables.scss (auto-generated)
$color-primary: #1D2433;
$color-secondary: #F5F4F0;
$font-family-body: Inter, sans-serif;
$font-family-heading: Bebas Neue, sans-serif;
$space-20: 20px;
$space-40: 40px;
Using Variables
// dx/scss/patterns/_hero.scss
.hero {
background-color: $color-primary;
padding: $space-80 0;
&__title {
font-family: $font-family-heading;
color: $color-secondary;
}
&__content {
font-family: $font-family-body;
}
}
ACF Blocks
Block Structure
dx/acf-blocks/
└── hero/
├── block.json
├── hero.php
├── hero.scss
└── hero.ts (optional)
block.json
{
"name": "acf/hero",
"title": "Hero",
"description": "Hero section with heading and CTA",
"category": "theme",
"icon": "cover-image",
"keywords": ["hero", "header"],
"acf": {
"mode": "edit",
"renderTemplate": "hero.php"
},
"supports": {
"align": ["full", "wide"],
"mode": false
}
}
Block Template (hero.php)
<?php
$heading = get_field('heading');
$cta_text = get_field('cta_text');
$cta_link = get_field('cta_link');
?>
<section class="hero alignfull">
<div class="hero__container">
<?php if ($heading): ?>
<h1 class="hero__title"><?php echo esc_html($heading); ?></h1>
<?php endif; ?>
<?php if ($cta_text && $cta_link): ?>
<a href="<?php echo esc_url($cta_link); ?>" class="hero__cta btn btn--primary">
<?php echo esc_html($cta_text); ?>
</a>
<?php endif; ?>
</div>
</section>
Block Patterns
Pattern Structure
dx/patterns/
└── hero-pattern/
├── pattern.php
└── hero-pattern.scss
Pattern Registration
<?php
/**
* Title: Hero Pattern
* Slug: theme/hero-pattern
* Categories: hero
* Block Types: core/cover
*/
?>
<!-- wp:cover {"dimRatio":50,"className":"hero-pattern"} -->
<div class="wp-block-cover hero-pattern">
<!-- Block content -->
</div>
<!-- /wp:cover -->
Commands
Development
# Watch for changes
npm run watch
# Development build
npm run dev
# Production build
npm run prod
Helpful Scripts
Add to package.json:
{
"scripts": {
"dev": "mix",
"watch": "mix watch",
"prod": "mix --production",
"lint": "eslint ts/**/*.ts",
"build": "npm run prod"
}
}
BEM Methodology
DX enforces BEM (Block Element Modifier) for consistent styling:
// Block
.hero { }
// Element
.hero__title { }
.hero__content { }
.hero__cta { }
// Modifier
.hero--dark { }
.hero__title--large { }
Best Practices
- One block per file - Each component in its own SCSS file
- Flat specificity - Avoid deep nesting
- No ID selectors - Use classes only
- Consistent naming - Follow BEM strictly
Troubleshooting
Common Issues
Variables not updating
- Run
npm run devto regenerate variables - Check
theme.jsonsyntax is valid
TypeScript errors
- Ensure
tsconfig.jsonis properly configured - Check import paths are correct
Blocks not appearing
- Verify
block.jsonis valid JSON - Check PHP template path is correct
- Clear block editor cache
Performance
Use npm run prod before deployment to ensure assets are minified and optimized.