Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/AMS-Regular.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Rollup模块打包踩坑指南

Rollup模块打包踩坑指南

作者头像
luciozhang
发布于 2023-04-22 08:40:34
发布于 2023-04-22 08:40:34
3K00
代码可运行
举报
文章被收录于专栏:前端lucio前端lucio
运行总次数:0
代码可运行

Rollup是一个轻量级javascript模块打包器。相比于Webpack,Rollup更适合打包library。Rollup基于ES6模块,ES模块允许通过静态分析,实现tree-shaking优化,删除冗余代码。

对于Rollup和Webpack的选择,可以看下Rollup的官方文档:

Rollup 是用来构建库还是应用程序?(Is Rollup meant for building libraries or applications?) Rollup 已被许多主流的 JavaScript 库使用,也可用于构建绝大多数应用程序。但是 Rollup 还不支持一些特定的高级功能,尤其是用在构建一些应用程序的时候,特别是代码拆分和运行时态的动态导入 dynamic imports at runtime. 如果你的项目中更需要这些功能,那使用 Webpack可能更符合你的需求。

本文记录了打包一个js组件,并发布到npm的过程。

这次示例我们打包一个基于mobile-select封装的城市选择组件,先来看下将要被打包的代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import CityList from './list'
import MobileSelect from 'mobile-select'

const CitySelector = {}
CitySelector.districtData = null
CitySelector.instance = null
CitySelector.callback = null

/**
 * 初始化方法
 * @param trigger  省份城市控件id
 * @param title  标题
 * @param callback (indexArr, data) data是一个数组
 * @param type 类型 1 选择省市 2 选择省市区
 */
CitySelector.init = function (trigger, callback, title = "请选择省份城市", type = 1) {
    CitySelector.callback = callback

    CitySelector.districtData = CityList
    CitySelector.doInit(trigger, title, type)

}

// ***

export default CitySelector

可以看到,我们的代码import了两个外部库,list是存在本地的城市区划列表,mobile-select是一个开源的选择弹框组件。

1. 初始化项目

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm init

会生成一个package.json文件,修改下配置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "name": "tip-city-selector",
  "version": "1.0.5",
  "description": "cn city selection component",
  "main": "dist/tip-city-selector.js",
  "scripts": {
    "build": "rollup -c"
  },
  "author": "luciozhang",
  "license": "ISC",
  "devDependencies": {},
  "dependencies": {}
}

2. ESLint代码检查

通过代码规范,避免不必要的bug。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install --save-dev eslint

3. 安装Rollup

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install --global rollup

4. 安装Babel相关插件

为了使用JavaScript的新特性。

https://www.rollupjs.com/guide/tools/#babel

关于babel的使用,推荐阅读下面这篇文章:

你真的会用 Babel 吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm i -D rollup-plugin-babel

rollup-plugin-babel插件并不包含babel包,需要安装必要的babel包依赖。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm i -D @babel/core @babel/preset-env

配置rollup.config.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// rollup.config.js
import babel from 'rollup-plugin-babel';

export default {
  input: 'src/main.js',  //打包入口
  output: {
    file: 'bundle.js',  //输出文件
    format: 'cjs'       //模块化方式
  },
  plugins: [
    babel({
      exclude: 'node_modules/**' // 只编译我们的源代码,忽略第三方代码
    })
  ]
};

创建babel配置.babelrc

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//.babelrc
{
  "presets": [
    ["latest", {
      "es2015": {
        "modules": false //设置"modules": false,否则 Babel 会在 Rollup 有机会做处理之前,将我们的模块转成 CommonJS,导致 Rollup 的一些处理失败
      }
    }]
  ],
  "plugins": ["external-helpers"] //允许 Rollup 在包的顶部只引用一次 “helpers”,而不是每个使用它们的模块中都引用一遍(这是默认行为)
}

安装插件babel-preset-latest和babel-plugin-external-helpers

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm i -D babel-preset-latest babel-plugin-external-helpers

运行一下,rollup -c。

报错了!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[!] (plugin babel) Error: /Users/luciozhang/tip-city-selector/src/main.js: Babel 7.0.0-beta.56 has dropped support for the 'helpersNamespace' utility.If you are using @babel/plugin-external-helpers you will need to use a newer version than the one you currently have installed. If you have your own implementation, you'll want to explore using 'helperGenerator' alongside 'file.availableHelper()'.

看了下rollup-plugin-babel的issues,原来Babel7.x版本不建议使用babel-plugin-external-helpers,也没对其进行支持。

对比了下英文文档,是中文文档翻译不及时的锅。

我们修改下.babelrc文件去掉babel-preset-latest babel-plugin-external-helpers两个插件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//.babelrc
{
  "presets": [
    ["@babel/env", {"modules": false}]
  ]
}

5. Node 模块位置解析

再次运行rollup -c。

可以了!!

但发现一个WARN

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(!) Missing global variable name
Use output.globals to specify browser global variable names corresponding to external modules
mobile-select (guessing 'MobileSelect')

我们已经安装了mobile-select模块,但没有被找到。

我们需要rollup-plugin-node-resolve 插件,来告知Rollup怎么查找外部模块,安装它

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install -D rollup-plugin-node-resolve
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//rollup.config.js
 plugins: [
       // …
    resolve({
       browser: true,
    }),
    // …
 ]

6. 加载 CommonJS 模块

再再次运行rollup -c。

WARN没了。但出现了一个Error。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[!] Error: 'default' is not exported by node_modules/mobile-select/mobile-select.js
https://rollupjs.org/guide/en/#error-name-is-not-exported-by-module

mobile-select模块是CommonJS模块,在Rollup中,加载CommonJS模块的能力放在可选插件中,我们需要安装rollup-plugin-commonjs。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install -D rollup-plugin-commonjs
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//rollup.config.js
 plugins: [
       // …
    commonjs({
        include: ['node_modules/**']
    }),
    // …
 ]

7. PostCSS插件

再再再次运行rollup -c。

上一个Error解决了,我们来看下新的Error

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!] Error: Unexpected token (Note that you need plugins to import files that are not JavaScript)
node_modules/mobile-select/mobile-select.css (1:0)

Rollup本身不支持加载css组件,我们需要安装一个Rollup的PostCSS插件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install -D rollup-plugin-postcss
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//rollup.config.js
 plugins: [
       // …
    postcss({
        extensions: ['.css'],
    }),
    // …
 ]

最后一次运行rollup -c,可以了。

8. 压缩代码

打包出来的js文件比较大,我们用rollup-plugin-terser压缩下代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install -D rollup-plugin-terser

在rollup.config.js的 插件列表加上terser()。

9. Rollup输出配置

打包的工作到这里就结束了,我们想要测试打包成果。

可能你还记得,我们打包输出的是CommonJS模块,因为rollup.config.js里面的output.format选项选择的是cjs。

可选的输出模块类型有下面这些:

  • amd – 异步模块定义,用于像 RequireJS 这样的模块加载器。
  • cjs – CommonJS,适用于 Node 和 Browserify/Webpack。
  • es – 将软件包保存为 ES 模块文件。
  • iife – 一个自动执行的功能,适合作为<script>标签。(如果要为应用程序创建一个捆绑包,您可能想要使用它,因为它会使文件大小变小。)
  • umd – 通用模块定义,以 amd,cjs 和 iife 为一体。

为了放在<script>中使用,方便测试,我们将打包格式改为umd。

同时,对于life和umd格式,我们需要指定输出模块名称,在js脚本中可以直接使用模块。

最终,我们的Rollup打包配置是这样的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//rollup.config.js
import { terser } from 'rollup-plugin-terser';
import babel from 'rollup-plugin-babel';
import resolve from 'rollup-plugin-node-resolve';
import commonjs from 'rollup-plugin-commonjs'
import postcss from 'rollup-plugin-postcss';

export default {
    input: './src/main.js',
    output: {
        file: './dist/tip-city-selector.js',
        format: 'umd',
        name: 'CitySelector'
    },
    runtimeHelpers: false,
    plugins: [
        postcss({
            extensions: ['.css'],
        }),
        resolve({
            browser: true,
        }),
        commonjs({
            include: ['node_modules/**']
        }),
        babel({
            exclude: 'node_modules/**',
        }),
        terser(),
    ]
};

10. 发布npm

最后,如果对封装的组件有信心的话,我们可以把组件发布到npm

package.json的main属性指向包的出口,在我们的项目中,是"main": "dist/tip-city-selector.js"。

npmloginnpm publish发布。

0. 参考文章

Rollup官方文档

你真的会用 Babel 吗?

rollup-plugin-babel

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用rollup创建组件库
这里打包的格式设置为umd ,打包模式可以设置的类型有 umd(原生js) ,cjs (commonjs), es (es) 。
lilugirl
2020/12/08
1.4K0
前端组件/库打包利器rollup使用与配置实战
写rollup的文章是因为笔者最近要规范前端开发的业务流程和架构,并提供内部公有组件库和工具库供团队使用。在查阅大量资料并对比了webpack和rollup的优缺点之后,最终选择rollup来作为打包工具,我们最终要实现通过npm的方式安装我们的组件库和工具库:
徐小夕
2019/10/23
2.6K0
前端组件/库打包利器rollup使用与配置实战
rollup打包ts+react最佳实践
前段时间系统性学习了webpack,针对于打包项目,webpack的确非常强大,也非常合适,但是用来打包组件库,就显得比较的繁琐。相较而言,使用rollup打包组件库,就显得非常的简单容易,而本文也将介绍它的基础用法。
Jou
2022/11/14
3.8K0
rollup打包ts+react最佳实践
Rollup初探
需要注意的是参数 -f 是 --output.format 的缩写,用来指定 bundle 的类型,有以下选项:
用户1515472
2019/07/24
1K0
Rollup初探
使用webpack和rollup打包组件库
之前做了一个loading的样式组件,为了实现代码的可重用性,将这个小项目打包并且发布在了npm上。在一次次的打包发包过程中经历了一个又一个报错,@buzuosheng/loading这个组件已经到了2.7.0版本,虽然还有一些要调整的地方,但总算是可以用了。
不作声
2021/03/05
1.2K0
使用webpack和rollup打包组件库
基于rollup打造组件库,你可能会用到这些插件
最近在重复赵轮子,用rollup搞一个react 组件库,今天就简单整理下用到的插件。
zz_jesse
2022/05/22
1.2K0
基于rollup打造组件库,你可能会用到这些插件
Rollup的基本使用
rollup.js是一个模块打包工具,可以使项目从一个入口文件开始,将所有使用到的模块文件都打包到一个最终的发布文件中,Rollup极其适合构建一个工具库,Vue.js源码就是通过Rollup打包构建的。
WindRunnerMax
2021/02/25
1.4K0
实用程序包utils - 基于Rollup打包输出各模块文件(二)
上一次,我们讲到了如何去搭建一个前端工具库的工程,那么今天我们来聊一聊如何去将其打包输出。
江涛学编程
2021/07/14
8420
gulp + gulp-better-rollup + rollup 构建 ES6 开发环境
关于 Gulp 就不过多啰嗦了。常用的 js 模块打包工具主要有 webpack、rollup 和 browserify 三个,Gulp 构建 ES6 开发环境通常需要借助这三者之一来合并打包 ES6 模块代码。因此,Gulp 构建 ES6 开发环境的方案有很多,例如:webpack-stream、rollup-stream 、browserify等,本文讲述使用 gulp-better-rollup 的构建过程。gulp-better-rollup 可以将 rollup 更深入地集成到Gulps管道链中。 GitHub地址:https://github.com/JofunLiang/gulp-translation-es6-demo
用户6167509
2019/09/04
1.2K0
sveltejs结合ol实现跨框架组件复用
velte 是构建 Web 应用程序的一种新方法,核心思想在于通过静态编译减少框架运行时的代码量,它可以像React和VUE一样开发,但却没有虚拟DOM,可以将代码编译为体积小、不依赖于框架的JS代码。使用Svelte开发的无框架依赖的Web Components,可以在各个框架间复用。同时,Svelte的开发方式也不像写pure js那样繁琐。本文将结合ol实现跨框架组件复用。
牛老师讲GIS
2023/02/10
8800
sveltejs结合ol实现跨框架组件复用
rollup打包入门到实践
rollup在业务中基本很少会有接触到,通常在我们的业务中大部分接触的脚手架,或者自己搭建项目中,我们都是用webpack,无论是vue-cli,还是react-create-app他们都是基于webpack二次封装的脚手架,所以我们对rollup更陌生一点,本文是一篇关于rollup的学习笔记,希望看完在项目中有所思考和帮助。
Maic
2022/12/21
1.4K0
rollup打包入门到实践
rollup从0到1
开发基于 typescript ES6 语法, 使用jest eslint 为校验或测试的npm包。 因为需要使用到 ts, 模块化,所以就存在模块编译打包的问题, 现有的打包工具中,webpack , Parcel 更偏向多类型资源 的web应用打包, 对于纯粹的npm工具包来说 rollup 更简单实用, 这里记录rollup的基础使用流程。
copy_left
2021/06/29
2.2K0
rollup学习小记
rollup适合库library的开发,而webpack适合应用程序的开发。 rollup也支持tree-shaking,自带的功能。 package.json 也具有 module 字段,像 Rollup 和 webpack 2 这样的 ES6 感知工具(ES6-aware tools)将会直接导入 ES6 模块版本。
用户2845596
2021/01/21
1.1K0
使用roolup构建你的lib
Rollup, 和 Webpack, Parcel 都是模块打包工具(module bundler tool), 但是侧重点不同, 我们要聊的 Rollup更加适合用于构建lib 而 Webpack, Precel 更加适合开发应用。本文,将结合一个简单的例子说说如何使用Rollup构建自己的lib。
牛老师讲GIS
2021/09/10
6260
Rollup
什么是Rollup rollup.js是Javascript的ES模块打包器,我们熟知的Vue、React等诸多知名框架或类库都通过rollup.js进行打包。与Webpack偏向于应用打包的定位不同,rollup.js更专注于Javascript类库打包(虽然rollup.js也可以提供资源打包,但显然这不是它的强项)。在我们学习Vue和React等框架源码或者自己编写Javascript类库时,rollup.js是一条必经之路。 Rollup 的好处 Tree Shaking: 自动移除未使用的代
念念不忘
2019/05/10
1.8K0
自建npm包-搭建,打包,调试,发布
简介 这里总结一个简单的npm包搭建,打包,调试,发布的基础点. 涉及内容 npm初始化 package.json 配置 eslint配置 babel配置 rollup打包 包初始化 // 新建包目录 md my-pkg // 进入包目录 cd my-pkg // npm 初始化 npm init -y package.json配置 { name: 'my-pkg', // 包名 main: 'lib/index.js', // 包加载时的入口文件 version: 0.
copy_left
2020/09/16
3.2K0
使用 Rollup + TypeScript 编写库
其中,dist 目录一般是通过 Rollup 等打包器打包后的入口文件,一般具有多种格式,以不同后缀命令,如: index.cjs.js index.esm.js。lib 和 esm 目录可以是 TypeScript 编译后生成的文件,目录下的结构基本和原项目结构相同,只是后缀变为 js,lib 一般为 CommonJS 格式,esm 为 ESModule 格式。而这些是一个库最基本的需要发布的文件。
Innei
2021/12/28
2.6K0
使用rollup打包React Native插件并发布
我们写组件库或工具库时不可避免会用到外部库,这些外部库可能是符合 CommonJS 规范的。而 Rollup 力图实现 ES 模块的规范, 因此,加载 CommonJS 模块和使用 Node 模块位置解析逻辑都被实现为可选插件,默认情况下不在 Rollup 内核中。我们需要安装并配置 CommonJS 和 node-resolve 插件。
用户1250838
2021/05/31
2.4K0
Rollup 基本概念及使用
Rollup是一款基于ESModule模块规范实现的JavaScript打包工具,在前端社区中赫赫有名,同时也在Vite的架构体系中发挥着重要作用。不仅是Vite生产环境下的打包工具,其插件机制也被Vite所兼容,可以说是Vite的构建基石。
xiangzhihong
2023/05/23
1.1K0
Rollup 基本概念及使用
【入门教程】Rollup模块打包器整合
注意:name为推荐选项,未指明打包后的模块名称,虽然打包产物可以正常加载但无法触发执行。
前端小鑫同学
2022/12/26
1.3K0
【入门教程】Rollup模块打包器整合
相关推荐
使用rollup创建组件库
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验