Prepack

JavaScript 代码优化工具
授权协议 BSD
开发语言 JavaScript
所属分类 开发工具、 代码管理分析/审查/优化
软件类型 开源受限软件
地区 不详
投 递 者 孙嘉悦
操作系统 跨平台
开源组织 Facebook
适用人群 未知
 软件概览
温馨提示:该项目除了使用 BSD 协议授权外,还需遵守附加的 专利授权

官方宣称Prepack是一个优化JavaScript源代码的工具,实际上它是一个JavaScript的部分求值器(Partial Evaluator),可在编译时执行原本在运行时的计算过程,并通过重写JavaScript代码来提高其执行效率。Prepack用简单的赋值序列来等效替换JavaScript代码包中的全局代码,从而消除了中间计算过程以及对象分配的操作。对于重初始化的代码,Prepack可以有效缓存JavaScript解析的结果,优化效果最佳。

官方提供的Prepack优化示例:

/* Hello World */// Input(function () {
  function hello() { return 'hello'; }
  function world() { return 'world'; }
  global.s = hello() + ' ' + world();
})();// Output(function () {
  s = "hello world";
})();

Prepack团队对未来的规划如下:

短期
  • 稳定现有功能集,用于预优化(Prepack)React Native代码包

  • 集成React Native工具链

  • 根据React Native所用模块系统的假设来构建优化

中期
  • 进一步优化序列化(Serialization),包括:消除不暴露特性(identity)的对象;消除未使用的导出属性,等等

  • 预优化每个函数、基本代码块、语句、表达式

  • 与ES6保持完全一致

  • 支持广泛的模块系统

  • 假设ES6支持某些功能,延迟完成或直接忽略Polyfill应用

  • 进一步实现Web和Node.js环境中的兼容性目标

  • 深入集成JavaScript虚拟机,改进堆反序列化过程,包括 :暴露“对象懒初始化”的概念 - 以一种JavaScript无感知的方式,在首次使用对象时对其进行初始化;通过专门的字节码提高普通对象创建的编码效率;将代码分为两个阶段:1) 非环境依赖阶段,虚拟机可以安全地捕获并恢复生成的堆;2)环境依赖阶段,通过从环境中获得的值执行所有剩余的计算过程来拼凑具体的堆,等等

  • 总结循环和递归

长期 - 利用Prepack作为一个平台
  • JavaScript Playground - 通过调整JavaScript引擎体验JavaScript特性,这些引擎由JavaScript所编写,托管在浏览器中;你可以把它想象成一个“Babel虚拟机”,实现了不能被编译的JavaScript新特性

  • 捉Bug - 发现异常崩溃、执行问题……

  • 效果分析,例如检测模块工厂函数可能的副作用或强制纯净注释

  • 类型分析

  • 信息流分析

  • 调用图推理,允许内联和代码索引

  • 自动测试生成,利用符号执行的特性与约束求解器(Constraint Solver)结合来计算执行不同执行路径的输入

  • 智能模糊(Smart Fuzzing)

  • JavaScript沙盒 - 以不可观察的方式有效地测试JavaScript代码

目前Prepack仍处于早期开发阶段,尚未准备好在生产环境中使用,官方建议仅尝试使用,并欢迎提供反馈以帮助修复错误。

  • 原文:A Gentle Introduction to Prepack (Part 1) 内容更新至:2018-12-24 注意: 计划在当前指南更完善后,将其引入 Prepack 文档中。 目前我以 gist 方式发布,以便收集反馈。 Prepack 介绍(第一部分) 如果你在开发 JavaScript 应用,那么对如下这些将 JavaScript 代码转为等价代码的工具应该比较熟悉: Babe

  •     最近,Facebook 发布 Prepack :一个优化 JavaScript 源代码的工具,实际上它是一个 JavaScript 部分求值器(Partvaluator),可在编译时执行原本在运行时的计算过程,并通过重写 JavaScript 代码来提高其执行效率。(西安尚学堂)   Prepack 用简单的赋值序列来等效替换 JavaScript 代码包中的全局代码,从而消除了中间计算过

  • 最新内容,请在github阅读。同时,All issue and star welcomed! 1.prepack vs webpack的说明 今天facebook开源了一个prepack,当时就很好奇。它到底和webpack之间的关系是什么?于是各种google,最后还是去官网上看了下各种例子。例子都很好理解,但是对于其和webpack的关系还是有点迷糊。最后找到了一个好用的插件,即prepac

  • 原文:https://prepack.io/ 翻译:Aladdin Prepack是一个JavaScript源代码优化工具:实际上它是一个JavaScript的部分求值器(Partial Evaluator),可在编译时执行原本在运行时的计算过程,并通过重写JavaScript代码来提高其执行效率。Prepack用简单的赋值序列来等效替换JavaScript代码包中的全局代码,从而消除了中间计算过

  • 5月4日,Facebook开源团队技术作者Joel Marcey在Hacker News社区发布一则《Prepack帮助提高JavaScript代码的效率》,引起了社区的广泛讨论。 官方宣称Prepack是一个优化JavaScript源代码的工具,实际上它是一个JavaScript的部分求值器(Partial Evaluator),可在编译时执行原本在运行时的计算过程,并通过重写JavaScrip

  • js 性能优化利器:prepack 1. js 性能优化 js 性能优化不外乎从三个角度入手: 1.1 开发者在编写程序时,尽量避免不必要的冗余代码,包括冗余的第三方库 首先要避免不必要的冗余代码,包括不必要的闭包、不必要的变量与函数声明、不必要的模块分割等。 比如: // 低效的实现 const urlParams = (() => { const params = {}; if (lo

  • 1. js 性能优化 js 本身是没有像 python 一样的预编译功能,更没有像 java 一样的编译功能,所以,这里所说的 js 代码预编译 只是通过工具实现的类似功能而已。 这就要提到 prepack 了,它的思路大致是这样: 把不依赖外部环境的逻辑提前进行运算,并把运算结果替换到相应的源码处,然后从源码中移除这段逻辑。 2. prepack 2.1 安装 2.2 编译(打印在命令行) 2.

  • Great improvements and optimizations can be made to the output of bundled code. Prepack provides the ability to optimize code at build-time, producing run-time optimizations. In this lesson, we will l

  • 作者介绍:雪婧,美团点评点餐团队成员。 前言 Prepack前几个月刚出来的时候已经得到了前端界的大范围关注,而在不久之后又逐渐退出了人们的视线。此时这篇文章出来可能显得有些滞后,个人还是比较看好它未来对于前端代码预编译优化所带来的收益。所以再详细地介绍一下Prepack和它给我带来的思考。 在前端技术迭代更新速度较快、前端人力宝贵的情况下,面对新技术的不断涌现我们需要保持冷静和严谨的态度去接受这

  • Prepack Prepack 是 Facebook 最近开源的一个 JavaScript 代码优化工具,它跟 Babel、谷歌的 Closure Compiler 类似,运行在 “编译” 阶段,生成优化后的代码。(实际上 Prepack 的源代码生成使用的就是 Babel) 它最基本能力就是四个字:计算消除。 看一个官方的例子代码: 源代码: (function () { function

 相关资料
  • Donald Knuth "过早的优化是一切罪恶的根源" 本章处理用策略让Python代码跑得更快。 先决条件 line_profiler gprof2dot 来自dot实用程序 2.4.1 优化工作流 让它工作起来:用简单清晰的方式来写代码。 让它可靠的工作:写自动的测试案例,以便真正确保你的算法是正确的,并且如果你破坏它,测试会捕捉到。 通过剖析简单的使用案例找到瓶颈,并且加速这些瓶颈,寻找更

  • 有没有代码写的漂亮的大佬,看看这个代码怎么优化,一直写前端的,突然被叫去搞java,发现很多技术都不太相同,例如动态的key去调用之类,导致写出这样的恶心代码,自己都看不下去了 明明js可以写的这么短小优雅,java有没有办法做到这样子的呢

  • 我想写一个模拟 DNF 装备增幅的程序,通过多次样本执行得到平均每件增幅 10 装备需要增幅多少次。装备 +4 之前不会失败,+4 之后会失败且失败后还会掉级,具体如下图所示: 公会秘药和普雷宠物会额外增加每次增幅的成功率 1% 和 4%,所以一共分了三种情况。 我最开始用 js 写了一版: 后来想到我刚学了 rust,不如练练手,而且 rust 很快,于是又写了一版: 然而实际上 rust 代码

  • 因此,通常关于通过汇编代码提高性能的问题的答案是“不要打扰,编译器比你聪明”。我明白了。 但是,我注意到优化的线性代数库(例如ACML)可以比标准编译库实现2到5倍的性能改进。例如,在我的8核机器上,与现有的单线程BLAS实现相比,优化的矩阵乘法运行速度快了30倍以上,这意味着,在考虑了由于使用所有内核而提高的8倍之后,仅仅通过优化仍然可以提高4倍。 所以在我看来,优化的汇编代码确实可以带来巨大的

  • JavaScript代码优化 1、慎用全局变量 为什么要慎用全局变量原因如下 1、全局变量定义在全局执行上下文,是所有作用域链的顶端 2、全局执行上下文一直存在于上下文执行站,直到程序退出 3、如果某个局部作用域出现了同名变量则会遮蔽或污染全局 2、缓存全局变量 其实就是在程序执行过程中,将使用中无法避免的全局变量缓存到局部 代码演示如下 1、普通写法: function getBt

  • 我认为代码(如下)已经优化(只需使用比相同逻辑的初始版本更少的变量) > 在优化过程中,我应该考虑哪些因素? 这是代码(也在jsfiddle上) 这是代码的解释。“处理”函数在数组中查找相同的值,对于每个相同的值,它通过将一个数字挂起到该值来更改值,“数字”表示它在数组中找到的值的计数。 例如arr=["x","x","y","z"]将返回["x(1)","x(2)","y","z"]"y"和"z

  • 存在与循环有关的问题。为什么?也许是虫子? 我使用的是最新的4.8.0,经过测试的x64、x86以及其他版本。都是同样的行为。

  • 前言 代码测试 测试程序的运行时间 time 函数调用关系图 calltree 性能测试工具 gprof & kprof 代码覆盖率测试 gcov & ggcov 内存访问越界 catchsegv, libSegFault.so 缓冲区溢出 libsafe.so 内存泄露 Memwatch, Valgrind, mtrace 代码调试 静态调试:printf + gcc -D(打印程序中的变量)