tooling.report- 构建工具测试结果 - webpack、parcel、browserify、rollup - 超级全面 (1)

本文主要是介绍tooling.report- 构建工具测试结果 - webpack、parcel、browserify、rollup - 超级全面 (1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考文档:

因此篇知乎回答 , 本文属于讲解 + 翻译,摘自 Tooling.Report
有能力的同学还是直接看原文比较清楚,不复杂的哦。

Tooling Report 简介

什么是Tooling Report? 这个报告提供了快速确定项目最佳构建工具的数据,可用于确定工具迁移的代价,或确定如何应用打包工具。

报告选择了最受欢迎的 browserifyparcelrollupwebpack四个打包工具,做了共计48个项目的特性测试;每个特性测试都有对应的测试文件。

性能总览

绿圆 - 通过, 黄色半圆 - 部分通过 , 红圈 - 失败,
在这里插入图片描述

1 - 代码分割

在这里插入图片描述
1.1 new Worker() 能否打包成不同bundle?

JS是单线程的,为了充分利用电脑多核,可以利用master-worker的主从模式,实现多线程,提升CPU利用效率。
new Worker() 属于H5的一部分,参考阮一峰的Web Worker 使用教程

打包预期: 不同线程(worker)应打包成不同的bundle.js;且如果有抽取公共部分,各线程应正确获取到公共部分代码。

1.2 worker之间的module是否支持共享?
对于多线程打包结果,包括 master - worker 或 worker - worker 模式,应包括以下三个文件: 一个主线程; 一个从线程,且该从线程应正确引用对应的worker.js ; 还有一个文件,用于两者共享的依赖项。

browserify虽然能打包公共模块,但还需要手动引入,预期不佳。
rollup使用emitFile方法,会抽取公共的js,并引入路径。
webpack使用importScripts抽取公共js,但对module worker就不支持了,因为Worker 在设计之初还没有 module system, webpack为了保证不会有变量冲突,会用函数把module封装起来。

Since there was no module system when workers were designed, the API for loading code into a worker and composing scripts has remained similar to the synchronous script loading approaches common in 2009.

As an example, bundlers like webpack embed a small module loader implementation into generated code that uses importScripts() for code loading, but wraps modules in functions to avoid variable collisions and simulate dependency imports and exports.

1.3 对动态异步载入的js能否分割打包?

Browserify由于CommonJS 的 require机制,不支持这类动态的ECMAScript 模块。
其他三个支持。

Browserify bundles CommonJS code by statically analyzing synchronous require() calls to import modules. Since dynamic require usage and ECMAScript modules are both unsupported, neither can be used to create split point

1.4 多个入口有没有混合公用某公共引入,而非多次实例化。
【翻的有点绕口,哭了】
在js中,一个模块只能被实例化一次。多入口的情况下,模块是被实例化多次还是一次,将造成结果不一致。
测试方式是,两个不同js,都import同一个obj.js,该obj里的方法应该被混合公用。
测试结果是,browserify和webpack都支持配置,选择 各自复制该模块 ,还是混合公用该模块。而rollup仅支持混合公用方式。parcel仅支持各自复制方式,但直接用 ES 时又不一致(这个是有问题的)。 webpack比browserify更优秀,因为它还支持配置大小限制等。

Whether extracted or inlined, it’s important that a module never be instantiated multiple times - both ECMAScript Modules and CommonJS Modules specify that a module must only be instantiated once per JavaScript context.

1.5 共同依赖包被抽取到共享包
比如两个页面(multi page 就有 multi entry points )都加载了同一个大资源包。这个包应该被正确抽取到一处,并被两个不同页面正确引用。这将有助于打包后体积减少。
有些打包机制不全,就会各自复制一份,没有做“抽取”。
这四个工具,简单来说,根据配置不同,想复制就复制,想抽取就抽取。但 browserify 是个半圆,因为打包不灵活,二选一:

… Browserify users must currently choose between having optimized “scope-collapsed” bundles with duplication, or multiple “scope-preserved” bundles without duplication.

1.6 共享引用
由于1.4,理论上根据适当的配置,不管是否是重复导入,由于被实例化只有一次,一但改变了变量,其他引用的地方都会随之变化。

1.7 单模块拆分

Code Splitting 是指为模块分组处理成小包的过程,这些小包可以在runtime时有用,并被处理,也避免了加载当前用不着的代码。
假如一个对象有两个export,两处import不同的内容,结果?
case1: 两处import属于动态载入场景: 除了browserify 利用 tinyify 插件可以拆分,其他三个不支持,全都混在一个文件。
case2: 两处import属于multi entry:webpack可以为每个runtime生成不同的文件,其他三个不支持。

2 - 哈希

在这里插入图片描述
2.1 JS依赖的资源发生变化,hash值是否更新?

理论上这种场景应该被监听到并被更新,但rollup 即使利用augmentChunkHash,也不能自动监听并更新,还需要code,所以是“partial”半圆。 其他都很好的支持这个基本功能。

2.2 依赖的资源再依赖的资源发生变化,hash值是否更新?

举例:某个css文件里的图片文件img or svg 发生更新。
browserify + gulp-rev-all,分析包含的文件,根据是否更新才更新hash值,都支持。
parcel:支持css,不支持svg(压根没支持)。
rollup + PostCSS 可以解析CSS URL,但没有用emitFile而导致可能出现重复包; 而emitFile 合理的配置监听,可对svg监听并更新hash值。
webpack + extract-loader, 原理上首先把css解析成require,再解析后反写成css,都能监测到。

2.3 bundle.js assets 能否在各种入口进行正确的hash更新和处理。
browserify fail

2.4 能否选择性的禁用部分资源的hash?
only browserify pass

2.5 JS hashing是否是基于其内容的?
All pass,是基于其内容的。

2.6 hash一般是根据文件路径来的,如果父组件引用后又更新了,那么hash值会更新吗?
rollup fail

2.7 比如改了一个注释,hash值会刷新吗?即是否根据其最终生成的文件内容来确定hash值的?
rollup fail

2.8 比如一个子组件发生了更新,那么引用他的两个index.js的hash值是否应该更新呢?
browserify 本身不提供能力,其他三个pass。

2.9 code splitting( 异步加载) 的内容发生更新,会更新入口文件hash值吗?
browserify 本身不提供能力,其他三个pass。

  • 太监了,躺草稿一个月了,先写到这里吧,有时间再审阅一下

这篇关于tooling.report- 构建工具测试结果 - webpack、parcel、browserify、rollup - 超级全面 (1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/509503

相关文章

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

基于C#实现PDF文件合并工具

《基于C#实现PDF文件合并工具》这篇文章主要为大家详细介绍了如何基于C#实现一个简单的PDF文件合并工具,文中的示例代码简洁易懂,有需要的小伙伴可以跟随小编一起学习一下... 界面主要用于发票PDF文件的合并。经常出差要报销的很有用。代码using System;using System.Col

redis-cli命令行工具的使用小结

《redis-cli命令行工具的使用小结》redis-cli是Redis的命令行客户端,支持多种参数用于连接、操作和管理Redis数据库,本文给大家介绍redis-cli命令行工具的使用小结,感兴趣的... 目录基本连接参数基本连接方式连接远程服务器带密码连接操作与格式参数-r参数重复执行命令-i参数指定命

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

使用Python制作一个PDF批量加密工具

《使用Python制作一个PDF批量加密工具》PDF批量加密‌是一种保护PDF文件安全性的方法,通过为多个PDF文件设置相同的密码,防止未经授权的用户访问这些文件,下面我们来看看如何使用Python制... 目录1.简介2.运行效果3.相关源码1.简介一个python写的PDF批量加密工具。PDF批量加密

使用Java编写一个文件批量重命名工具

《使用Java编写一个文件批量重命名工具》这篇文章主要为大家详细介绍了如何使用Java编写一个文件批量重命名工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录背景处理1. 文件夹检查与遍历2. 批量重命名3. 输出配置代码片段完整代码背景在开发移动应用时,UI设计通常会提供不