前端工程化

152 阅读3分钟

一,什么是AST? AST就是code经过词法分析,语法分析,语义分析最终生成代码的的编译器;

image.png

1,词法分析,将源代码转成单词刘,成为‘词法单元’,每个词法单元包含一个标识符合一个属性值,比如变量名,数字,操作符等; 2,语法分析:将词法单元流转换成抽象语法树,也就是标记所构成的数据结构,表示源代码的结构和规则; 3,语义分析:在AST上执行类型检查,作用域检查等操作,以确保代码的正确性和安全性。 4,代码生成:基于AST生成目标代码,包括优化代码结构,生成代码文本,进行代码压缩等 下面是一个简单的JavaScript编译器示例代码: 其中: lexer 是词法分析器,将源代码转换成词法单元流 parser 是语法分析器,将词法单元流转换成抽象语法树; semanticAnalysis 是语义分析器,对抽象语法树进行语义分析; codeGeneration 是代码生成器,将分析后的AST生成目标代码;

编译器最核心的代码: function compiler(sourceCode){ // 词法分析 const tokens = lexer(sourceCode) // 语法分析 const ast =parser(tokens) // 语义分析 const analyzeAst = semanticAnalysis(ast) // 代码生成 const code = codeGeneration(analyzedAst) return code } 为什么要在工作中用到编译原理,一个公式编辑器,一个字符串复杂处理,低代码平台更是需要详细掌握AST及编译原理。

二、babel的plugin 和 loader应用与原理? babel是一个流行的js编译器,babel包含以下几个核心内容: 1,@babel/core 2,@babel/parser 3,@babel/traverse 4,辅助相关,type polyfill temple等 babel 的 预设 babel-preset-env

三、请说说webpack打包过程与原理? 几个核心概念: 1,complier, 2,compilation, 3,Module, 4,chunk 5,bundle 执行过程描述? 1,初始化,初始化会读取配置信息,统计入口文件,解析loader及plugin等信息; 2,编译阶段,webpack编译代码,部分依赖babel,ts转为js,less转为css,styled-components进行处理 3,输出阶段:生成输出文件,包含文件名,输出路径,资源信息,

初始化主要流程 1,初始化参数; 2,创建compiler对象实例; 3,开始编译,compiler.run 4,确定入口,根据entry找出所有入口文件,调用addEntry 构建阶段 1,编译模块,通过entyr对应的dependence创建Module对象,调用对应loader将模块转换为js内容,babel将一些内容转换为目标内容 2,完成模块编译,得到一个moduleGraph 生成阶段 1,输出资源组装chunk,chunkGroup,再将Chunk转换为一个单独文件输出加入到输出列表,既然到这已经加入到输出列表了,说明这里是修改资源内容的最后机会,也就是(afterChunks:new SyncHook(["chunks"])钩子) Module->chunk->bundle 2,写入文件系统(emitAsset)在确定好输出内容后,根据配置输出到文件中