Yii的AssetManager有什么意义?

时间:2010-09-02 10:13:23

标签: php yii

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

似乎将所有Javascript文件放在/ webroot / js /下更简单,只需使用标签加载文件而不是经历AssetManager的麻烦。另外,Yii的registerCoreScript函数总是将脚本标记放在标题标记内,而不是按照YSlow的建议将它们放在代码的底部,靠近结束标记。

我认为我对Yii的AssetManager的理解肯定存在差距。任何人都有任何想法为什么使用AssetManager比在PHP代码中硬编码脚本标签更好?我有点困惑......

谢谢!

3 个答案:

答案 0 :(得分:23)

我确信有人可以比我更好地回答这个问题,但基本上你的 JS和CSS文件可以保留在受保护的文件夹中。

这对于一件事情来说更安全,但对我来说主要的好处是你可以使用资产发布系统压缩和缩小和处理你的资产,这使得它更容易将您的JS和CSS托管在CDN上,因为它与您的代码库是分开的。

此外,这是一个official response from qiang(写Yii的人)。

答案 1 :(得分:7)

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

小部件的故事

考虑一个UI小部件的组件。让我们假设分发包括一些资产以及组件实现,例如这些文件:

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

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

  1. SuperWidget.php目录
  2. 内的某处复制protected/
  3. superwidget.js复制到您的js/目录
  4. superwidget.css复制到您的css/目录
  5. image_for_css.png复制到images/目录,或者也可能复制到css/内,以帮助减少相对路径依赖关系
  6. 然后在运行时,SuperWidget将发出适当的标签以包含CSS和JavaScript; 为此,需要知道您将这些资产放在何处。换句话说:关于安装的一些选择可以任意进行,但是除非你去编辑源,否则它们会被设置在一起。

    窗口小部件是否可重用?

    如果这个小部件是高度自定义的并且是应用程序不可分割的一部分,那么这种方法可以正常工作,并且不需要拥有资产管理器。但是如果它是一个你想要分发的广泛有用的组件呢?

    问题开始出现。

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

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

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

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

    资产经理,这样做

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

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

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

    使用资产管理员SuperWidget.php publishes整个superwidget/assets/目录,副本最后为例如assets/1337c0de/ assets/其中1337c0de/是您的应用程序的基本资产路径,1337c0de/是由Yii创建的随机哈希,并保证不与任何其他已发布资产冲突。

    这意味着SuperWidget 的资产不可能与任何其他组件的资产冲突,使SuperWidget真正可重用。由于../images/中的目录结构与您的发行版中的目录结构相同,因此CSS可以使用相对路径protected/引用图像,而无需引用随机哈希的值(仅知道出版后)。

    资产经理不是什么

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

    TL; DR

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

答案 2 :(得分:2)

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

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