時間:2023-06-07 07:09:01 | 來源:網(wǎng)站運營
時間:2023-06-07 07:09:01 來源:網(wǎng)站運營
Web 前端模板引擎的選擇:無論你是否直接使用模板引擎,Web 模板一直都在,不在前端就在后端,它的出現(xiàn)甚至可以追溯到超文本標記語言 HTML 標準正式確立之前。輕量度:tpl.js、T.js它們的共同特征:全都支持插值。
認知度:arttemplate、mustache.js、doT.js、handlebars.js、pug
DOM-tree-based:domTemplate、transparency、plates
VDOM-based:htmltemplate-vdom、virtual-stache、html-patcher
流行框架:Vue.js、ReactJS、riot
Real-DOM:PowJS
前提,選擇的引擎能滿足數(shù)據(jù)渲染需求,且不和現(xiàn)有依賴沖突,如果你已經(jīng)非常熟悉某個引擎,那你已經(jīng)有答案了。我認為應該弱化語法風格的對比,偏好是沒有可比性的,一些語法甚至有特殊的背景原因。
是一次性的項目需求么? 是的話直接選擇輕量的,學習復雜度最低的。 是要做組件開發(fā)么?
引擎支持預編譯結果,不必每次都實時編譯么?
要跨平臺么? 有官方提供支持的,首選類 React-JSX 的引擎或純粹的 VDOM 引擎。
選擇學習或維護復雜度最低的,眾所周知,開發(fā)者對調(diào)試的時間超過寫代碼的時間深惡痛絕。
最后才是性能對比,性能對比是一件非常細致的工作,他人的對比結果不一定符合你的場景。
class HelloMessage extends React.Component { render() { return <div>Hello <x-search>{this.props.name}</x-search>!</div>; }}
編譯后:class HelloMessage extends React.Component { render() { return React.createElement( "div", null, "Hello ", React.createElement( "x-search", null, this.props.name ), "!" ); }}
不少 VDOM 引擎也可以編譯類似效果,比如 htmltemplate-vdom。<script> var id = 3; var env = { people: [ { id: 'id1', name: 'John', inner: [{ title: 'a1' }, { title: 'b1' }], city: 'New York', active: true }, { id: 'id2', name: 'Mary', inner: [{ title: 'a2' }, { title: 'b2' }], city: 'Moscow' } ], githubLink: 'https://github.com/agentcooper/htmltemplate-vdom', itemClick: function(id) { env.people.forEach(function(person) { person.active = String(person.id) === String(id); }); loop.update(env); } // Omitted .... }; </script>
復雜度有的使用者認為這個應用場景有字符串模板就滿足了需求,輕量夠用。這些評判都有各自的理由,著眼點不同,標準也就不同了。但是我們還是可以從它們的共性去考慮它們的復雜度。
有的使用者認為字符串拼接技術的模板引擎不夠強壯,不夠時代感。
有的使用者認為OOP 夠理性,夠邏輯,夠抽象。
有的使用者認為原生 HTML 才叫前端。
有的使用者認為 VDOM 適用性更廣。
1.入口參數(shù)是個 Object,模板中的變量 x 是該對象的 .x 屬性,例:virtual-stache-example這些模式只是理論方面的,通常是模板引擎設計者要解決的問題。對于使用者來說不如直接問:
2.特定語法或?qū)傩?,比如:Vue.js 的 <a v-on:click="doSomething">...</a>,屬性 computed、methods
3.抽象的語義化屬性,比如:Vue.js 的 active 這個詞適用于多種場景,容易理解且不產(chǎn)生歧義
4.不負責綁定,需要使用者非常熟悉原生方法,用原生方法進行綁定,比如:PowJS
1.可以在 HTML 模板中直接寫最簡單的 console.log(context) 來調(diào)試么?模板引擎團隊會給你正確的解決辦法,但通常和問題字面描述的目標有所差異。我覺得這就是你評判選擇的關鍵,你對官方給出的正確方法的認可度。
2.可以在多層 DOM 樹綁定或傳遞不同的上下文參數(shù)么?
3.可以在多層 DOM 樹內(nèi)層向上訪問已經(jīng)生成的 Node 么?
嵌入到 HTML 中PowJS 是這么實現(xiàn)的:
<template> <details func="repo" param="data" if="is.object(data.content)&&!sel(`#panel details[sha='${data.sha}']`)" open let="ctx=data.content" sha="{{data.sha}}" origin="{{ctx.Repo}}" repo="{{data.owner}}/{{data.repo}}" subdir="{{ctx.Subdir||''}}" filename="{{ctx.Filename}}" render=":ctx" do="this.renew(sel(`#panel details[repo='${data.owner}/${data.repo}']`))" break > <summary>{{ctx.Description}}</summary> <div if="':';" each="ctx.Package,val-pkg"> <p title="{{pkg.Progress}}: {{pkg.Synopsis}}">{{pkg.Import}}</p> </div> </details> <dl func="list" param="data" if="!sel(`#panel details[sha='${data.sha}']`)&&':'||'';" each="data.content,data.sha,val-rep" do="this.appendTo(sel('#panel'))"> <details sha="{{sha}}" repo="{{rep.repo}}"> <summary>{{rep.synopsis}}</summary> </details> </dl></template>
多數(shù)模板引擎都會實現(xiàn) if 、each 這些指令,上面的 PowJS 模板中還有:關鍵詞:選擇,引擎,模板
微信公眾號
版權所有? 億企邦 1997-2025 保留一切法律許可權利。