Use Parcel for your theme’s assets
Why?
Parcel offers a lot of benefits:
- The latest JS-language-features
Your JS-assets will be transpiled to ES5 so you can use most of the latest language features without sacrificing compatibility with older browsers like Internet Explorer - Support for SCSS
SCSS will be compiled to CSS and prefixed to support a wide range of browsers - Shorter load times
Your JS and CSS-assets will be minified merged into one file each so there are fewer and smaller requests to display your site - Automatic Cache-Management
All files will include their hash in their filename so you can set the cache duration to a very high value
How does it work?
Your source files should be placed inside the folder “src”
yarn start
This will start parcel and compile your assets todev. Parcel will also watch for file changes and immediately recompile your assets. Your files will not be minified to make debugging easier.yarn build
Compiles all assets todist. These assets will be minified and optimized for a production environment.
Which assets will be loaded?
If you enable WP_DEBUG the assets will be loaded from dev. Otherwise they will be loaded from dist. This way no unoptimized code will be loaded in your production environment.
Setup
Inside your theme’s folder run the following commands
sh
npm init
yarn add -D parcel parcel-bundler parcel-plugin-assets-list sass
Add the following scripts to your package.json
package.json
json
{
"scripts": {
"start": "rm -rf .cache && rm -rf dev && parcel src/parcel.urls --no-hmr --out-dir dev --public-url ./",
"build": "rm -rf .cache && rm -rf dist && parcel build src/parcel.urls --out-dir dist --public-url ./"
},
"alias": {
"jquery": "./src/jquery.js"
}
}
Create these files inside your theme’s directory
- src
- backend
- js
- main.js (leer)
- scss
- main.scss (leer)
- js
- frontend
- js
- main.js (leer)
- scss
- main.scss (leer)
- js
- jquery.js
- parcel.urls
- backend
jquery.js
jquery.js
javascript
// This file will ensure that parcel doesn't bundle it's
// own version of jQuery and your JS uses WordPress'
// default jQuery
module.exports = window.jQuery;
parcel.urls
parcel.urls
# Frontend
backendJS: backend/js/main.js
backendCSS: backend/scss/main.scss
# Backend
frontendJS: frontend/js/main.js
frontendCSS: frontend/scss/main.scss
functions.php
functions.php
php
<?php
// This code enqeues the assets that parcel generates
// for front- and backend
function parcel_assets_path($filename = '', $public = false)
{
$base = $public ? get_template_directory_uri() : get_stylesheet_directory();
return $base . '/' . (WP_DEBUG ? 'dev' : 'dist') . '/' . $filename;
}
function parcel_enqueue_resource($name, ...$args)
{
$jsonFileName = parcel_assets_path('parcel.json');
if (!is_readable($jsonFileName)) {
wp_die('I did not find /' . $jsonFileName . ', did you run <b>yarn install</b> && <b>yarn ' . (WP_DEBUG ? 'start' : 'build') . '</b>?');
}
$assets = json_decode(file_get_contents($jsonFileName));
if (!property_exists($assets, $name)) return;
$uri = parcel_assets_path($assets->$name, true);
if (substr($uri, -3, 3) === 'css') {
wp_enqueue_style($name, $uri, ...$args);
} else {
wp_enqueue_script($name, $uri, ...$args);
wp_localize_script($name, $name . '_parcel', ['baseUrl' => parcel_assets_path('', true)]);
}
}
add_action('wp_enqueue_scripts', function () {
parcel_enqueue_resource('frontendCSS');
parcel_enqueue_resource('frontendJS', ['jquery'], null, true);
});
add_action('admin_enqueue_scripts', function () {
parcel_enqueue_resource('backendCSS');
parcel_enqueue_resource('backendJS', ['jquery'], null, true);
});
Post-Meta
- Published: July 14, 2019
- Last modified: February 29, 2020
Comments