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框架生态实战 - 从零模拟新浪微博的详细内容...