JavaScriptのテンプレートエンジンを作ってみる

■ このスレッドは過去ログ倉庫に格納されています
000112019/03/05(火) 00:50:27.87ID:8a3k8XPA
よ?

000212019/03/06(水) 17:34:50.45ID:1pbO3u+T
まずはライブラリの名前を決めた

000312019/03/06(水) 23:20:38.72ID:1pbO3u+T
サンプル(1)

<!doctype html>

<html lang="ja" >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script src="../lib/biew.js"></script>
<script src="./test.js"></script>
</head>
<body biew:canvas="page" biew:id="body">
<section biew:id="section">
<h1 biew:id="heading1">この要素はHeading Element1です。</h1>
<h2>{{ heading2 }}</h2>
<h3 biew:id="heading3">薬草は<span>{{ heading3.gold }}</span>Gです。</h3>
</section>
</body>
<html>

000412019/03/06(水) 23:22:11.81ID:1pbO3u+T
サンプル(1)test.js

var page = new Biew.Canvas(); // <body biew:canvas="page">

page.draw = function(node){
page.body.setAttr("style", "background-color:#8888FF;"); // bg blue.
page.section.setAttr("style", "background-color:#CCCCCC; width:512px;"); // bg grey.

var h1 = page.heading1; // true === (h1 instanceof Biew.Element)
h1.setText("テンプレートエンジンのサンプル");

var h2 = page.heading2;
h2.setText("Hello World!");
h2.setAttr("style", "background-color:#FFFFFF;");

var h3 = page.heading3;
h3.setAttr("style", "color:white; background-color:black;"); // font white, bg black.
h3.gold.setText("8");
h3.gold.setAttr("style", "color:#66FF66;"); // font grean.
};

window.onload = function(){
Biew.init();
Biew.draw();
};

000512019/03/06(水) 23:25:49.76ID:1pbO3u+T

000612019/03/08(金) 00:59:23.45ID:kMybevyH
上記のサンプルを解説

1.
属性(biew:canvas)が付加された要素内を一括に再描画する
要素のクローンがfunction draw(node)に引数として渡され、
DOM操作されたクローンがHTMLFragmentとして差し替えられる

2.
属性(biew:id)の値と同じ名前の変数に、対となるHTMLElementが代入される
<h2>の{{変数名}}はTextNodeの代入ではなく<h1>と同じように、
要素を変数に代入する糖衣構文である
<h3>では<h1>と<h2>の例を組み合わせて文字列と属性を変更した

000712019/03/16(土) 23:01:43.70ID:Jt4TMHpi
Vue, Reactみたいな双方バインディングを作りたかったけど簡単には作れないや

0008デフォルトの名無しさん2019/03/23(土) 08:25:09.46ID:xbtzdLRS
HTMLはやめてJSONなどJSで完結できるようにして

000912019/03/25(月) 21:40:09.75ID:ci2yIkxV
HTMLはやめるってHTML内にif else forとかの独自属性をごてごて埋め込むことかな?
id属性とか{{name}}でHTML内のタグの位置を特定するのだけは必要だと思う
そうじゃないとjQueryみたいにセレクタを使うことになるから

001012019/03/26(火) 23:37:48.08ID:NVFp1MPL
今日は試しにWebComponentsぽい機能を作ってみる

index.html(HTML)
https://pastebin.com/zgk87cxy

config.xml(XML/XHTML)
https://pastebin.com/KuBEp3vm

test.js(JavaScript)
https://pastebin.com/8bnMsLF0

↓出力HTML
https://pastebin.com/UUet5Rw1
https://i.imgur.com/hm4txLj.png

001112019/03/27(水) 00:42:38.58ID:aVpY1CXQ
ちょっと構想を書いてみる。

例えばログインのユーザー入力でエラーが生じたとき、よく赤字でエラーメッセージをだす。
そのときよくあるテンプレートエンジンではHTML内にifを埋め込んでいたりする。

// JS
var js = {
loginErrorName : true, // booleanがfalseのときはhtmlタグが消える
loginErrorPass : false
};

// HTML
<p id="loginError">
<div framework:if="js.loginErrorName" style="color:red;">※そのアカウント名は存在しません。</div>
<div framework:if="js.loginErrorPass" style="color:red;">※パスワードが間違っています</div>
</p>

↓上記を下記のようにクラスライブラリ化してみるか?

// JS
var loginError = new LoginError();
loginError.loginErrorName = true;
loginError.loginErrorPass = false;

// HTML
<p>{{ loginError }}</p>

これだとタグライブラリを作るのに近い感じになりそう。

001212019/03/31(日) 13:51:59.56ID:quVuOhjO
要素の繰り返しが鬼門だな

001312019/04/03(水) 18:11:43.84ID:0NhWgLHB
考えた結果、作り直すことにした

Vueの単一ファイルコンポーネントみたいなのを作ろうかと構想してたけど
まずはもっと簡単にjQueryみたいなことをやってみるぞ

0014デフォルトの名無しさん2019/04/03(水) 19:10:41.45ID:/cw++oNj
jQueryのどこがテンプレートエンジンなんだ?
とっとと削除依頼出して回線切って首吊って死ねや

001512019/04/04(木) 08:08:33.83ID:AP8fvSfz
結局DOM操作したほうがいいじゃんと思って。

html内に埋め込まないテンプレートエンジンてこうだろ?↓
特に工夫することもないよね

HTML
https://pastebin.com/8hS3FZur

JS
https://pastebin.com/W5znAzjg

↓出力結果

HTML
https://pastebin.com/1DXTjD88

0016デフォルトの名無しさん2019/04/06(土) 23:26:17.28ID:+du4Jk0c
やはりDOM操作系が一番だな
以下、繰り返しのサンプル

HTML
https://pastebin.com/m1jG6UMf

JS
https://pastebin.com/BZ9daPTJ

↓出力結果
https://i.imgur.com/JL8ebLX.png

0017デフォルトの名無しさん2019/04/09(火) 07:01:20.81ID:88xid7Sh
>>9
全然違う

0018デフォルトの名無しさん2019/04/09(火) 10:49:18.75ID:cRtn1aSe
テンプレートエンジンっていうのは、

テンプレート(雛形)とデータから生成物を
作ってくれる ”エンジン" で完成されたもの。

毎回専用のエンジン(?)を作らなければいけない>>16
テンプレートエンジンではない。

テンプレートとデータから生成物を作るための
単なるJavaScriptコード

001912019/04/09(火) 19:08:59.78ID:mANEt9Mq
分かった。じゃあまたあとで書くが既存の名の知れたテンプレートエンジンを調査するところから始めてみよう

002012019/04/09(火) 19:37:35.64ID:mANEt9Mq
おそらく、jsにはデータだけを置いて、それをどのようにDOMに組み立てるのかを
テンプレート側(HTML)に全て置くのがテンプレートエンジンと言うことなのだろう

>>8はどういう意味なんだろう
HTMLテンプレート自体をjsonにしてしまうとか?
{ "html" : [ "head" : {}, "body" : { "div":"hello" } ] }

0021デフォルトの名無しさん2019/04/09(火) 20:33:21.80ID:QoVolURM
テンプレートにロジックを置くのはアンチパターン。
じゃなきゃロジックレステンプレートなんて言葉は生まれない。
まあifやforくらいは許されてる感あるが…
なぜロジックフルが忌避されてるかって?
答え:PHP

002212019/04/09(火) 23:50:46.70ID:mANEt9Mq
例えばsetInterval()でstyle.opacityを更新して要素を点滅させるとか、ViewModelに関する一切をエンジンに任せ、
テンプレートには<div framework:blink="speed:0.8">greeting</div>とかエンジンが提供する属性を埋め込むのが
よくあるテンプレートエンジンの方向性だよね

0023デフォルトの名無しさん2019/04/10(水) 01:02:07.20ID:BUarUbyW
全然違う。それは「テンプレートエンジン」の仕事ではない。
じゃんけんのパーって、手のひら開いて極太ビーム出す必殺技だよね?と言っているに等しい。
トンチンカンにも程がある。

0024デフォルトの名無しさん2019/04/10(水) 12:10:44.96ID:sSiaigIF
用語がわかってないから、テンプレートエンジンを作るスタート地点にも立っていない。

「美味しいラーメン作るぞー」と言いながら、
「パラパラのご飯が重要なんですよ」って言ってる。

そして出来た後、皆に突っ込まれる。
「それラーメンじゃなくてチャーハンだろ!」って

それでもまだこう言うんだ。
「え?これいつも行くラーメン屋の一番人気メニューですよ?」と。
つまり素でチャーハンをラーメンだと勘違いしている。

>>22
お前は今、そんなレベルだよ

002512019/04/10(水) 16:09:44.07ID:92CfBwCq
             /)
           ///)
          /,.=゙''"/   
   /     i f ,.r='"-‐'つ____こまけぇこたぁいいんだよ!!
  /      /   _,.-‐'~/⌒  ⌒\
    /   ,i   ,二ニ⊃( ●). (●)\
   /    ノ    il゙フ::::::⌒(__人__)⌒::::: \
      ,イ「ト、  ,!,!|     |r┬-|     |
     / iトヾヽ_/ィ"\      `ー'´     /

002612019/04/10(水) 16:21:31.25ID:92CfBwCq
入力テンプレートとJSからHTML画面を出力するのがテンプレートエンジンDA!

002712019/04/10(水) 16:48:39.76ID:92CfBwCq
>>16のサンプルはこういう書き方にしてもいいな
https://pastebin.com/UB2mDUgW

我ながら秀逸だわ

■ このスレッドは過去ログ倉庫に格納されています