在什么情况下选择 webpack?在什么情况下选择 rollup

2020-08-03 14:26发布

3条回答
天天
2楼 · 2020-08-18 18:35

webpack主要用于以下两种情况:

1、代码拆分(Code Splitting): 可以将应用程序分解成可管理的代码块,可以按需加载,这样用户便可快速与应用交互,而不必等到整个应用程序下载和解析完成才能使用,以此构建复杂的单页应用程序(SPA);

2、静态资源(Static Assets): 可以将所有的静态资源,如 js、css、图片、字体等,导入到应用程序中,然后由 webpack 使用 hash 重命名需要的资源文件,而无需为文件 URL 增添 hash 而使用 hack 脚本,并且一个资源还能依赖其他资源。

rollup主要用于:

1、要 js 高效运行。因为 webpack 对子模块定义和运行时的依赖处理(__webpack_require__),不仅导致文件体积增大,还会大幅拉低性能;

2、项目(特别是类库)只有 js,而没有其他的静态资源文件,使用 webpack 就有点大才小用了,因为 webpack bundle 文件的体积略大,运行略慢,可读性略低。


Dillion
3楼 · 2020-12-11 16:56

webpack和rollup都是JavaScript社区非常流行的一个打包工具。

关于什么情况下使用二者,可以这么说:对于应用使用 webpack,对于类库使用 Rollup。

因为如果你需要代码拆分(Code Splitting),或者你有很多静态资源需要处理,再或者你构建的项目需要引入很多CommonJS模块的依赖,那么 webpack 是个很不错的选择。如果您的代码库是基于 ES2015 模块的,而且希望你写的代码能够被其他人直接使用,你需要的打包工具可能是 Rollup 。


我是大脸猫
4楼 · 2021-12-17 10:19

Webpack 始于2012年,由 Tobias Koppers发起,用于解决当时现有工具未解决的的一个难题:构建复杂的单页应用程序(SPA)。特别是 webpack 的两个特性改变了一切:

  1. 代码拆分(Code Splitting) 使你可以将应用程序分解成可管理的代码块,可以按需加载,这意味着你的用户可以快速获取交互性的网站,而不必等到整个应用程序下载和解析完成。当然你可以手动来完成这项工作,那么祝你好运。

  2. 静态资源(Static assets) 如图像和 CSS 可以导入到你的应用程序中,而且还能够被作为依赖图中的另一个节点。再也不用关心你的文件是否放在正确的文件夹中,再也不用为文件 URL 增添 hash 而使用 hack 脚本,因为 webpack 会帮我们处理这些事情。

Rollup 则是由于不同的原因被创建的:利用 ES2015 巧妙的模块设计,尽可能高效地构建出能够直接被其它 JavaScript 库引用的模块。其他的模块打包工具 – 包含 webpack – 通过都是将每个模块封装在一个函数中,将它们放在一个包中,通过浏览器友好的 require 实现,最后逐一执行这些模块。如果您需要按需加载,webpack 这类的打包工具非常合适。否则有点浪费,如果你有很多模块,它会变得更糟。

ES2015模块启用了一种不同的方法,这是真是 Rollup 使用的。所有的代码都放在同一个地方,然后一次性执行,从而生成更简洁、更简单的代码,从而启动更快。您可以 自己使用 Rollup REPL 来查看它 。

但是有一个权衡:代码拆分(Code Splitting)是一个更加棘手的问题,在撰写本文时,Rollup 还不支持。同样的,Rollup 也不支持模块的热更新(HMR)。而对于使用 Rollup 的人来说,最大的痛点可能是 – 它能处理大多数 CommonJS 文件(通过 插件 ),然而有些东西根本不能转译为 ES2015 ,而 webpack 能处理所有你丢给它的事情。

那么我该用什么

到目前为止,希望这两个工具共同存在并相互支持的原因已经很明确了 – 它们有着不同的用途。总结一句话就是:

对于应用使用 webpack,对于类库使用 Rollup

这不是一个绝对的规则 – 事实上有许多 网站 和 应用程序使用 Rollup 构建,同样的也有大量的库使用了 webpack 构建。但是,对于应用使用 webpack,对于类库使用 Rollup 是一个很好的经验法则。

如果你需要代码拆分(Code Splitting),或者你有很多静态资源需要处理,再或者你构建的项目需要引入很多CommonJS模块的依赖,那么 webpack 是个很不错的选择。如果您的代码库是基于 ES2015 模块的,而且希望你写的代码能够被其他人直接使用,你需要的打包工具可能是 Rollup 。

给NPM包作者的建议:请使用 pkg.module !

在很长一段时间内,使用 JavaScript 库需要一些投机取巧,这是因为你和库作者使用的模块系统可能不一样,所以这就需要你和库作者在模块系统的选择上必须达成一致意见。举个例子,假设你使用的是Browserify打包工具,但是库作者更喜欢AMD模块系统,所以在你构建之前,你必须把库作者的模块系统替换成自己项目所使用的模块系统。虽然通用模块定义(UMD)格式类型固定,但是因为它没有在任何地方被要求强制执行,你永远不知道你下一步使用的模块系统是哪一种。

ES2015 改变了所有这一切,因为 import 和 export 是 JavaScript 语言的一部分。在将来,不会有歧义,模块系统会更加无缝地对接。不幸的是,因为浏览器(大多数)以及 Node 不支持 import 和 export ,我们仍然需要 UMD 模块系统过渡(如果你构建的文件只是用于Node,或许可以考虑CommonJS)。

通过在您项目的 package.json 文件(又称 pkg.module)中添加 "module": "dist/my-library.es.js" 入口选项,就可以同时为 UMD 和 ES2015 提供服务。
这很重要,因为 Webpack 和 Rollup 都可以使用 pkg.module 来尽可能构建出高效代码 – 在某些情况下,Webpack 以及 Rollup 甚至都能利用 tree-shake 特性来剔除项目中未使用的代码。


相关问题推荐

  • 回答 15

    对于新入门的小伙伴来说,选择一个合适的nodejs框架可能是一件很头疼的事情,我最初也为这个头疼过,下面分享一下我的框架选择之路nodejs的框架最近来node的火热,带动了一大批的框架,例如express koa sails loopback thinkjs egg这些是我比较过的框架,下面...

  • PHP与Node.js的区别2021-01-18 10:23
    回答 19

    PHP胜出:代码与内容混合大家在输入的过程中当然希望能将自己的思路直接转化为网站的文本内容,同时还要为进程添加分支、一部分if-then语句以保证站点拥有漂亮的视觉效果,具体取决于URL中的某些参数。又或者,我们希望能够利用单一数据库将文本或者数据加以...

  • 回答 9
    已采纳

    这个问题涉及到的是整个web开发体系的变更。我尽量长话短说,有问题可以继续留言。现在的web开发体系可以说是在15年后才逐渐形成,因为15年比较特殊,html5和ES6都是在这一年发布,css3的最后一次更新在2014年。这些变更带来的变化是产生了前后分离的开发方式...

  • 回答 3

    初次接触nodejs确实有一些难度,因为思路语法都和js有了一些差别,属于后端思想,所以需要楼主多下功夫,进行系统学习之后就容易接受了

  • 回答 13

    //首先卸载已安装的node-sasscnpm uninstall node-sass//重新安装cnpm install node-sass//如果报关于gyp的错,安装相关的gyp编译环境npm install -g node-gyp//再重复执行以上的卸载安装步骤//安装完成启动项目试试npm run dev...

  • 回答 10

    node.js 和 javascript 从本质上来说没有什么区别,语言是一样的,都是javascript语言编写。但是,node.js 主要从事后台操作,javascript主要操作HTML的元素(前端)。

  • 回答 8

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。(事件驱动:事件触发过程中,进行决策的一种策略,简单说就是跟随当前时间点上出现的事物,调用可用的资源进行解决该事物...

  • 回答 10

    global 最根本的作用是作为全局变量的宿bai主。按照ECMAScript 的定义,满足以下条 件的变量是全局变量:在最外层定义的变量;全局对象的属性;隐式定义的变量(未定义直接赋值的变量)。当你定义一个全局变量时,这个变量同时也会成为全局对象的属性,反之亦...

  • 回答 4

        webpack构建工具是基于node平台的, 所以在安装之前必须先安装nodejs. 接在来就可以通过npm包管理工具在线安装webpack了.    对于webpack构建工具, 即可全局安装, 也可以局部安装. 一般情况下,大多数会采用局部安装, 因为每一个项目需要对webpack...

  • 回答 3

    vue-cli脚手架是基于node平台的, 所以安装之前, 必须先安装nodejs. 之后直接通过npm包管理工具即可完成vue-cli脚手架工具的安装. 目前市面上流行的vue-cli脚手架有两个版本, 接下来分别演示下:安装vue-cli-2.x版本// -g 表示全局安装 npm install vue-cli...

  • 回答 3

    1.打开node官网 https://nodejs.org/en/,选择 other Downloads,2.安装Windows Binary 64位或者32位3.将你减压后的路径保存一份,如(D:\soft\node-v10.16.3-win-x64)4.找到系统路径(控制面板-》系统-》高级系统设置-》环境变量-》path),获取到 5.找到...

  • 回答 5

    一、安装环境1、本机系统:Windows 10 Pro(64位)2、Node.js:v6.9.2LTS(64位)二、安装Node.js步骤1、下载对应你系统的Node.js版本2、选安装目录进行安装3、环境配置4、测试

  • 回答 4

    Node.js是一个基于Chrome v8引擎建立的JavaScript运行平台,用于搭建响应速度快、易于扩展的网络应用。本文和大家分享的是Node.js的一些特点,希望对大家有帮助。  异步I/O  这里,我们来详细解释一下:  异步是什么意思  比如说你的爸,今天要叫你做...

  • 回答 5

    dejs适用于I/O密集的应用,而不太适用于计算密集的应用我用 Node.js 开发了 Am I Hacked,算是有一点用 Node.js 支持大流量的经验。先列一些数字服务器是 Linode 512,也就是 Linode 上最低端的。...

没有解决我的问题,去提问