| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> JavaScript知识库 -> 写一个简单的webpack打包工具 -> 正文阅读 |
|
[JavaScript知识库]写一个简单的webpack打包工具 |
1 AST概念??????????抽象语法树( Abstract Syntax Tree,AST ),或简称语法树( Syntax tree ),是源代码语法结构的一种抽象表示。 2 AST应用????????在前端,可以通过 总结下来就是AST三板斧: (1) 将源代码映射成AST (2) 操作AST进行遍历更新 (3) 将更新后的AST再转换为源 ????????说到以上三点,作为一个前端开发者,必然想到babel,下面就以babel来解释一下AST在编译中的应用 3 babel与AST的关系????????Babel解析器是一个javascript解析器;最常见的功能就是将我们的高版本js语法解析为浏览器识别的es5语法;为了使用高版本js带来的便利,工作中会经常用es6或者es7来开发,但是某些浏览器并不能完全兼容该语法,所以需要babel将他们编译为浏览器可识别的es5的语法;其实基本过程就是上面提到的三板斧 3.1 @babel/parser????????负责将源码解析为AST;该api负责将javascript源码根据表达式,函数声明,变量定义,导入声明等类型,解析为树节点,用树的方式将代码组织起来;方便后续遍历更新 3.2 @babel/traverse?????????负责遍历操作AST节点;通过该api可以方便的获取所有节点,比如获取所有变量类型节点,或者获取所有的console.log()表达式,获取所有debugger等等;在打包时设置的去除所有打印语句或者debugger关键词等;就是在这一步实现,我们根据传入的规则,将一些不需要的节点遍历删除或者更改; ?3.3 ?@babel/core? ? ? ? ?在遍历更新完ast后,将更新后的AST重新编译为浏览器可兼容的低版本源码; 4 代码演示?4.1 新建一个目录,?在根目录下新建src文件夹,然后在src文件夹新建如下三个测试文件 hello.js
name.js
message.js?
4.2 新建入口文件在src目录下新建entry.js
到这里准备工作完成了;下面剧通过AST三板斧对入口文件关联的所有代码进行打包 4.3 安装babel包在根目录下打开命令行,安装如下包,版本没要求,安装最新的即可
4.4 在根目录下建一个配置文件minipack.config.js执行脚本时,读取该配置文件;跟vue cli中vue.config.js是一个道理?
4.5 代码编译脚本文件(打包核心部分)????????根目录下新建一个index.js;待会我们直接执行node index.js 即可打包我们的代码;跟vue工程中 npm run build是一个道理; (1)第一步:获取所有源码内容 根据三板斧流程,获取更新后的源码
我们打印ast变量,看一下ast树的组织节点长啥样: ?打印查看可能不太直观,我们借助一个网站查看:AST explorer 将entry.js文件内容复制到左侧,右侧自动展示出AST树,可以直观的看到源码是如何被以节点的方式组织;如下 7行源码,分别在body节点中被管理;主要有导入声明、变量声明、函数声明、表达式声明等类型; 打开最后一个输出语句表达式看一下;结构如下 ?看到标志符的类型是console;其实我们再vue工程中打包的时候,会加如一些规则插件,比如去掉console,debugger等;在编译过程中,就是在利用Travser遍历AST后,然后根据节点名称去做删除操作的;将删除后的AST再转换成新的源码。 (2)递归解析所有依赖,形成依赖关系图 我们根据解析后的入口文件AST,将所有以依赖的文件用数组管理起来;代码如下
(3) 根据依赖关系数组,返回浏览器可执行的js文件 这一步就是将入口文件所依赖的所有js文件代码,写入到匿名IIFE函数中;
(4)将可执行js代码,写入到文件 利用nodejs fs的writeFile将文件写入到js文件;
|
|
JavaScript知识库 最新文章 |
ES6的相关知识点 |
react 函数式组件 & react其他一些总结 |
Vue基础超详细 |
前端JS也可以连点成线(Vue中运用 AntVG6) |
Vue事件处理的基本使用 |
Vue后台项目的记录 (一) |
前后端分离vue跨域,devServer配置proxy代理 |
TypeScript |
初识vuex |
vue项目安装包指令收集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 12:34:04- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |