rollup 实战打包教程

936 阅读2分钟

这是我参与8月更文挑战的第15天,活动详情查看:8月更文挑战

rollup打包react组件

1, 创建项目文件

mkdir my-react-library

2, 进入文件,初始化package.json文件

cd my-react-library
yarn init -y 

3, 安装rollup和相关插件

 yarn add rollup rollup-plugin-babel @babel/core @babel/preset-env @babel/preset-react 
 @emotion/babel-preset-css-prop -D

4, 创建相对于的文件

src文件夹: 存放源代码的
lib文件夹: 存放编译之后的文件
.gitignore: 忽略掉node_modules文件
.yarnignore: 忽略掉src, .gitignor, 保证上传的文件之后lib里面的代码
.babelrc:   配置babel解析插件

根目录创建rollup.config.js

详细的配置在文件中说明 1, 格式(format)

amd – 异步模块定义,用于像RequireJS这样的模块加载器
cjs – CommonJS,适用于 Node 和 Browserify/Webpack
esm – 将软件包保存为 ES 模块文件,在现代浏览器中可以通过 <script type=module> 标签引入
iife – 一个自动执行的功能,适合作为<script>标签。(如果要为应用程序创建一个捆绑包,您可能想要使用它,
因为它会使文件大小变小。)
umd – 通用模块定义,以amd,cjs 和 iife 为一体
system - SystemJS 加载器格式

5, 初步打包

yarn run rollup -c

6, package.json文件添加打包脚本

package.json新增

"build": "yarn run rollup -c",  // 打包
"start": "yarn run rollup -c -w"  // 监听文件变化,打包

7, 修复main文件入口

"main": "lib/bundle.js"

8, 执行yarn link

解释一下yarn link的原理

开发过程中,两个或多个项目之间相互依赖时,可以使用yarn link将一个项目链接到另一个项目。
项目A中需要使用项目B时,可以使用yarn link或npm link将B引入到A。
link本身是软链接,yarn link是将资源存在yarn的内存中,相当于建立了一个通道

执行完yarn link之后,相当于把my-react-library代码存在yarn内存中

9, 打开另外一个项目,链接项目

 yarn link my-react-library

10,添加 css,和动画库

yarn add styled-components
yarn add @emotion/core
yarn add  framer-motion

11,react开发组件代码

(1)rollup.config.js

import babel from 'rollup-plugin-babel'
export default {
  // 入口文件
  input: './src/index.js',
  // 出口文件
  output:{
    file: './lib/bundle.js', // 输出的文件
    format: 'cjs' // 输出的格式
  },
  plugins: [babel()],
  external: ['react', 'styled-components']
}

(2) Switch.js代码

import React, {useState} from 'react'
import styled from 'styled-components'
import { css } from '@emotion/core'
import { motion } from 'framer-motion'
const Switch = () => {
  const [state, setState] = useState(false)
  const handleOntap = () => {
    setState(!state)
  }
  return (
    <motion.div className="container" css={css`
      width:100px;
      height: 50px;
      background: whitesmoke;
      border-radius: 50px;
      position: relative;
    `}
    onTap={handleOntap}
    >
      <motion.div className="ball" css={css`
        width: 50px;
        height: 50px;
        background:royalblue;
        border-radius:50px;
        position: absolute;
        left: ${state ? 'unset' : 0};
        right: ${state ? 0 : 'unset'}
      `}>

      </motion.div>
     {/* <StyledSwitch>Switch Hello</StyledSwitch> */}
    </motion.div>
  )
}
const StyledSwitch = styled.h1`color: hotpink`;
export default Switch

(3) package.json代码

{
  "name": "my-react-library",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "scripts": {
    "build": "yarn run rollup -c",
    "start": "yarn run rollup -c -w"
  },
  "description": "添加描述",
  "keywords": ["SWITCH"],
  "devDependencies": {
    "@babel/core": "^7.15.0",
    "@babel/preset-env": "^7.15.0",
    "@babel/preset-react": "^7.14.5",
    "@emotion/babel-preset-css-prop": "^11.2.0",
    "rollup": "^2.56.2",
    "rollup-plugin-babel": "^4.4.0"
  },
  "dependencies": {
    "@emotion/core": "^11.0.0",
    "framer-motion": "^4.1.17",
    "styled-components": "^5.3.0"
  }
}

12, 发布

yarn publish