Open linwu-hi opened 1 year ago
模块化是一种处理复杂系统分解为更好的可管理模块的方式
可以用来分割,组织和打包应用。每个模块完成一个特定的子功能,所有的模块按某种方法组装起来,成为一个整体(bundle)
bundle
在前端领域中,并非只有webpack这一款优秀的模块打包工具,还有其他类似的工具,例如Rollup、Parcel、snowpack,以及最近风头无两的Vite
webpack
Rollup
Parcel
snowpack
Vite
通过这些模块打包工具,能够提高我们的开发效率,减少开发成本
这里没有提及gulp、grunt是因为它们只是定义为构建工具,不能类比
gulp
grunt
Rollup 是一款 ES Modules 打包器,从作用上来看,Rollup 与 Webpack 非常类似。不过相比于 Webpack,Rollup要小巧的多
ES Modules
Webpack
现在很多我们熟知的库都都使用它进行打包,比如:Vue、React和three.js等
Vue
React
three.js
举个例子:
// ./src/messages.js export default { hi: 'Hey Guys, I am zce~' } // ./src/logger.js export const log = msg => { console.log('---------- INFO ----------') console.log(msg) console.log('--------------------------') } export const error = msg => { console.error('---------- ERROR ----------') console.error(msg) console.error('---------------------------') } // ./src/index.js import { log } from './logger' import messages from './messages' log(messages.hi)
然后通过rollup进行打包
rollup
$ npx rollup ./src/index.js --file ./dist/bundle.js
打包结果如下图
可以看到,代码非常简洁,完成不像webpack那样存在大量引导代码和模块函数
并且error方法由于没有被使用,输出的结果中并无error方法,可以看到,rollup默认开始Tree-shaking 优化输出结果
error
Tree-shaking
因此,可以看到Rollup的优点:
但缺点也十分明显,加载其他类型的资源文件或者支持导入 CommonJS 模块,又或是编译 ES 新特性,这些额外的需求 Rollup需要使用插件去完成
CommonJS
ES
综合来看,rollup并不适合开发应用使用,因为需要使用第三方模块,而目前第三方模块大多数使用CommonJs方式导出成员,并且rollup不支持HMR,使开发效率降低
CommonJs
HMR
但是在用于打包JavaScript 库时,rollup比 webpack 更有优势,因为其打包出来的代码更小、更快,其存在的缺点可以忽略
JavaScript
Parcel ,是一款完全零配置的前端打包器,它提供了 “傻瓜式” 的使用体验,只需了解简单的命令,就能构建前端应用程序
Parcel 跟 Webpack 一样都支持以任意类型文件作为打包入口,但建议使用HTML文件作为入口,该HTML文件像平时一样正常编写代码、引用资源。如下所示:
HTML
<!-- ./src/index.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Parcel Tutorials</title> </head> <body> <script src="main.js"></script> </body> </html>
main.js文件通过ES Moudle方法导入其他模块成员
ES Moudle
// ./src/main.js import { log } from './logger' log('hello parcel') // ./src/logger.js export const log = msg => { console.log('---------- INFO ----------') console.log(msg) }
运行之后,使用命令打包
npx parcel src/index.html
执行命令后,Parcel不仅打包了应用,同时也启动了一个开发服务器,跟webpack Dev Server一样
webpack Dev Server
跟webpack类似,也支持模块热替换,但用法更简单
同时,Parcel有个十分好用的功能:支持自动安装依赖,像webpack开发阶段突然使用安装某个第三方依赖,必然会终止dev server然后安装再启动。而Parcel则免了这繁琐的工作流程
dev server
同时,Parcel能够零配置加载其他类型的资源文件,无须像webpack那样配置对应的loader
loader
打包命令如下:
由于打包过程是多进程同时工作,构建速度会比Webpack 快,输出文件也会被压缩,并且样式代码也会被单独提取到单个文件中
可以感受到,Parcel给开发者一种很大的自由度,只管去实现业务代码,其他事情用Parcel解决
Snowpack,是一种闪电般快速的前端构建工具,专为现代Web设计,较复杂的打包工具(如Webpack或Parcel)的替代方案,利用JavaScript的本机模块系统,避免不必要的工作并保持流畅的开发体验
Web
开发阶段,每次保存单个文件时,Webpack和Parcel都需要重新构建和重新打包应用程序的整个bundle。而Snowpack为你的应用程序每个文件构建一次,就可以永久缓存,文件更改时,Snowpack会重新构建该单个文件
Snowpack
下图给出webpack与snowpack打包区别:
在重新构建每次变更时没有任何的时间浪费,只需要在浏览器中进行HMR更新
vite ,是一种新型前端构建工具,能够显著提升前端开发体验
它主要由两部分组成:
其作用类似webpack+ webpack-dev-server,其特点如下:
webpack-dev-server
vite会直接启动开发服务器,不需要进行打包操作,也就意味着不需要分析模块的依赖、不需要编译,因此启动速度非常快
vite
利用现代浏览器支持ES Module的特性,当浏览器请求某个模块的时候,再根据需要对模块的内容进行编译,这种方式大大缩短了编译时间
ES Module
原理图如下所示:
在热模块HMR方面,当修改一个模块的时候,仅需让浏览器重新请求该模块即可,无须像webpack那样需要把该模块的相关依赖模块全部编译一次,效率更高
相比上述的模块化工具,webpack大而全,很多常用的功能做到开箱即用。有两大最核心的特点:一切皆模块和按需加载
与其他构建工具相比,有如下优势:
面试官:与webpack类似的工具还有哪些?区别?
一、模块化工具
模块化是一种处理复杂系统分解为更好的可管理模块的方式
可以用来分割,组织和打包应用。每个模块完成一个特定的子功能,所有的模块按某种方法组装起来,成为一个整体(
bundle
)在前端领域中,并非只有
webpack
这一款优秀的模块打包工具,还有其他类似的工具,例如Rollup
、Parcel
、snowpack
,以及最近风头无两的Vite
通过这些模块打包工具,能够提高我们的开发效率,减少开发成本
这里没有提及
gulp
、grunt
是因为它们只是定义为构建工具,不能类比Rollup
Rollup
是一款ES Modules
打包器,从作用上来看,Rollup
与Webpack
非常类似。不过相比于Webpack
,Rollup
要小巧的多现在很多我们熟知的库都都使用它进行打包,比如:
Vue
、React
和three.js
等举个例子:
然后通过
rollup
进行打包打包结果如下图
可以看到,代码非常简洁,完成不像
webpack
那样存在大量引导代码和模块函数并且
error
方法由于没有被使用,输出的结果中并无error
方法,可以看到,rollup
默认开始Tree-shaking
优化输出结果因此,可以看到
Rollup
的优点:但缺点也十分明显,加载其他类型的资源文件或者支持导入
CommonJS
模块,又或是编译ES
新特性,这些额外的需求Rollup
需要使用插件去完成综合来看,
rollup
并不适合开发应用使用,因为需要使用第三方模块,而目前第三方模块大多数使用CommonJs
方式导出成员,并且rollup
不支持HMR
,使开发效率降低但是在用于打包
JavaScript
库时,rollup
比webpack
更有优势,因为其打包出来的代码更小、更快,其存在的缺点可以忽略Parcel
Parcel ,是一款完全零配置的前端打包器,它提供了 “傻瓜式” 的使用体验,只需了解简单的命令,就能构建前端应用程序
Parcel
跟Webpack
一样都支持以任意类型文件作为打包入口,但建议使用HTML
文件作为入口,该HTML
文件像平时一样正常编写代码、引用资源。如下所示:main.js文件通过
ES Moudle
方法导入其他模块成员运行之后,使用命令打包
执行命令后,
Parcel
不仅打包了应用,同时也启动了一个开发服务器,跟webpack Dev Server
一样跟
webpack
类似,也支持模块热替换,但用法更简单同时,
Parcel
有个十分好用的功能:支持自动安装依赖,像webpack
开发阶段突然使用安装某个第三方依赖,必然会终止dev server
然后安装再启动。而Parcel
则免了这繁琐的工作流程同时,
Parcel
能够零配置加载其他类型的资源文件,无须像webpack
那样配置对应的loader
打包命令如下:
由于打包过程是多进程同时工作,构建速度会比
Webpack
快,输出文件也会被压缩,并且样式代码也会被单独提取到单个文件中可以感受到,
Parcel
给开发者一种很大的自由度,只管去实现业务代码,其他事情用Parcel
解决Snowpack
Snowpack,是一种闪电般快速的前端构建工具,专为现代
Web
设计,较复杂的打包工具(如Webpack
或Parcel
)的替代方案,利用JavaScript
的本机模块系统,避免不必要的工作并保持流畅的开发体验开发阶段,每次保存单个文件时,
Webpack
和Parcel
都需要重新构建和重新打包应用程序的整个bundle
。而Snowpack
为你的应用程序每个文件构建一次,就可以永久缓存,文件更改时,Snowpack
会重新构建该单个文件下图给出
webpack
与snowpack
打包区别:在重新构建每次变更时没有任何的时间浪费,只需要在浏览器中进行HMR更新
Vite
vite ,是一种新型前端构建工具,能够显著提升前端开发体验
它主要由两部分组成:
其作用类似
webpack
+webpack-dev-server
,其特点如下:vite
会直接启动开发服务器,不需要进行打包操作,也就意味着不需要分析模块的依赖、不需要编译,因此启动速度非常快利用现代浏览器支持
ES Module
的特性,当浏览器请求某个模块的时候,再根据需要对模块的内容进行编译,这种方式大大缩短了编译时间原理图如下所示:
在热模块
HMR
方面,当修改一个模块的时候,仅需让浏览器重新请求该模块即可,无须像webpack
那样需要把该模块的相关依赖模块全部编译一次,效率更高webpack
相比上述的模块化工具,
webpack
大而全,很多常用的功能做到开箱即用。有两大最核心的特点:一切皆模块和按需加载与其他构建工具相比,有如下优势:
参考文献