柚子快報激活碼778899分享:如何構(gòu)建一個簡單的前端框架
柚子快報激活碼778899分享:如何構(gòu)建一個簡單的前端框架
先讓我來解釋一下什么是前端框架。所謂的前端框架,就是一種能夠讓我們避免去寫常規(guī)的HTML和JavaScript代碼
而是讓我們能夠編寫出像這樣簡約的HTML和JavaScript代碼(Vue):
{{ coolPara }}
或者是下面這個(react)
export default function Para() {
const coolPara = 'Lorem ipsum';
return
{ coolPara }
;}
這樣一個框架的優(yōu)點(diǎn)是顯而易見的。記住諸如document、innerText和getElementById等單詞或短語是很困難的。當(dāng)然看玩笑的,這個不是主要的原因。
特點(diǎn)
Reactivity ?
第一個主要原因是,在第二個和第三個例子中, 我們可以只設(shè)置或更新變量的值,標(biāo)記(即元素)就會更新,而無需顯式設(shè)置其 .coolPara``
``innerText
這稱為反應(yīng)性,UI 與這樣的數(shù)據(jù)相關(guān)聯(lián) 僅更改數(shù)據(jù)即可更新 UI 的方式。
Composability ?
第二個主要原因是能夠定義組件和 重用它,而不必在每次我們需要使用它時重新定義它。這 稱為可組合性。
常規(guī)HTML + JavaScript默認(rèn)沒有這個。所以 以下代碼不會執(zhí)行應(yīng)有的操作:
反應(yīng)性和可組合性是Vue、React等常見前端框架給我們的兩個主要優(yōu)勢。
這些抽象不是免費(fèi)提供的,我們必須預(yù)先加載一堆框架特定的概念,處理它們在以難以解釋的神奇方式工作時出現(xiàn)的缺陷,更不用說,還有一大堆容易出錯的依賴項(xiàng)。
但是,事實(shí)證明,使用現(xiàn)代Web API來實(shí)現(xiàn)這兩點(diǎn)并不難。而且,對于大多數(shù)用例,我們可能實(shí)際上并不需要使用通常的框架以及它們的復(fù)雜性的混亂。
介紹
Reactivity
解釋反應(yīng)性的簡單語句是,當(dāng)數(shù)據(jù)更新時,自動更新 UI。
第一部分是知道數(shù)據(jù)何時更新。這 不幸的是,這不是普通對象可以做的事情。我們不能 只需附加一個調(diào)用以偵聽數(shù)據(jù)的偵聽器 更新事件。ondataupdate
幸運(yùn)的是,JavaScript 正好允許我們做到這一點(diǎn), 它被稱為代理。
Proxy對象
Proxy允許我們從常規(guī)對象創(chuàng)建代理對象:
const user = { name: 'Lin' };
const proxy = new Proxy(user, {});
然后,此代理對象可以偵聽對數(shù)據(jù)的更改。
在上面的例子中,我們有一個代理對象,但它并不是真的 當(dāng)知道已經(jīng)改變時,做任何事情。name
為此,我們需要一個處理程序,它是一個對象,它告訴代理對象在數(shù)據(jù)更新時要做什么。
const handler = {
set(user, value, property) {
console.log(`${property} is being updated`);
return Reflect.set(user, value, property);
},
};
//用handler創(chuàng)建一個代理
const user = { name: 'Lin' };
const proxy = new Proxy(user, handler);
現(xiàn)在,每當(dāng)我們使用該對象進(jìn)行更新時,我們都會收到一條消息,說.name``proxy``"name is being updated"
下面來看這樣寫的好處:
代理方法具有通用性,并且可以重用處理器在代理對象上設(shè)置的任何值都可以遞歸地轉(zhuǎn)換為代理現(xiàn)在這個神奇的對象可以無論嵌套多深都能對數(shù)據(jù)更新作出反應(yīng)。
除此之外,您還可[處理其他幾個訪問事件,例如讀取、更新、刪除屬性等。
實(shí)現(xiàn)
更新用戶界面
如果您還記得,反應(yīng)性的第二部分是自動更新 UI。為此,我們需要獲取要更新的相應(yīng) UI 元素。但在此之前,我們 需要首先根據(jù)需要標(biāo)記 UI 元素。
為此,我們將使用 data-attributes,該功能允許我們在元素上設(shè)置任意值:
data-attributes的優(yōu)點(diǎn)在于,我們現(xiàn)在可以使用以下方法找到所有合適的元素:
document.querySelectorAll('[data-mark="name"]');
現(xiàn)在我們只需設(shè)置所有適當(dāng)元素:innerText
const handler = {
set(user, value, property) {
const query = `[data-mark="${property}"]`;
const elements = document.querySelectorAll(query);
for (const el of elements) {
el.innerText = value;
}
return Reflect.set(user, value, property);
},
};
const user = new Proxy({ name: 'Lin' }, handler);
就是這樣,這就是反應(yīng)性的關(guān)鍵!
由于我們的一般性質(zhì),對于設(shè)置的任何屬性,所有適當(dāng)?shù)?UI 元素都將更新。handler``user
這就是 JavaScript 功能的強(qiáng)大之處,具有 零依賴性和一些聰明,它可以給我們這些神奇的反應(yīng)對象。Proxy
現(xiàn)在進(jìn)入第二個主要問題
可組合性
事實(shí)證明,瀏覽器已經(jīng)有專門用于此的整個功能 叫Web組件
很少使用它,因?yàn)樗褂闷饋碛悬c(diǎn)痛苦。
對于可組合性,我們首先需要定義組件。
標(biāo)記用于包含標(biāo)記,即 不由瀏覽器呈現(xiàn)。例如,您可以添加以下內(nèi)容 HTML 中的標(biāo)記:
Will not render!
并且它不會被渲染。您可以將它們視為不可見的容器 為您的組件。
下一個構(gòu)建塊是 定義組件內(nèi)容的放置位置。這 使組件能夠與不同的內(nèi)容重用,即它變得可組合。
例如,下面是一個將其文本著色為紅色的 h1 元素。
在我們開始使用我們的組件之前——比如上面的紅色 h1,我們需要 注冊它們。
在注冊紅色 h1 組件之前,我們需要一個名稱來注冊它 由。我們可以為此使用該屬性:name
現(xiàn)在,使用一些JavaScript,我們可以獲取組件及其名稱:
const template = document.getElementsByTagName('template')[0];
const componentName = template.getAttribute('name');
最后使用 customElements.define注冊它:
customElements.define(
componentName,
class extends HTMLElement {
constructor() {
super();
const component = template.content.children[0].cloneNode(true);
this.attachShadow({ mode: 'open' }).appendChild(component);
}
}
);
下面我們把這兩個放到一起
總結(jié)
快速回顧一下,我們做了兩件事:
我們創(chuàng)建了一個反應(yīng)式數(shù)據(jù)結(jié)構(gòu),即代理對象,在設(shè)置值時可以更新我們標(biāo)記的任何元素。我們定義了一個自定義組件,該組件將呈現(xiàn)它的 內(nèi)容為紅色 H1。red-h1
現(xiàn)在我們可以將它們放在一起:
```html
并讓自定義組件呈現(xiàn)我們的數(shù)據(jù)并在我們時更新 UI 更改數(shù)據(jù)。
當(dāng)然,通常的前端框架不只是這樣做,它們有 專門的語法,例如 Vue 中的[模板語法](https://vuejs.org/guide/essentials/template-syntax.html)和 React 中的 [JSX](https://react.dev/learn/writing-markup-with-jsx),這使得編寫復(fù)雜的前端相對更簡潔 否則會是這樣。
由于這種專門的語法不是常規(guī)的JavaScript或HTML,因此它不是 可由瀏覽器解析,因此它們都需要專門的工具來編譯 在瀏覽器之前,它們可以簡化為常規(guī)的JavaScript,HTML和CSS。 了解他們。
即使沒有專門的語法,你也可以做很多通常的事情 前端框架以類似的簡潔性完成,只需使用 和 即可。`Proxy``WebComponents`
這里的代碼過度簡化,并將其轉(zhuǎn)換為框架 你必須充實(shí)它。
在開發(fā)此功能時,我計(jì)劃維護(hù)兩個硬約束:
1. 沒有依賴關(guān)系。
2. 在可以使用之前沒有構(gòu)建步驟。
柚子快報激活碼778899分享:如何構(gòu)建一個簡單的前端框架
文章來源
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。