2017年4月份的时候,Facebook将React的构建工具换成了Rollup。很多人就有疑问了,Webpack不也是Facebook团队开发的吗,为什么不使用它而是要换成第三方构建工具呢?先别急,等你看完这篇文章,你就知道为什么了。

一、Webpack

诞生于2012年,目前Javascript社区使用得比较多的构建工具。它的出现,解决了当时的构建工具不能处理的问题——构建复杂的单页面应用(SPA)。它是一个强力的模块打包器。 所谓包(bundle)就是一个 JavaScript 文件,它把一堆资源(assets)合并在一起,以便它们可以在同一个文件请求中发回给客户端。 包中可以包含 JavaScript、CSS 样式、HTML 以及很多其它类型的文件。

Webpack的特点

代码分割

Webpack 有两种组织模块依赖的方式,同步和异步。异步依赖作为分割点,形成一个新的块。在优化了依赖树后,每一个异步区块都作为一个文件被打包。

Loader(加载器)

Webpack 本身只能处理原生的 JavaScript 模块,但是 loader 转换器可以将各种类型的资源转换成 JavaScript 模块。这样,任何资源都可以成为 Webpack 可以处理的模块。

智能解析

Webpack 有一个智能解析器,几乎可以处理任何第三方库,无论它们的模块形式是 CommonJS、 AMD 还是普通的 JS 文件。甚至在加载依赖的时候,允许使用动态表达式 require("./templates/" + name + ".jade")。

插件系统

Webpack 还有一个功能丰富的插件系统。大多数内容功能都是基于这个插件系统运行的,还可以开发和使用开源的 Webpack 插件,来满足各式各样的需求。

开始使用

安装
目前webpack最新版本是3.0.0

npm i webpack -g  br/>npm i webpack@version -g
配置
在项目添加webpack.config.js

const path = require('path');
const webpack = require('webpack');
module.exports = {      entry: './src/main.js',      output: {        path: path.resolve(__dirname, './dist'),        publicPath: '/dist/',        filename: 'build.js'
      },      module: {        rules: [
          {            test: /.vue$/,            loader: 'vue-loader',            options: {                  loaders: {}                  // other vue-loader options go here
            }
          },
          {            test: /.js$/,            loader: 'babel-loader',            exclude: /node_modules/
          },
          {            test: /.(png|jpg|gif|svg)$/,            loader: 'file-loader',            options: {              name: '[name].[ext]?[hash]'
            }
          }
        ]
      },      resolve: {        alias: {              'vue$': 'vue/dist/vue.common.js'
        }
      },      devServer: {        historyApiFallback: true,        noInfo: true
      },      performance: {        hints: false
      },      devtool: '#eval-source-map'}if (process.env.NODE_ENV === 'production') {
    module.exports.devtool = '#source-map';

module.exports.plugins = (module.exports.plugins || []).concat([        new webpack.DefinePlugin({            'process.env': {                NODE_ENV: '"production"'
            }
        }),        new webpack.optimize.UglifyJsPlugin({            sourceMap: true,            compress: {                warnings: false
            }
        }),        new webpack.LoaderOptionsPlugin({            minimize: true
        })
    ]);
}
打开命令控制台,执行:

webpack# or webpack --config webpack.config.js
此时你应该可以在项目目录的dist文件夹里找到打包好的文件了。

其他使用方式可参照官方文档:
英文:https://webpack.js.org/configuration/
中文:https://doc.webpack-china.org/configuration/

二、Rollup

Rollup是下一代JavaScript模块打包工具。开发者可以在你的应用或库中使用ES2015模块,然后高效地将它们打包成一个单一文件用于浏览器和Node.js使用。 Rollup最令人激动的地方,就是能让打包文件体积很小。这么说很难理解,更详细的解释:相比其他JavaScript打包工具,Rollup总能打出更小,更快的包。因为Rollup基于ES2015模块,比Webpack和Browserify使用的CommonJS模块机制更高效。这也让Rollup从模块中删除无用的代码,即tree-shaking变得更容易。

Rollup的特点

Tree-shaking
这个特点,是Rollup最初推出时的一大特点。Rollup通过对代码的静态分析,分析出冗余代码,在最终的打包文件中将这些冗余代码删除掉,进一步缩小代码体积。这是目前大部分构建工具所不具备的特点(Webpack 2.0+已经支持了,但是我本人觉得没有Rollup做得干净)。

ES2015模块打包支持

这个也是其他构建工具所不具备的。Rollup直接不需要通过babel将import转化成Commonjs的require方式,极大地利用ES2015模块的优势。

使用

先在全局安装好rollup

npm i rollup -g
然后我们再创建一个简单的项目:

mkdir -p my-rollup-project/src
cd my-rollup-project
编写好入口文件:

// src/main.jsimport foo from './foo.js';export default function () {
      console.log(foo);
}
然后,创建一个名为foo.js的文件

// src/foo.jsexport default 'hello world!';
最后,打开命令行,执行下面的命令吧:

rollup src/main.js --format cjs
打包结果:

'use strict';var foo = 'hello world!';var main = function () {      console.log(foo);
};module.exports = main;
你也可以打包出一个名为bundle.js的文件:

rollup src/main.js --format cjs --output bundle.js# or rollup main.js -f cjs -o bundle.js
其他使用方式可查看官网文档:
https://rollupjs.org

三、Webpack与Rollup的对比

其实,通过分别对Webpack和Rollup的介绍,不难看出,Webpack和Rollup在不同场景下,都能发挥自身优势作用。Webpack对于代码分割和静态资源导入有着“先天优势”,并且支持热模块替换(HMR),而Rollup并不支持,所以当项目需要用到以上,则可以考虑选择Webpack。但是,Rollup对于代码的Tree-shaking和ES6模块有着算法优势上的支持,若你项目只需要打包出一个简单的bundle包,并是基于ES6模块开发的,可以考虑使用Rollup。
其实Webpack从2.0开始支持Tree-shaking,并在使用babel-loader的情况下支持了es6 module的打包了,实际上,Rollup已经在渐渐地失去了当初的优势了。但是它并没有被抛弃,反而因其简单的API、使用方式被许多库开发者青睐,如React、Vue等,都是使用Rollup作为构建工具的。而Webpack目前在中大型项目中使用得非常广泛。
最后,用一句话概括就是:在开发应用时使用 Webpack,开发库时使用 Rollup。

四、总结

Webpack和Rollup作为构建工具,都有着各自的优势和各自的使用场景,我们不能因为他们的一些缺点而弃之,相反,我们在开发过程中,若是能利用好它们的优点,并能对我们的生产效率有着极大的提高作用。


作者:网易云
来源:CSDN
原文:https://blog.csdn.net/wangyiyungw/article/details/84955909
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://blog.51cto.com/zhuxianzhong/2351010

Webpack vs Rollup相关推荐

  1. 前端打包工具-webpack和rollup的区别

    开门见山 2017年4月初,Facebook 将一个 巨大的 pull 请求 合并到了 React 主分支(master) 中,将其现有的构建流程替换为基于 Rollup ,这一举动 促使 一些人发很 ...

  2. 【模块化开发】之 Webpack、Rollup、Parcel

    项目说明 笔记来源:拉勾教育 大前端高薪训练营 阅读建议:内容较多,建议通过左侧导航栏进行阅读 模块化打包工具解决的是前端整体的模块化,并不单指 JavaScript 模块化. 产生原因 ES Mod ...

  3. webpack、rollup、parcel优劣?

    对比 Webpack Rollup Parcel 功能 为处理资源管理和分割代码而生,可以用来处理任何类型的文件,灵活,插件多. 用标准化的格式(es6)来写代码,通过减少死代码尽可能地缩小包体积. ...

  4. webpack、rollup、parcel 它们的优劣?_尾货批发与正价批发优劣势,你有二者兼顾吗?...

    服装人对于尾货批发与正价批发都是比较了解的,但是新手小白就有点晕,不清楚什么是尾货批发什么是正价批发.那么我们还是按照套路来,先来给大家普及一下这两个名词.让你们先了解一下,不然对你们来说就不大友好了 ...

  5. 前端工资涨不上去?可能是你没掌握构建工具:关于 Webpack、Babel、esbuild、Vite、Rollup、Parcel、SWC......的那些事

    每个前端都应该掌握构建工具 大概从 2019 年到现在的这三年多的时间里,构建工具几乎已经成为前端发展最快的一个部分. 构建工具,属于前端工程化领域.而前端工程化,是每一个高级前端开发人员都必须要去深 ...

  6. Rollup(1): 安装 Rollup 以及 Rollup 和 Webpack 的区别

    Rollup 介绍 Rollup 是一个 JavaScript 模块打包器,可以将小块代码编译成大块复杂的代码,例如 library 或应用程序.Rollup 对代码模块使用新的标准化格式,这些标准都 ...

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

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

  8. pika开源:替代WebPack的全新JS构建工具

    在过去几年中,JavaScript打包已经从一种生产环境优化手段演变成几乎所有Web App都必不可少的构建步骤.不管你喜欢与否,打包器已经给Web开发带来了巨大的复杂性,这是个不争的事实. 为什么要 ...

  9. npm run buil构建后页面白屏_从Npm Script到Webpack,6种常见的前端构建工具对比

    从Npm Script到Webpack,6种常见的前端构建工具对比 小编说:历史上先后出现了一系列构建工具,它们各有优缺点.由于前端工程师很熟悉JavaScript,Node.js又可以胜任所有构建需 ...

最新文章

  1. mysql分页与分页性能查询优化
  2. PostgreSQL在何处处理 sql查询之三十九
  3. 在电脑上实现手机app抓包
  4. Spring 国际化例子
  5. 【控制】《多智能体系统的协同群集运动控制》陈杰老师-第3章-基于代数连通度估计的多智能体系统群集运动控制
  6. 优秀!复旦直博生一作发15篇SCI,并担任12本SCI期刊审稿人
  7. DP-桥接模式(Bridge Pattern)
  8. 核电安全级数字化仪控系统内存诊断设计与实现
  9. 2020网易游戏测试面试二面面经(上海春招)
  10. 程序设计入门——C语言 翁恺 第一次单元测试
  11. 红蓝对抗,学习整理 -------雷神众测
  12. 2021GMV目标10000亿,“好学生”抖音认真做电商
  13. 元素和子集,属于与包含
  14. 微信小程序调用导航,uniapp打开本地导航软件
  15. 【论文阅读】自然语言生成(NLG)——基于plan思想的Data2Text任务实现
  16. Win11校园网无法连接怎么办?Win11连接不到校园网的解决方法
  17. 电子商务安全欺诈预防市场现状研究分析-
  18. java实验二_Java实验2
  19. 图像处理+帧差法实现对车辆的识别框选
  20. VK1668带键盘扫描接口的LED(发光二极管显示器)驱动控制IC功能及作用介绍

热门文章

  1. 026_CSS内边距
  2. Linux服务器tomcat部署war包
  3. internetreadfile读取数据长度为0_Datax3.0的安装和基本使用
  4. CAD2019软件安装教程
  5. web访问hive速度怎么样_使用Hive的web界面:HWI
  6. kafka java 查询信息_Kafka查看topic、consumer group状态命令
  7. android 请求权限失败怎么办,java – Android HTTP POST请求错误 – 套接字失败EACCES(权限被拒绝)...
  8. cmd 调用webservice接口_C++ 调用 Webservice gSoap 方法
  9. 设置在本文件里查找_Win 10 自带聚焦搜索?这么设置轻松查找电脑文件
  10. c语言高中题目及答案,高中信息技术 C语言程序设计练习题 选修1