如果有大致做过Odoo开发调试的小伙伴都会发现,在odoo运行时,非调试模式下,js和css内容都是经过了合并、压缩的几个文件,与原来开发模块中的资源文件并不相同。如果需要调试自己写的前端代码,首先需要切换到debug模式下,才能正常显示原模块下的资源内容。
那这个功能是怎么实现的呢,我们来追踪一下执行的源代码,大致来看一下处理过程。
在登入Odoo系统时,会执行到如下的路由控制,前面的选择数据库、登录我们就跳过了,直接看下面关键,系统会渲染模板'web.webclient_bootstrap'到前端显示,于是我们就去web模块中找到这个名称的模板。

在addons\web\views\webclient_templates.xml中找到下图所示的模板定义,

这里分别加载了四个不同类型的资源文件,两个js,两个css。其中这里用到了一个特殊的qweb属性t-call-assets,这个属性表示将后面名称对应的模板进行汇总/压缩。其中web.assets_开头的四个名称在这个xml中也可以找到,我们随便找一个看看,大致内容如下图:

这四个模版都正常的html语法,加载js、css等资源文件。然后我们根据前面的渲染方法,顺藤摸瓜找到odoo\addons\base\models\ir_qweb.py中,如下图所示的处理方法,该方法是专用处理t-call-assets属性标签的。

该方法会将此标签对应的模板执行_get_asset_nodes方法,我们再看看_get_asset_nodes内容,如下图:

这里调用了odoo\addons\base\models\assetsbundle.py中的AssetsBundle对象,大家看此对象的源码,就可以了解这是一个压缩js,css的工具。这里会判断参数debug,如果不是debug状态,则会执行汇总/压缩,如果是debug状态,则还是按原格式输出。




