网易首页 > 网易号 > 正文 申请入驻

前端组件/库打包利器 Rollup 使用与配置实战

0
分享至

作者:徐小夕

前言

写rollup的文章是因为笔者最近要规范前端开发的业务流程和架构,并提供内部公有组件库和工具库供团队使用。在查阅大量资料并对比了webpack和rollup的优缺点之后,最终选择rollup来作为打包工具,我们最终要实现通过npm的方式安装我们的组件库和工具库:

// 安装npm install @xuxi/tools// 使用import { sleep } from '@xuxi/tools'

下面我们一步步来复盘rollup的配置过程和最佳实践。

rollup介绍

Rollup is a module bundler for JavaScript which compiles small pieces of code into something larger and more complex, such as a library or application. It uses the new standardized format for code modules included in the ES6 revision of JavaScript, instead of previous idiosyncratic solutions such as CommonJS and AMD.

意思大致是说Rollup 是一个 JavaScript 模块打包器,可以将小块代码编译成大块复杂的代码,例如 library 或应用程序。Rollup 对代码模块使用新的标准化格式,这些标准都包含在 JavaScript 的 ES6 版本中,而不是像CommonJS 和 AMD这种特殊解决方案。

rollup最大的亮点就是Tree-shaking,即可以静态分析代码中的 import,并排除任何未使用的代码。这允许我们架构于现有工具和模块之上,而不会增加额外的依赖或使项目的大小膨胀。如果用webpack做,虽然可以实现tree-shaking,但是需要自己配置并且打包出来的代码非常臃肿,所以对于库文件和UI组件,rollup更加适合。

搭建库打包脚手架
1. rollup入门

首先我们安装一下rollup:

npm i rollup -g
1.

然后在本地创建一个项目:

mkdir -p my-project
cd my-project
1.2.

其次我们创建一个入口并写入如下代码:

  • // src/main.js
    import say from './say.js';
    export { say }
    // src/say.js
    export default function(name){
    console.log(name)
    1.2.3.4.5.6.7.8.

基本代码准备好了之后,我们写rollup的配置文件(rollup.config.js在根目录下):

  • // rollup.config.js
    export default {
    input: 'src/main.js',
    output: {
    file: 'bundle.js',
    format: 'cjs'

    1.2.3.4.5.6.7.8.

这样,我们在终端执行:

复制// --config 或 -c 来使用配置文件
rollup -c
1.2.

这样在更目录下就生成了一个bundle.js,就是我们想要的打包后的文件。我们也可以用package.json来设置打包配置信息,用npm run xxx来打包和测试代码。

2.rollup插件使用

为了更灵活的打包库文件,我们可以配置rollup插件,比较实用的插件有:

rollup-plugin-node-resolve —帮助 Rollup 查找外部模块,然后导入

rollup-plugin-commonjs —将CommonJS模块转换为 ES2015 供 Rollup 处理

rollup-plugin-babel — 让我们可以使用es6新特性来编写代码

rollup-plugin-terser — 压缩js代码,包括es6代码压缩

rollup-plugin-eslint — js代码检测

打包一个库用以上插件完全够用了,不过如果想实现对react等组件的代码,可以有更多的插件可以使用,这里就不一一介绍了。

我们可以这样使用,类似于webpack的plugin配置:

  • import resolve from 'rollup-plugin-node-resolve';
    import commonjs from 'rollup-plugin-commonjs';
    import babel from "rollup-plugin-babel";
    import { terser } from 'rollup-plugin-terser';
    import { eslint } from 'rollup-plugin-eslint';
    export default [
    input: 'src/main.js',
    output: {
    name: 'timeout',
    file: '/lib/tool.js',
    format: 'umd'
    },
    plugins: [
    resolve(), // 这样 Rollup 能找到 `ms`
    commonjs(), // 这样 Rollup 能转换 `ms` 为一个ES模块
    eslint(),
    babel(),
    terser()

    1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.

是不是很简单呢?个人觉得比webpack的配置简单很多。通过如上配置,虽然能实现基本的javascript文件打包,但是还不够健壮,接下来我们一步步来细化配置。

3.利用babel来编译es6代码

首先我们先安装babel相关模块:

  • npm i core-js @babel/core @babel/preset-env @babel/plugin-transform-runtime

然后设置.babelrc文件


  • "presets": [
    "@babel/preset-env",
    "modules": false,
    "useBuiltIns": "usage",
    "corejs": "2.6.10",
    "targets": {
    "ie": 10

    ],
    "plugins": [
    // 解决多个地方使用相同代码导致打包重复的问题
    ["@babel/plugin-transform-runtime"]
    ],
    "ignore": [
    "node_modules/**"

    1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.

@babel/preset-env可以根据配置的目标浏览器或者运行环境来自动将ES2015+的代码转换为es5。需要注意的是,我们设置"modules": false,否则 Babel 会在 Rollup 有机会做处理之前,将我们的模块转成 CommonJS,导致 Rollup 的一些处理失败。

为了解决多个地方使用相同代码导致打包重复的问题,我们需要在.babelrc的plugins里配置@babel/plugin-transform-runtime,同时我们需要修改rollup的配置文件:

  • babel({
    exclude: 'node_modules/**', // 防止打包node_modules下的文件
    runtimeHelpers: true, // 使plugin-transform-runtime生效
    }),
    1.2.3.4.

如果你对babel不太熟,可以看我之前webpack的文章或者去官网学习。

4.区分测试环境和开发环境

我们可以在package.json中配置不同的执行脚本和环境变量来对开发和生产做不同的配置:

  • // package.json
    "scripts": {
    "build": "NODE_ENV=production rollup -c",
    "dev": "rollup -c -w",
    "test": "node test/test.js"
    },
    1.2.3.4.5.6.

我们可以手动导出NODE_ENV为production和development来区分生产和开发环境,然后在代码中通过process.env.NODE_ENV来获取参数。这里我们主要用来设置在开发环境下不压缩代码:

  • const isDev = process.env.NODE_ENV !== 'production';
    plugins: [
    !isDev && terser()
    1.2.3.4.5.

使用eslint来做代码检测

我们可以使用上面的提到的rollup-plugin-eslint来配置:

  • eslint({
    throwOnError: true,
    throwOnWarning: true,
    include: ['src/**'],
    exclude: ['node_modules/**']
    1.2.3.4.5.6.

然后建立.eslintrc.js来根据自己风格配置具体检测:

  • module.exports = {
    "env": {
    "browser": true,
    "es6": true,
    "node": true
    },
    "extends": "eslint:recommended",
    "globals": {
    "Atomics": "readonly",
    "SharedArrayBuffer": "readonly",
    "ENV": true
    },
    "parserOptions": {
    "ecmaVersion": 2018,
    "sourceType": "module"
    },
    "rules": {
    "linebreak-style": [
    "error",
    "unix"
    ],
    "quotes": [
    "error",
    "single"

    1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.

详细的eslint配置可以去官网学习。

5. external属性

使用rollup打包,我们在自己的库中需要使用第三方库,例如lodash等,又不想在最终生成的打包文件中出现jquery。这个时候我们就需要使用external属性。比如我们使用了lodash,

  • import _ from 'lodash'
    // rollup.config.js
    input: 'src/main.js',
    external: ['lodash'],
    globals: {
    lodash: '_'
    },
    output: [
    { file: pkg.main, format: 'cjs' },
    { file: pkg.module, format: 'es' }

    1.2.3.4.5.6.7.8.9.10.11.12.13.14.
6.导出模式

我们可以将自己的代码导出成commonjs模块,es模块,以及浏览器能识别的模块,通过如下方式设置:


  • input: 'src/main.js',
    external: ['ms'],
    output: [
    { file: pkg.main, format: 'cjs' },
    { file: pkg.module, format: 'es' },
    { file: pkg.module, format: 'umd' }

    1.2.3.4.5.6.7.8.9.
发布到npm

如果你是之前没有注册npm账号,你可以通过如下方式配置:

复制npm adduser
1.

然后输入用户名,邮箱,密码,最后使用npm publish发布。这里介绍包的配置文件,即package.json:


  • "name": "@alex_xu/time",
    "version": "1.0.0",
    "description": "common use js time lib",
    "main": "dist/tool.cjs.js",
    "module": "dist/time.esm.js",
    "browser": "dist/time.umd.js",
    "author": "alex_xu",
    "homepage": "https://github.com/MrXujiang/timeout_rollup",
    "keywords": [
    "tools",
    "javascript",
    "library",
    "time"
    ],
    "dependencies": {
    },
    "devDependencies": {
    },
    "scripts": {
    "build": "NODE_ENV=production rollup -c",
    "dev": "rollup -c -w",
    "test": "node test/test.js",
    "pretest": "npm run build"
    },
    "files": [
    "dist"

    1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.

name是包的名字,可以直接写包名,比如loadash,或者添加域,类似于@koa/router这种,@后面是你npm注册的用户名。key为包的关键字。

发布后,我们可以用类似于下面这种方式安装:

  • npm install @alex_xu/time
    // 使用
    import { sleep } from '@alex_xu/time'
    // 或
    const { sleep } = requrie('@alex_xu/time')
    1.2.3.4.5.

如下是安装截图:

在npm上也可以搜索到自己的包:

是不是很有成就感呢?快让大家一起使用你开发的包吧!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
660胜!丁俊晖成亚洲历史第一人,中国一哥迎职业生涯里程碑!

660胜!丁俊晖成亚洲历史第一人,中国一哥迎职业生涯里程碑!

世界体坛观察家
2024-05-20 19:29:40
夺冠仅1天,英超冠军遭指控!3种处罚方式曝光:降级+被剥夺奖杯

夺冠仅1天,英超冠军遭指控!3种处罚方式曝光:降级+被剥夺奖杯

侃球熊弟
2024-05-20 21:00:28
郭有才爆火:引发强烈担忧,网上开始一片骂声,有人呼吁国家出手

郭有才爆火:引发强烈担忧,网上开始一片骂声,有人呼吁国家出手

影像温度
2024-05-19 12:05:56
扎心!湖人选秀避开3大天才,完美选中1.6分龙套,370万打水漂

扎心!湖人选秀避开3大天才,完美选中1.6分龙套,370万打水漂

末位侃球
2024-05-21 07:30:55
《庆余年2》女演员告诉你:干瘪如柴不叫美,珠圆玉润才更有韵味

《庆余年2》女演员告诉你:干瘪如柴不叫美,珠圆玉润才更有韵味

娱乐圈十三太保
2024-05-20 15:40:39
杀疯了!林允儿戛纳被网友爆夸不愧第一门面,韩素希清纯风却翻车

杀疯了!林允儿戛纳被网友爆夸不愧第一门面,韩素希清纯风却翻车

娱乐的小灶
2024-05-20 02:58:52
在华祭出史上最大降价,苹果真急了

在华祭出史上最大降价,苹果真急了

观察者网
2024-05-20 17:44:32
不愧是jk,我这种小屌丝穿都好看

不愧是jk,我这种小屌丝穿都好看

室内设计师阿喇
2024-05-20 19:19:31
直升机事故中遇难的伊朗外长:曾称美国所谓民主人权都是假的

直升机事故中遇难的伊朗外长:曾称美国所谓民主人权都是假的

南方都市报
2024-05-20 20:04:19
彻底炸锅了!A股突发惊天大雷!近十万股东彻夜难眠!

彻底炸锅了!A股突发惊天大雷!近十万股东彻夜难眠!

彩云的夕阳
2024-05-21 04:05:02
下赛季可以走了,曼城有哈兰德有福登,世界冠军已无用武之地

下赛季可以走了,曼城有哈兰德有福登,世界冠军已无用武之地

老乐说球
2024-05-20 08:56:52
4月份SUV销量出炉,特斯拉Model Y夺冠,比亚迪和丰田各三款入围

4月份SUV销量出炉,特斯拉Model Y夺冠,比亚迪和丰田各三款入围

财经老庄
2024-05-20 21:05:23
徐冬冬怒批贩卖走光照行为,要一告到底!网友嘲笑:怕穷人看到

徐冬冬怒批贩卖走光照行为,要一告到底!网友嘲笑:怕穷人看到

诚小宝
2024-05-20 21:54:49
突然反转了!台积电正式对外宣布,外媒:大势已去了!

突然反转了!台积电正式对外宣布,外媒:大势已去了!

疯狂小菠萝
2024-05-20 22:41:58
什么水平?CBA总决赛前两场场均上座人数9241,上座率达94.3%

什么水平?CBA总决赛前两场场均上座人数9241,上座率达94.3%

懂球帝
2024-05-20 18:10:20
《庆余年2》:余皑磊火出圈,不仅演技获好评,还带火了一句台词

《庆余年2》:余皑磊火出圈,不仅演技获好评,还带火了一句台词

八卦南风
2024-05-20 22:30:36
输G3,邱彪彻底怒了!炮轰球队三分拉胯,于德豪+锋线双核狂铁!

输G3,邱彪彻底怒了!炮轰球队三分拉胯,于德豪+锋线双核狂铁!

篮球资讯达人
2024-05-21 01:43:57
俄军宣布夺取卢甘斯克重要定居点

俄军宣布夺取卢甘斯克重要定居点

参考消息
2024-05-20 22:05:23
保证金3.1亿打水漂?小米已退还徐汇滨江地块!

保证金3.1亿打水漂?小米已退还徐汇滨江地块!

地产申度
2024-05-20 22:53:11
郭富城方媛过520情人节,两人一身名牌男方更时髦,身高差明显!

郭富城方媛过520情人节,两人一身名牌男方更时髦,身高差明显!

山野下
2024-05-20 10:40:30
2024-05-21 08:22:44
Nodejs开发
Nodejs开发
分享只有程序员懂的干货
648文章数 824关注度
往期回顾 全部

科技要闻

理想 Q1营收同比增长36% 交付指引不及预期

头条要闻

伊朗总统莱希坠机遇难震动世界 多国政要表示深切哀悼

头条要闻

伊朗总统莱希坠机遇难震动世界 多国政要表示深切哀悼

体育要闻

8年半,讲不出再见

娱乐要闻

王俊凯现身蔡依林演唱会,牵手唱歌!

财经要闻

股价暴跌78%!“扫地茅”科沃斯跌落神坛

汽车要闻

智驾升级/月底上市 问界新M7 MAX焕新版

态度原创

时尚
本地
旅游
房产
公开课

今年最流行的衬衫穿法,越帅越时髦!

本地新闻

强制开锁展铁腕 “交叉执行”勇亮剑

旅游要闻

详情披露!香港黄家驹墓碑再遭铁锤砸和涂鸦

房产要闻

突然爆发!大量重磅宅地挂出,海南土地市场开始狂飙!

公开课

父亲年龄越大孩子越不聪明?

无障碍浏览 进入关怀版