prestashop给我们提供了一种比较好的思路,实现动态资源文件合并,对于需要频繁变动的网站或者是非技术人员建立的网站还是很有帮助的。减少CSS/JS文件的加载次数,可提高页面的载入速度,搜索引擎也会把页面包含CSS/JS文件的个数作为网站质量评分的一个参考项。所以,减少页面中的资源文件数目是网站开发中不得不考虑的一项。一般而言,我们都会在项目接近尾声的时候手工合并、精简资源文件。这个方法对于变动不多的网站操作较为方便,但对于频繁变更的网站则有些繁琐。
1. 在prestashop的后台“高级参数” -> “性能”中有两个选项,“用于CSS的智能Cache"和”用于Javascript的智能Cache”分别控制CSS和JS文件的合并
点击“保存”按钮,参数的变更会提交到AdminPerformanceController.php模块,由于这是一个异步提交,按照prestashop的规范,请求在postProcess()中处理。获取到变更的参数后保存在数据库ps_configuration表中。至此,配置完成
2. 为了更好理解合并功能的实现,有必要略微了解一点prestashop Controller的运行顺序
Execution order of the controller's functions
__contruct(): Sets all the controller's member variables.
init(): Initializes the controller.
setMedia() or setMobileMedia(): Adds all JavaScript and CSS specifics to the page so that they can be combined, compressed and cached (see prestashopShop's CCC tool, in the back-office "Performance" page, under the "Advanced preferences" menu).
postProcess(): Handles ajaxProcess.
initHeader(): Called before initContent().
initContent(): Initializes the content.
initFooter(): Called after initContent().
display() or displayAjax(): Displays the content.
如上摘自prestashop帮助文件,可以看到前面提到的postProcess()在这里有描述,ajax请求应在此处处理。同时,这里还提到了为了便于CSS/JS的合并,资源文件的指定应放在setMedia()或setMobileMedia()中。
3. 资源文件合并的具体实现
以为是用了某个Hook在实现资源文件合并的,打印了所有的Hook可能的操作,也没有找到。包括在SetMedia()结尾调用的Hook::exec('actionFrontControllerSetMedia', array());看起来是那么的像干这个事情的样子,结果这东西是空的,没有任何作用,仅仅是埋伏的种子而已~
按着FrontController.php的执行顺序挨个查看,最终在display()中找到了合并的具体代码。这里一上来就检查PS_CSS_THEME_CACHE和PS_JS_THEME_CACHE两个参数。而这两个参数即为后台“用于CSS的智能Cache"和”用于Javascript的智能Cache”对应的开关名称。然后调用了Media类对文件进行具体的合并工作,并使用合并后的文件路径替换掉在setMedia()中指定的一串资源文件路径。
也许是孤陋寡闻,prestashop实现资源文件合并的思路非常有意思,避免了程序员亲自动手来做这些工作。当然,这样做可能对访问速度会有一点点的牺牲,每次访问网站的时候都需要检查下有没有合并的资源文件,是不是最新。。。
(责任编辑:好模板) |