精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

前端進階: 如何用 Javascript 存儲函數?

開發 前端 存儲設備
今天就來分享一下在研發Dooring過程中遇到的前端技術問題——javascript函數存儲.

[[437221]]

任何一家Saas企業都需要有自己的低代碼平臺.在可視化低代碼的前端研發過程中, 發現了很多有意思的技術需求, 在解決這些需求的過程中, 往往也會給自己帶來很多收獲, 今天就來分享一下在研發Dooring過程中遇到的前端技術問題——javascript函數存儲.

背景介紹

我們都知道要想搭建一個前端頁面基本需要如下3個要素:

  • 元素(UI)
  • 數據(Data)
  • 事件/交互(Event)

在 數據驅動視圖 的時代, 這三個要素的關系往往如下圖所示:

趣談前端

可視化搭建平臺的設計思路往往也是基于上面的過程展開的, 我們需要提供編輯器環境給用戶來創建視圖和交互, 最終用戶保存的產物可能是這樣的:

  1.     "name""Dooring表單"
  2.     "bgColor""#666"
  3.     "share_url""http://xxx.cn"
  4.     "mount_event": [ 
  5.         { 
  6.             "id""123"
  7.             "func": () => { 
  8.                 // 初始化邏輯 
  9.                 GamepadHapticActuator(); 
  10.             }, 
  11.             "sourcedata": [] 
  12.         } 
  13.     ], 
  14.     "body": [ 
  15.         { 
  16.             "name""header"
  17.             "event": [ 
  18.                 { 
  19.                     "id""123"
  20.                     "type""click"
  21.                     "func": () => { 
  22.                         // 組件自定義交互邏輯 
  23.                         showModal(); 
  24.                     } 
  25.                 } 
  26.             ] 
  27.         } 
  28.     ] 

那么問題來了, json 字符串我們好保存(可以通過JSON.stringify序列化的方式), 但是如何將函數也一起保存呢? 保存好了函數如何在頁面渲染的時候能正常讓 js 運行這個函數呢?

實現方案思考

趣談前端

我們都知道將 js 對象轉化為json 可以用 JSON.stringify 來實現, 但是它也會有局限性, 比如:

  • 轉換值如果有 toJSON() 方法,那么由 toJson() 定義什么值將被序列化
  • 非數組對象的屬性不能保證以特定的順序出現在序列化后的字符串中
  • 布爾值、數字、字符串的包裝對象在序列化過程中會自動轉換成對應的原始值
  • undefined、任意的函數以及 symbol 值,在序列化過程中會被忽略(出現在非數組對象的屬性值中時)或者被轉換成 null(出現在數組中時)。函數、undefined 被單獨轉換時,會返回 undefined,如JSON.stringify(function(){}) or JSON.stringify(undefined)
  • 所有以 symbol 為屬性鍵的屬性都會被完全忽略掉,即便 replacer 參數中強制指定包含了它們
  • Date 日期調用了 toJSON() 將其轉換為了 string 字符串(同Date.toISOString()),因此會被當做字符串處理
  • NaN 和 Infinity 格式的數值及 null 都會被當做 null
  • 其他類型的對象,包括 Map/Set/WeakMap/WeakSet,僅會序列化可枚舉的屬性

我們可以看到第4條, 如果我們序列化的對象中有函數, 它將會被忽略! 所以常理上我們使用JSON.stringify 是無法保存函數的, 那還有其他辦法嗎?

也許大家會想到先將函數轉換成字符串, 再用 JSON.stringify 序列化后保存到后端, 最后在組件使用的時候再用 eval 或者 Function 將字符串轉換成函數. 大致流程如下:

趣談前端

不錯, 理想很美好, 但是現實很_______.

接下來我們就一起分析一下關鍵環節 func2string 和 string2func 如何實現的.

js存儲函數方案設計

熟悉 JSON API 的朋友可能會知道 JSON.stringify 支持3個參數, 第二個參數 replacer 可以是一個函數或者一個數組。作為函數,它有兩個參數,鍵(key)和值(value),它們都會被序列化。 函數需要返回 JSON 字符串中的 value, 如下所示:

如果返回一個 Number, 轉換成相應的字符串作為屬性值被添加入 JSON 字符串

如果返回一個 String, 該字符串作為屬性值被添加入 JSON 字符串

如果返回一個 Boolean, 則 "true" 或者 "false" 作為屬性值被添加入 JSON 字符串

如果返回任何其他對象,該對象遞歸地序列化成 JSON 字符串,對每個屬性調用 replacer 方法。除非該對象是一個函數,這種情況將不會被序列化成 JSON 字符

如果返回 undefined,該屬性值不會在 JSON 字符串中輸出

所以我們可以在第二個函數參數里對 value類型為函數的數據進行轉換。如下:

  1. const stringify = (obj) => { 
  2.     return JSON.stringify(obj, (k, v) => { 
  3.       if(typeof v === 'function') { 
  4.           return `${v}` 
  5.       } 
  6.       return v 
  7.     }) 

這樣我們看似就能把函數保存到后端了. 接下來我們看看如何反序列化帶函數字符串的 json.

因為我們將函數轉換為字符串了, 我們在反解析時就需要知道哪些字符串是需要轉換成函數的, 如果不對函數做任何處理我們可能需要人肉識別.

人肉識別的缺點在于我們需要用正則把具有函數特征的字符串提取出來, 但是函數寫法有很多, 我們要考慮很多情況, 也不能保證具有函數特征的字符串一定是函數.

所以我換了一種簡單的方式, 可以不用寫復雜正則就能將函數提取出來, 方法就是在函數序列化的時候注入標識符, 這樣我們就能知道那些字符串是需要解析為函數了, 如下:

  1. stringify: function(obj: anyspace: number | string, error: (err: Error | unknown) => {}) { 
  2.         try { 
  3.             return JSON.stringify(obj, (k, v) => { 
  4.                 if(typeof v === 'function') { 
  5.                     return `${this.FUNC_PREFIX}${v}` 
  6.                 } 
  7.                 return v 
  8.             }, space
  9.         } catch(err) { 
  10.             error && error(err) 
  11.         } 

this.FUNC_PREFIX 就是我們定義的標識符, 這樣我們在用 JSON.parse 的時候就能快速解析函數了. JSON.parse 也支持第二個參數, 他的用法和 JSON.stringify 的第二個參數類似, 我們可以對它進行轉換, 如下:

  1. parse: function(jsonStr: string, error: (err: Error | unknown) => {}) { 
  2.         try { 
  3.             return JSON.parse(jsonStr, (key, value) => { 
  4.                 if(value && typeof value === 'string') { 
  5.                     return value.indexOf(this.FUNC_PREFIX) > -1 ? new Function(`return ${value.replace(this.FUNC_PREFIX, '')}`)() : value 
  6.                 } 
  7.                 return value 
  8.             }) 
  9.         } catch(err) { 
  10.             error && error(err) 
  11.         } 
  12.     } 

new Function 可以把字符串轉換成 js 函數, 它只接受字符串參數,其可選參數為方法的入參,必填參數為方法體內容, 一個形象的例子:

趣談前端

我們上述的代碼中函數體的內容:

new Function(`return ${value.replace(this.FUNC_PREFIX, '')}`)()

之所以要 return 是為了把原函數原封不動的還原, 大家也可以用 eval , 但是出于輿論還是謹慎使用.

以上方案已經能實現前端存儲函數的功能了, 但是為了更工程化和健壯性還需要做很多額外的處理和優化, 這樣才能讓更多人開箱即用的使用你的庫.

最后

為了讓更多人能直接使用這個功能, 我將完整版 json 序列化方案封裝成了類庫, 支持功能如下:

stringify 在原生JSON.stringify 的基礎上支持序列化函數,錯誤回調

parse 在原生JSON.parse 的基礎上支持反序列化函數,錯誤回調

funcParse 將js對象中的函數一鍵序列化, 并保持js對象類型不變

安裝方式如下:

  1. or npm install xijs 
  2.  
  3. yarn add xijs 

使用:

  1. import { parser } from 'xijs'
  2.  
  3. const a = { 
  4.     x: 12, 
  5.     b: function() { 
  6.       alert(1) 
  7.     } 
  8.  } 
  9.   
  10.  const json = parser.stringify(a); 
  11.  const obj = parser.parse(json); 
  12.  // 調用方法 
  13.  obj.b(); 

本文轉載自微信公眾號「趣談前端」,可以通過以下二維碼關注。轉載本文請聯系趣談前端公眾號。

 

責任編輯:武曉燕 來源: 趣談前端
相關推薦

2020-03-06 10:05:59

前端Javascript代碼

2009-06-22 11:52:00

javascriptxml

2017-10-27 22:03:35

javascrip

2010-07-30 12:56:02

Flex調用JavaS

2011-09-02 09:51:21

2021-11-16 14:25:38

JavaScript前端

2010-04-16 11:03:02

Oracle存儲過程

2019-07-16 10:35:54

JavaScript進階字符串

2025-01-09 12:00:00

JavaScript前端數組

2022-09-04 15:40:39

JavaScrip狀態模式軟件

2011-07-22 14:30:44

存儲過程

2023-10-26 08:06:53

圖片存儲前端

2021-03-04 08:33:20

JavaScript 前端原生js

2018-12-06 08:40:43

PythonR函數編程語言

2017-03-20 17:59:19

JavaScript模板引擎

2017-03-15 08:43:29

JavaScript模板引擎

2009-06-26 15:55:29

Javascript+

2013-01-22 15:27:23

WebWeb前端

2011-08-30 17:33:10

OracleSAS宏

2024-08-14 08:33:20

點贊
收藏

51CTO技術棧公眾號

日韩欧美一区二区视频| 国产人伦精品一区二区| 久久久久久国产精品| 看全色黄大色黄女片18| 成人小电影网站| 国产精品久久久久久一区二区三区| 91久久国产精品91久久性色| 国产在线综合网| 九色精品91| 91精品在线一区二区| 免费一级特黄毛片| 91网在线播放| 成人国产电影网| 国产精品video| 久久久久成人精品无码| 美女久久久久| 日韩免费在线观看| 丝袜制服一区二区三区| 激情av在线| 国产精品护士白丝一区av| 国产伦精品一区二区三区高清| 午夜视频网站在线观看| 一区在线免费观看| 日韩在线播放视频| 中文字幕免费视频| 成人午夜网址| 欧美一级生活片| 亚洲不卡视频在线| 日韩伦理在线| 亚洲综合色区另类av| 亚洲一区二区三区午夜| 日本福利午夜视频在线| 国产成人免费网站| 成人久久一区二区| 综合久久中文字幕| 久久伊人亚洲| 欧美亚洲国产精品| 国产精品.www| 好吊一区二区三区| 久久国产视频网站| 免费成人深夜夜行网站| 精品久久久久中文字幕小说| 国产视频欧美视频| 欧美无人区码suv| 最新国产精品精品视频| 欧美一区二区美女| 日本高清免费在线视频| 国产精品久久久久久吹潮| 色综合久久天天| 97国产精东麻豆人妻电影| 69av成人| 天天综合网天天综合色 | 国产大片一区| 中文字幕免费精品一区| www.日本高清视频| 日本电影一区二区| 日韩色av导航| 天堂网avav| 香蕉综合视频| 欧美xxxx综合视频| 69av视频在线| 亚洲手机在线| 97精品国产aⅴ7777| 日本在线观看视频网站| 亚洲一区二区三区高清| 欧美一区二区.| 伊人性伊人情综合网| 青青视频免费在线| 第四色日韩影片| 亚洲成人精品一区| 久久人妻精品白浆国产| 日韩制服一区| 欧美日韩国产另类一区| 先锋资源在线视频| 国产精品流白浆在线观看| 日韩经典第一页| av电影网站在线观看| 日韩理论电影院| 久久久国产精品x99av| 青青草偷拍视频| 日韩一级在线| 国产精品嫩草影院久久久| 国产强伦人妻毛片| 99久久精品免费看国产免费软件| 久久久久久久久一区二区| 久久这里精品| 亚洲欧美日韩精品久久久久| 国产亚洲黄色片| 亚洲第一会所001| 91精品国产入口| 中文精品在线观看| 欧美国产美女| 97精品久久久| 国产精品无码白浆高潮| 成人av动漫在线| 亚洲欧洲精品一区二区三区波多野1战4| 超碰人人在线| 欧美性猛交xxxx乱大交3| 自拍偷拍21p| 9999久久久久| 一区二区三区高清国产| 青青草在线观看视频| 天堂久久一区二区三区| 亚洲xxxx在线| 国产高清一区在线观看| 亚洲第一主播视频| 中文字幕永久有效| 免费不卡中文字幕在线| 久99久在线视频| 啪啪小视频网站| 成人av免费网站| 亚洲综合激情五月| 欧美aaa大片视频一二区| 精品对白一区国产伦| 潘金莲一级黄色片| 久久经典综合| 俄罗斯精品一区二区| 免费高清在线观看| 在线观看日韩国产| 97香蕉碰碰人妻国产欧美| 亚洲精品二区三区| 国产精品一区二区久久精品| 涩涩视频在线观看免费| 一区二区视频在线看| 中文字幕第88页| 国产欧美日韩一区二区三区四区| 久久久亚洲国产| 91 中文字幕| 国产午夜精品久久| 黄色片久久久久| 女一区二区三区| 久久久久久久久久久91| 国产免费黄色片| 国产精品国产三级国产aⅴ入口 | 亚洲欧美日韩在线高清直播| 日产精品久久久久| 东方aⅴ免费观看久久av| 法国空姐在线观看免费| 人人精品久久| 日韩在线激情视频| 中文字幕视频二区| 日本一区二区高清| 日韩肉感妇bbwbbwbbw| 国产真实有声精品录音| 日本久久久久久久久久久| 午夜成人免费影院| 精品久久久一区| 国产精品探花一区二区在线观看| 亚洲精品四区| 九色综合日本| 美脚恋feet久草欧美| 亚洲女人被黑人巨大进入| 久久国产视频播放| 久久久亚洲高清| 99免费视频观看| 欧美日韩性在线观看| 国产精品日韩欧美综合| 91高清在线| 91精品午夜视频| 538精品在线观看| 不卡电影免费在线播放一区| 国产精品无码人妻一区二区在线 | 亚洲国产一区二区精品视频 | 黄av在线播放| 日韩欧美三级在线| 亚洲国产精品午夜在线观看| 99国产精品视频免费观看| 男人日女人bb视频| 精品欧美激情在线观看| 成人h片在线播放免费网站| 成人av福利| 亚洲国产精品免费| 国产精品777777| 中文字幕精品三区| 亚洲精品一二三四| 在线欧美福利| 欧美中日韩一区二区三区| 国产亚洲人成a在线v网站 | 九九九国产视频| 久久免费电影网| 中文字幕成人免费视频| 黄色在线一区| 日本中文不卡| 精品中文字幕一区二区三区| 91av在线精品| 调教视频免费在线观看| 欧美一卡2卡3卡4卡| 日韩精品1区2区| 日韩毛片精品高清免费| 国产性生活毛片| 日本伊人色综合网| 欧美成人精品免费| 凹凸成人精品亚洲精品密奴| 99九九电视剧免费观看| 偷拍中文亚洲欧美动漫| 欧美超级乱淫片喷水| 蝌蚪视频在线播放| 日韩欧美国产小视频| 中文字幕 国产精品| 一区二区三区影院| 国产亚洲精品熟女国产成人| 国产福利一区二区三区视频在线 | 国产第一亚洲| 欧美精品久久久久久久久| 国产青青草在线| 亚洲精品一区二区三区影院 | 国产在线88av| 精品国产一区二区三区久久久狼 | www.av亚洲| 亚洲一级片av| 日本欧美一区二区| 国产69精品久久久久久久| 亚洲字幕久久| 色噜噜狠狠一区二区三区| 国产毛片精品| 99视频免费观看| 91成人小视频| 国产精品久久久久77777| ririsao久久精品一区| 久久精品99久久香蕉国产色戒| 男女视频在线观看免费| 亚洲国产日韩精品在线| 亚洲欧美高清视频| 5858s免费视频成人| 国产精品午夜一区二区| 欧美日韩国产专区| 久久精品人妻一区二区三区| 亚洲免费大片在线观看| 欧洲美女女同性互添| 久久久久久一级片| 亚洲成人av免费在线观看| 国产aⅴ精品一区二区三区色成熟| 日本中文字幕观看| 青青草97国产精品免费观看无弹窗版 | 亚洲成av人在线观看| 欧美国产日韩综合| 亚洲精品视频在线观看免费| 女人18毛片毛片毛片毛片区二| 欧美国产精品一区二区三区| 亚洲 小说 欧美 激情 另类| 91小视频免费看| 国产精品无码永久免费不卡| 99久久免费视频.com| 在线免费观看a级片| 成人av在线资源网站| 手机免费看av片| 不卡一区二区在线| 欧美一区二区免费在线观看| 成人激情av网| 亚洲国产果冻传媒av在线观看| 95精品视频在线| 美女脱光内衣内裤| 日本一区二区三区四区在线视频 | 尤物在线观看一区| 欧美激情一区二区视频| 亚洲国产日韩a在线播放| 国产一级片播放| 精品久久香蕉国产线看观看亚洲 | 日本一区免费| sdde在线播放一区二区| 影音先锋亚洲视频| 欧美一区久久| 17c丨国产丨精品视频| 91久久亚洲| 99蜜桃臀久久久欧美精品网站| 日韩一区精品视频| 亚洲成人天堂网| 国产老肥熟一区二区三区| 香蕉在线观看视频| 99久久亚洲一区二区三区青草 | 1区2区3区国产精品| 成人性生活毛片| 婷婷亚洲久悠悠色悠在线播放| 少妇高潮av久久久久久| 欧美精品在线一区二区三区| 性一交一乱一伧老太| 日韩大片免费观看视频播放| 国产视频第一区| 久久综合久久八八| 两个人看的在线视频www| 国产精品久久久久久久久久尿 | 欧美a一区二区| 国产乱叫456| aaa亚洲精品一二三区| 亚洲无人区码一码二码三码的含义| 亚洲人一二三区| 久久精品一二区| 欧美日韩二区三区| 午夜影院免费体验区| 日韩在线观看你懂的| 高潮在线视频| 成人黄色在线免费| 人人精品亚洲| 蜜臀av.com| 久久久久综合| 四虎国产精品免费| 91视视频在线观看入口直接观看www | 国产毛片一区二区三区va在线 | www.成人.com| 午夜精品一区二区三区在线播放| 成人在线视频免费| 久久99精品久久久久久久青青日本 | 国产传媒一区在线| 亚洲а∨天堂久久精品2021| 一区二区三区小说| 91 中文字幕| 亚洲小视频在线| a级片在线免费观看| 国产在线视频一区| 西瓜成人精品人成网站| 国产精品igao激情视频| 日韩精品91亚洲二区在线观看| 深夜视频在线观看| 亚洲欧美怡红院| 色老头在线视频| 精品在线小视频| 国产美女一区视频| 91久久久久久久久| 欧美精品久久久久久 | 久久99热99| 国产精久久一区二区三区| 午夜av电影一区| 性生活视频软件| 欧美精品在线免费| 成人黄色理论片| 久久免费看毛片| 麻豆精品视频在线| 日本少妇xxxxx| 日本韩国欧美一区| 青青草免费在线| 7777精品视频| 欧美成a人免费观看久久| 中文精品无码中文字幕无码专区| 国产一区三区三区| 四虎影院中文字幕| 91麻豆精品国产自产在线观看一区| 国产黄色片在线播放| 国产精品国产三级国产专播精品人| 伊人久久大香线蕉| 日本成人中文字幕在线| 国产无人区一区二区三区| 精品成人无码久久久久久| 亚洲视频欧洲视频| 成人自拍av| 天堂资源在线亚洲视频| 日本成人在线视频网站| 污污视频网站在线免费观看| 欧美日韩精品一区二区三区 | 最近中文字幕一区二区三区| 亚洲字幕av一区二区三区四区| 伊人一区二区三区久久精品| yy6080久久伦理一区二区| 亚洲成人网上| 经典一区二区三区| 日韩女优一区二区| 精品成人免费观看| 蜜桃在线视频| 日韩欧美在线一区二区| 喷水一区二区三区| www日韩在线| 精品福利在线导航| 伊人久久综合一区二区| 日韩中文不卡| 国产综合久久久久影院| 久一区二区三区| 亚洲九九九在线观看| 成人福利一区二区| 亚洲国产精品女人| 成人免费不卡视频| 最近免费中文字幕大全免费版视频| 中文字幕欧美日韩在线| 日韩精品成人| 国产午夜福利视频在线观看| 国产肉丝袜一区二区| 91丨porny丨在线中文 | 激情五月激情综合网| 久久久久成人网站| 亚洲乱码一区二区| 99视频这里有精品| 成人毛片视频网站| 国产精品高清亚洲| 日本高清视频在线| 国产精品自产拍高潮在线观看| 欧美日韩1区2区3区| www.久久av| 日韩三区在线观看| 免费亚洲电影| 久久久天堂国产精品| 久久久久久久久久久久久女国产乱| 一区二区三区亚洲视频| 国产做受69高潮| 91亚洲国产| 在线免费观看成年人视频| 91麻豆精品国产自产在线观看一区| 不卡的av影片| 日本女人高潮视频| 久久久一区二区| 亚洲国产欧美另类| 国产精品视频久久久| 亚洲精品1234|