需修改 laravel 视图加载器以支持 .ssr.vue/.ssr.jsx:1. 在 appserviceprovider@boot 中注册后缀与编译器;2. 扩展 viewfinder 优先查找 ssr 文件;3. 覆盖 blade 编译器 iscompilable 逻辑避免误编译。

在 Laravel 项目中启用服务端渲染(SSR)时,Vue 或 React 的入口文件常以 .ssr.vue 或 .ssr.jsx 结尾,但默认 Blade 模板引擎只识别 .blade.php 后缀;若想让 Laravel 的视图加载器原生支持自定义后缀(如 .ssr.vue),必须修改底层视图解析逻辑,否则调用 view('home.ssr') 会直接报错“View [home.ssr] not found”。
注册新的视图后缀与编译器
第一步:在 App\Providers\AppServiceProvider 的 boot() 方法中注册新后缀和对应编译器。
打开 app/Providers/AppServiceProvider.php,在 boot() 方法内添加以下代码:
$this->app['view']->addExtension('ssr.vue', 'ssr'); $this->app['view']->addExtension('ssr.jsx', 'ssr');
第二步:绑定名为 ssr 的视图编译器,它负责将 .ssr.vue 文件内容原样返回(不编译),交由前端框架在 SSR 环境中处理。
继续在 boot() 中追加:
$this->app['view']->composer('*', function ($view) { if (str_ends_with($view->name(), '.ssr.vue') || str_ends_with($view->name(), '.ssr.jsx')) { $view->with('ssr_mode', true); } });
这一步确保所有匹配后缀的视图自动注入 ssr_mode 标识,便于后续判断渲染上下文。
重写 ViewFinder 定位逻辑
Laravel 默认只在 resources/views 下查找 .blade.php 文件,要支持 .ssr.vue,需扩展视图定位器,使其能识别并返回非 blade 后缀的物理路径。
创建 app/View/ExtendedViewFinder.php,继承 Illuminate\View\ViewFinder:
namespace App\View;use Illuminate\View\ViewFinder as BaseViewFinder;class ExtendedViewFinder extends BaseViewFinder { public function find($name) { $paths = $this->paths; $extensions = $this->extensions;
关键点在于:原始 find() 方法硬编码了 .blade.php 优先级,我们必须把 .ssr.vue 和 .ssr.jsx 插入到扩展名检测队列最前面,否则会被 blade 编译器抢先拦截并报错。
在构造函数或 find() 开头插入:
array_unshift($extensions, 'ssr.vue', 'ssr.jsx');
然后在 config/app.php 中替换默认 ViewFinder 实例:
'providers' => [ /* ... */, App\Providers\ViewServiceProvider::class ],
新建 app/Providers/ViewServiceProvider.php,在 register() 中绑定:
$this->app->bind('view.finder', function ($app) { return new \App\View\ExtendedViewFinder($app['files'], $app['config']['view.paths'], $app['config']['view.extensions']); });
禁用 Blade 编译器对 SSR 文件的误处理
方法一:在 config/view.php 的 extensions 数组中移除 'ssr.vue' => 'ssr' 对应项——但这会导致 addExtension() 失效,不可取。
方法二(推荐):在 App\Providers\AppServiceProvider@boot() 中覆盖 Blade 引擎的 isCompilable() 判断逻辑:
$bladeCompiler = $this->app['blade.compiler']; $originalIsCompilable = \Closure::bind(function ($path) { return \Str::endsWith($path, '.blade.php'); }, $bladeCompiler, $bladeCompiler);
$this->app->extend('blade.compiler', function ($compiler, $app) { $compiler->setExtension('ssr.vue', 'php'); return $compiler; });
【必须执行此步,否则 Laravel 仍会尝试用 Blade 编译器解析 .ssr.vue 文件,导致语法错误】
最后,在 resources/views/home.ssr.vue 中写入标准 Vue SSR 入口模板,例如包含 <div id="app"></div> 和 window.__INITIAL_STATE__ 注入逻辑。











