大前端 - 打包工具

概要


需求背景

  • 新特性代码编译,将具备新特性的代码编译成能够兼容低版本环境的代码,如 ES6 => ES 5
  • 模块化 JavaScript 打包
  • 支持不同类型的资源模块

本质

解决的是前端整体的模块化,并不单指 JavaScript 模块化

功能

  • 模块打包器(Module Bundler)
    • 解决模块 JS 打包问题
    • 可以将零散的 JS 代码整合打包到一个 JS 文件中
  • 模块加载器(Loader)
    • 对于存在兼容问题的代码,可以通过引入对应的解析编译模块进行编译
  • 代码拆分(Code Splitting)
    • 将应用中的代码按需求进行打包,避免因将所有的代码打包成一个文件而使得文件过大的问题
    • 可以将应用加载初期所需代码打包在一起,而其余的在后续执行中按需加载,实现增量加载或渐进加载
    • 可以避免出现文件过大或文件太碎的问题
  • 资源模块(Asset Module)

Rollup


Rollup 作用与 Webpack 相似,是一款更为小巧的打包器。但同时,Rollup 仅仅是一款 ESM(ES Module) 打包器,并不支持类似 HMR 这种高级特性。Rollup 的初衷在于提供一个充分利用 ESM 各项特性的高效打包器。

Rollup 的打包结果相对于 Webpack,没有多余的引导代码和模块函数,只是将各模块的函数按引用顺序排列、合并打包到一起。并且,模块函数中未引用部分不会被一起打包到结果中。

安装

yarn add  rollup --dev

运行

// yarn rollup '打包入口文件' 
// --format   ==> 指定文件打包的格式
// --file   ==> 指定文件输出路径'
yarn  rollup ./src/index.js --format iife --file dist/bundle.js

配置

// rollup.config.js
export default {
    input: 'src/index.js', // 入口文件
    output: {
        file: 'dist/bundle.js', // 输出结果
        format: 'iife' // 输出格式
    }
}

插件

Rollup 唯一的扩展途径

// 安装插件模块
yarn add rollup-plugin-json --dev

// rollup.config.js 中引入插件函数
import json from 'rollup-plugin-json'

export default {
    plugins: [
        json()
    ]
}

加载 npm 模块

Rollup 无法像 Webpack 那样,直接通过 npm 或 yarn 添加功能模块,需要通过插件 rollup-plugin-node-resolve 来完成。

安装后,可以直接通过模块名来引用功能模块

// 安装
yarn add rollup-plugin-node-resolve --dev

// rollup.config.js 中引入插件函数
import resolve from 'rollup-plugin-node-resolve'

export default {
    plugins: [
        resolve()
    ]
}

// 引用
import _ from 'lodash-es' // 通过模块名引用 lodash-es

加载 CommonJS 模块

Rollup 默认不支持导入 CommonJS 模块,需要额外引入解析模块 rollup-plugin-commonjs

// 安装
yarn add rollup-plugin-commonjs --dev

export default {
    plugins: [
        commonjs()
    ]
}

代码拆分

// 配置 rollup.config.js
export default {
    input: 'src/index.js',
    output: {
        dir: 'dist', // 输出路径,分包不能打包到同一个文件,需指定为文件夹
        format: 'amd'
    }
}

// 动态导入 demo.js
import('./logger').then(({ log }) => {
    log('code splitting~')
})

// 执行命令 cmd
yarn  rollup --config

多入口打包

export default {
    input: {
        foo: 'src/index.js',
        bar: 'src/album.js'
    },
    output: {
        dir: 'dist', 
        // format: 'iife'
        format: 'amd' // 多入口打包时,会自动提取公用部分,所以不能使用自执行函数模式
    }
}

与 Webpack 对比

  • Rollup 优势
    • 输出结果更加扁平
    • 会自动移除未引用代码
    • 打包结果依然完全可读
  • Rollup 缺点
    • 加载非 ESM 的第三方模块比较复杂
    • 模块最终都被打包到一个函数中,无法实现 HMR
    • 浏览器环境中,代码拆分功能依赖 AMD 库

Parcel


概述

  • 一款零配置的前端应用打包器
  • 建议使用 html 文件作为打包入口
  • 会自动安装任意导入的模块,无需手动配置
  • 打包时会自动执行文件压缩
  • 打包时会自动分离文件

安装

yarn add parcel-bundler --dev

使用

// 需要指定入口文件路径
yarn parcel src/index.html
// 生产模式
yarn parcel build src/index.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值