前端构建工具大盘点:gulp、webpack、vite、rollup、esbuild、snowpack、babel、parcel、swc、tsc

news2024/11/22 11:21:18

文章目录

    • 背景
    • 分类
      • 转译器
      • 打包器
    • 对比
      • gulp VS webpack
      • Bundle vs Bundleless(代表就是webpack VS vite)
      • 其他比较
    • 个人理解总结
    • 官网

背景

做前端也有好多年了,从最早的 jQuery 时代到现在的三大框架,这过程中用到了很多构建工具,今天就来盘点一下我们前端开发常用的这些构建工具。

盘点之前呢,我们先聊聊现代前端开发的痛点,也是这些构建工具出现的原因:

  • 开发过程注重速度、配置复杂度
  • 线上部署注重体积

分类

我们根据功能将这些工具分为两种:
转译器:将一门高级语音转译为另一种高级语言,如 ts 转译为 js、es6 转译为 es5 等等。
打包器:将项目中的各种文件如png、sass、json 等等打包成想要的结果。

转译器:babel、esbuild、swc、tsc
打包器:gulp、webpack、vite、rollup、esbuild、snowpack、parcel

转译器

转译器再分类:
用js/ts实现的:babel、tsc
其他语言实现的:esbuild(go)、swc(rust)

这里的区别主要是性能,其他语言实现的性能会高一些,比如 esbuild 官网就号称速度比其他工具高这么多
在这里插入图片描述

打包器

也可以分为两类:
一类是通过监听源代码变化然后重新构建项目将打包后的代码推送到浏览器的传统模式。如 Webpack、rollup、parcel
另一类是通过浏览器的原生 module 来实现动态打包的 bundleless 模式。如:vite、snowpack

对比

gulp VS webpack

其实平常开发就能明显感觉到,现在这个时代,webpack 比 gulp 使用的频率更高了,但其实并不是 webpack 比 gulp 厉害,而是他们偏向的应用场景不一样,gulp 更偏向将开发流程中让人痛苦或耗时的任务自动化,从而减少你所浪费的时间。而webpack 更侧重于模块化打包,也就是官网的那张图,将所有依赖的 js、less、png 等等打包为最终需要的模块。

所以在 jQuery 的时代,更多的是用 gulp,做代码压缩之类的事情。
在现在的 SPA 单页面应用的时代,更多使用 webpack,对不同的模块进行打包,并且通过 plugin 也能实现压缩等功能。

虽然在一些功能上确实有重复,比如:文件合并、压缩、less/sass编译等等,但是对于 gulp 来说模块化不是他强调的东西,他旨在规范前端开发流程。而 webpack 更是明显强调模块化开发,而那些文件压缩合并、预处理等功能,不过是他附带的功能。

gulp 强调的是前端开发的工作流程,通过配置一系列的task,定义执行顺序,来让gulp执行,从而构建项目的整个前端开发流程。
webpack是一个前端模块化方案,更侧重模块打包,我们可以把开发中的所有资源(图片、js文件、css文件等)都看成模块,通过loader(加载器)和plugins(插件)对资源进行处理,打包成符合生产环境部署的前端资源。

gulp 时代没有模块化是依赖 RequireJS、SeaJS 的

Bundle vs Bundleless(代表就是webpack VS vite)

传统的 webpack 等工具会把代码打包成 Bundle 文件,而 vite 则是依赖原生的 ESM 来实现的,虽然在生产环境仍然要打包。

为什么 vite 生产环境要打包?
尽管原生 ESM 现在得到了广泛支持,但由于嵌套导入会导致额外的网络往返,在生产环境中发布未打包的 ESM 仍然效率低下(即使使用 HTTP/2)。为了在生产环境中获得最佳的加载性能,最好还是将代码进行 tree-shaking、懒加载和 chunk 分割(以获得更好的缓存)。

在过去我们一般都会使用Webpack这个打包构建工具来打包构建我们的代码,那为什么过去需要打包,简单来说就是一下几点:

  • HTTP/1.1 各浏览器有并行连接限制
  • 浏览器不支持模块系统(如 CommonJS 包不能直接在浏览器运行)
  • 代码依赖关系与顺序管理

为什么开始尝试不打包

  • 随着项目不断变大,启动和热更新所等待的时间越来越长
  • HTTP/2.0 多路并用
  • 各大浏览器逐一支持 ESM
  • 原生的解决了代码依赖和复用的问题
  • 越来越多的 npm 包拥抱 ESM(尽管很多包的依赖并不是)
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

其他比较

Rollup 通常用来打包第三方库,vite 在生产环境打包也使用的 rollup,在预购建依赖的时候使用 esbuild。

Parcel 和 Webpack 的功能类似,但是它简化了配置,号称零配置、开箱即用。
Parcel 2 的 JS 转译器部分基于 SWC 进行开发,性能有很大提升。

Snowpack 是最早的 bundleless 打包器之一,它最大的特点就是闪电般的速度,但是生态不行。

个人理解总结

可以看到,未来有两个趋势:

  • 一个基于 ESM 实现的 bundleless 模式。
  • 一个是基于其他语言实现的打包器。

都使得前端开发速度更快,JavaScript 和我一样诞生于1996,在这短短几年的时间,发展的如此迅速,各类开发工具日新月异、欣欣向荣,希望未来这个行业能越来越好!!

官网

gulp:https://www.gulpjs.com.cn/
webpack:https://webpack.docschina.org/
vite:https://vitejs.cn/
rollup:https://www.rollupjs.com/
esbuild:https://esbuild.github.io/
snowpack:https://www.snowpack.dev/
babel:https://www.babeljs.cn/
parcel:https://parceljs.org/
swc:https://swc.rs/
tsc:https://www.typescriptlang.org/ 只要下载了 typescript 就可以使用该命令 npm i typescript -g tsc index.ts

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/384507.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

婴幼儿常见八大疾病及护理方法

在1岁之前,婴儿的体质还没有完全发育,很容易生病,大多数婴儿在1岁之后都会更好。今天,新的稀有婴儿育儿专家组织了一些婴儿最容易患的疾病和护理方法。1、新生儿黄疸宝宝出生后,你可能会注意到他的皮肤发黄。别担心&am…

Netty学习(三):Netty线程模型和代码示例

〇、前言网络编程的基本线程模型,详见:Netty学习(二):线程模型一、工作原理简图Netty主要基于主从 Reactors 多线程模型(如下图) 做了一定的改进,其中主从Reactor 多线程模型有多个R…

11_MySQL数据处理(增删改)

1. 插入数据1.1 实际问题解决方式:使用 INSERT 语句向表中插入数据。1.2 方式1:使用VALUES使用这种语法一次只能向表中插入一条数据。情况1:为表的所有字段按默认顺序插入数据INSERT INTO 表名 VALUES (value1,value2,....);值列表中需要为表…

Windows安装Liberica JAVA8

在浏览器打开下载:Liberica JAVA。 点击链接"下载MSI"相对应的Microsoft Windows版本。 下载后完成后,验证的文件,通过比较其大小对你的驱动器和下载的页。 一个更加先进的方法来验证检验和在PowerShell: (Get-FileHas…

软件测试之测试环境--XAMPP

1. 测试环境 Linux下的环境搭建 LNMP: LinuxNginxMysqlphp项目 Windows下的环境搭建 WAMP: WindowsapacheMysqlphp项目 2. Xampp安装及使用 XAMPP包括Apache、MySQL、PHP、PERL,直接解压缩,没有复杂的安装过程,强烈推荐初学者使用。 到目前…

【C/C++基础知识点】输出n位斐波那契数列

目录 前言什么是斐波那契数列兔子的故事小知识点收尾前言 在软件行业已经有快十年,技术虽然一般般,但是足够应付额解决编程入门的相关问题! 都说十年磨一剑,积累到一定经验,是时候发挥自己的价值,给予入门的同行些许的帮助! 为什么要写收费专栏,其实原因很简单,时间就…

使用VNC远程连接Ubuntu - 内网穿透实现公网远程办公

写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成…

PLSQL创建新用户并导入导出.dmp文件

一、登录管理员账号 用户名密码登录身份说明systemmanagerSYSDBA 或 NORMAL不能以 SYSOPER 登录,可作为默认的系统管理员syschange_on_installSYSDBA 或 SYSOPER不能以 NORMAL 登录,可作为默认的系统管理员scotttigerNORMAL普通用户aqadmaqadmSYSDBA 或…

目标检测论文阅读:RepPoints算法笔记

标题:RepPoints: Point Set Representation for Object Detection 会议:ICCV2019 论文地址:https://ieeexplore.ieee.org/document/9009032/ 官方代码:https://github.com/microsoft/RepPoints 作者单位:北京大学、清华…

Jetpack Compose 深入探索系列六:Compose runtime 高级用例

Compose runtime vs Compose UI 在深入讨论之前,非常重要的一点是要区分 Compose UI 和 Compose runtime。Compose UI 是 Android 的新 UI 工具包,具有 LayoutNodes 的树形结构,它们稍后在画布上绘制其内容。Compose runtime 提供底层机制和…

qsort快速排序的实现以及模拟实现qsort的功能(狠狠的拿捏)

当你为错过太阳而哭泣的时候,你也要再错过群星了。 --泰戈尔 目录 一.qsort快速排序的实现 二.模拟实现一个qsort功能的函数 一.qsort快速排序的实现 下面是 qsort() 函数的声明: void qsort(void *base, size_t nitems, size_t size, int (…

Java——电话号码的字母组合

题目链接 leetcode在线oj题——电话号码的字母组合 题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 题目示例…

高压功率放大器在压电驱动器的研究中的应用

实验名称:压电驱动器的电致振动特性研究研究方向:压电驱动器测试目的:旨在分析压电驱动器的电激励振动特性。以双晶压电悬臂梁为对象,基于能量法和热力学平衡方程推导了压电悬臂梁在电压激励下的强迫振动微分方程。利用自行搭建的…

Spring的核心基础——IOC与DI

文章目录一、Spring简介1 Spring介绍1.1 为什么要学1.2 学什么2 初识Spring2.1 Spring家族2.2 Spring发展史3 Spring体系结构3.1 Spring Framework系统架构图4 Spring核心概念问题导入4.1 核心概念二、IOC和DI入门1 IOC入门问题导入1.1 门案例思路分析1.2 实现步骤1.3 实现代码…

【计算机网络】HTTP

一、基础概念 请求和响应报文 客户端发送一个请求报文给服务器,服务器根据请求报文中的信息进行处理,并将处理结果放入响应报文中返回给客户端。 请求报文结构: 第一行是包含了请求方法、URL、协议版本;接下来的多行都是请求首…

大数据开发的工作内容与流程

大数据开发的工作内容与流程离线数据仓库开发实时流处理开发离线数据仓库开发 我们之后在做开发的时候,可能是选择某几个组件来使用。比如做数仓开发,可能就是用sqoop把数据抽到hdfs里,用spark或者mapreduce对这部分数据做一个清洗。 清洗的…

嵌入式开发--STM32H750VBT6开发中,新版本CubeMX的时钟问题,不能设置到最高速度480MHZ

嵌入式开发–STM32H750VBT6开发中,新版本CubeMX的时钟问题,不能设置到最高速度480MHZ 问题描述 之前开发的项目,开发环境是CubeMX6.6.1,H7系列的支持包版本是1.10.0。跑得没问题,最近需要对项目做修改,同…

vue学习(7)vuex的辅助函数封装(基于vue3)

简介: 封装了 mapState,mapGetters,mapActions,mapMutations,用更灵活的方式来使用vuex,主要使用的是vuex的createNamespacedHelpers方法,此方法是帮助重写以特定模块为主的辅助函数 createNa…

Spring Cloud(微服务)学习篇(四)

Spring Cloud(微服务)学习篇(四) 1.nacos实现服务之间传参数 1.1 在dto包(shop-sms-api项目)中创建SmsDTO类 package com.zlz.shop.sms.api.dto;import lombok.Data;Data public class SmsDTO {private String tel; }1.2 复制SmsDTO类到shop-sms-server项目的dto包下面 1.3 …

AVL 树实现

AVL 树的概念 也许因为插入的值不够随机,也许因为经过某些插入或删除操作,二叉搜索树可能会失去平衡,甚至可能退化为单链表,造成搜索效率低。 AVL Tree 是一个「加上了额外平衡条件」的二叉搜索树,其平衡条件的建立是…