如果有機會由你建立 DOM 的 API,你會怎麼設計?

時間 2021-05-29 23:33:27

1樓:伊撒爾

我好像有搞過這個,當時是為了找到乙個宣告式,但不需要 DSL 的 api

大概差不多長這樣

function

Timer

(...

children

)大概長上面這個樣子,不需要 jsx,不需要 template,宣告式,js 可復現,也沒有 flutter 的巢狀語法,關鍵是可以實現 90% 的 UI 組合

元件為單位,Timer 和 Text 都是元件,函式引數是 children 內容,後面的鏈式呼叫是拍平的 props

狀態也是利用 rxjs 的鏈式呼叫的思路,rxjs 本身是個發布訂閱,相當於環境狀態

純 js runtime 可復現,padding 這些屬性可以繼承 html-element,不需要走編譯

當然這組 api 是我當初做跨平台的時候想出來的,有可能不是題主想要的

當時的剛需是 1. 元件為單位(而不是dom節點)2. 生命式且純 runtime 3. 減少巢狀

於是想到了這種鏈式呼叫的 API,我覺得類似的思路還是 ok 的,反正就是尋找一套宣告式的語法嘛

2樓:keelii

我覺得可以可以提供一種結構化的查詢方式,比如使用 sql 語句去查 dom,後端可以直接儲存結構化的 dom 記錄,不存在前端狀態這種概念,直接全部由後端接管。

3樓:答題用馬甲

最近在嘗試做乙個跨平台的專案,可以同時編譯到 web 和 pc 客戶端,需要抽象類似於 DOM 的模型控制 UI 繪製,抹平平台間的差異。

web 端的渲染和更新使用的 dom 的介面,客戶端是使用資料驅動的 GUI 庫,修改資料就可以更新檢視。樣式則是直接作為 UI 樹上節點的 attribute,對映到各個平台的相應樣式。

事件系統更是簡單,所有的事件在一處監聽,提供 target,目前業務的 sdk 可以消化沒有阻止冒泡的問題,後續需要新增。

沒有類似 querySelector 的能力。

那麼這套簡陋的 DOM API 有希望實現題主提到的能力嗎 ?

首先是編譯到掌機,這個通過 GUI 庫更換後端就可以做到,跟 DOM API 設計關係不大。

然後是編譯期優化和 tree shaking 的能力。這套方案使用靜態強型別的語言,GUI 庫也是從原始碼編譯,應該對做這兩件事情比較友好。

NPM 全家桶這條我不清楚指什麼。如果是指開發體驗,我的想法是提供編輯器外掛程式或者 IDE,更像原生開發。DOM API 的廢棄和新增自己內部消化,開發者只需要宣告支援的平台和版本區間,編譯時就可以檢查出問題。

最後是對框架的優化。DOM API 可以適當的根據實現暴露一些介面,比如現在的 idle callback。也可以暴露效能更好但更底層的 API,我認為現在的 canvas 方案就挺好。

所以我覺得我的方案思路可以解決題主提到的問題,有一定的想象空間。如果由我來設計,我理想中的方案需要做到:

跨平台是設計目標,不侷限於 web。

提供像瀏覽器這樣的宿主平台,可以動態執行。也支援通過原始碼編譯成可執行檔案。

提供類似於 canvas 這樣能力

開發工具友好

至於具體 DOM 的 API 設計,我覺得現在的就挺好,同時也在不斷演進,沒有必要推到重來。

另外寫點題外話,在現在的背景下,我的想法也是可以一定程度實現的:

比如借助 wasm,讓靜態語言走進瀏覽器;也可以讓 js/ts 支援 aot 編譯,走出瀏覽器。非 web 平台的 DOM API,可以根據 webIDL,在每個平台實現需要的介面,或者在 DOM API 上抽象一層,再或者直接提供類似 react 這種寫法(類似 react-native)。

這套方案做通用的跨平台 GUI 方案工作量會比較大,而且沒有生態。但是實現跨平台的特殊業務應該是有可能的,我覺得像編輯器就是比較合適的業務,使用者對原生的需求也相對強烈。

能力有限,有誤望指正。

4樓:navegador

node 不應該繼承eventTargettextNode 應該是一種attrib ,而不是單獨的一種nodecss selector 應該移除,使用自定義函式當過濾器/選擇器(引數就是tag 與attrib以及element本身),降低不必要的DSL 學習成本。

為了和UI框架配合更好,所有底層都應該是鍊錶/陣列,不應該使用帶巢狀性質的結構(例如用迴圈直接表達樹狀UI檢視,而不是用巢狀結構)

style 部分的API,比如實時獲取某個動畫元素當前的座標/角度/matrix..這些API 要可以脫離瀏覽器使用: 輸入html+css+js 直接能輸出結果

以上是我在應用中覺得需要的。

如果有機會的話 應該出國嗎?

海荔留學Lydia 如果有機會的話,並且家庭條件允許,我覺得是應該出國留學的。首先大多數人出國留學很重要的原因就是為了提公升自己的能力,這樣的話可以在以後的工作生涯中為你未來的道路鋪好路。而且出國留學可以開拓自己身的眼界,對自己也是好的。 CA留學移民Julie 答案是肯定的,無論是出國出差還是出國...

如果有機會 你想對前任說些什麼?

美局 什麼都說不說 我當你是路人,我還跟你說什麼 你會跟乙個路人扯東扯西嗎?真正的放下,無所謂什麼的,沒有怨恨,沒有任何情緒。那些只是我們生命中的回憶而已 今天聽了AGA 的新歌。確實有點想說的。點講都好,忘記後來的不快,還是很想多謝你那三年幾的陪伴。和你夢想雖早,祝你做到。祝我也做到。 希望你啊,...

如果有機會,你們會定居法國嗎?

物理狗 法國假期是多,也沒壓力。但是,工資也確實低了點。乙個人工作養活一家人還是不容易的。工資再能提公升50 可以考慮吃一輩子法國。 侗博士 可以定居法國,法國整體社會人文我很喜歡,特別是法國南部,如果定居首選南法,環境很好,離瑞士 西班牙很近,有法國的優雅也有瑞士的精緻和西班牙的奔放。最喜歡的地方...