vite打包lib库
背景
与上一篇文章原因一样,公司内部开发的私有包,统一管理等原因,此篇文章介绍使用vite打包lib库。
什么是lib库
LIB是静态链接库
lib应该说是一个程序集, 只是把一些相应的函数总结在一起, 如果调用lib中的函数,在工程编译时,这些调用的函数都将参加编译.
从内存管理的角度来看,lib必须被链接到主程序中,主程序进入内存,lib也同时进入内存
举个例子:an-design不是lib库,它只是一个基于vue或者react的一个组件ui组件库,vue和react是框架,而jquery就算是一个lib库,它集成了多种函数,可以用于用于基于js的各种平台上(只要你不闲它又慢又大~)。
为什么使用vite
官网说了很多,比如:浏览器开始原生支持 ES 模块,且越来越多 JavaScript 工具使用编译型语言编写。在我这很简单,因为我只调通了这一种。。。。
工具
安装
你可以使用vite官网推荐的搭建vite 我们目前准备使用vue3框架来写架构以及组件,所以可以使用vue3的官方推荐的 命令行工具 (CLI)
$ yarn create vite <project-name> --template vue
$ cd <project-name>
$ yarn
$ yarn dev
vue-cli 自带的是 webpack 的打包方式,打出的包体积有点大,而 vite 自带的是 rollup 的打包方式,这种方式打包的体积就非常小,官网也有一些使用说明,所以学会之后还是比较很方便的。
vite 的库项目可以分为两类:(我自己分的)
- 一个是纯js的项目,不带HTML;
- 一个是可以带上HTML(模板)的项目,比如UI库。
下面分别介绍一下编写和打包方式,其实大同小异。
纯js的库项目
export function is(val, type) {
return toString.call(val) === `[object ${type}]`
}
export function isDef(val) {
return typeof val !== 'undefined'
}
export function isUnDef(val) {
return !isDef(val)
}
export function isObject(val) {
return val !== null && is(val, 'Object')
}
代码比较简单,只需要将你想要打包的方法和函数export就可以了
想要打包的话,只能有一个出口文件,所以内部的代码结构要设置好。
带HTML的库项目
与纯js方式一样,将需要导出的组件export就可以了 首先创建一个自定义的测试组件文件夹 我们就起名 packages 好了 然后建立 testA、testB、testC等组件, 目录结构如下:\
- index.less作为所有组件的样式入口
- index.ts为所有组件的入口
TextA.vue:
<template>
<div>123</div>
</template>
<script setup>
</script>
<style scoped>
</style>
textA/index.ts:
import TestA from './src/TestA.vue';
export {
TestA
}
packages/index.ts:
import type {App} from "vue";
import {TestA} from "./testA";
import './index.less';
const components: any[] = [TestC, TestA, TestB];
const install = (app: App) => {
components.forEach(component => app.component((component.name, component)))
}
export {TestA}
export default {
install,
...components
}
设置vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
// https://vitejs.dev/config/
export default defineConfig({
// 打包配置
build: {
lib: {
entry: 'src/packages/index.ts', // 设置入口文件
name: 'vite-lib', // 起个名字,安装、引入用
fileName: (format) => `vite-lib.${format}.js` // 打包后的文件名
},
sourcemap: true, // 输出.map文件
rollupOptions: {
// 确保外部化处理那些你不想打包进库的依赖
external: ['vue', 'ant-design-vue'],
output: {
// 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量
globals: {
vue: 'Vue',
'ant-design-vue': 'ant-design-vue'
}
}
}
},
plugins: [vue()],
css: {
preprocessorOptions: {
less: {
javascriptEnabled: true,
additionalData: '@import "./src/packages/index.less";',
}
}
}
})
- entry:指定要打包的入口文件。
- name:包的名称
- fileName:包文件的名称,默认是umd和es两个文件。
- sourcemap:是否生成 .map 文件,默认是不会生成的,如果需要的话需要设置为 true。
- rollupOptions:如果项目引用了第三方插件,那么需要在这里设置排除,如果不设置的话,第三方插件的源码也会被打包进来,这样打包文件就变大了。排除之后第三方的插件会单独存在。
- css: 引入公共样式
打包
yarn bulid
打出来的文件目录是:
vite 会按照这里的设置进行打包,打包分为两种模式:
- umd:打包后代码很紧凑、体积小,但是不易读;
- es:打包后的代码和我们写的代码很像,易读,但是体积大。 \
- js.map: 调试代码
如何使用lib包
与组件库一样,直接将你导出的testA组件直接导入到组件中,当做组件使用即可:
<template>
<div>
<TestA></TestA>
</div>
</template>
<script setup>
import { ref } from 'vue'
import {TestA} from '../../dist/vite-lib.es'
// import {TestA} from '../../dist/vite-lib.umd' // 二者皆可
const count = ref(0)
</script>
<style scoped>
a {
color: #42b983;
}
</style>
页面效果:
发布
创建package.json文件
{
"name": "vite-lib", // lib包的名字 // 必须
"version": "0.0.4", // 版本号 // 必须
"description": "JavaScript 的小工具,验证 JavaScript 的数据类型,输出调试信息等。", //描述
"main": "./dist/vite-lib.umd.js", // 入口文件地址
"module": "./dist/vite-lib.es.js", // 入口文件地址
"exports": {
".": {
"import": "./dist/vite-lib.es.js",
"require": "./dist/vite-lib.umd.js"
}
},
"private": false,
"dependencies": { // 依赖
"ant-design-vue": "^2.2.8",
"vue": "^3.2.16"
},
"devDependencies": { "
@vitejs/plugin-vue": "^1.9.3",
"vite": "^2.6.4"
}
}
根据上章内容,在dist文件下,直接进行publish:
npm publish
使用
当做普通组件一样调用:
yarn add vite-lib
\
HelloWorld.vue:
<template>
<div>
<TestA></TestA>
</div>
</template>
<script setup>
import { ref } from 'vue'
import {TestA} from 'vite-lib'
const count = ref(0)
</script>
<style scoped>
</style>
因为vit-lib基于ant-design-vue, 所以我们本地也要下载依赖引入进去才可使用
第一次写文章 文笔不好 尽请见谅。