首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
【架构师(第一篇)】整体需求分析和架构设计
2
【架构师(第二篇)】脚手架架构设计和框架搭建
3
【架构师(第三篇)】脚手架开发之掌握Lerna操作流程
4
【架构师(第四篇)】脚手架开发之Lerna源码分析
5
【架构师(第五篇)】脚手架之import-local执行流程及简历设计
6
【架构师(第六篇)】脚手架之需求分析和架构设计
7
【架构师(第七篇)】脚手架之准备阶段编写
8
【架构师(第八篇)】脚手架之 commander 框架使用方法
9
【架构师(第九篇)】如何让 Node 环境支持 ES Module
10
【架构师(第十篇)】脚手架之注册命令及架构优化
11
【架构师(第十一篇)】脚手架之命令注册和执行过程开发
12
【架构师(第十二篇)】脚手架之命令行交互工具 inquirer.js 使用方法
13
【架构师(第十三篇)】脚手架之创建项目准备阶段开发
14
【架构师(第十四篇)】脚手架之 egg.js 和 mongodb 的使用
15
【架构师(第十五篇)】脚手架之创建项目模板开发
16
【架构师(第十六篇)】脚手架之创建项目模板的下载与更新
17
【架构师(第十七篇)】脚手架之 ejs 和 glob 的使用
18
【架构师(第十八篇)】脚手架之项目模板的安装
19
【架构师(第十九篇)】脚手架之组件库模板开发
20
【架构师(第二十篇)】脚手架之自定义模板及第一阶段总结
21
【架构师(第二十一篇)】编辑器开发之需求分析和架构设计
22
【架构师(第二十二篇)】编辑器开发之项目整体搭建
23
【架构师(第二十三篇)】编辑器开发之画布区域组件的渲染
24
【架构师(第二十四篇)】编辑器开发之添加模版到画布
25
【架构师(第二十五篇)】编辑器开发之属性编辑区域表单渲染
26
【架构师(第二十六篇)】编辑器开发之属性编辑同步渲染
27
【架构师(第二十七篇)】前端单元测试框架 Jest 基础知识入门
28
【架构师(第二十八篇)】 测试工具 Vue-Test-Utils 基础语法
29
【架构师(第二十九篇)】Vue-Test-Utils 触发事件和异步请求
30
【架构师(第三十篇)】Vue-Test-Utils 全局组件和第三方库 vuex | vue-router
31
【架构师(第三十一篇)】前端测试之 TDD 的开发方式
32
【架构师(第三十二篇)】 通用上传组件开发及测试用例
33
【架构师(第三十三篇)】 Vue 中的实例及本地图片预览
34
【架构师(第三十四篇)】 业务组件库开发之 vue3 的插件系统
35
【架构师(第三十五篇)】 业务组件库开发之使用 Rollup 进行打包
36
【架构师(第三十六篇)】 业务组件库开发之发布到 NPM
37
【架构师(第三十七篇)】 服务端开发之后端框架与数据库技术选型
38
【架构师(第三十八篇)】 服务端开发之本地安装最新版 MySQL 数据库
39
【架构师(第三十九篇)】 服务端开发之连接 MySQL 数据库
40
【架构师(第四十篇)】 服务端开发之连接 Mongodb 数据库
41
【架构师(第四十一篇)】 服务端开发之安装并连接 Redis数据库
42
【架构师(第四十二篇)】 服务端开发之常用的登录鉴权方式
43
【架构师(第四十三篇)】 服务端开发之单元测试和接口测试
44
【架构师(第四十四篇)】 服务端开发之 pm2 和 nginx 介绍
45
【架构师(第四十五篇)】 服务端开发之认识 Github actions
46
【架构师(第四十六篇)】 服务端开发之安装 Docker
47
【架构师(第四十七篇)】 服务端开发之认识 Docker
48
【架构师(第四十八篇)】 服务端开发之 Dockerfile
49
【架构师(第四十九篇)】 服务端开发之认识 Docker-compose
50
【架构师(第五十篇)】 服务端开发之自动发布到测试机
清单首页架构文章详情

【架构师(第三十五篇)】 业务组件库开发之使用 Rollup 进行打包


打包工具简介与对比

Webpack

大型 SPA 项目的模块化构建,也就是常说的 web 应用。

  • 通过各种 loader 处理各种各样的静态资源
  • 通过各种插件 plugins 对整体文件进行一些处理
  • Code splitting 将公共模块进行提取
  • 提供一个 webpack-dev-server ,进行本地开发
  • 支持 HMR 模块热替换

Rollup

Rollup 设计之初就是面向 ES Module 的,构建出结构扁平,性能出众的类库。

ES Module 的规则

  • import 只能作为模块顶层的语句出现,不能出现在 function 里或者 if 里。
  • import 的模块名只能是字符串常量。
  • 不管 import 的语句位置出现在哪里,在模块初始化的时候,所有的 import 都必须导入完成。

使用工具静态分析的过程

  • Tree shaking ,摇树,让死了的叶子掉下来。
  • 目的就是将 ES Module 打包生成特定的 JS 模块文件,并最大程度的减小体积。

Webpack VS Rollup

通过以上的对比可以得出,构建App应用时,webpack 比较合适,如果是类库(纯js项目),rollup 更加合适。

Webpack 的优势

  • 强大的生态插件
  • 面向开发应用的特性支持 HMR,按需加载,公共模块提取。
  • 简化 web 开发的环节,图片自动转 base64,资源的缓存(添加 chunkID)。

Rollup 的优势

  • 构建高性能的模块文件,这正是类库所需要的。
  • 编译出来的代码可读性好,内容更小,执行效率更高。
  • 配置简单。

SnowPack

开发环境

  • 利用新版本浏览器支持 ES Module 的特性。
  • 不会被打包。
  • 每个文件编译一次,永久被缓存。
  • 当一个文件修改的时候,只需要重新 build 那一个文件。

处理 node_modules 中的模块

  • 扫描 node_modules 中的模块,找到使用的模块。
  • 将每个模块都分别转换成单个的 js 文件。
  • 这些文件都是 esm 模块,可以被最新的浏览器直接使用。

为生产环境 build 代码

  • 默认情况下,和开发环境生成的代码几乎是一致的。
  • 提供了插件,生成 bundle,全浏览器兼容的代码。

打包什么类型的模块

  • 首要格式:ES Module,并且提供支持 typescripttype 文件。
  • 备选方案:UMD

Rollup 配置文件和插件

rollup.config.js

默认的配置文件

代码语言:javascript
复制
// 打包 vue 文件
import vue from 'rollup-plugin-vue'
// 打包 css
import css from 'rollup-plugin-css-only'
// 打包 ts 文件
import ts from 'rollup-plugin-typescript2'
// 打包依赖
import { nodeResolve } from '@rollup/plugin-node-resolve'
// 文件名称
import { name } from './package.json'

// 文件
const file = type => `dist/${name}.${type}.js`

export { name, file }

// 开启 ts 的类型声明文件打包
const overrides = {
  compilerOptions: {
    declaration: true
  },
  exclude: ['src/main.ts', 'node_modules', 'src/App.vue']
}

export default {
  input: "src/index.ts",
  output: {
    name,
    file: file('esm'),
    format: "es"
  },
  plugins: [
    nodeResolve(),
    vue(),
    css({ output: 'bundle.css' }),
    ts({ tsconfigOverride: overrides })
  ],
  // 排除需要打包的第三方库
  // external: (id) => {
  //   return /^vue/.test(id)
  // }
  external: ['vue', 'lodash-es']
}

rollup.umd.config.js

生成 umd 规范的组件库

代码语言:javascript
复制
import baseConfig, { file } from './rollup.config'

export default {
  ...baseConfig,
  output: {
    name: 'LegoComponents',
    file: file('umd'),
    format: 'umd',
    // 第三方库的全局变量名称
    globals: {
      'vue': "Vue",
      'lodash-es': '_'
    },
    // 组件库的全局变量名称
    exports: 'named'
  },
}

rollup.esm.config.js

生成 esm 规范的组件库

代码语言:javascript
复制
import baseConfig, { name, file } from './rollup.config'

export default {
  ...baseConfig,
  output: {
    name,
    file: file('esm'),
    format: 'es'
  }
}

package.json

package.json 内容

  • 新建 buildbuild:esmbuild:umd 命令
  • peerDependencies 用于第三方库,前置依赖,本地不安装
  • 可以添加到 devDependencies,来进行本地安装
代码语言:javascript
复制
{
  "name": "lego-component",
  "version": "1.0.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "npm run clean && npm run build:esm && npm run build:umd",
    "lint": "vue-cli-service lint",
    "build:esm": "rollup --config rollup.esm.config.js",
    "build:umd": "rollup --config rollup.umd.config.js",
    "clean": "rimraf ./dist"
  },
  "peerDependencies": {
    "vue": "^3.2.37"
  },
  "dependencies": {
    "ant-design-vue": "^3.2.6",
    "core-js": "^3.6.5",
    "lodash-es": "^4.17.21"
  },
  "devDependencies": {
    "vue": "^3.2.37"
  }
}
下一篇
举报
领券