ES 6-テンプレートコンパイル(正規表現およびテンプレート文字列の変化を説明)
2091 ワード
テンプレート文字列から正式テンプレートを生成します.
テンプレート文字列:
このテンプレートは、JavaScript防止コードを使用し、出力JavaScript式を使用します.
コンパイルプロセス:
templateはコンパイル中に3つの遷移状態があり、以下は各状態templateのコードです.
参照リンク:https://segmentfault.com/q/1010000013871493
参考書:『ES 6標準入門』
テンプレート文字列:
var template = `
-
`;
このテンプレートは、JavaScript防止コードを使用し、出力JavaScript式を使用します.
コンパイルプロセス:
function compile(template) {
var evalExpr = //g;
// '' , , val
// <.> :'' , '>', 。
var expr = //g;
// '' ,
// [\s\S] ,
template = template
.replace(evalExpr, '`);
echo( $1 );
echo(`') // 1
.replace(expr, '`);
$1
echo(`'); // 2
template = 'echo(`' + template + '`);'; // 3
var script =
`(function parse(data) {
var output = "";
function echo(html) {
output += html;
}
${ template }
return output;
})`;
return script;
}
var div = document.getElementById("test");
var parse = eval(compile(template));
// innerHTML
div.innerHTML = parse({ supplies: [ "broom", "mop", "cleaner"] });
templateはコンパイル中に3つの遷移状態があり、以下は各状態templateのコードです.
// 1 : .replace(evalExpr, '`);
echo( $1 );
echo(`')
"
- `);
echo( data.supplies[i] );
echo(`
"
// 2 : .replace(expr, '`);
$1
echo(`');
"
`);
for(var i = 0; i < data.supplies.length; i++) {
echo(`
- `);
echo( data.supplies[i] );
echo(`
`);
}
echo(`
"
// 3 : 'echo(`' + template + '`);'
"echo(`
`);
for(var i = 0; i < data.supplies.length; i++) {
echo(`
- `);
echo( data.supplies[i] );
echo(`
`);
}
echo(`
`);"
参照リンク:https://segmentfault.com/q/1010000013871493
参考書:『ES 6標準入門』