1.什么是前端器源前端源码,什么是后台源码
2.webå端å¼åç¼è¾å¨ï¼
3.一般程序员做前端代码开发时用什么工具写代码?
4.图解vue3.0编译器核心原理
5.[前端代码] 第五章 JS 操作浏览器和HTML 文档
什么是前端源码,什么是后台源码
前端源码一般是指html,js,css等一些浏览器可直接运行的轻量级脚本.
后端源码一般指在某个编程环境下的运行的后端未编译的代码,如C#,java等,这些代码在未编译解释前无法被浏览器识别!
注:其实js也可以作为后端编程代码!即js也可是后端源码!但要借助于nodejs等运行工具!换句话说后端代码是需要一个运行环境的,而前端只需要支持浏览器就可以了
webå端å¼åç¼è¾å¨ï¼
å代ç ç软件æåªäº
常ç¨çå代ç 软件æ以ä¸å 个ï¼
1ãWebStormãWebStormæ¯jetbrainså ¬å¸æä¸ä¸æ¬¾JavaScriptå¼åå·¥å ·ãç®åå·²ç»è¢«å¹¿å¤§ä¸å½JSå¼åè èªä¸ºâWebå端å¼åç¥å¨âãâæ强大çHTML5ç¼è¾å¨âãâææºè½çJavaScriptIDEâçã
2ãSublimeTextãSublimeTextæ¯ä¸ä¸ªä»£ç ç¼è¾å¨ä¹æ¯HTMLåæ£æå è¿çææ¬ç¼è¾å¨ã
3ãHBuilderãHBuilderæ¯ä¸ä¸ºå端æé çå¼åå·¥å ·ï¼å ·æé£ä¸æ ·çç¼ç ãæå ¨çè¯æ³åºåæµè§å¨å ¼å®¹æ°æ®ãå¯ä»¥æ¹ä¾¿çå¶ä½ææºAPPãæä¿æ¤ç¼çç绿æ设计çç¹ç¹ã
å端å¼å常ç¨åªäºå·¥å ·è½¯ä»¶ï¼å端å¼åçç¼è¯å¨å¨éæ©ä¸è¿æ¯å¾å¤çãå¨å¦æ ¡éï¼èå¸ä¸»è¦è®²ä¸ä¸ªå端å¼å软件ï¼
1ãWebStorm
帮å©ç¼åHTMLãCSSãLessãSassåStylus代ç ï¼å¹¶ä¸æ¯æNode.jså主æµæ¡æ¶ï¼å¦ReactãAngularã?Vue.jsãMeteorçãä¸IntelliJIDEAåæºï¼ç»§æ¿äºIntelliJIDEA强大çJSé¨åçåè½ãä½æ¯ä»è´¹è½¯ä»¶ã
2ãIntelliJidea
ideaæ¯å¦æ ¡èå¸æå¾æå¤çä¸æ¬¾è½¯ä»¶ï¼ä»å¦Javaå¼å§ï¼é¤äºeclipseåmyeclipseä¹å¤ï¼å¦æ ¡èå¸ç¨çæ广æ³çJavaç¼è¯å¨å°±æ¯ideaï¼èideaä¹è½è¿è¡å端项ç®çå¼åï¼ideaæ¯æç¨å¾æççä¸ä¸ªç¼è¯è½¯ä»¶ãåä¸ä¸ªå®æ´çå端ç½ç«ï¼é 置好jdkï¼tomcatï¼mavenï¼æ°æ®åºä¹åå°±å¯ä»¥å¨ideaä¸è¿è¡æ建äºã
3.VisualStudioCode
ç®ç§°VScodeï¼å端å¼åæ¶æå¦ä¹ ç第ä¸æ¬¾è½¯ä»¶ï¼å½æ¶å¦VScodeçæ¶åä¸çç½è¯¾ï¼èå¸ç¨æ件çæ¶åä¸ä¸ªæ²¡è·ä¸ï¼å°±è·ä¸ä¸äºãæ»ä½æè§ä¸æ¥æ¯æ件åºå¾ä¸°å¯ï¼èä¸å åå ç¨ä¸å¤§ï¼ç®åæ身边ç¨VScodeç人æ¯æå¤çã
ä¸é¢æ¯æå¨å®ä¹ ä¸æ¥è§¦å°çå端å¼åå·¥å ·ï¼
notepad++
页é¢å¾ç®åï¼ä¹ä¸çåæ¯ä¸ä¸ªè®°äºæ¬ï¼å®ä¹ç¡®å®å¯ä»¥å½è®°äºæ¬ç¨ãæå¾å¤ç¹è²æ件å¯ä»¥ä½¿ç¨ï¼æ¯æå¤ç§ç¼ç¨è¯è¨çè¯æ³é«äº®æ¾ç¤ºï¼å ·æ代ç æå åè½ã
2ãHBuilderX
HBuilderXæ¯DCloudï¼æ°å天å ï¼æ¨åºçä¸æ¬¾æ¯æHTML5çWebå¼åIDEãHBuilderçç¼åç¨å°äºJavaãCãWebåRubyãHBuilderæ¬èº«ä¸»ä½æ¯ç±Javaç¼åãæ¯HBuilderä¸ä¸ä»£çæ¬ï¼å ·æ轻便ãéåvueæ¡æ¶çç¹ç¹ã
æä»ä¹å¥½çç¼ç 软件åï¼
æ²ä»£ç ç¨ç软件æï¼Androidstudioï¼WebStormï¼IntellijIDEAï¼sourceinshghtï¼Vscodeã
1ãAndroidstudio
对UIçé¢è®¾è®¡åç¼å代ç ææ´å¥½å°æ¯æï¼å¯ä»¥æ¹ä¾¿å°è°æ´è®¾å¤ä¸çå¤ç§å辨çãåæ ·æ¯æProGuardå·¥å ·ååºç¨ç¾åãä¸è¿ï¼ç®åçæ¬çAndroidStudioä¸è½å¨åä¸çªå£ä¸ç®¡çå¤ä¸ªé¡¹ç®ã
2ãWebStorm
jetbrainså ¬å¸æä¸ä¸æ¬¾JavaScriptå¼åå·¥å ·ãç®åå·²ç»è¢«å¹¿å¤§ä¸å½JSå¼åè èªä¸ºâWebå端å¼åç¥å¨âãâæ强大çHTML5ç¼è¾å¨âãâææºè½çJavaScriptIDEâçãä¸IntelliJIDEAåæºï¼ç»§æ¿äºIntelliJIDEA强大çJSé¨åçåè½ãä¸è¿ï¼æçç²ä¸è¯´è¿ä¸ªæç¹å¡ï¼ä½æ¯åè½è¿æ¯é½å ¨çã
3ãIntellijIDEA
IntellijIDEAæ¯javaç¼ç¨è¯è¨å¼åçéæç¯å¢ï¼å¨ä¸çå ä¹è¢«å ¬è®¤æ¯æ¯è¾å¥½çä¸ä¸ªjavaå¼åå·¥å ·ã
4ãsourceinshght
ä¸ä¸ªé¢å项ç®å¼åçç¨åºç¼è¾å¨å代ç æµè§å¨ï¼å®æ¥æå ç½®ç对C/C++ï¼C#åJavaçç¨åºçåæãSourceInsightè½åæä½ çæºä»£ç 并å¨ä½ å·¥ä½çåæ¶å¨æç»´æ¤å®èªå·±ç符å·æ°æ®åºï¼å¹¶èªå¨ä¸ºä½ æ¾ç¤ºæç¨çä¸ä¸æä¿¡æ¯ãSourceInsightæä¾äºæå¿«éç对æºä»£ç ç导èªåä»»ä½ç¨åºç¼è¾å¨çæºä¿¡æ¯ã
5ãVscode
Vscodeå ¨ç§°VisualStudioCodeï¼æ¯ä¸æ¬¾é对äºç¼åç°ä»£webåäºåºç¨ç跨平å°æºä»£ç ç¼è¾å¨ã
webå端å¼åå·¥ä½ç¨ä»ä¹è½¯ä»¶å½æ¶åå°å¼åå·¥å ·æ¶ï¼è¯å®é¿ä¸å¼ç¼è¾å¨ï¼SublimeTextè¿ä¸ªå·¥å ·å¾å欢è¿ï¼å ³é®æ¯å®ç´§åãç®æ´ãå¿«éï¼é¿ææ¬çå¼é度ä¹æ¯æ ææ»´ãæ¥ææ¼äº®çç¨æ·çé¢å强大çåè½ï¼å¦ä»£ç 缩ç¥å¾ãPythonæ件ã代ç ç段ççãæ¨è¿å¯ä»¥èªå®ä¹é®ç»å®ãèååå·¥å ·æ ãå®æ¯ä¸ä¸ªè·¨å¹³å°çç¼è¾å¨ï¼æ¯æWindowsãLinuxãMacOSXåå ¶ä»æä½ç³»ç»ãAdobeDreamweaveræ¯ä¸ä¸web设计人åå¯è§åwebå¼åå·¥å ·ç第ä¸ä¸ªç¹æ®å¼åï¼å®å¯ä»¥æ¹ä¾¿å°å建跨平å°ç约æï¼è·¨æµè§å¨éå¶å¨æweb页é¢ããç¹å»æµè¯æéä¸éåå¦è®¾è®¡ã
å¦ææ¨æç®å¦ä¹ å端çç¥è¯ï¼å¯ä»¥èèä¸ä¸åéæè²ãåéçä¼ä¸æå¡ä¸å¡èµè½ä¼ä¸æ°åå转åè¿ç¨ï¼è´åäºä¸ºä¼ä¸æä¾å ¨æ¹ä½ç»¼å人ææå¡ï¼ç®åå·²ä¸ç¾åº¦ã京ä¸ãé¿éãè ¾è®¯ãç»ä¿¡ãä¸æ¹å½ä¿¡çå½å ç¥åä¼ä¸è¾¾æ深度åä½å ³ç³»ï¼ä¸å½å ä½å®¶ä¼ä¸å»ºç«äººæè¾éåä½å ³ç³»ãåéå¨ä¼ä¸æèå人æå°±ä¸ä¹é´æ建起桥æ¢å纽带ï¼ä¸ºæå½æ°å产ä¸å¥åº·å¿«éåå±ååºäºå®è´¨æ§è´¡ç®ã
一般程序员做前端代码开发时用什么工具写代码?
1. Bootstrap
前端开发中常用的工具之一,Bootstrap 是浏览一个基于 HTML、CSS、码编JavaScript 的译网页前前端框架,它可以帮助开发者快速构建响应式布局的端源代码网页。它包含了丰富的前端器源人气累积指标源码组件,如按钮、浏览表格、码编导航栏等,译网页前以及用于响应不同屏幕尺寸的端源代码栅格系统。
2. 蓝湖
蓝湖是前端器源一款在线的设计协作工具,它允许设计师将他们的浏览设计稿上传到云端,前端开发人员可以通过蓝湖轻松查看设计稿,码编并进行标注和切图操作。译网页前
3. Cloud9 IDE
Cloud9 IDE 是端源代码一个基于浏览器的在线集成开发环境,专为 JavaScript 开发设计。它提供了一个功能丰富的代码编辑器,支持多种编程语言的语法高亮,并且集成了 Node.js 和 Chrome 的调试工具。
4. Notepad++
Notepad++ 是一款广受欢迎的文本编辑器,适用于 Windows 系统。它支持多种编程语言的语法高亮,并具备插件系统,源码代码设计使得开发者可以扩展其功能。
5. Visual Studio Code
Visual Studio Code 是一个轻量级但功能强大的源代码编辑器,适用于 Windows、macOS 和 Linux 平台。它支持多种编程语言,并提供代码补全、版本控制集成等高级功能。
6. GIMP
GIMP(GNU Image Manipulation Program)是一款开源的图像编辑软件,功能强大,可与 Adobe Photoshop 相媲美。它适用于 Linux 系统,但也有适用于其他平台的版本。
7. SecureHeaders
SecureHeaders 是一个Web安全工具,它可以自动在网页中添加多种安全头部信息,如内容安全策略(CSP)、HTTP 严格传输安全(HSTS)等,以提高网站的安全性。
8. Fontello
Fontello 是一个图标字体生成器,它允许用户将图标作为字体使用,这样可以简化网页中的图标管理,减少加载时间,并且提升SEO效果。atomic原子源码
图解vue3.0编译器核心原理
概览
Vue.js作为目前最流行的前端框架之一,一些概念和原理还是需要我们前端开发人员了解与深入理解的。
Vue.js涉及的知识点很多,一些重要概念,例如:如何使用proxy实现响应式effect,虚拟DOM的Diff算法及演变过程(双端Diff算法、快速Diff算法等),渲染器原理的实现,编译器、解析器的工作原理,动态节点、静态提升等等;
现在重点采用图解步骤分析一下编译器的简单工作原理;
编译器概念编译器其实就是一段JavaScript代码程序,它将一种语言(A)编译成另外一种语言(B),其中前者A通常被叫做源代码,后者B通常被叫做为目标代码。例如我们vue的前端项目的.vue文件一般即为源代码,而编译后dist文件里的.js文件即为目标代码;这个过程就被称为编译(compile)
关键概念主要涉及的概念:
DSL领域特定语言
AST抽象语法树(AbstractSyntaxTree)
有限状态机
深度优先算法
简单流程一个标准的编译器流程如下图所示:Vue.js作为DSL,其编译流程会与上图有所不同,对于Vue.js来说,源代码就是组件的模板代码,而目标代码就是能够在浏览器(或其他平台)平台上运行的JavaScript代码。
Vue的reactor模式源码编译器Vue.js的目标代码其实就是渲染函数(render函数)。概况而言,Vue.js编译器首先对模板进行词法分析、语法分析,然后得到模板的抽象语法树(AST)。随后将模板AST转换成JavaScriptAST,最后再转换成JavaScript代码,及渲染函数。一个简单的Vue.js模板编译器的工作流如下:
简单如下:模板代码
<div><h1id="vue">vue_compiler</h1></div>目标的AST
constast={ type:'Root',children:[{ type:'Element',tag:'div',children:[{ type:'Element',tag:'h1',props:[{ type:'Attribute',name:'id',content:'vue'}],children:[{ type:'Text',content:'vue_compiler'}]}]}]}目标代码
functionrender(){ returnh('div',[h('h1',{ id:'vue'},'vue_compiler')])}由以上代码可以看出,AST其实就是一个具有层级结构的对象,模板的AST与模板具有相同的嵌套结构。每一颗AST都有一个逻辑上的根节点,其类型为Root,而模板中真正的根节点则作为Root节点的children存在。
观察AST可知:
不同类型的节点是通过节点的type属性进行区分的。
标签节点的子节点存储在其children数组中。
标签节点的属性节点会存储在props数组中。
不同类型的节点会使用不同的对象属性进行描述。
编译过程parse函数Vue.js通过封装parse函数,实现对模板的词法分析和语法分析,最终得到模板的AST。parse函数接收模板字符串作为参数,并将解析后的ffmpe优化源码AST作为返回值返回;
consttemplate=`<div><h1>vue<h1></div>`consttemplateAst=parse(template)解析器是如何对模板字符串进行分割的呢,此处就需要用到有限状态自动机。指的是在有限个状态之间,随着字符的输入,解析器会自动地在不同的状态之间进行切换。(实际上有限状态机是可以使用正则表达式来实现的)。
简单的状态机流程图:通过有限状态机原理,可以帮助我们完成对模板的标记,最终将得到一系列Token(词法标记号)。
假设有如下代码:
consttemplate=`<div><span>Vue</span><p>VueCompiler</p></div>`//模板字符串//通过有限状态机原理实现词法分解得到三个Token//开始标签<div>//文本节点vue//结束标签</div>//最终值为consttokens=tokenize(template);//[//{ //type:'tag',name:'div'//},//{ //type:'tag',name:'span'//},//{ //type:'text',name:'Vue'//},//{ //type:'tagEnd',name:'span'//},//{ //type:'tag',name:'p'//},//{ //type:'text',name:'VueCompiler'//},//{ //type:'tagEnd',name:'p'//},//{ //type:'tagEnd',name:'div'//}//]//此代码需要生成的AST应为constast={ type:'Root',children:[{ //实际的根节点type:'Element',tag::'div',children:[{ type:'Element',tag::'span',children:[{ type:'Text',content:'Vue'}]},{ type:'Element',tag::'p',children:[{ type:'Text',content:'VueCompiler'}]}]}]}以上代码生成的AST数据结构HTML结构相同,都是树状结构
接下来要做的就是将生成的tokens转换成AST,在转换过程中需要维护一个Stack,这个栈将用来维护元素间的父子关系。每到遇到一个开始标签,就创建一个Element类型的AST节点,并将其压入栈内,类似的,每当遇到一个结束标签节点,我们就将当前栈顶的节点弹出。这样栈顶的节点将始终充当父节点的角色。转换过程中的所有节点,都将作为当前栈顶节点的子节点,并添加到栈顶节点的children属性下。流程如下图示:
最初节点只有根节点Root
当扫描到第一个标签是开始节点时,因此我们创建一个类型为Element的AST节点Element(div),并将该节点作为当前节点的子节点。由于当前的栈顶节点是Root节点,所以新创建的Element(div)节点作为Root节点的子节点被添加到AST中,最后将新建的Element(div)节点压入栈中。
由于第二个节点也是一个开始标签,所以流程同上一步,只不过当前的栈顶节点为Element(div),所以将当前的节点Element(span)作为其子节点添加到AST中,最后将Element(div)节点压入栈中。
接下来的节点是一个文本节点,所以需要创建一个Text类型的AST节点,并将其作为栈顶节点Element(span)的子节点加入到AST中,不同的时,当前接待不是Element类型,所以不需要压入栈中;
下面是一个结束标签节点,根据规则,则需要将当前栈顶的节点弹出。
后面的流程此处就不再累述
最终完成后的效果如下:
现在我们来实现parse函数
functionparse(str){ //对模板进行词法分析,得到节点listconsttokens=okenize(template);//创建跟节点constroot={ type:'Root',children:[]};//创建节点栈,root节点作为栈的根节点conststack=[root];while(tokens.length){ constparent=stack[stack.length-1];consttoken=tokens[0]//从第一个点开始switch(t.type){ case'tag':consteleNode={ type:'Element',tag:t.name,children:[]}parent.children.push(eleNode);stack.push(eleNode);break;case'text':consttextNode={ type:'Text',content:t.content}parent.children.push(textNode);break;case'tagEnd'://结束标签,将栈顶节点弹出栈stack.pop();break;}//消费掉已处理的节点tokens.shift()}returnroot}以上就是一个简版的parse函数的实现,当然相对于Vue.js的源码还有很多差异,但基本原理大致相同。
下面关于transform函数和generate函数仅做了简要说明,具体实现原理敬请期待;
transform函数consttemplate=`<div><h1>vue<h1></div>`consttemplateAst=parse(template)constjsAst=transform(templateAst)generate函数consttemplate=`<div><h1>vue<h1></div>`consttemplateAst=parse(template)constjsAst=transform(templateAst)constcode=generate(jsAst)完整流程以上就是Vue模板编译器的基本结构和工作流程,它主要有三个部分组成:
用来将模板字符串解析为模板AST的解析器(parser);
用来将模板AST解析成JavaScriptAST的转换器(transformer);
用来根据JavaScriptAST生成渲染函数代码的生成器(generator);
本文章主要讨论了parser的基本实现原理(实际上Vue.js的真正实现要复杂的多,比如正则解析、Vue语法解析v-if、v-show、内插值{ { }}等等),以及如何使用有限状态自动机来构造一个词法分析器,其过程就是状态机在不同的状态之间进行迁移的过程,并生成一个Token列表集合。然后使用Token列表集合和顶节点元素栈来构造一个可以用来描述模板的AST,最后使用模板AST来解析成JavaScriptAST和渲染函数。
作者:GFE-绝对零度著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
参考Vue.js源码;
Vue.js设计与实现;
原文:/post/[前端代码] 第五章 JS 操作浏览器和HTML 文档
JavaScript通过浏览器内置对象操作浏览器,实现对HTML文档的管理和操作,为开发者提供了极大的便利。
窗口(window)对象作为全局对象,包含了浏览器窗口的几乎所有信息,例如浏览器的大小(innerWidth和innerHeight)、地址栏信息等,提供了直接与浏览器交互的途径。
navigator对象提供了浏览器的详细信息,如用户代理字符串、操作系统、浏览器版本等,用于了解用户的环境配置。
screen对象描述了当前屏幕的特性,包括分辨率、颜色深度等信息,可用于响应式设计,确保页面在不同设备上呈现良好。
location对象代表当前页面的URL,允许获取和修改URL路径,实现页面跳转和重新加载。
document对象是HTML文档的根节点,提供了访问和操作DOM树的接口,用于解析、修改页面内容。
JavaScript可以动态修改document对象的title属性,改变浏览器窗口的标题。
查找DOM节点的方法主要包括通过id、标签名或类名定位。通过document.getElementById()可以获取具有特定id的单个节点,而getElementsByTagName()和getElementsByClassName()则用于获取一组相关节点。
JavaScript能够读取当前页面的Cookie,Cookie用于存储用户信息和网站偏好,但存在安全风险。通过document.cookie可以获取或设置Cookie值。HttpOnly属性增强了Cookie的安全性,限制了跨域请求访问。
HTML DOM定义了HTML文档的结构,并提供了一系列方法和属性,用于创建、修改和操作DOM节点。
DOM节点操作涉及到选择、更新和遍历节点,例如通过id或标签名获取节点后,可以直接更新其内容或属性。
AJAX(Asynchronous JavaScript and XML)实现异步的JavaScript和XML通信,不刷新页面的情况下,通过JavaScript发送HTTP请求,获取服务器响应,然后更新页面内容,为实现动态交互提供了可能。
使用AJAX,开发者可以在不刷新页面的情况下实现数据的实时更新,显著改善用户体验。 XMLHttpRequest对象是AJAX实现的核心,允许在现代浏览器中发送HTTP请求和接收响应。
AJAX代码的编写相对简单,主要包括创建XMLHttpRequest对象、配置请求参数、发送请求、处理响应和更新页面内容等步骤。
同步请求在等待服务器响应期间,浏览器无法执行其他任务,而异步请求则允许浏览器继续执行其他操作,提升用户体验。
POST请求允许向服务器发送实体内容,常用于数据提交和更新操作,是AJAX中常见的一种请求方式。