天天看點

小程式基礎庫探究:說說formid生成的實作

熟悉小程式的都知道,模闆消息于2020年1月10日下線了,官方推薦使用者使用訂閱消息。現在已經是1202年了,探讨一下一個已經下線的功能的實作應該問題不大吧。

然後之前很多老的小程式發送消息給使用者都是使用的模闆消息,說到模闆消息就不得不提一個叫做formId的東西了,記得當初在公司開發小程式的時候曾經為了擷取這個ID基本上在小程式的每個頁面都加了僞裝的表單去盡可能多的收集使用者産生的formid,為了給使用者發送提醒消息,煞費苦心,詳見之前寫的一篇

小程式formid埋點

那麼formid是如何生成的呢,帶着疑問我們最終在視圖層基礎庫中找到了答案,因為這個功能是大家都會使用的,是以這個基礎的功能當然會放在基礎庫裡去實作了。

因為小程式的雙線程架構設計,基礎庫分為視圖層基礎庫及邏輯層基礎庫,因為id是在使用者點選畫面上的表單時生成,處在視圖層的作用範圍,是以這個生成要加在webview基礎庫裡比較高效一些,這樣子就避免了與邏輯層線程消息通訊的消耗。

然後我們來看代碼吧,以2.8.3版本的基礎庫為例,格式化之後大概在8600行左右的位置,我們會發現一個名叫

generateFormId

的函數,函數的核心方法如下:

return ((i = Date.now()),
            'undefined' != typeof performance &&
              'function' == typeof performance.now &&
              (i += performance.now()),
            'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(
              /[xy]/g,
              function (e) {
                var t = (i + 16 * Math.random()) % 16 | 0;
                return (
                  (i = Math.floor(i / 16)),
                  ('x' === e ? t : (3 & t) | 8).toString(16)
                );
              }
            )).replace(/-/g, '');
            var i;           

這個大家應該很熟悉了,就是生成唯一uuid的JS代碼,是以我們可以得出結論,所說的formid就是結合目前時間随機生成的一串32位uuid字元串。formid隻能使用一次且有效期隻有7天,是以基礎庫裡基于時間生成的uuid完全可以滿足這個需求,可以保證在全球範圍的唯一性。

當然基礎庫裡還存在着其它一些有意思的東西,js的寫法也是令人大開眼界。後面有機會再探讨吧。

參考資料

繼續閱讀