6

我找不到太多关于 Yii 的 AssetManager 管理 JS 和 CSS 文件的信息。我的问题是使用 AssetManager 有什么意义?我不确定它为我的开发过程增加了什么价值,事实上,它似乎使我的代码复杂化......每次我更改我的脚本或 css 代码时,我都必须进入并删除我的资产文件夹以确保我有最新版本。

似乎将所有 Javascript 文件放在 /webroot/js/ 下并使用标签加载文件而不是通过 AssetManager 的麻烦来简单得多。另外,Yii 的 registerCoreScript 函数总是将脚本标签放在头标签内,而不是像 YSlow 推荐的那样将它们放在代码底部,靠近正文结束标签。

我想我对 Yii 的 AssetManager 的理解肯定有差距。有人知道为什么使用 AssetManager 比在 PHP 代码中硬编码脚本标签更好吗?我有点困惑……

谢谢!

4

3 回答 3

23

我敢肯定有人能比我更好地回答这个问题,但基本上是为了让您的JS 和 CSS 文件可以保留在您的 Protected 文件夹中。

一方面这更安全一些,但对我来说主要的好处是您可以使用资产发布系统压缩和缩小以及以其他方式处理您的资产,并且它可以更轻松地将您的 JS 和 CSS 托管在 CDN 上,因为它是与您的代码库分开。

另外,这是qiang (写Yii的人)对此的官方回应。

于 2010-09-03T18:36:18.093 回答
8

Yii 资产管理器的主要好处是它允许您以独立的方式构建组件

一个小部件的故事

考虑一个作为 UI 小部件的组件。假设发行版包括几个资产以及组件实现,例如这些文件:

SuperWidget.php
superwidget.css
superwidget.js
image_for_css.png

考虑如果资产管理器不存在,您将如何将此小部件合并到您的应用程序中。典型的步骤可能包括:

  1. 复制目录SuperWidget.php内的某处protected/
  2. 复制superwidget.js到你的js/目录
  3. 复制superwidget.css到你的css/目录
  4. 复制image_for_css.png到您的images/目录或内部css/以帮助减少相对路径依赖性

然后在运行时 SuperWidget 会发出适当的标签来包含 CSS 和 JavaScript;要做到这一点,它需要知道您将这些资产放在哪里。换句话说:关于安装的一些选择可以任意做出,但是除非你去编辑源代码,否则它们是一成不变的

小部件是否可重复使用?

如果这个小部件是高度定制的,并且意味着成为您的应用程序不可分割的一部分,那么这种方法可以正常工作,并且不需要资产管理器。但是,如果它是您想要分发的广泛有用的组件怎么办?

问题开始出现。

首先,我们检查过的部署方案要求小部件的用户将不同的文件复制到不同的目录中,这使安装过程复杂化并增加了出错的机会。

但更大的问题是您的部署方案可能与独立于您开发的任何其他组件的部署方案相冲突。如果其他人也决定有一个superwidget.js文件怎么办?

如果这两个组件的安装说明发生冲突,那么显然其中一个组件无法按预期安装,然后您需要更改一些细节并破解组件的源代码以适应这些更改。如果您稍后升级到该组件的较新版本,您将被迫仔细考虑您的自定义,从而无法进行“复制/覆盖”升级。

所有这一切都不是很漂亮,虽然它在实践中不太可能发生,但它肯定感觉不对。

资产经理,做到这一点

这就是资产管理器的用武之地。假设您决定像这样构建组件:

superwidget/
  SuperWidget.php
  assets/
    css/
      superwidget.css
    js/
      superwidget.js
    images/
      image_for_css.png

protected/无论您安装了哪些其他组件,您都可以直接将其复制到目录中的某个位置;superwidget/这里可能发生的最糟糕的事情是,如果发生冲突,您必须重命名为其他名称。

使用资产管理器,SuperWidget.php 发布整个superwidget/assets/目录,副本最终位于例如你的应用程序的基本资产路径在assets/1337c0de/哪里,是由 Yii 创建的随机散列,并保证不会与任何其他已发布的资产冲突。assets/1337c0de/

这意味着 SuperWidget 的资产不可能与任何其他组件的资产发生冲突,从而使 SuperWidget 真正可重用。而且由于里面的目录结构1337c0de/和你的发行版中的一样,CSS可以使用相对路径来引用图像,../images/而不需要引用随机散列的值(只有发布后才知道)。

资产管理者不是什么

  • 这不是提高安全性的方法。无论如何,您的组件源都将在内部某处protected/(因此那里没有改进),并且无论它们最终被复制到哪里,资产都需要可通过网络访问(无论如何它们都没有安全性)。
  • 它不是处理资产的包罗万象的解决方案(例如缩小 CSS)。虽然可以安装一个自定义资产管理器来执行此操作,但不要忘记包含在可重用组件中的资产将在所有“基础应用程序”资产中占一小部分;如果你想全面缩小,你还必须处理其他所有事情,资产管理器不会帮助你。

TL;博士

资产管理器允许您制作易于分发的组件,并且可以包含在应用程序中,而不必担心与其他组件产生冲突。

于 2012-10-18T12:58:13.317 回答
2

我喜欢资产管理器的另一个好处是,它允许您更新资产文件,而无需告诉您的用户清除他们的缓存。

http://www.yiiframework.com/wiki/311/assetmanager-clearing-browser-s-cache-on-site-update/

于 2013-05-10T14:57:40.120 回答