zoukankan      html  css  js  c++  java
  • 【js】vue 2.5.1 源码学习 (十一) 模板编译compileToFunctions渲染函数

    大体思路(九)
    本节内容:
    1. compileToFunctions定位
     1 1. compileToFunctions定位
     2     ==> createCompiler = createCompilerCreator(function beasCompile(){}) // 创建编译器的编译器 编译器的爷爷。
     3     ==> beasOptions 编译器默认预留选项
     4     ==> createCompiler(beasOptions) 创建一个编译器。返回一个对象 
     5         ==> { compile: function{} ,conpileToFunctions:function{} }
     6         ==> compileToFunctions(template,{用户配置和兼容},this)
     7     ==> createCompilerCreator(beasCompile){
     8             return function createCompiler(beasOptions){
     9                 function compiler(template,options){
    10                     // 编译器核心方法
    11                 }
    12                 return {
    13                     compile: compiler,
    14                     conpileToFunctions: createComilpeToFunctionFn(compiler)
    15                 }
    16             } 
    17         }
    18     ==> createComilpeToFunctionFn(compile){
    19             // 缓存对象 存储 编译结果
    20             var cache = Object.create(null)
    21             return  function comilpeToFunctions(template,options,vm) {
    22                 try{
    23                     new Function('return 1')
    24                 }catch(e){
    25                     if(e.toString().match(/unsafe-eval|csp/)){
    26                         console.error('您当前的环境禁止不安全评估的内容安全策略,模版编译无法在此环境中工作')
    27                     }
    28                 }
    29                 var key = template
    30                 // 缓存作用,编译过后不重复编译
    31                 if(!cache[key]){
    32                    return  cache[key]
    33                 }
    34                 var compiled = compile(template,options)
    35                 /// comilped.errors  错误信息 compiled.tips 提示信息
    36                 if(){} if(){}  
    37                 var res = {}
    38                 var fnGenErrors = []
    39                 res.render = createFuntion(compiled.render,fnGenErrors);
    40                 res.staticRenderFns = compiled
    41                 return res;
    42 
    43             }
    44         }
    45     ==> compiler(template,options){
    46             finalOptions = 
    47             errors = [] tips = [] 
    48             // if(options) 检测用户有那些自定义配置,最终扩展到 finalOptions
    49             var compiled = beasCompile(template,finalOptions)
    50             errors  tips 
    51             return compiled;
    52         }
    53     ==> beasCompile(template,options){
    54             // 把模版解析成抽象的语法树(AST)  parse 函数
    55             // 根据给点的AST 生成目标平台需要的代码 “函数题的字符串”  generate()  函数new Function()
    56             var ast = pares()
    57             var code = generate(ast,options); // 函数体字符串
    58             return {
    59                 // ast:ast,
    60                 render:code.render, // 渲染函数
    61                 // staticRenderFns: code.staticRenderFns
    62 
    63             }
    64         }
    65     ==> createFuntion(code,error){
    66             try{
    67                 new Function(code)
    68             }catch(){
    69 
    70             }
    71         }
    2. compileToFunctions 作用
    3. 模版编译代码组织结构
     
    本节将新内容分开写到compileToFunctions  分析学习后,在合并到vue.js,如下是compileToFunctions.js
    compileToFunctions.js
    index.html代码如下
     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
     7     <title>第九课</title>
     8 </head>
     9 <body>
    10     <div id="app">
    11         <!-- <huml></huml> -->
    12        
    13     </div>
    14     <script src="vue.js"></script>
    15     <!-- <script src="vue2.5.1.js"></script> -->
    16     <script type="text/javascript">
    17         var componentA = {
    18             el: "#app"
    19         }
    20         var vm = new Vue({
    21             el:"#app",
    22             data: { 
    23                 message: "hello Vue",
    24                 key: "wodow",
    25                 test: 1,
    26                
    27                 list: {
    28                     b:1
    29                 },
    30                 aa:{
    31                     b: [1,2,3]
    32                 }
    33             },
    34             beforeCreate: function(){
    35                 console.log('我钩子函数beforeCreate')
    36                 
    37             },
    38             mounted: function(){
    39                 this.url = 'eeeee'
    40             },
    41             components:{
    42                 humle: componentA
    43             } 
    44         })
    45         vm.test = 2;
    46         // console.log(vm.aa)
    47     </script>
    48 </body>
    49 </html>
    View Code

    如有问题或者疑惑,欢迎评论。

     
  • 相关阅读:
    JQ对JSON的增删改
    Debug编辑通过转Release找不到命名空间
    Codeforces Round #740(Div. 2)
    2021“MINIEYE杯”中国大学生算法设计超级联赛(10)
    2021“MINIEYE杯”中国大学生算法设计超级联赛(8)
    Codeforces Round #737 (Div. 2)
    2021“MINIEYE杯”中国大学生算法设计超级联赛(7)
    2021牛客暑期多校训练营8
    2021牛客暑期多校训练营7
    2021“MINIEYE杯”中国大学生算法设计超级联赛(6)
  • 原文地址:https://www.cnblogs.com/yeujuan/p/11176586.html
Copyright © 2011-2022 走看看