Wang's blog Wang's blog
首页
  • 前端文章

    • HTML教程
    • CSS
    • JavaScript
  • 前端框架

    • Vue
    • React
    • VuePress
    • Electron
  • 后端技术

    • Npm
    • Node
    • TypeScript
  • 编程规范

    • 规范
  • 我的笔记
  • Git
  • GitHub
  • VSCode
  • Mac工具
  • 数据库
  • Google
  • 服务器
  • Python爬虫
  • 前端教程
更多
收藏
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Wang Mings

跟随大神,成为大神!
首页
  • 前端文章

    • HTML教程
    • CSS
    • JavaScript
  • 前端框架

    • Vue
    • React
    • VuePress
    • Electron
  • 后端技术

    • Npm
    • Node
    • TypeScript
  • 编程规范

    • 规范
  • 我的笔记
  • Git
  • GitHub
  • VSCode
  • Mac工具
  • 数据库
  • Google
  • 服务器
  • Python爬虫
  • 前端教程
更多
收藏
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Python爬虫

  • 前端教程

    • 团队规范

    • Project

      • Axios用法与原理
      • css布局技巧
      • 深度学习平台术语
      • 谈谈前端天花板问题
      • 一个程序员的成长之路
      • Markdown-It 解析原理
      • minipack源码解析
        • [#](#整体流程) 整体流程
        • [#](#_1-babel编译代码) 1. babel编译代码
        • [#](#_2-ats可以获取依赖项) 2. ATS可以获取依赖项
        • [#](#拼接代码-核心) 拼接代码\(核心\)
      • PostCSS
      • Electron工程踩坑记录
      • H5 Video踩坑记录
      • Puppeteer翻页爬虫
      • 重构你的javascript代码
      • RxJS入门实践
      • 官网脚手架思考与实践
      • Stylelint样式规范工具
      • TypeScript开发Vue应用
      • Typescript tsconfig.json全解析
      • Vue项目TypeScript指南
      • TypeScript在Vue2.x中的坑
      • Vue Dialog弹窗解决方案
      • Vue JSX插件依赖及语法实践
      • Webpack 模块打包原理
      • Webpack4 配置详解
      • Webpack4 devServer配置详解
      • Webpack3.x升级Webpack4指南
    • JS

    • NodeJS

    • Vue

    • React

    • 效率工具

    • 读书笔记

  • 教程
  • 前端教程
  • Project
wangmings
2022-07-19
目录

minipack源码解析

# # minipack源码解析

注释可以查看笔者fork自官方minipack项目:https://github.com/lq782655835/minipack

结合笔者另外一篇文章Webpack 模块打包原理 (opens new window) (opens new window),会有更多编译底层知识。

# # 整体流程

先递归找到依赖项 & 编译每个文件 -> 代码拼接方式生成最终代码。

流程细节:入口entry文件 -> 生成ATS -> ATS中找到依赖项 & babel编译代码(createAsset) -> 依赖项递归生成队列queue(createGraph) -> 代码拼接(build,基于CommonJS规范)

    const graph = createGraph('./example/entry.js'); // ATS分析图
    const result = bundle(graph); // 技巧拼接字符串
    
1
2
3

核心代码分析如下:

# # 1. babel编译代码

babel编译代码(babylon.parse -> AST -> transformFromAst -> code

    const babylon = require('babylon');
    const {transformFromAst} = require('babel-core');
    
    // 生成ATS
    const ast = babylon.parse(content, {
        sourceType: 'module',
      });
    
    // 最终code代码
    const {code} = transformFromAst(ast, null, { // springleo: babel编译代码(babylon.parse -> AST -> transformFromAst -> code)
        presets: ['env'],
      });
    
1
2
3
4
5
6
7
8
9
10
11
12
13

# # 2. ATS可以获取依赖项

    const traverse = require('babel-traverse').default;
    
    const dependencies = [];
    
      traverse(ast, {
        // Every time we see an import statement we can just count its value as a
        // dependency.
        ImportDeclaration: ({node}) => {
          dependencies.push(node.source.value); // 通过ATS找到依赖项目
        },
      });
    
1
2
3
4
5
6
7
8
9
10
11
12

# # 拼接代码(核心)

技巧性利用CommonJS规范

    function bundle(graph) {
      let modules = '';
    
      // 代码拼接
      graph.forEach(mod => {
        modules += `${mod.id}: [
          function (require, module, exports) {
            ${mod.code}
          },
          ${JSON.stringify(mod.mapping)},
        ],`;
      });
    
      // 入口0开始寻找require(1)
      const result = `
        (function(modules) {
          function require(id) {
            const [fn, mapping] = modules[id];
    
            // 自己实现的require本地包
            function localRequire(name) {
              return require(mapping[name]); // springleo: 从依赖包的名字,找到包编译的序列号ID
            }
    
            const module = { exports : {} };
    
            fn(localRequire, module, module.exports);
    
            return module.exports;
          }
    
          require(0);
        })({${modules}})
      `;
    
      return result;
    }
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

graph是解析的图数据结构:

image

编辑 (opens new window)
Markdown-It 解析原理
PostCSS

← Markdown-It 解析原理 PostCSS→

最近更新
01
theme-vdoing-blog博客静态编译问题
09-16
02
搜索引擎
07-19
03
友情链接
07-19
更多文章>
Theme by Vdoing | Copyright © 2019-2022 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式