好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Node.js+Koa2框架生态实战 - 从零模拟新浪微博

download:Node.js+Koa2框架生态实战 - 从零模拟新浪微博

课程为纯实战项目,从零模拟开发一个基本功能完备的微博系统(包括注册、登录、关注和取关,微博浏览、创建和回复,及 @ 关注人等各个功能),带你完成整个Koa2框架生态的综合技术实战,包括各类中间件,MySQL数据库设计,微博项目架构等诸多干货内容,最后带你回顾整个开发过程,从技术层面总结 Node.js 的最佳实践经验

适合人群

有 Node.js 基础,但想继续提升能力的同学

技术储备要求

掌握Node.js基础

熟悉 es6 语法

了解 Koa2或 Express 框架

{{ a }}

打包時,vue-loader會 將 .vue文件的内容,轉化爲render函數

運轉時compiler 運轉時compiler,我們 不運用 vue-loader這樣的插件,而且直接寫template,讓vue在阅讀器運轉的時分,動態將template轉化爲render函數。例如:

 <meta charset="utf-8"/>

<div id='root'> 

<script src="vue/dist/vue.js"> 實質上,構建時compiler和運轉時compiler都是轉化爲render函數。 顯現構建時效率更高,在我們的消费環境中,盡量避免運轉的時分,再去compiler。

仔細的同窗會問了:既然都是轉化爲render函數,那是不是也能夠手寫render函數?

答案是肯定的,例如:

 <meta charset="utf-8"/>

<div id='root'>

<script src="vue/dist/vue.js"> 

export const createCompiler = createCompilerCreator(function baseCompile ( template: string, options: CompilerOptions ): CompiledResult { const ast = parse(template.trim(), options) if (options.optimize !== false) { optimize(ast, options) } const code = generate(ast, options) return { ast, render: code.render, staticRenderFns: code.staticRenderFns } }) 總體流程分爲三局部:

模板編译階段 優化階段 代码生成階段 - 即轉化爲render函數 下面,我們將逐一擊破

三. AST ast 全名:Abstract Syntax Tree,即笼統语法樹。是源代码语法構造的一種笼統表示。

在計算機中,任何問題的實質就是 數據構造 + 算法,ast也是一種數據構造,來描绘源代码的一種構造化表示。

以我們上面的運轉時demo爲例:

parse的辦法入參,第一個參數是template,是一個字符串, 即:

" {{ a }} " 抽丝剥繭,我們先看到ast生成階段parse辦法 的中心入口:

// ... 省略一堆函數定義 parseHTML(template, { // options ...,

start() { // ... },

end() { // ... },

chars() { // ... }, comment() { // ... } }) parseHTML 主幹如下: export function parseHTML (html, options) { const stack = [] // ...options let index = 0 let last, lastTag;

while(html) { last = html

 if (!lastTag || !isPlainTextElement(lastTag)) {
  let textEnd = html.indexOf('<')

  if(textEnd == 0) {

    if(comment.test(html)) {
      const commentEnd = html.indexOf('-->')
      // ...
      if(commentEnd >= 0) {
        // ...
        advance(commentEnd + 3)
        continue
      }
    }

    if(conditionalComment.test(html)) {
      // ...
      const conditionalEnd = html.indexOf(']>')
      if (conditionalEnd >= 0) {
        advance(conditionalEnd + 2)
        continue
      }
    }

    if(html.match(doctype)) {
      // ...
      advance(doctypeMatch[0].length)
      continue
    }

    if(html.match(endTag)) {
      // ...
      const curIndex = index
      advance(endTagMatch[0].length)
      parseEndTag(endTagMatch[1], curIndex, index)
      continue
    }

    startTagMatch = parseStartTag()
    if(startTagMatch) {
      // ...
      handleStartTag(startTagMatch)
      if (shouldIgnoreFirstNewline(startTagMatch.tagName, html)) {
        advance(1)
      }
      continue
    }
  }

  if(textEnd >= 0) {
    // 假如 < 呈現在 純文本中,需求寬容處置,先做爲文本處置
  } 

查看更多关于Node.js+Koa2框架生态实战 - 从零模拟新浪微博的详细内容...

  阅读:35次