Basset 是一种加载 CSS 和 JS 资产的替代方法
上次更新于 作者 Cristian Tabacitu
现在是 2024 年,我要说 - 服务器端渲染正式回归
- 在 Laravel 中,Livewire 现在每天有 46.000 次安装
- 在 Ruby on Rails 中使用 Hotwire
- 在 Phoenix 中使用 Liveview
- 在 Web 开发领域中,使用 HTMX
现在“旧的已经成为新的”... 也许是时候重新审视我们从 Javascript 生态系统中采用的另一种做法了。也许是时候... 放弃构建步骤了?我明白,这听起来很疯狂!但在我关注的领域里,人们一直在谈论关于无构建的 Laravel 设置。并且人们始终在一个地方卡住 - “如果我们放弃 NPM,我们该如何处理 JS 依赖项?”。这是我的答案 - 或者至少是重要的第一步。
如果我们不使用像 NPM 这样的包管理器来安装 JS 依赖项并捆绑它们... 我们直接从 URL 加载它们怎么样? 你知道... 类似于 NodeJS 创始人自己在 Deno 中的做法。他公开表示 NPM 已经变得一团糟,并为 JS 生态系统创建了一个替代方案... 为什么我们不能为 Laravel 生态系统做同样的事情呢?
如果你梦想着那些简单的日子,你只需要使用 asset()
加载资产,那么试试 Basset - Laravel 的更好的资产助手。 你只需要用 basset()
替换 asset()
就能获得一些超级能力
- 来自 CDN 的资产会被下载到
/storage
并从那里提供服务; - 供应商资产可以被加载;
- 非公共资产可以被加载;
- 在请求期间,不可能重复加载资产;
简而言之,basset()
消除了 asset()
的限制,允许你安全地加载任何你想要的资产。这意味着除了以下操作之外
<link href="{{ asset('path/to/public/file.css') }}">
你可以安全地执行以下操作
<script src="{{ basset(storage_path('file.js')) }}"><script src="{{ basset(base_path('vendor/org/package/assets/file.js')) }}"><script src="{{ basset('https://cdn.com/path/to/file.js') }}">
这是一个非常简单的解决方案,适用于那些希望在他们的 Laravel 项目中“以旧的简单方式”加载资产的人,因为它解决了一些“旧方式”的问题
- 不想遇到 GDPR 问题?
- ✅ 已解决 - Basset 会将资产缓存到
/storage
并从那里提供服务。
- ✅ 已解决 - Basset 会将资产缓存到
- 不想依赖 CDN 的正常运行?
- ✅ 已解决 - 资产可以在部署时(或提交时)进行缓存。
- 不想在页面上使用多个组件时,两次加载同一个资产?
- ✅ 自动解决。
- 担心加载多个 JS 文件的性能是否优于单个大型捆绑包?
- ✅ 由
HTTP/2
解决,它可以高效地在一个页面上加载多个 Javascript 资产.
- ✅ 由
当然,Basset 可能不是完美的资产加载解决方案。至少不是对每个项目来说。它只存在了 12 个月,所以它缺少 importmaps 之类的东西,无法成为 NPM 和 Deno 方式的 1 对 1 替代方案。但它确实存在了 12 个月,并且已经证明了它的实用性。
也许... 是时候重新审视一下我们如何在 Laravel 项目中加载资产了。也许我们会发现简单的方法... 是一个好方法。至少对于一些项目来说。我建议你 试一下 Basset。毕竟
- 它已经投入生产一年了;
- 它由 Backpack 团队维护;
- 它已经获得了 110.000 次下载;
- 它采用 MIT 许可证;
如果你有任何反馈,请 在 Github 上提一个问题,并告诉团队。v2 很快就要发布,我们希望尽可能多地吸取反馈意见。