最近有幸在前端团队里面做了一次关于 webpack 的技术分享。在分享的准备过程中,为了能让大家更好的理解 webpack,特意对市面上以前和现在流行的构建工具做了一个梳理总结。在整理和分享的过程中,获益匪浅,对前端构建工具有了新的认识。在这里,将自己的一些思考总结写出来,希望也能给到对构建工具同样感兴趣的同学一点帮助。
本文的目录结构如下:
谈到构建工具,大家首先想到的肯定就是 Webpack
以及现在最的 Vite
。Webpack
,功能强大,生态丰富,从面世到今天,一直是很受大家欢迎;Vite
采用 unbundle
构建模式,带来了极致的开发体验,给开发人员以新的选择。
在这两个构建工具之外,还有其他的构建工具,如和 Webpack
、Vite
类似的 Rollup
、Parcel
、Esbuild
,自动化构建工具 grunt
、gulp
,以及更加久远的 YUI Tool
。
这些工具的存在,构成了前端构建工具的发展史。
YUI tool
是 07 年左右出现的一个构建工具,功能比较简单,用于压缩混淆 css
和 js
代码,需要配合 java
的 Ant
使用。
当时 web 应用开发主要采用 JSP
,还不像现在这样前后端分离,通常是由 java 开发人员来编写 js、css 代码,前端代码都是和后端 java 代码放在一起的。因此前端代码的压缩混淆也就基于 java 实现了。
Grunt
/ Gulp
都是运行在 node
环境上的自动化工具。
在开发过程中,我们可以将一些常见操作如解析 html
、es6 代码转换为 es5
、less / sass 代码转换为 css 代码
、代码检查
、代码压缩
、代码混淆
配置成一系列任务,然后通过 Grunt
/ Gulp
自动执行这些任务。
Grunt
和 Gulp
的不同点:
Grunt
的过程中,会产生一些中间态的临时文件。一些任务生成临时文件,其它任务可能会基于临时文件再做处理并生成最终的构建后文件,导致出现多次 I/O
。Gulp
有文件流的概念,通过管道将多个任务和操作连接起来,不会产生临时文件,减少了 I/O
操作,流程更清晰,更纯粹,大大加快了构建的速度。Webpack
、Rollup
、Parcel
统称为静态模块打包器
。
这一类构建工具,通常需要指定入口 - entry
,然后以 entry
为起点,通过分析整个项目内各个源文件之间的依赖关系,构建一个模块依赖图 - module graph
,然后再将 module graph
分离为三种类型的 bundle
: entry
所在的 initial bundle
、lazy load
需要的 async bundle
和自定义分离规则的 custome bundle
。
这几个构建工具各有优势:
Webpack
大而全,配置灵活,生态丰富,是构建工具的首选。Parcel
号称零配置,使用简单,适合不太需要定制化构建的项目使用。Rollup
推崇 ESM
标准开发,打包出来的代码干净,适用于组件库开发。新一代构建工具。
esbuild
, 基于 go
语言实现,代码直接编译成机器码(不用像 js 那样先解析为字节码,再编译为机器码),构建速度比 webpack
更快。
vite
, 开发模式下借助浏览器对 ESM
的支持,采用 nobundle
的方式进行构建,能提供极致的开发体验;生产模式下则基于 rollup
进行构建。
javascript
语言设计之初,只是作为一个简单的脚本语言用来丰富网站的功能,并不像 java
、c++
那样有 module
的概念,发展到现在的模样,也经历了相当长的时间。
这段时间,可以简单归纳为:
青铜时代
- no module;白银时代
- cjs、amd、cmd、umd、esm 相继出现;黄金时代
- 组件模块化;不同的时代,构建工具也不同。
由于没有 module
的概念, javascript
无法在语言层面实现模块之间的相互隔离
、相互依赖
,只能由开发人员手动处理。
相应的,早期的 web
开发也比较简单甚至简陋:
对象
、iife(或者闭包)
的方式实现模块隔离
;script
的加载顺序
确定模块之间的依赖关系
。jsp
开发模式,没有专门的前端,html
、js
、css
代码通常也由后端开发人员编写。为了节省带宽
和保密
,通常需要对前端代码做压缩混淆
处理。这个时候,构建工具为 YUI Tool
+ Ant
。
chrome v8
引擎 和 node
的横空出世,给前端带来了无限的可能。
同时,javascript
的模块化标准也有了新的发展:
commonjs
规范,适用于 node
环境开发。amd
、cmd
规范,适用于浏览器
环境。umd
,兼容 amd
、commonjs
,代码可以同时运行在浏览器
和 node
环境。ESM
,即 ES6 module
(这个时候还不是很成熟);同时还出现了 less
、sass
、 es6
、 jslint
、 eslint
、typescript
等新的东西, 前端角色也开始承担越来越重要的作用,慢慢的独立出来。
有了 node
提供的平台,大量的工具开始涌现:
requirejs
提供的 r.js
插件,可以分析 amd 模块依赖关系
、合并压缩 js
、优化 css
;less
/ sass
插件,可以将 less
/ sass
代码转化为 css
代码;babel
,可以将 es6
转化为 es5
;typescript
,将 ts
编译为 js
;jslint
/ eslint
,代码检查;这个时候,我们可以将上面的的这些操作配置成一个个任务,然后通过 Grunt
/ Gulp
自动执行任务。
基于 Angular
、Vue
、React
三大框架和 Webpack
的使用,组件模块化
成为前端开发的主流模式。同时 ESM
规范也原来越成熟,被更多的浏览器支持。
以 React
和 Webpack
为例,通常我们会将一个应用涉及到的所有的功能拆分为一个个组件,如路由组件、页面组件、表单组件、表格组件等,一个组件对应一个源文件,然后通过 Webpack
将这些源文件打包。在开发过程中,还会通过 Webpack
开启一个 local server
,实时查看代码的运行效果。
Webpack
是一个静态模块打包器,它会以 entry
指定的入口文件为起点,分析整个项目内各个源文件之间的依赖关系,构建一个模块依赖图 - module graph
,然后将 module graph
分离为多个 bundle
。在构建 module graph
的过程中,会使用 loader
处理源文件,将它们转化为浏览器可以是识别的 js
、css
、image
、音视频
等。
随着时间的发展, Webpack
的功能越来越来强大,也迎来诸多对手。
Webpack1
|
|
Rollup 出现(推崇 ESM 规范,可以实现 tree shaking, 打包出来的代码更干净)
|
|
Webpack2(也实现了 tree shaking, 但是配置还是太繁琐了)
|
|
Parcel (号称 0 配置)
|
|
Webpack4(通过 mode 确定 development 和 production 模式,各个模式有自己的默认配置)
|
|
Webpack5(持久化缓存、module federation)
Esbuild(采用 go 语言开发,比 Webpack 更快)
Vite(推崇 ESM 规范,开发模式采用 nobundle,更好的开发体验)
复制代码
丰富的构建工具,形成了百花绽放的局面,可用于不同的情形,给开发人员带来了越来越多的选择。
目前来看,构建工具在整个前端体系中占据的位置是越来越重要。只会 Webpack 甚至不懂构建工具已经无法满足日常开发。这就需要我们时时学习,紧跟时代的脚步,了解最新的技术,不断前进。
尽管前路坎坷,依然相信未来可期,加油 !
本文由哈喽比特于2年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/1RR-8opHA601OfTLq_o0Ig
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。