
前言
本文将介绍如何开发一个前端工具库,并使用rollup
对代码进行打包,最终将工具库发布到npm
Rollup 是一个 JavaScript 模块打包工具,可以将多个小的代码片段编译为完整的库和应用。文档
想要完整地发布一个工具库,分为以下步骤:
- 初始化项目,并安装相关依赖
- 修改
package.json
中的相关配置 - 如果你的工具包是使用
typescript
编写的,还需要额外配置一下tsconfig.json
- 使用
rollup
打包代码 - 发布
npm
包
安装依赖
- rollup:用于打包 JavaScript 应用程序和库的模块打包器
- rollup-plugin-typescript2:用于在 Rollup 构建过程中编译 TypeScript 代码
- typescript:rollup-plugin-typescript2 的对等依赖项
- tslib:rollup-plugin-typescript2 的对等依赖项
- @rollup/plugin-json:用于将 .json 文件转换为 ES6 模块
npm i rollup rollup-plugin-typescript2 tslib typescript @rollup/plugin-json -D |
配置文件
配置package.json
:
{ |
配置rollup.config.ts
:
import json from '@rollup/plugin-json' |
使用第三方类库
我们在开发过程中,可能会依赖一些外部类库,如:lodash
、react
。
为了保证其中的模块能够正常的,通常都会需要使用到@rollup/plugin-commonjs
。该插件支持将 CommonJS
模块转换为ES6
,可以帮助我们在项目中使用commonjs
规范的文件/模块。
另外,我们在打包的时候应该注意保持这些类库的外部引用状态,并告诉rollup
如何正确的处理这些依赖。
最后,为了确保这些外部类库的代码不会被共同打包到bundle.js
文件中。可以使用external
属性,告诉rollup
哪些是外部的库,不需要对这些外部类库进行打包。
安装:
npm install @rollup/plugin-commonjs @rollup/plugin-node-resolve --save-dev |
使用:
import commonjs from '@rollup/plugin-commonjs'; |
Tree Shaking & 副作用代码
在使用rollup
进行生产构建的时候,会自动开启tree shaking
,其本质是借助ES Module的静态分析
来消除无用的js代码。无用代码有以下特征:
- 代码不会被执行到
- 代码执行的结果不会被用到
- 代码只影响死变量
为了更直观的体会tree shaking
的作用,我们可以看看rollup
官方示例:
main.js
// TREE-SHAKING |
maths.js
// maths.js |
bundle comes out:
// maths.js |
可以看到,没有被使用到的代码都被’摇’掉了。可是产生了副作用的一段代码仍然被保留了下来:
window.effect1 = 'created'; |
以下操作同样会产生副作用:
global
,document
,window
, 全局变量修改,如window.xxx = xx
console.log
,history.pushState
等方法调用- 未声明的变量,如
a = 1
处理副作用代码
有时候,我们并不希望意外的副作用代码被保留下来,以此避免产生一些不必要的错误。
treeshake.annotations
在代码注释中忽略副作用
/*@__PURE__*/ console.log('side-effect'); |
treeshake.moduleSideEffects
忽略模块的副作用
// input file |
// output with treeshake.moduleSideEffects === true |
// output with treeshake.moduleSideEffects === false |
更多选项请参考官方文档。使用配置项:
// rollup.config.js |
提示:使用SideEffects
前请确保你的代码真的没有副作用,否则打包的时候会误删掉那些有副作用的代码
生成声明文件
由于我们使用了typescript
,在发布代码之前,也应该让同样使用typescript
的用户能够进行类型提示。
这里我们使用rollup-plugin-dts
,该插件能够汇总你的.d.ts
定义文件。该插件会自动将任何外部库(@types
例如)标记为external
,因此这些库将被排除在捆绑之外。
安装:
npm install --save-dev rollup-plugin-dts |
将其添加到rollup.config.js
:
export default [ |
并且修改package.json
配置项:
{ |
执行构建命令
npm run build |
{ |
发布
npm publish |