Rollup 快速入门,JDK 打包必备

Rollup 优点

  • 输出结果更加扁平
  • 自动移除为引用代码
  • 打包结果依然完全可读

Rollup 缺点

  • 加载非 ESM 的第三方模块比较复杂
  • 模块最终都被打包到一个函数中,无法实现 HMR
  • 浏览器环境中,代码拆分功能依赖 AMD 库

1. 项目目录结构

新建文件夹,在文件夹下新建 src 目录,执行 npm init

  • src/index.js
js 复制代码
import { log } from 'logger'
import messages from './messages'

// 使用模块成员
const msg = messages.hi
log(msg)
  • src/logger.js
js 复制代码
export const log = (msg) => console.log(`log ${msg}`)
export const error = (msg) => console.log(`error ${msg}`)
  • src/messages.js
js 复制代码
export default {
    hi: 'hello, Rollup'
}

2. 使用 rollup

  • 安装组件包
bash 复制代码
yarn add rollup --save
  • 打包浏览器
bash 复制代码
yarn rollup ./src/index.js --format iife --file dist/bundle.js
  • 打包后目录结构,及打包代码效果

打包的内容,只对引用的数据进行了打包,自行处理了依赖

2.1 配置文件

  • rollup.config.js
arduino 复制代码
export default {
    input: 'src/index.js',
    output: {
        file: 'dist/bundle.js',
        format: 'iife' // 输入格式
    }
}
  • 配置后可以直接运行进行打包
sql 复制代码
yarn rollup --config

如果执行yarn rollup --config报错,则需要在package.json里添加 "type": "module"

  • 报错
  • 修改package.json

后期使用时可以根据配置文件不同区分不同的环境构建配置 yarn rollup --config rollup.config.js (可以根据环境设置不同的文件名称)

2.2 使用插件

  • rollup-plugin-json插件为例

    • 安装rollup-plugin-json
    bash 复制代码
    yarn add rollup-plugin-json --dev
    • 调整配置文件

    引入的函数的运行结果,不是直接引用函数

    • 直接使用
    • 打包文件

2.3 加载 npm 模块

  • 安装rollup-plugin-node-resolve
bash 复制代码
yarn add rollup-plugin-node-resolve --dev
  • 补充相应的插件配置

引入的函数的运行结果,不是直接引用函数

js 复制代码
import json from 'rollup-plugin-json'
+ import resolve from 'rollup-plugin-node-resolve'
export default {
    input: 'src/index.js',
    output: {
        file: 'dist/bundle.js',
        format: 'iife' // 输入格式
    },
    plugins: [
        json(),// 函数的运行结果
+        resolve()
    ]
}
  • 引用测试
js 复制代码
import { log } from 'logger'
import messages from './messages'
import { name, version } from '../package.json'
import _ from 'ladash-es'
// 使用模块成员
const msg = messages.hi
log(msg)
log(`name:${name} version:${version}`)
log(_.sum([1, 2, 3]))
  • 打包测试yarn rollup --config
js 复制代码
(function (logger, _ ) {
    'use strict';

    var messages = {
        hi: 'hello, Rollup'
    };

    var name = "pop-monitor-sdk";
    var version = "1.0.0";

    // 使用模块成员
    const msg = messages.hi;
    logger.log(msg);
    logger.log(`name:${name} version:${version}`);
    logger.log( _ .sum([1, 2, 3])); 

})(logger, _);

2.4 加载 commonJS模块

  • 安装rollup-plugin-commonjs
sql 复制代码
yarn add rollup-plugin-commonjs  --dev
  • 补充相应的插件配置
js 复制代码
+import commonjs from 'rollup-plugin-commonjs'
+ commonjs()
  • 添加文件src/cjs-module.js
js 复制代码
module.exports = {
    foo: 'bar'
}
  • 引用测试
js 复制代码
import cjs from './cjs-module'
log(cjs)
  • 打包测试yarn rollup --config

2.5 代码拆分

  • src/index.js
js 复制代码
import('./logger').then(({ log }) => {
    log('hello, Rollup')
})
  • 尝试打包,不是浏览器模式不支持,调整为 amd
  • 使用 amd,会分包处理,之前的配置不支持
css 复制代码
yarn rollup --config --format amd
  • 调整配置文件
  • 进行了分包yarn rollup --config

2.6 多入口打包

2.6.1 准备多入口文件

  • src/fetch.js
js 复制代码
export default endpoint => {
    return fetch(`https://jsonplaceholder.typicode.com${endpoint}`)
        .then(response => response.json())
}
  • src/album.js
js 复制代码
import fetchApi from './fetch'
import { log } from './logger'
fetchApi('/photos?albumId=1').then(data => {
    data.forEach(item => {
        log(item)
    });
})
  • src/index.js
js 复制代码
// 测试多入口代码
import fetchApi from './fetch'
import { log } from './logger'
fetchApi('/posts').then(data => {
    data.forEach(item => {
        log(item)
    });
})

2.6.2 配置文件调整

  • 调整入口文件问多入口
js 复制代码
 input: {
        index: 'src/index.js',
        album: 'src/album.js'
}
  • 打包预览yarn rollup --config

    • 以配置设置的文件名称为打包后的文件入口
    • 公共的模块会统一提取成公共文件
    • album
    • index

2.6.3 测试打包库的运行效果

  • 新增 index.html,在dist/index.html中添加引用
html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script src="https://cdn.bootcdn.net/ajax/libs/require.js/2.3.6/require.js" data-main="album.js"> </script>
</body>

</html>
  • 新增 index.html,在dist/index.html中添加引用
html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script src="https://cdn.bootcdn.net/ajax/libs/require.js/2.3.6/require.js" data-main="album.js"> </script>
</body>

</html>
  • 在浏览器运行

    • 加载的包
    • 运行效果
相关推荐
某公司摸鱼前端17 分钟前
uniapp socket 封装 (可拿去直接用)
前端·javascript·websocket·uni-app
要加油哦~18 分钟前
vue | 插件 | 移动文件的插件 —— move-file-cli 插件 的安装与使用
前端·javascript·vue.js
小林学习编程24 分钟前
Springboot + vue + uni-app小程序web端全套家具商场
前端·vue.js·spring boot
柳鲲鹏25 分钟前
WINDOWS最快布署WEB服务器:apache2
服务器·前端·windows
weixin-a153003083161 小时前
【playwright篇】教程(十七)[html元素知识]
java·前端·html
ai小鬼头2 小时前
AIStarter最新版怎么卸载AI项目?一键删除操作指南(附路径设置技巧)
前端·后端·github
wen's2 小时前
React Native 0.79.4 中 [RCTView setColor:] 崩溃问题完整解决方案
javascript·react native·react.js
一只叫煤球的猫3 小时前
普通程序员,从开发到管理岗,为什么我越升职越痛苦?
前端·后端·全栈
vvilkim3 小时前
Electron 自动更新机制详解:实现无缝应用升级
前端·javascript·electron
vvilkim3 小时前
Electron 应用中的内容安全策略 (CSP) 全面指南
前端·javascript·electron