Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

minipack源码解析 #53

Open
huruji opened this issue Nov 11, 2018 · 0 comments
Open

minipack源码解析 #53

huruji opened this issue Nov 11, 2018 · 0 comments

Comments

@huruji
Copy link
Owner

huruji commented Nov 11, 2018

1523855944316

minipack是一个非常简单的通过babel实现的、旨在讲述打包工具原理的仓库,这个仓库本身已经包含了详细的注释。

大致过程可�以梳理如下,从主入口中将代码转换为AST后找出�主入口的依赖关系,通过这个依赖关系可以�构建依赖图,最后通过依赖图转化为类commonjs模块的代码,打包在一块。�

babylon

babylon是babel的js代码解析器,目前已经babel官方已经将仓库迁移到了@babel域下,改名为babel-parser,可以通过以下命令安装

npm install -D @babel/parser

使用这个可以生成js代码的AST

const babelParser = require('@babel/parser');
const fs = require('fs');

const content = fs.readFileSync('./index.js');
babelParser.parse(content, {
    sourceType: 'module'
})

这个库的API非常简单,具体的options参数可以在官网找到 https://babeljs.io/docs/en/next/babel-parser.html

babel-traverse

Babel Traverse(遍历)模块维护了整棵树的状态,并且负责替换、移除和添加节点。我们可以和 Babylon 一起使用来遍历和更新节点。

这个模块帮助我们更改我们得到的AST,算是babel所做的中间工作

可以简单使用如下:

const babelParser = require('@babel/parser');
const traverse = require('babel-traverse').default;
const fs = require('fs');

const content = fs.readFileSync('./index.js', 'utf-8');
console.log(content);
const ast = babelParser.parse(content, {
    sourceType: 'module'
})
traverse(ast, {
    FunctionDeclaration: ({
        node
    }) => {
        console.log(node)
    }
})

babel-core

babel-core提供了babel的核心能力,将高版本的Es语法转换为浏览器支持的ES语法,主要API有:transformtransformSynctransformAsynctransformFiletransformFileSynctransformFileAsynctransformFromAsttransformFromAstSynctransformFromAstAsync

按行为划分可以分为异步接口、同步接口、promise接口。

返回的结果是一个包含代码code、sourcemap、ast的对象:

{ code, map, ast }
const {
        code
    } = transformFromAst(ast, null, {
        presets: ['env']
    })
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant