文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Webpack原理与实践:关于如何选择合适的打包工具Rollup和Webpack?

2024-12-02 11:42

关注

Rollup的使用

Rollup 对代码模块使用新的标准化格式,这些标准都包含在 JavaScript 的 ES6 版本中,而不是以前的特殊解决方案,如 CommonJS 和 AMD。ES6 模块可以使你自由、无缝地使用你最喜爱的 library 中那些最有用独立函数,而你的项目不必携带其他未使用的代码。ES6 模块最终还是要由浏览器原生实现,但当前 Rollup 可以使你提前体验。

首先当然是需要执行安装命令进行安装rollup,接着就和webpack一样需要配置相关的config文件。我们可以配置不同的配置文件直接用cli进行打包,但是如果添加更多地选项,这种命令行的方式就变得很麻烦。为此我们需要创建配置文件来囊括所需的选项,配置文件以rollup.config.js形式命名,比cli更加灵活。

  1. $ npm i rollup -D 

我们看到其实rollup配置和webpack大同小异,想要更详细的配置项信息可以异步rollup官网。

  1. //src/helloWorld.js 
  2. export default function sayHello(){ 
  3.   console.log("nihao"); 
  4.  
  5. //src/index.js 
  6. import sayHello from "./helloWorld" 
  7. sayHello() 
  8.  
  9. //rollup.config.js 
  10. export default { 
  11.   input:"src/index.js",//打包入口 
  12.   output:{//文件输出配置 
  13.     file:"dist/bundle.cjs.js",//打包后生成的文件位置和文件名 
  14.     format:"cjs",//文件的输出格式,遵循cjs规范,这也是官方模块化规范 
  15.     name:"bundleName"//包的全局变量名 
  16.   } 

我们在package.json文件中配置的打包命令是"build":"rollup -c",我们在执行打包命令npm run build后,看到生成的文件dist/bundle.cjs.js中的代码是非常简洁清爽的,可读性非常强。

  1. //dist/bundle.cjs.js 
  2. 'use strict'
  3.  
  4. function sayHello(){ 
  5.   console.log("nihao"); 
  6.  
  7. sayHello(); 

接下来,我们就详细谈谈rollup的相关配置问题,我们知道rollup默认采用的是ESM规范,但是如果你想使用CommonJS规范,你可以使用.cjs后缀进行区分:

  1. //rollup.config.cjs 
  2. module.export = { 
  3.   input:"src/index.js"
  4.   output:{ 
  5.     file:"dist/bundle.cjs.js"
  6.     format:"cjs" 
  7.   } 

前面我们已经创建了一个简单的打包配置文件,但是当你需要创建更加复杂的bundles时,你将需要更大的弹性,比如:通过npm安装导入模块、通过babel编译代码,使用json配置文件等等。对此,我们可以使用plugins插件,通过在捆绑过程的关键点来改变rollup的行为。比如,我们可以使用@rollup/plugin-json插件来允许导入JSON文件,使用命令行npm install --save-dev @rollup/plugin-json安装。

  1. // src/main.js 
  2. import {version} from "../package.json"
  3.  
  4. export default function(){ 
  5.   console.log('version ' + version); 
  6.  
  7. // rollup.config.js 
  8. import json from '@rollup/plugin-json'
  9.  
  10. export default { 
  11.   input: 'src/main.js'
  12.   output: { 
  13.     file: 'bundle.js'
  14.     format: 'cjs' 
  15.   }, 
  16.   plugins: [json()] 
  17. }; 

这样,执行npm run build命令进行打包,生成的文件是:

  1. 'use strict'
  2.  
  3. var version = '1.0.0'
  4.  
  5. function main() { 
  6.   console.log('version ' + version); 
  7.  
  8. module.exports = main; 

当然,一些特殊的插件依赖于一些输出,有关特定于输出的插件可以做什么的技术细节,请参阅插件钩子。如果一个不兼容的插件被用作特定于输出的插件,那么 Rollup 会发出警告。

为了实践那些依赖于输出的插件,我们基于前面简单的项目打包进行相关的配置,先执行命令行npm install --save-dev rollup-plugin-terser,

  1. // rollup.config.js 
  2. import json from '@rollup/plugin-json'
  3. import { terser } from 'rollup-plugin-terser'
  4.  
  5. export default { 
  6.   input: 'src/main.js'
  7.   output: [ 
  8.     { 
  9.       file: 'bundle.js'
  10.       format: 'cjs' 
  11.     }, 
  12.     { 
  13.       file: 'bundle.min.js'
  14.       format: 'iife'
  15.       name'version'
  16.       plugins: [terser()] 
  17.     } 
  18.   ], 
  19.   plugins: [json()] 
  20. }; 

此时打包得到:

  1. var version = (function () { 
  2.   'use strict'
  3.   var n = '1.0.0'
  4.   return function () { 
  5.     console.log('version ' + n); 
  6.   }; 
  7. })(); 

前面我们看到可以将多个文件的代码打包成一个文件,那么当项目比较大的时候就需要对代码进行分割。对于代码分割,有时候 Rollup 会自动将代码分割成块,比如动态加载或多个入口点,还有一种方法可以通过 output.manualChunks 选项显式告诉 Rollup 哪些模块要分割成单独的块。

  1. // src/main.js 
  2. export default function () { 
  3.   import('./foo.js').then(({ default: foo }) => console.log(foo)); 

Rollup将会使用动态导入去创建一个分割的chunk文件,只在需要的时候进行加载。为了rollup能够知道哪里是第二个chunk块,可以通过设置--file设定规范,通过--dir创建导出目录。

  1. rollup src/main.js -f cjs -d dist 

接下来将会创建一个包含两个文件main.js和chunk-[hash].js的目录dist,此处的[hash]是一个hash字符串。你可以设置你自己想要的文件命令模式,通过 output.chunkFileNames和output.entryFileNames 进行配置。

  1. //→ main.js: 
  2. 'use strict'
  3.  
  4. function main() { 
  5.   Promise.resolve(require('./chunk-b8774ea3.js')).then(({ default: foo }) => console.log(foo)); 
  6.  
  7. module.exports = main; 
  8.  
  9. //→ chunk-b8774ea3.js: 
  10. ('use strict'); 
  11.  
  12. var foo = 'hello world!'
  13.  
  14. exports.default = foo; 

Rollup的优势是:

Rollup的缺点是:

写在最后

对于Webpack大而全,Rollup小而美,我的选择基本原则是应用开发优先webpack,类库或框架开发使用Rollup。这是因为在开发js库时,webpack的繁琐和打包后的文件体积太大,而rollup就是针对js库和框架开发的,它只是生成代码将我们的代码转为目标js。如果你想了解更多关于rollup的相关知识,可以阅读(官方文档)。

 

来源:前端万有引力内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯