360搜索彩蛋自動化開發實踐

来源:https://www.cnblogs.com/dongtianee/archive/2019/08/25/egg_development.html
-Advertisement-
Play Games

生命不息,探索不止。通過回顧360搜索彩蛋開發方式的發展歷程,我們可以看到相關人員通過不斷努力地探索更加自動和智能的開發方式來解決工作中遇到的種種繁複的工作,從而有效降低成本,提高需求的落地效率。彩蛋開發方式的發展歷程只是你我在工作道路上的一個小小的縮影,我自認為這種探索精神應該滲透到一切項目的迭代... ...


本文首發於360技術公眾號360搜索彩蛋自動化開發實踐

引子

  我們常說的彩蛋,一般是指影視劇在劇情結束之後出現的影視片段,或者是游戲中製作者特意為玩 家留下的、隱藏在游戲中的一些有趣的內容。對於搜索引擎來說,彩蛋是指搜索引擎在特定的檢索 詞下,刻意為用戶展示的一些額外信息。搜索引擎彩蛋的出現往往在用戶的預期之外,其獨立於正 常的搜索結果流,是用戶在檢索時預期之外的信息獲取方式,用途常為態度表示、社會責任、商業 推廣等。在本文中,“彩蛋”特指“搜索引擎彩蛋”

發展歷程

  在以往很長的一段時間內,360搜索彩蛋的開發方式為按需開發。當發起一個彩蛋需求後,前端開發工程師會按照需求逐步拆解,將設計出的彩蛋效果還原到網頁中。比如下圖1呈現的碎屏彩蛋——當用戶搜索某個詞時,頁面呈現出碎裂效果。

圖1 碎屏彩蛋

 圖1 碎屏彩蛋

  像這類彩蛋需求往往都比較複雜,並且無共通性,前端開發人員除了需要處理彩蛋本身複雜的實現邏輯外,還需要考慮彩蛋的瀏覽器相容性、定時退出、主動關閉次數、視窗自適應等邏輯,開發周期較久。由於此類彩蛋需要優秀的創意支撐,因此需求量並不大,按需開發帶來的消耗我們還可以接受。

  從去年開始,360搜索UED團隊發起了節氣彩蛋計劃——24節氣當天,與該節氣相關的搜索詞的搜索結果頁面都會將一副優美的插畫作為彩蛋呈現給用戶。此時按需開發的複雜性便無法接受了,尤其是重覆的邏輯處理。因此,我們將彩蛋的公用部分代碼提取封裝後,製作成通用節氣彩蛋生成工具,只需要簡單配置一下即可生成彩蛋腳本,見下圖2。

圖2 通用節氣彩蛋生成工具 - PC版

圖2 通用節氣彩蛋生成工具 - PC版

  基於這個工具,我們完成了2018年初至今全部的節氣彩蛋上線工作,設計同學與運營同學直接對接,無需前端開發人員參與。

  這裡必須盛贊一下360搜索UED團隊,24節氣插畫真的全部都超級好看,敬請大家在24節氣當天來360搜索(so.com)找插畫彩蛋喲。如果對往期插畫感興趣也可以去站酷關註360搜索UED,查看更多高清大圖。

圖3 24節氣彩蛋插畫

圖3 24節氣彩蛋插畫

  有了通用節氣彩蛋生成工具後,我們都嘗到了“偷懶”的樂趣,“點點按鈕”就發佈上線,成為了前端同學和運營同學的共同追求,更多的彩蛋生成工具先後誕生了。如通用單圖彩蛋生成工具,服務於彈出單張圖片蒙層類型的彩蛋;通用飄落彩蛋生成工具,適用於一切飄落、掉落類效果彩蛋的生成。有了這些生成工具之後,彩蛋成為了一種常規且便捷的運營手段,使用率大大提升。據作者的不完全統計,截止目前使用生成工具上線的彩蛋數量非常可觀,見下圖4。

圖4 部分使用自動工具上線的彩蛋

圖4 部分使用自動工具上線的彩蛋

動畫類彩蛋的自動化開發

  到這裡,一般的彩蛋需求都可以很好地被滿足了,但具有動畫效果的彩蛋仍然沒有很好的解決辦法——要麼使用gif圖,要麼則需要占用前端人力進行開發。於是,針對An(Adobe Animate CC) 和 Ae(Adobe After Effects CC)兩個設計師常用的動畫編輯軟體,我們探索了兩種方式來避免前端開發工作。

An動畫彩蛋自動生成

  An自帶了動畫預覽功能,可以將設計師製作好的動畫導出為瀏覽器可執行的腳本資源。我們通過分析An導出後文件的特點和腳本結構,開發了An動畫彩蛋自動生成工具

圖5 An動畫彩蛋自動生成工具

圖5 An動畫彩蛋自動生成工具

  下表1列舉出了此工具的優點和不足。

表1 An動畫彩蛋自動生成工具的優缺點

優點 不足
動畫依賴的圖片資源可自動合併為雪碧圖,有效減少請求數 動畫執行基礎依賴createJs,186Kb(60K gziped),導出的動畫腳本體積很大,甚至會遠超於基礎依賴。
  相關人員在導出預覽時,需規定文件命名、導出命名等,受限較多,比較刻板
  一旦使用了新特性,比如點陣圖,渲染、描邊等,導出後的腳本會發生變化,自動生成工具將會失效
  只適用於簡單播放型動畫,交互困難,需要編程

  可以看出基於An的自動生成工具通用性不高,不具備普適價值,但仍然可以很好的滿足我們團隊部的使用需求。經過驗證,藉助此工具自動生成的腳本可以正常地將插畫師設計出的動效彩蛋還原至360搜索結果頁。

Ae動畫彩蛋自動生成

  與An不同,得力於bodymovin插件和lottie-web庫,Ae製作的動畫可以被穩定地導出和還原。使用bodymovin插件,可以將Ae幀動畫描述為一個json文件。這個json文件至關重要,通過lottie-web腳本庫可以將動畫還原至瀏覽器環境中。事實上,還有lottie-androidlottie-ios等多個庫,可以將動畫還原到Native App、React Native、Flutter等開發環境中。在這裡,我們只關註一下lottie-web。 
  lottie-web提供了豐富的動畫播放API,比如播放、暫停、設置播放速度、指定播放某段動畫等,有了這些還原基礎,只需要處理一下腳本執行時機,就可以把動畫還原到搜索結果頁中了。但僅僅如此似乎不能滿足複雜一些的交互需求,比如當我們希望用戶點擊某個按鈕來觸發某段動畫的執行時,就必須進行二次開發了。 
  為此,我們引入狀態機機制,可以將複雜的動畫切割為多個狀態,通過狀態機機制來控制動畫執行的順序。引入事件機制,除了狀態機產生的自動狀態切換,事件也可以引起狀態切換,從而實現動畫與用戶之間的交互。

  一句話概括Ae動畫的還原思路:使用bodymovin生成的json用來描述動畫的執行過程,使用狀態機和事件生成的json來描述動畫的執行順序。 

  我們開發了Ae動畫編輯器,來生成描述動畫執行過程和執行順序的json文件,再通過Ae動畫彩蛋自動生成工具生成360搜索結果頁的內嵌腳本並完成發佈上線。

圖6 Ae動畫彩蛋生成工具和Ae動畫編輯器

圖6 Ae動畫彩蛋生成工具和Ae動畫編輯器

  Ae動畫編輯器的主要實現原理是基於動畫關鍵幀的區間播放。lottie-web的API這裡不再詳細說明,其中有一個API允許用戶依據起始幀和結尾幀進行區間播放。我們引入狀態機和事件機制後,就可以用狀態機自動觸發或通過事件手動觸發來引起播放區間的切換,從而實現整個動畫順序可編輯、可交互。 
  舉個例子,假設我們的期望是“動畫在初始時停留在第1幀,直至用戶點擊後,開始在第1~50幀迴圈”,狀態機和事件的配置即如下圖7所示。

圖7 狀態機與事件配置

圖7 狀態機與事件配置

  在設置狀態機和事件之前,必須先規定動畫的總幀數。狀態機和事件都可以根據動畫期望無限制的添加。可以設置“結束後自動前往”來自行改變動畫狀態,也可以通過事件來手動改變。事件類型包括常見的瀏覽器事件,觸發事件後除了前往某個狀態,還可以跳轉到新頁面等。 上面配置的json描述如下。

 1 "stage":[{
 2     "stage": 1,
 3     "frame_s": 1,
 4     "loop": false,
 5     "play": false,
 6     "isRange": false,
 7     "endToStage": null
 8 }, {
 9     "stage": 2,
10     "frame_s": [1, 50],
11     "loop": true,
12     "play": false,
13     "isRange": true,
14     "endToStage": null
15 }],
16 "event":[{
17     "onStage": 1,
18     "type": "click",
19     "toStage": 2,
20     "url": "",
21     "isBlank": false
22 }]

  將我們的意願描述成上面的json後,結合lottie-web提供的API和事件,再將json還原成我們的描述就比較容易了。這裡只提一點註意事項,在還原事件時需要首先將事件類型去重,避免同一個事件重覆綁定,事件觸發後通過判斷當前動畫階段來定位需要執行的任務。 
  訪問這個Demo,可以線上體驗Ae動畫編輯器,可以使用內置的示例進行隨意編輯和預覽。

  Ae動畫生成工具的缺點和不足之處如下表2所示。

表2 Ae動畫彩蛋自動生成工具的優缺點

優點 不足
bodymovin插件為通用性而生,導出時無繁瑣限制,且跨平臺。 導出的圖片未自動合併為單張雪碧圖
通過自由編輯事件和狀態機,可對一段有序動畫進行你想要的任何後期處理,可輕鬆實現簡單用戶交互 動畫執行依賴lottie-web庫,SVG-only(194KB,61KB gziped)
web端支持多種動畫渲染方式 - canvas,SVG,HTML Ae功能受限,部分功能如expressionse、ffects、圖層樣式等無法還原,需要設計師自行取捨
導出的json描述文件非常小。圖片素材可以base64形式內嵌在json文件中,實現快速載入(不過體積較大,圖片無法壓縮)  

  儘管有一些缺點,但仍無法掩蓋其得強大的自動化開發的能力。藉助Ae動畫編輯器,我們可以對動畫進行二次組裝,且可實現簡單的交互。目前,360搜索藉助Ae動畫彩蛋生成工具已經生成並上線瞭如2019母親節、2019世界地球日等多個動畫彩蛋。

  設計師使用Ae動畫導出時,註意事項可以參考官方說明

總結

  Ae動畫編輯器具有很好的普適性,如果你還在使用傳統的幀動畫或者gif圖來實現動畫效果,可以嘗試一下bodymovin + lottie技術,不僅可以幫我們還原動畫,還可以做一些簡單的交互設計。 
  生命不息,探索不止。通過回顧360搜索彩蛋開發方式的發展歷程,我們可以看到相關人員通過不斷努力地探索更加自動和智能的開發方式來解決工作中遇到的種種繁複的工作,從而有效降低成本,提高需求的落地效率。彩蛋開發方式的發展歷程只是你我在工作道路上的一個小小的縮影,我自認為這種探索精神應該滲透到一切項目的迭代優化過程中,因此特意分享一下。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • reduce(收斂):接收一個回調函數作為累加器,數組中的每個值(從左到右)開始縮減,最終為一個值,是ES5中新增的又一個數組逐項處理方法。 reduce(callback,initialValue) callback(一個在數組中每一項上調用的函數,接受四個函數:) previousValue(上 ...
  • 簡易萬年曆這個案例是比較有意義的,雖然是個小demo,但涵蓋的知識是一點也不少啊!需要靜下心來好好理解,完全理解下來,就會覺得也沒那麼難,理解了這個demo,後續很多東西都知道怎麼寫了。好啦,先上HTMl部分的代碼。 樣式可以自己更改哈! 下麵是javascript的代碼,會加上註釋,以防小白白看不 ...
  • React 中 setState()詳細解讀 對於 setState() 相信伙伴們都用過,它是 React 官方推薦用來更新組件 state 的 API,但是對於 setState() 你真的瞭解嗎?且待我慢慢詳聊一番。 setState() 官方用法指南 語法1: updater:函數類型,返回 ...
  • js中\=\=和\=\=\=區別 簡單來說: \=\= 代表相同, \=\=\=代表嚴格相同, 為啥這麼說呢, 這麼理解: 當進行雙等號比較時候: 先檢查兩個操作數數據類型,如果相同, 則進行\=\=\=比較, 如果不同, 則願意為你進行一次類型轉換, 轉換成相同類型後再進行比較, 而===比較時, ...
  • jQuery跳轉到另一個頁面 1.我們可以利用http的重定向來跳轉 window.location.replace(" "https://www.cnblogs.com/pythonywy/" "); 2.使用href來跳轉 window.location.href = " "https://ww ...
  • html 基礎標簽 單標簽 1.註釋標簽: <! 註釋信息 看不到 ctrl+/ <! 網頁頭部導航盒子 換行標簽: 橫線標簽: 標題標簽: 段落標簽: 表示強調標簽: 文字 屬性:文字加顏色 color:改變文字顏色 size:改文字大小屬性 例如:文字 文本加粗顯示:或者 文字斜體顯示: 或 下 ...
  • django搭建BBS 登入&驗證碼的生成 文件結構 app 介面 migrations _\_inint\_\_.py admin.py apps.py bbsform.py models.py tests.py views.py avatar BBS \_\_inint\_\_.py setti ...
  • //這裡使用的是本地的資源文件,如果需要使用,請將代碼內的資源文件用CDN引入 ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...