資產?
在Odoo中管理資產并不像其他應用程序那樣直截了當。其中一個原因是我們有各種情況,其中一些資產是必需的,但不是全部。例如,Web客戶端、銷售點應用程序、網站甚至移動應用程序的需求是不同的。此外,有些資產可能很大,但很少需要使用:在這種情況下,我們可能希望它們是 按需懶加載 。
資產類型?
有三種不同的資產類型:代碼( js
文件),樣式( css
或 scss
文件)和模板( xml
文件)。
- 代碼
Odoo支持 三種不同類型的javascript文件 。所有這些文件都會被處理(本地JS模塊會被轉換為Odoo模塊),然后被壓縮(如果不在
debug=assets
模式 中),最后被合并。結果會被保存為文件附件。這些文件附件通常通過在頁面的<head>
部分中使用<script>
標簽(作為靜態文件)來加載。- 樣式
樣式可以使用
css
或 scss 進行處理。與javascript文件一樣,這些文件會被處理(scss
文件會被轉換為css
),然后被壓縮(如果不在debug=assets
模式 中),最后被合并。結果會被保存為文件附件。通常它們會通過在頁面的<head>
部分使用<link>
標簽(作為靜態文件)進行加載。- 模板
模板(靜態的
xml
文件)的處理方式不同:它們只是在需要時從文件系統中讀取并連接。每當瀏覽器加載Odoo時,它會調用
/web/webclient/qweb/
控制器來獲取 模板 。
了解在大多數情況下,瀏覽器只在第一次加載頁面時執行請求是很有用的。這是因為每個資源都與校驗和相關聯,該校驗和被注入到頁面源代碼中。然后將校驗和添加到URL中,這意味著可以安全地將緩存頭設置為長時間。
捆綁包?
Odoo資產按 捆綁包 分組。每個捆綁包(特定類型的 xml
、 js
、 css
或 scss
的 文件路徑列表 )在 模塊清單 中列出??梢允褂?`glob<https://en.wikipedia.org/wiki/Glob_(programming)>`_語法聲明文件,這意味著您可以使用一行聲明多個資產文件。
每個模塊的 __manifest__.py
中都定義了 bundle,其中有一個專門的 assets
鍵,包含一個字典。該字典將 bundle 名稱(鍵)映射到它們包含的文件列表(值)。它看起來像這樣:
'assets': {
'web.assets_backend': [
'web/static/src/xml/**/*',
],
'web.assets_common': [
'web/static/lib/bootstrap/**/*',
'web/static/src/js/boot.js',
'web/static/src/js/webclient.js',
],
'web.qunit_suite_tests': [
'web/static/src/js/webclient_tests.js',
],
},
以下是大多數Odoo開發人員需要了解的一些重要的捆綁包列表:
web.assets_common
: 這個 bundle 包含了大部分 web 客戶端、網站和銷售點共用的資源。這個 bundle 應該包含 odoo 框架的低級構建塊。請注意,它包含了定義 odoo 模塊系統的boot.js
文件。web.assets_backend
: 此捆綁包包含特定于Web客戶端的代碼(特別是Web客戶端/操作管理器/視圖)web.assets_frontend
: 這個 bundle 包含了所有與公共網站相關的內容: 電子商務、門戶、論壇、博客等。web.assets_qweb
: 所有在后端環境和銷售點中使用的靜態XML模板。web.qunit_suite_tests
: 所有 JavaScript QUnit 測試代碼(測試、幫助程序、模擬)web.qunit_mobile_suite_tests
: 移動端專用的 QUnit 測試代碼
操作?
通常,處理資產很簡單:您只需要將一些新文件添加到常用的捆綁包中,例如 assets_common
或 assets_backend
。但是,還有其他操作可用于涵蓋一些更特定的用例。
請注意,所有針對特定資產文件的指令(即 before
、 after
、 replace
和 remove
)都需要事先聲明該文件,無論是在更高層次的清單中還是在具有較低序列的 ir.asset
記錄中。
append
?
此操作添加一個或多個文件。由于這是最常見的操作,因此可以通過簡單地使用文件名來完成:
'web.assets_common': [
'my_addon/static/src/js/**/*',
],
默認情況下,將簡單字符串添加到包中將在包的末尾添加與 glob 模式匹配的文件。顯然,該模式也可以直接是單個文件路徑。
prepend
?
在捆綁包的開頭添加一個或多個文件。
當您需要在捆綁包中將某個文件放在其他文件之前時很有用(例如使用css文件)。使用以下語法調用“prepend”操作: ('prepend', <path>)
。
'web.assets_common': [
('prepend', 'my_addon/static/src/css/bootstrap_overridden.scss'),
],
before
?
在特定文件之前添加一個或多個文件。
在捆綁包的開頭添加文件可能不夠精確??梢允褂?before
指令將給定的文件添加到目標文件的 前面 。它通過將普通路徑替換為 3 元組 ('before', <target>, <path>)
來聲明。
'web.assets_common': [
('before', 'web/static/src/css/bootstrap_overridden.scss', 'my_addon/static/src/css/bootstrap_overridden.scss'),
],
after
?
在特定文件后添加一個或多個文件。
與 before
相同,但匹配的文件將會在目標文件之后添加。通過使用 3 元組 ('after', <target>, <path>)
來聲明。
'web.assets_common': [
('after', 'web/static/src/css/list_view.scss', 'my_addon/static/src/css/list_view.scss'),
],
include
?
使用嵌套包。
include
指令是在其他包中使用包以最小化清單大小的一種方式。在 Odoo 中,我們使用子包(按慣例以下劃線為前綴)批量處理在多個其他包中使用的文件。您可以像這樣指定子包作為一對 ('include', <bundle>)
:
'web.assets_common': [
('include', 'web._primary_variables'),
],
remove
?
刪除一個或多個文件。
在某些情況下,您可能想要從捆綁包中刪除一個或多個文件。 這可以通過使用 remove
指令并指定一對 ('remove', <target>)
來完成:
'web.assets_common': [
('remove', 'web/static/src/js/boot.js'),
],
replace
?
用一個或多個文件替換資產文件。
假設一個資產不僅需要被刪除,而且您還想在完全相同的位置插入新版本的該資產。這可以使用“replace”指令完成,使用3元組 ('replace', <target>, <path>)
:
'web.assets_common': [
('replace', 'web/static/src/js/boot.js', 'my_addon/static/src/js/boot.js'),
],
加載順序?
資產加載的順序有時非常關鍵,必須是確定性的,主要是為了樣式表優先級和設置腳本。Odoo中的資產處理如下:
當調用資產包時(例如
t-call-assets="web.assets_common"
),將生成一個空資產列表。所有與該捆綁包匹配的
ir.asset
類型的記錄都會被獲取并按序列號排序。然后,所有序列號嚴格小于16的記錄都會被處理并應用于當前資產列表。所有在其清單中聲明資產的模塊都將其資產操作應用于此列表。這是按照模塊依賴關系的順序完成的(例如,“web”資產在“網站”之前處理)。如果指令嘗試添加已經存在于列表中的文件,則不會對該文件執行任何操作。換句話說,列表中只保留文件的第一次出現。
剩余的
ir.asset
記錄(序列大于或等于16的記錄)也將被處理并應用。
在清單中聲明的資源可能需要按特定順序加載,例如在加載lib文件夾時,必須先加載 jquery.js
,然后再加載所有其他jquery腳本。一種解決方案是創建一個具有較低序列或“prepend”指令的 ir.asset 記錄,但還有另一種更簡單的方法。
由于資產列表中每個文件路徑的唯一性是有保證的,因此您可以在包含它的通配符之前提到任何特定文件。因此,該文件將出現在所有包含在通配符中的其他文件之前。
'web.assets_common': [
'my_addon/static/lib/jquery/jquery.js',
'my_addon/static/lib/jquery/**/*',
],
注解
一個模塊 b 移除/替換模塊 a 中聲明的資源將必須依賴于它。嘗試操作尚未聲明的資源將導致錯誤。
延遲加載?
有時動態加載文件和/或資源包是很有用的,例如只在需要時加載庫。為此,Odoo框架提供了一些輔助函數,位于 @web/core/assets
中。
await loadAssets({
jsLibs: ["/web/static/lib/stacktracejs/stacktrace.js"],
});
- loadAssets(assets)?
- 參數
assets (
Object()
) – 描述應該加載的各種資源
- 返回
Promise<void>
加載由
assets
參數描述的資源。它是一個對象,可能包含以下鍵:鍵
類型
描述
jsLibs
string[]
JavaScript文件的URL列表
cssLibs
string[]
CSS文件的URL列表
- useAssets(assets)?
- 參數
assets (
Object()
) – 描述應該加載的各種資源
當組件需要在其
onWillStart
方法中加載某些資源時,此鉤子非常有用。它內部調用了loadAssets
。
資產模型 ( ir.asset
)?
在大多數情況下,清單中聲明的資產將基本足夠。但是為了更靈活,框架還支持在數據庫中聲明的動態資產。
這可以通過創建 ir.asset
記錄來完成。這些記錄將被處理,就像它們在模塊清單中被發現一樣,并且它們具有與其清單對應項相同的表現力。
- class odoo.addons.base.models.ir_asset.IrAsset(env, ids, prefetch_ids)[源代碼]?
這個模型對兩個方面做出了貢獻:
1. It provides a function returning a list of all file paths declared in a given list of addons (see _get_addon_paths);
2. It allows to create ‘ir.asset’ records to add additional directives to certain bundles.
name
資產記錄的名稱(用于識別目的)。
bundle
應用該資產的捆綁包。
directive
(默認值為append
)此字段確定如何解釋
path
(如果需要,還包括target
)。以下是可用指令的列表以及它們所需的參數:append :
path
prepend :
path
before :
target
,path
after :
target
,path
include :
path
(被解釋為 bundle名稱 )remove :
path
(被解釋為要刪除的 目標資產 )replace :
target
,path
path
一個定義以下內容之一的字符串:
一個相對路徑,指向插件文件系統中的資產文件;
在插件文件系統中,將 **glob模式 ** 匹配到一組資產文件;
一個指向附件或外部資產文件的 URL ;
使用
include
指令時,表示 bundle 名稱 。
target
目標文件,用于在捆綁包中指定位置。只能與
replace
、before
和after
指令一起使用。active
(默認值為True
)記錄是否激活
sequence
(default=16
)資產記錄的加載順序(升序)。序列小于16表示該資產將在清單中聲明的資產之前進行處理。