引入Packem:一个超级快速实验打包机用生锈
Packem打包机是一个实验性的预编译JavaScript模块主要实现生锈。它也可以处理各种各样的其他文件类型,如YAML / TOML片段着色器文件和更多。检出的网站或者是GitHub页面快速开始。
Packem解析模块的依赖关系和再水化成一个模块图,本质上是一个平面列表包含模块接口引用内存中的基于堆的可变数据结构含有特殊元数据模块的模块图。
大部分的业务逻辑抽象成铁锈使用FFI绑定,使低水平两端之间的相互作用。生锈的二进制文件是可用的节点作为预编译的C / c++插件Packem的回购。使用基于云的CI与pre-gyp安装,运行几个脚本产生使用二进制文件支持后节点版本(8、9、10)。
这一层的Packem的核心就是被称为逻辑上下文(LC)。所有其他的操作明确优先退化为节点的总体运行时,Packem的条件是运行时上下文(RC)。阅读更多关于上下文在这里。
理论上,模块图保持平坦,以避免常见缺陷,会导致不必要的遍历树是用来代替。这允许RC跟踪等情况下的深循环依赖进口或深度嵌套动态(代码分割),在其他人,适当用最小的性能影响或副作用。
更多细节可以在Packem找到README.md。
我一直有这个想法但从未计划执行它,直到我加入军队与萨达姆米。它真的是在我的兴趣模块捆绑销售作为一个概念的安全,任何人学习,理解和实现。让人们的斗争与配置、文档和插件是非常可怕的,我想抓住这个机会来改变这种状况。和你在一起。Packem。
快速的历史
我花了一些时间到排气大多数筹款人用javascript环境。我发现他们中的大多数忘记了他们应该是一个打包机和不是一个C / c++库从黑暗的ol 19年代。
什么我想要的是一个打包机,最繁重的接近金属语言内部的用户不需要任何交互。然后我发现生锈。一个聪明的和简洁的系统语言,展示了一些值得称赞的功能像一个无所畏惧的并发模型,类型安全,和更多!我希望尽可能多的使用C / c++但我宁愿坚持生锈时因为它是很简单的内存管理。
为什么另一个打包机吗?
这里的花是什么?我们为什么需要另一个构建工具,因为我们已经有惊人的webpack,包裹,汇总,等等?我会带你一起几个原因。也许你会有你自己的利益你的开发和生产构建时间大量减少。
这是2019年,我们不需要缓慢的工具
尽管Packem比webpack快4这是超过两倍包裹(与多核编译)。在基准测试中,我们捆绑Lodash v4.17.1Packem和包裹,这是结果:
从未采取任何长椅。你可以测试一下在这里。
为什么我没有打扰基准包裹对webpack是因为webpack 4是深刻的速度比包裹。我通过使用证明这一事实肖恩·t·拉金自己的长凳上,一个线程在Twitter上可以在这里找到。
因为我们可以。任何人都可以,对吗?
当然,最有意义,是因为我们可以。我们的想法与一个生锈的接口有更快的包时间与FFI或WASM(还不确定)。FFI更合理的速度和DX是而言,我们有Packem锈FFI实现绑定。
我们经历了一些上述与线程相关的问题所以我们没有使用可用的资源。由于子进程(我们使用多个节点node-worker-farm),相同的技术包裹使用多核编译,但对于较大的模块图,因为它增加了一个重要的启动时间的节点的正常运行时间在使用较小的模块图。
配置风格
这是一个棘手的部分。有很多的问题需要一个好的答案,选择正确的配置方式。静态或动态吗?JSON / YAML / TOML吗?我们的选择是完全基于我们是否需要Packem:
- 有一个整洁的配置风格,然后呢
- 其他自定义用户配置的不可知论者.babelrc或package.json。
底线,我们进行一个静态配置风格,因为我们发现它正是我们需要的。的东西可以以声明的方式告诉Packem如何管理包周期。所有的限制有一个静态配置都明确表示。
感兴趣的另一个方面是我们应该使用的文件类型的配置。JSON是更常见的绝大多数JavaScript开发人员或YAML TOML / xml样式不常见但也有自己的优势(s)。一个建议仍为JSON支持(# 5)。
JSON只是没有停止,因为所有不必要的字符串引号,花& block括号,这是有意义的,因为这是一个数据交换格式。XML-ish方法不值得尊重与被用作配置格式,因为它会让事情更糟比JSON不必要的字符而言。TOML引入了大量的新线路,嵌套和调试选项似乎没有吸引眼球,因为我们知道Packem插件可以真正内斯蒂。
最后的赢家是YAML !它能够通过方方面面的一个合适的配置格式(至少在Packem)。它:
- 使配置无痛。
- 使用一个优雅的方式。
- 还在熟悉JavaScript的眼睛吗
- 这是专门为例(配置)。
这是一个典型的例子Packem配置(packem.config.yml)。检查自己和思考写相同的内容在一个JSON / TOML XML-ish风格。
通知你,只有前两个选项是必要的!
延长Packem
这个功能还没有实现。
有时我们可能需要使用一个特性还不存在,在Packem可能不会实现或者是我们的项目非常具体。在这种情况下,你会解决你的需求有两种方式:
- 创建一个Packem插件为你的用例(推荐的选项)。
- 构建一个定制的RC Packem之上的二进制文件。
使用生锈给我们机会改革LC到其他二进制格式,如WebAssembly,这将使Packem展示多个编译目标:
- NAPI-based C / c++插件Packem所需的特定于平台的二进制文件的默认RC。
- 一个WebAssembly-based二进制跨平台和注入RC。
- Packem默认的独立使用WebAssembly浏览器兼容的RC实现。
最后两个尚未在雷达自内部重构仍在解决。
先进的指导预计很快将向您展示如何构建一个自定义构建工具使用Packem的二进制文件根据自己的需要在浏览器之外的情况下,您需要使用Packem和节点环境。这些二进制文件完成整个图形生成和重复的过滤和其他graph-related方面。这意味着您可以使用您的自定义序列化器,文件中,插件系统等。它就像如何构建您的自定义渲染器在OpenGL。
- 你仍然可以拥抱Packem插件系统因为它会让你整合Packem插件和定制打包机的生态系统。
- 如果你不确定你是否需要构建一个定制的打包机,知道你不会总是需要。请先试着申请一个问题。
- 这是一个保证这些二进制文件将加快工作流程根据您具体的用例(s)。
当前状态
- ✂代码分离为开发和生产模式。
- 改进的CLI (”——verbose”)为更好的信息捆绑销售周期。
- 模块接口允许容易操作的模块图。
- ✔适当的优先级。本机功能完全融入LC。这意味着有更多的机会迅速构建。
- 出口
NativeUtils
外部使用的本机功能包括generateModuleGraph
重播生成模块图的过程。重但仍然有用的情况下你需要的克隆当前活动模块图。使用它意味着构建时间翻了一番,所以小心使用它。
接下来是什么?
这些特性我们希望很快在接下来的版本。我们可以和你的努力正确地完成捆绑。当Packem在1.0,我们期待完全支持下面列出的所有特性和其他人提到的Packem的路线图。
- 的浏览器兼容的独立与LC Packem WebAssembly与底层的系统更紧密的融合。阿克塞尔Rauschmayer已经做了一个特性请求WASM Node-compatible版本。备案,我们将工作很快。
- Treeshaking,但先进。解决命名/不知名的进口和剥离死代码应该是微风。这意味着您可以使用图书馆lodash而不是lodash-es不用担心您的代码省略与否。
- 汽车配置。像零配置,但defaults-oriented额外的灵活性。
- 高级CLI选项使发展Packem第二天性。
- 更好的错误报告。
- 更多的环境目标。Packem只能包现在的浏览器。最终,我们希望支持节点cj和其他格式。
- 更多的插件。我们需要更多的插件!Packem有一组常见的插件让你开始更快。但成长的一个社区,我们需要一个大的生态系统插件。检查常见的插件或可用插件部分在网站上开始开发一个插件。
- 和更多…
资源
Packem还没有达到1.0然而,。如果你发现Packem是有趣的,你试着导致Packem本身通过创建插件,更新文档,在经济上支持我们,在会议上代表Packem或任何其他方式。我们感谢你的努力!
捆绑快乐!