作为 laravel 开发者,你是否也曾为前端资源的管理而烦恼?
在日常开发中,我们经常需要引入各种 CSS 和 JavaScript 库。传统的做法无非几种:
-
手动发布到
public
目录: 对于一些第三方包的资源,我们可能需要运行php artisan vendor:publish
。这不仅意味着public
目录会被各种包的资源占据,增加了项目体积,而且每次更新包后都可能需要重新发布,繁琐且容易遗漏。 - 使用构建工具: 对于大型项目,Webpack、Vite 等构建工具无疑是最佳选择。但对于那些只需要引入少量 CSS/JS 的小型或中型项目来说,引入一套复杂的构建流程,配置各种 loader 和 plugin,无疑是杀鸡用牛刀,增加了不必要的学习和维护成本。
- CDN 引用: 直接从 CDN 引用资源看似简单,但一旦 CDN 出现问题,或者项目需要在离线环境下运行,就会导致页面样式或功能失效,缺乏稳定性。
-
重复加载的困扰: 即使 Laravel 提供了
@once
指令来避免同一 Blade 文件中的资源被重复加载,但如果同一个 JS 文件被不同的 Blade 组件(例如,一个card
组件和一个modal
组件)所引用,且这两个组件同时出现在一个页面上,那么这个 JS 文件仍然会被重复加载,白白浪费用户的带宽和浏览器渲染资源。
这些问题,都指向了一个核心痛点:在 Laravel 中,我们缺少一种简单、智能、高效的前端资源管理方案。
救星驾到:Backpack Basset 助你化繁为简
正当我为这些问题焦头烂额时,Backpack Basset 走进了我的视野。它是一个为 Laravel 10+ 设计的 Composer 包,承诺以“死简单”的方式解决前端资源加载的痛点,确保每个资源在页面上只加载一次,并且可以从任何地方加载资源,而不仅仅是
public目录。
第一步:引入 Composer 依赖
立即学习“前端免费学习笔记(深入)”;
Basset 作为 Laravel 的一个扩展包,自然是通过 Composer 来管理和安装的。Composer 是 PHP 生态中不可或缺的包管理工具,它让我们可以轻松地声明、安装和更新项目所需的第三方库。通过 Composer,Basset 及其所有依赖项都能被自动处理,避免了手动下载和配置的麻烦。
在你的 Laravel 项目根目录下,运行以下命令:
composer require backpack/basset php artisan basset:install
这两行命令,第一行通过 Composer 下载并安装 Basset 包,第二行则运行 Basset 的安装命令,它会帮助你完成一些初始配置,例如创建
storage目录的软链接,这是 Basset 内部化资源所必需的。
Basset 如何解决问题?
Basset 的核心思想是“内部化 (internalize)”资源。无论你的资源来自 CDN、
vendor目录、
storage目录,甚至是本地的某个非公开路径,Basset 都会将它下载或复制到
storage/app/public/bassets目录下,然后将这个新的公共路径输出到你的 HTML 中。这意味着:
- CDN 资源本地化: 解决了 CDN 不稳定或离线环境的问题。
-
非公开资源可访问: 你可以直接引用
vendor
目录下的 JS/CSS,无需vendor:publish
。 -
统一管理: 所有由 Basset 处理的资源都集中在
storage/app/public/bassets
,便于管理。
Basset 的使用方式:
Basset 提供了两种主要的使用方式:
basset()辅助函数和
@basset()Blade 指令。
-
basset()
辅助函数: 它与 Laravel 自带的asset()
函数类似,但功能更强大,可以直接指向非public
路径或外部 URL。{{-- 引用公共目录下的文件 (与 asset() 相同) --}} {{-- 引用 CDN 上的文件 --}} {{-- 引用 vendor 目录下的文件 --}} {{-- 引用 storage 目录下的文件 --}} -
@basset()
Blade 指令: 对于常见的 CSS、JS、图片等资源,Basset 甚至无需你手动编写 HTML 标签,它会根据文件类型自动生成。更重要的是,它确保这些资源在整个页面生命周期中只被加载一次,完美解决了@once
指令无法跨组件去重的问题。{{-- 自动生成










