在 symfony 8.2 中,默认情况下 `importmap.php` 会预加载所有已注册的资源,无法直接通过配置只加载当前页面用到的资源。要实现按需加载,需要手动管理资产清单或使用 php 代码动态构建 importmap 标签,仅输出当前路由或控制器所需的脚本和样式。

如何根据当前路由动态生成 Importmap 标签
可以通过创建一个自定义的 Twig 扩展或服务,在渲染时检查当前请求的路由,并从完整的 importmap 列表中筛选出对应的资源。这种方法避免了加载无关资源,减少了 HTTP 请求数量。

<?php namespace App\Service;
use Symfony\Component\HttpFoundation\RequestStack;
class DynamicImportMapService
{
private array $fullImportMap;
private RequestStack $requestStack;
public function __construct(array $fullImportMap, RequestStack $requestStack)
{
$this->fullImportMap = $fullImportMap;
$this->requestStack = $requestStack;
}
public function getActiveImports(): array
{
$request = $this->requestStack->getCurrentRequest();
if (!$request) {
return [];
}
$route = $request->attributes->get('_route');
// 假设有一个映射表,将路由名映射到需要的资源
$routeToResources = [
'dashboard' => ['vendor.js', 'dashboard.css'],
'profile' => ['vendor.js', 'profile.js'],
];
return $routeToResources[$route] ?? [];
}
}
如何在 Twig 模板中集成动态 Importmap
在 Twig 模板中调用上述服务,获取当前页面所需的资源列表,并手动生成 <script type="</p"> </script>











