minipack 源码解析

发布于 2022-08-08 19:23:48 字数 2465 浏览 175 评论 0

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']
    })

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

-小熊_

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

烙印

文章 0 评论 0

singlesman

文章 0 评论 0

独孤求败

文章 0 评论 0

晨钟暮鼓

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文