简易JS打包器,不做语法转换,只支持ESM
- import文件类型
- JS
- JSON
- TS
- import方式
- 本地文件
- node_modules
- URL
- Path alias
- Export from
- Default
- Namespace
- Dynamic Import
- 优化
- Parallel
- 使用require形式(这种比较简单)
- Tree Shaking
- Dead Code Elimination
- 根据给定入口,进行依赖收集,获取所有待打包文件
- 拓扑排序,确定打包顺序
- runtime代码注入 (参考
runtime.go
) - 符号表合并
- 消除同名变量,作用域提升 (通过
Scope
和Binding
找到引用节点)
- 消除同名变量,作用域提升 (通过
- 按顺序写入一份文件
这种情况可以作用域提升,所有模块都直接写在顶层
源文件 | 打包后 |
---|---|
顶层函数 function |
在顶层进行定义 |
顶层变量 var , let , const , class |
顶层 var 定义 |
顶层语句 | 顶层中使用 |
别名导入 import { x as y } from 'bar' |
无视别名,仍然使用 x |
命名空间导入 import * as mm from 'baz' |
无视命名空间,使用原本命名 |
默认导入 import z from 'foo' |
使用 foo_default 代替 z (最麻烦,会有命名重复问题) |
Node自带的module | 维持使用import |
模块需要用函数包一层
源文件 | 打包后 |
---|---|
顶层函数 function |
在顶层进行定义 |
顶层变量 var , let , const , class |
顶层 var 声明,init 中定义 |
顶层语句 | init 中使用 |
-
export { a as b }
的处理 -
export *
的处理 - 单元测试
- Dynamic Import处理