Vue源码笔记-模板引擎

49 阅读1分钟

1.什么是模板引擎?

在学习vue的源码之前,我们首先应该去了解一下什么是模板引擎?模板引擎就是将数据转变为一种视图的解决方案。例如vue中的v-for是如何将数据自动循环渲染到页面的呢?

1)前端经历的四种将数据变为视图的方案

1.纯DOM法

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <ul id="container">
    </ul>

    <script>
        var arr = [
            { "name": "张三", "age": 18},
            { "name": "李四", "age": 100},
        ];

        var container = document.getElementById('container');

        for (var i = 0; i < arr.length; i++) {
            // 每遍历一项,都要用DOM方法去创建li标签
            let oLi = document.createElement('li');
            // 创建hd这个div
            let hdDiv = document.createElement('div');
            hdDiv.className = 'hd';
            hdDiv.innerText = arr[i].name + '的基本信息';
            // 创建bd这个div
            let bdDiv = document.createElement('div');
            bdDiv.className = 'bd';
            // 创建三个p
            let p1 = document.createElement('p');
            p1.innerText = '姓名:' + arr[i].name;
            bdDiv.appendChild(p1);
            let p2 = document.createElement('p');
            p2.innerText = '年龄:' + arr[i].age;
            bdDiv.appendChild(p2);

            // 创建的节点是孤儿节点,所以必须要上树才能被用户看见
            oLi.appendChild(hdDiv);
            // 创建的节点是孤儿节点,所以必须要上树才能被用户看见
            oLi.appendChild(bdDiv);
            // 创建的节点是孤儿节点,所以必须要上树才能被用户看见
            container.appendChild(oLi);
        }
    </script>
</body>

</html>   

2.数组join()法

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
   <ul id="container">
    </ul>

    <script>
        var arr = [
            { "name": "张三", "age": 18},
            { "name": "李四", "age": 100},
        ];

        var container = document.getElementById('container');

        // 遍历arr数组,每遍历一项,就以字符串的视角将HTML字符串添加到list中
        for (let i = 0; i < arr.length; i++) {
            list.innerHTML += [
                '<li>',
                '    <div class="hd">' + arr[i].name + '的信息</div>',
                '    <div class="bd">',
                '        <p>姓名:' + arr[i].name + '</p>',
                '        <p>年龄:' + arr[i].age  + '</p>',
                '    </div>',
                '</li>'
            ].join('')
        }
 
    </script>
</body>

</html>

3.ES6的反引号法

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <ul id="container"></ul>

    <script>
         var arr = [
            { "name": "张三", "age": 18},
            { "name": "李四", "age": 100},
        ];

        var container = document.getElementById('container');

        // 遍历arr数组,每遍历一项,就以字符串的视角将HTML字符串添加到list中
        for (let i = 0; i < arr.length; i++) {
            list.innerHTML += `
                <li>
                    <div class="hd">${arr[i].name}的基本信息</div>    
                    <div class="bd">
                        <p>姓名:${arr[i].name}</p>      
                        <p>年龄:${arr[i].age}</p>    
                    </div>    
                </li>
            `;
        }
    </script>
</body>

</html>

4.mustache(Vue采用)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    
</head>
<body>
    <div id="container"></div>
    <script type="module">
        import mustache from './mustache.js'
        var templateArr = `
        <ul>
        {{#arr}}
        <li>
            <div>{{name}}的基本信息</div>
            <p>{{name}}</p>
            <p>{{age}}</p>
        </li>
        {{/arr}}
    </ul>
        `
        var data = {
            arr: [
                {name: '张三',age: 18},
                {name: '李四',age: 100}
            ]
        }
        console.log(mustache.render(templateArr,data))
        var view = mustache.render(templateArr,data)
        document.getElementById('container').innerHTML = view
    </script>
</body>
</html>

2.mustache的底层原理

mustache的基本使用GitHub地址

Snipaste_2022-09-19_14-44-29.png

1.为什么是tokens

weiwan....