mirror of
https://github.com/flarum/core.git
synced 2025-08-16 21:34:08 +02:00
performance(frontend): Preload FontAwesome, JS and CSS (#3057)
* Add preloads support to Document class * Add frontend extender for asset preloading * Provide default preloads for FontAwesome * Add tests for preload extender and default preloads * Apply fixes from StyleCI [ci skip] [skip ci] * Fix typo * Fix two more typos 🙃 * Preload core JS and CSS * Apply fixes from StyleCI [ci skip] [skip ci] * Reorder preloads * Remove singular preloads method * Use filesystem disk driver for getting FA font paths * Update test to use full URL * Apply fixes from StyleCI [ci skip] [skip ci] * Address review comment * Apply fixes from StyleCI [ci skip] [skip ci] * Fix typo * Apply fixes from StyleCI [ci skip] [skip ci] * Correct callback wrapping * Update src/Extend/Frontend.php Co-authored-by: Sami Mazouz <sychocouldy@gmail.com> * Update src/Extend/Frontend.php Co-authored-by: Sami Mazouz <sychocouldy@gmail.com> * Update src/Extend/Frontend.php * Fix preload extender logic * Convert base FontAwesome preloads into a Singleton * Apply fixes from StyleCI [ci skip] [skip ci] Co-authored-by: luceos <luceos@users.noreply.github.com> Co-authored-by: Sami Mazouz <sychocouldy@gmail.com> Co-authored-by: Alexander Skvortsov <38059171+askvortsov1@users.noreply.github.com> Co-authored-by: Alexander Skvortsov <sasha.skvortsov109@gmail.com>
This commit is contained in:
@@ -16,6 +16,7 @@ use Flarum\Foundation\ContainerUtil;
|
||||
use Flarum\Foundation\Event\ClearingCache;
|
||||
use Flarum\Frontend\Assets;
|
||||
use Flarum\Frontend\Compiler\Source\SourceCollector;
|
||||
use Flarum\Frontend\Document;
|
||||
use Flarum\Frontend\Frontend as ActualFrontend;
|
||||
use Flarum\Frontend\RecompileFrontendAssets;
|
||||
use Flarum\Http\RouteCollection;
|
||||
@@ -33,6 +34,7 @@ class Frontend implements ExtenderInterface
|
||||
private $routes = [];
|
||||
private $removedRoutes = [];
|
||||
private $content = [];
|
||||
private $preloadArrs = [];
|
||||
|
||||
/**
|
||||
* @param string $frontend: The name of the frontend.
|
||||
@@ -124,11 +126,45 @@ class Frontend implements ExtenderInterface
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds multiple asset preloads.
|
||||
*
|
||||
* The parameter should be an array of preload arrays, or a callable that returns this.
|
||||
*
|
||||
* A preload array must contain keys that pertain to the `<link rel="preload">` tag.
|
||||
*
|
||||
* For example, the following will add preload tags for a script and font file:
|
||||
* ```
|
||||
* $frontend->preloads([
|
||||
* [
|
||||
* 'href' => '/assets/my-script.js',
|
||||
* 'as' => 'script',
|
||||
* ],
|
||||
* [
|
||||
* 'href' => '/assets/fonts/my-font.woff2',
|
||||
* 'as' => 'font',
|
||||
* 'type' => 'font/woff2',
|
||||
* 'crossorigin' => ''
|
||||
* ]
|
||||
* ]);
|
||||
* ```
|
||||
*
|
||||
* @param callable|array $preloads
|
||||
* @return self
|
||||
*/
|
||||
public function preloads($preloads): self
|
||||
{
|
||||
$this->preloadArrs[] = $preloads;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function extend(Container $container, Extension $extension = null)
|
||||
{
|
||||
$this->registerAssets($container, $this->getModuleName($extension));
|
||||
$this->registerRoutes($container);
|
||||
$this->registerContent($container);
|
||||
$this->registerPreloads($container);
|
||||
}
|
||||
|
||||
private function registerAssets(Container $container, string $moduleName): void
|
||||
@@ -236,6 +272,25 @@ class Frontend implements ExtenderInterface
|
||||
);
|
||||
}
|
||||
|
||||
private function registerPreloads(Container $container): void
|
||||
{
|
||||
if (empty($this->preloadArrs)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$container->resolving(
|
||||
"flarum.frontend.$this->frontend",
|
||||
function (ActualFrontend $frontend, Container $container) {
|
||||
$frontend->content(function (Document $document) use ($container) {
|
||||
foreach ($this->preloadArrs as $preloadArr) {
|
||||
$preloads = is_callable($preloadArr) ? ContainerUtil::wrapCallback($preloadArr, $container)($document) : $preloadArr;
|
||||
$document->preloads = array_merge($document->preloads, $preloads);
|
||||
}
|
||||
});
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
private function getModuleName(?Extension $extension): string
|
||||
{
|
||||
return $extension ? $extension->getId() : 'site-custom';
|
||||
|
Reference in New Issue
Block a user