最简单且更便携的方法是包含与特定模式匹配的所有文件,例如 /components/component1/header.css
这会带来两个并发症。一是性能(您需要检查所有组件的所有目录)。另一个是组件的隔离,即,如果您需要将给定的 CSS 包含在另一个可能存在或不存在的 CSS 之前或之后,会发生什么?
您可以尝试通过在每个组件中包含一个“清单”来解决这两个问题,它可以首先指定任何文件的位置以及它们应该包含的位置。然后你的处理被简化为检查“组件”目录并解码所有清单,并在一系列指令向量中“编译”它(例如 $CSSToBeIncludedInThisOrder[] )。您还可以将编译后的对象序列化为缓存文件。当然,对组件的任何更改都应包括删除已编译的元清单。
稍后,您可能会在清单指令中包含条件优先级等。
所有这一切都应该在任何东西发送到客户端浏览器之前完成(如果组件 ZZZ 希望改变 ob_ 状态,或者可能是编码,或者是一个下载覆盖组件并且想要发送一个 Content-Type 的 application/octet-stream ?),但“编译”应该允许保持较低的感知延迟。
所以让我澄清一下:
1. index.php checks whether a metamanifest.cache file exists.
2. If it does, it runs something like
$__META = unserialize(file_get_contents($METACACHE));
and goes on to #4.
3. If it does not, opendirs/readdirs the components directory,
looks what files are there, decides (but does not do yet) what to do with them,
placing those decisions in $__META, e.g. $__META['HeaderJS'][].
4. Now HTML generation begins: the __META array is walked and everything that
needs doing gets done (headers, inclusion of JS in heads, etc.).
阶段 #3 甚至可能执行一些重复检查或版本控制,比如你有两个组件都需要包含“jQuery.js”;系统可以声明冲突或决定通过仅包括其中之一,从而进一步减少处理时间。