元々、artTemplate のソース コード分析に関する以前のコメントを共有したかったのですが、1 年経っても見つかりませんでした。そのため、当時のテンプレート エンジンの原理を分析した後、自分で試してみる必要がありました
その時にいくつかのテンプレートエンジンを比較したのを思い出したので、記念にメモしておきたいと思います。
ここで説明した js テンプレート エンジンはネイティブ JavaScript 構文を使用しているため、php のネイティブ テンプレート エンジンと非常によく似ています。
フロントエンド テンプレート エンジンの役割は何ですか?
1. DOM 構造を生成するために演算子を使用して文字列を結合する必要がなく、代わりに 1 つの要素 (内部の HTML テンプレート) または変数 ( template) またはテンプレートファイル
が必要です。2. メンテナンスが容易で、DOM 構造が変更された場合でも、ロジック コードを変更する必要はなく、対応するテンプレート (ファイル) を変更するだけで済みます。
3. テンプレートが .tpl に似たファイルの場合は、ブラウザーでロードして保存できます。 .tpl ファイルについて言えば、キャッシュ以外のこともできます。モジュール ローダーを通じて行うこともできます.tpl をモジュールとして使用すると、オンデマンドでファイルをロードできるので、帯域幅が節約され、ページが高速化されませんか?
4. 待機など
フロントエンドテンプレートエンジンの原理は何ですか?
原理は非常に単純です: オブジェクト (データ) + テンプレート (変数を含む) -> 文字列 (html)
フロントエンド テンプレート エンジンを実装するにはどうすればよいですか?
テンプレートを解析して、辞書に従ってテンプレートを関数に変換し、その関数を呼び出してオブジェクト (データ) を渡して文字列 (html) を出力します(もちろん、具体的な詳細はコードによって異なります)
次のように:
var obj = {
name : 'lovesueee' ,
年齢 : 24
};
var fn = Engine.compile(tpl); // 関数にコンパイルします
var str = fn(obj); // 文字列をレンダリングします。
<script><BR> var trs = [<BR> {name:"隐形杀手",age:29,sex:"男"},<BR> {name: "索拉",age:22,sex:"男"},<BR> {name:"fesyo",age:23,sex:"女"},<BR> {name:"恋妖壶",age :18,sex:"男"},<BR> {name:"竜崎",age:25,sex:"男"},<BR> {name:"你不懂的",age:30,sex: "女"}<BR> ]</script>
// var html = Ice("tpl",{
// trs: trs,
// href: "http://images.jb51.net/type4.jpg"
/ / },{
// title: function(){
// return "
これはビデオヘルパーを使用しています输出力代码片断
"// }
// });
var elem = document.getElementById('tpl');
var tpl = elem.innerHTML;
var html = Ice(tpl,{
trs: trs,
href: "http://images.jb51.net/type4.jpg"
},{
title: function (){
return "
これはビデオヘルパーを使用しています出力代码片断
"}
});
console.log(html);
$("#content").html(html);
简单的实现:
(function (win) {
// 模板引擎路由函数
var ice = function (id, content) {
return ice[
typeof content === 'object' ? 'render' : 'compile'
].apply(ice, arguments);
};
ice.version = '1.0.0';
// 模板配置
var iConfig = {
openTag : ' closeTag : '%>'
};
var isNewEngine = !!String.prototype.trim;
// 模板缓存
var iCache = ice.cache = {};
// 辅助函数
var iHelper = {
include : function (id, data) {
return iRender(id, data);
},
print : function (str) {
return str;
}
};
// 原型继承
var iExtend = Object.create || function (object) {
function Fn () {};
Fn.prototype = object;
return new Fn;
};
// 模板编译
var iCompile = ice.compile = function (id, tpl, options) {
var cache = null;
id && (cache = iCache[id]);
if (cache) {
return cache;
}
// [id | tpl]
if (typeof tpl !== 'string') {
var elem = document.getElementById(id);
options = tpl;
if (elem) {
// [id, options]
options = tpl;
tpl = elem.value || elem.innerHTML;
} else {
//[tpl, options]
tpl = id;
id = null;
}
}
options = options || {};
var render = iParse(tpl, options);
id && (iCache[id] = render);
return render;
};
// 模板渲染
var iRender = ice.render = function (id, data, options) {
return iCompile(id, options)(data);
};
var iForEach = Array.prototype.forEach ?
function(arr, fn) {
arr.forEach(fn)
} :
function(arr, fn) {
for (var i = 0; i fn(arr[i], i, arr)
}
};
// 模板解析
var iParse = function (tpl, options) {
var html = [];
var js = [];
var openTag = options.openTag || iConfig['openTag'];
var closeTag = options.closeTag || iConfig['closeTag'];
// 根据浏览器采取不同的拼接字符串策略
var replaces = isNewEngine
?["var out='',line=1;", "out+=", ";", "out+=html[", "];", "this.result=out;"]
: ["var out=[],line=1;", "out.push(", ");", "out.push(html[", "]);", "this.result=out.join('');"];
// 函数体
var body = replaces[0];
iForEach(tpl.split(openTag), function(val, i) {
if (!val) {
return;
}
var parts = val.split(closeTag);
var head = parts[0];
var foot = parts[1];
var len = parts.length;
// html
if (len === 1) {
body += replaces[3] + html.length + replaces[4];
html.push(head);
} else {
if (head ) {
// code
// 去除空格
head = head
.replace(/^\s+|\s+$/g, '')
.replace(/[\n\r]+\s*/, '')
// 输出语句
if (head.indexOf('=') === 0) {
head = head.substring(1).replace(/^[\s]+|[\s;]+$/g, '');
body += replaces[1] + head + replaces[2];
} else {
body += head;
}
body = 'line =1;';
js.push(head);
}
html
if (足) {
_foot = foot.replace(/ ^[nr] s*/g, '');
if (!_foot) {
return;
}
body = replaces[3] html.length replaces[4];
html.push(foot);
}
}
});
body = "var Render=function(data){ice.mix(this, data);try{"
body
replaces[5]
"}catch(e){ice.log ('レンドエラー: ', line, 'line');ice.log('無効なステートメント: ', js[line-1]);throw e;}};"
"var proto=Render.prototype= iExtend(iHelper);"
"ice.mix(proto, options);"
"return function(data){return new Render(data).result;};";
var render = new Function('html', 'js', 'iExtend', 'iHelper', 'options', body);
return render(html, js, iExtend, iHelper, options);
};
ice.log = function () {
if (コンソールの種類 === 'unknown') {
return;
}
var args = Array.prototype.slice.call(arguments);
console.log.apply && console.log.apply(console, args);
};
// 合并对象
Ice.mix = function (target,source) {
for (source の var key) {
if (source.hasOwnProperty(key)) {
target[ key] = ソース[key];
}
}
};
// 注册関数
Ice.on = function (name, fn) {
iHelper[name] = fn;
};
// 清除缓存
Ice.clearCache = function () {
iCache = {};
};
// 変更構成
Ice.set = function (name, value) {
iConfig[name] = value;
};
// 公開接続
if (typeof module !== 'unknown' && module.exports) {
module.exports = template;
} else {
win.ice = Ice;
}
})(ウィンドウ);

JavaScript文字列置換法とFAQの詳細な説明 この記事では、javaScriptの文字列文字を置き換える2つの方法について説明します:内部JavaScriptコードとWebページの内部HTML。 JavaScriptコード内の文字列を交換します 最も直接的な方法は、置換()メソッドを使用することです。 str = str.replace( "find"、 "置換"); この方法は、最初の一致のみを置き換えます。すべての一致を置き換えるには、正規表現を使用して、グローバルフラグGを追加します。 str = str.replace(/fi

それで、あなたはここで、Ajaxと呼ばれるこのことについてすべてを学ぶ準備ができています。しかし、それは正確には何ですか? Ajaxという用語は、動的でインタラクティブなWebコンテンツを作成するために使用されるテクノロジーのゆるいグループ化を指します。 Ajaxという用語は、もともとJesse Jによって造られました

10の楽しいjQueryゲームプラグインして、あなたのウェブサイトをより魅力的にし、ユーザーの粘着性を高めます! Flashは依然としてカジュアルなWebゲームを開発するのに最適なソフトウェアですが、jQueryは驚くべき効果を生み出すこともできます。また、純粋なアクションフラッシュゲームに匹敵するものではありませんが、場合によってはブラウザで予期せぬ楽しみもできます。 jquery tic toeゲーム ゲームプログラミングの「Hello World」には、JQueryバージョンがあります。 ソースコード jQueryクレイジーワードコンポジションゲーム これは空白のゲームであり、単語の文脈を知らないために奇妙な結果を生み出すことができます。 ソースコード jquery鉱山の掃引ゲーム

このチュートリアルでは、jQueryを使用して魅惑的な視差の背景効果を作成する方法を示しています。 見事な視覚的な深さを作成するレイヤー画像を備えたヘッダーバナーを構築します。 更新されたプラグインは、jQuery 1.6.4以降で動作します。 ダウンロードしてください

記事では、JavaScriptライブラリの作成、公開、および維持について説明し、計画、開発、テスト、ドキュメント、およびプロモーション戦略に焦点を当てています。

この記事では、ブラウザでJavaScriptのパフォーマンスを最適化するための戦略について説明し、実行時間の短縮、ページの負荷速度への影響を最小限に抑えることに焦点を当てています。

この記事では、JQueryとAjaxを使用して5秒ごとにDivのコンテンツを自動的に更新する方法を示しています。 この例は、RSSフィードからの最新のブログ投稿と、最後の更新タイムスタンプを取得して表示します。 読み込み画像はオプションです

Matter.jsは、JavaScriptで書かれた2D Rigid Body Physics Engineです。このライブラリは、ブラウザで2D物理学を簡単にシミュレートするのに役立ちます。剛体を作成し、質量、面積、密度などの物理的特性を割り当てる機能など、多くの機能を提供します。また、重力摩擦など、さまざまな種類の衝突や力をシミュレートすることもできます。 Matter.jsは、すべての主流ブラウザをサポートしています。さらに、タッチを検出し、応答性が高いため、モバイルデバイスに適しています。これらの機能はすべて、物理ベースの2Dゲームまたはシミュレーションを簡単に作成できるため、エンジンの使用方法を学ぶために時間をかける価値があります。このチュートリアルでは、このライブラリのインストールや使用法を含むこのライブラリの基本を取り上げ、


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

Dreamweaver Mac版
ビジュアル Web 開発ツール

ホットトピック



