Laravel使用Mix时如何渲染带资源版本号的Blade模板为HTML
Blade视图调用render()时mix()生成的资源路径不带版本号的解决方法
首先确认基础配置是否正确:
- 检查
webpack.mix.js配置,必须调用.version()方法才会生成资源版本hash:
// webpack.mix.js const mix = require('laravel-mix'); mix.js('resources/js/app.js', 'public/js') .css('resources/css/app.css', 'public/css') .version(); // 开启版本号生成
- 执行前端生产构建命令,生成带版本映射的manifest文件:
npm run production
构建完成后检查public/mix-manifest.json,文件内容需要包含带hash后缀的资源映射,示例格式如下:
{ "/css/app.css": "/css/app.css?id=0adb49f1f26bc78ba1d8", "/js/app.js": "/js/app.js?id=8f2d9ac7e12b3f09cd4e" }
如果上述配置确认无误,渲染后还是没有版本号,按以下场景处理:
- 框架内(控制器/队列/自定义命令)调用render无版本号
mix()辅助函数内部会缓存已解析的资源路径,如果在manifest生成前就调用过mix(),会直接返回无版本号的缓存结果,先清空Mix内部缓存再渲染即可:
// 清空Mix已缓存的manifest解析结果 app('mix')->flushManifest(); // 渲染视图 $html = view('home')->render();
- 非HTTP上下文(CLI脚本/定时任务)调用render无版本号
这类场景下框架未初始化HTTP请求上下文,Mix无法正确识别资源根路径,需要提前配置请求参数后再渲染:
// 加载应用基础配置 config(['app.url' => env('APP_URL', 'http://localhost')]); // 模拟HTTP请求的脚本入口,设置web根路径 request()->server->set('SCRIPT_NAME', '/index.php'); // 清空缓存 app('mix')->flushManifest(); // 渲染视图 $html = view('home')->render();
注意:本地开发执行
npm run dev时默认不会生成版本号,只有执行生产构建或显式开启.version()配置时才会输出带hash的资源路径。
内容的提问来源于stack exchange,提问作者Vincent Nguyen
相关产品推荐
相关产品推荐

