rollup流程
2022-01-18 12:25:17 0 举报
rollup基础版流程
作者其他创作
大纲/内容
defines
iife
stronglyDependsOn代表根作用域所引用的对象,dependsOn代表所有作用域引用的对象
checkForWrites
在节点分析是有可能会生成newScope对象,情况如下:1,解析到函数节点,包括函数直接定义、函数表达式、箭头函数2,解析到块级表达式且父级不是函数3,解析到catch表达式节点由此可以得出,只要js产生了新作用域,都会new一个Scope对象,究其原因,是因为在解析一个module代码时,只是维护了根级的一层statement,也就是相应的scope作用域,但是js代码产生的作用域不只是根级作用域这么简单,所以需要在这里进行分析
梳理defaultExport
es6
cjs
每个scope作用域对象里面都维护了一个declarations数组,作用是?declarations数组的改变方法:1,初始化Scope对象时options里面带有params属性初始化Scope的场景里之后两种情况下会带有params属性:(1)catch 节点(2)函数生成2,调用Scope对象的addDeclaration方法什么时候会调用addDeclaration方法:1, 函数直接定义节点,例:function aa() {}2,变量声明,例:var aa = 1;3,类的声明答:作用是在查找依赖性时可以根据这个来判断是否有被依赖,方便进行tree-shaking
Statement.prototype.analyse
modifies
问:definitions的作用是?问:statement.defines是怎么来的?答:完全与scope.declarations挂钩问:defines有什么作用?答:defines其实就是declarations相对应的Map对象,用来判断在模块中已经声明的变量defines是在分析完成之后再给值的,这说明他永远都不会有值,这样的意义是什么?现象:在checkForReads函数中有对declarations和defines进行判断,判断的结果是对dependsOn变量进行修改,dependsOn用来判断模块中对于变量的使用
amd
bundle.build
bundle.generate
modifications
bundle.fetchModule
分析导出语句
umd
拼接符合umd格式的代码
_analyse(注释分析,注释与节点之间的间隔)
stronglyDependsOn
代码生成var code = magicString.toString();
export转exports前置准备
var intro = '(function (' + args + ') { \\'use strict\\';\\';\tvar outro = '\\})(' + dependencies + ');';
解决冲突,所有节点排序
new ExternalModule
Bundle对象中初始化了解析代码所需要的前置工作。定义好了众多内部对象,例如:entry、resolveOptions、varExports、modules、statements...
Module.prototype.analyse
module.define
checkForReads
外链import改为require以及exports导出
fetchModule中根据文件路径读取文件内容,读取文件内容后生成一个Module对象,并将此Module实例对象放入bundle全局的modules和modulePromises,并在内部区分了是否外链模块,其中一个module对象的Id可以简单理解为文件路径
build中调用了fetchModule方法,该方法用于获取一个文件中的内容,在rollup中认为一个文件就是一个module,在fetch成功之后回填信息
new Statement
分析注释
this.orderedStatements.forEach
declarations
外链模块
拼接自执行函数
用于展开下级寻找sequence(modifications =>statement.expand()
对应
canonicalNames
definitions
expand
newScope
entryModule.expandAllStatements(true)遍历解析自身所有变量声明,目的是检查以是否依赖其他模块
definitions作用判断是否全局变量
省略不必要语法或优化语法
dependsOn
用于分析本节点所有的依赖,如果依赖了其他模块,则先导入其他模块
_this2.statements = statements;\t\t\t_this2.deconflict();\t\t\t_this2.orderedStatements = _this2.sort();
new Module
Scope.prototype.addDeclaration
new Bundle
define申明以及exports导出
rollup
函数中生成了一个Bundle对象,bundle对象执行内部的build方法,在执行完成之后返回了一个对象,对象包含了两个属性,generate和write,其中generate函数用来生成转译之后的代码以及生成sourceMap,write函数内部调用了generate函数,然后将结果写入文件。
生成模块,每个文件代表一个模块,每个模块维护一个MagicString对象,使用acorn工具解析语法,生成ast抽象语法树,遍历抽象语法树维护好原代码作为sourceMap,分析当前文件生成的节点信息,维护在module对象的statements数组中,筛分导入导出节点注:每一个module在初始化的时候只会把根级Statement对象维护到数组中来,其它节点自行分析
对模块代码进行分析,分析import导入,分析export导出,并记录在module对象的import属性和export属性,分析definitions, modifications
0 条评论
下一页