使用 Vue3 开发前端 SDK(vue-cli 构建库)

958 阅读2分钟

1.项目背景

需求描述:

  1. 将原有的功能页面抽离,进行优化,降低耦合,大致如下图:

image.png

  1. 将页面B可以开发成独立的,可作为售卖包单独进行售卖的小小功能模块(SDK)
  2. SDK功能要求
  • 提供一个js文件,供客户放调用
  • 可以接受参数
  • 可以接受SDK内部执行之后的处理事件
  • 全局只有一个,单例模式

需求分析:

项目技术栈为vue,封装的SDK可以不依赖任何前端技术栈而运行,打破传统的 iframe 内嵌。始终维护一套代码,可以借助构建命令来构建。

需求结果:

Vue CLI内置了构建应用的功能,省去不少繁琐的配置

官方配置文档☞

2.实际操作

1.首先,package.json 文件添加命令

"lib": "vue-cli-service build --target lib --inline-vue --name vue3SDK src/Lib.js"

命令解释:

  • 1.入口文件的选择:【src/Lib.js】 vue-cli 默认是以 src/App.vue为入口,基于灵活配置,可以接受参数,处理事件,故而选择了以 js 文件为入口

  • 2.--inline-vue 命令: 构建的SDK不局限任何前端框架,所以要把 vue 运行环境 内置

  • 3.--name vue3SDK 命令: 构建的SDK的名字,自己可以修改

  • 4.--target lib 命令: 构建的目标

2.入口的 js 文件(这才是重点)

import App from '../src/App.vue'
import { createPinia } from 'pinia'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import { createApp } from 'vue'
class Vue3SDK {
  constructor(option) {
    if (!Vue3SDK.instance) {
      Vue3SDK.renderDom(option)
      Vue3SDK.instance = this
    }
    return Vue3SDK.instance
  }
  // 渲染vue
  static renderDom(option) {
    // 1.创建挂载节点
    // 2.vue挂载
    // 3.接受外部参数
    const { dom, ...restOpt } = option
    const app = createApp(App, restOpt)
    app.use(createPinia()).use(ElementPlus)
    // 传入dom节点
    // 不传入会挂载在body下
    if (dom) {
      app.mount(dom)
    } else {
      // 1.创建挂载节点
      const outer = document.createElement('div')
      outer.setAttribute('id', 'Vue3SDK')
      document.body.appendChild(outer)
      app.mount('#Vue3SDK')
    }
  }
  // 初始化
  static init(option = {}) {
    if (!this.instance) {
      this.instance = new Vue3SDK(option)
    }
    return this.instance
  }
}

export default Vue3SDK

3.vue.config.js 配置文件的修改

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  css: {
    extract: false // 是否使用css分离插件 ExtractTextPlugin
  },
  configureWebpack: {
    output: {
      libraryExport: 'default'
    }
  }
})

3.最后的效果

1.产出文件:

image.png

2.sdk 的使用方式

<!doctype html>
<meta charset="utf-8">
<title>vue3SDK demo</title>
<style>
  #App {
    text-align: center;
  }
</style>
<body>
  <div id="App"></div>
</body>
<script src="./vue3SDK.umd.js"></script>
<script>
  console.log('object :>> ', vue3SDK);
  const rootDom = document.querySelector('#App')
  const onStop = () => {
    console.log('onStop :>> ')
  }
  const onStart = () => {
    console.log('onStart :>> ')
  }
  const defaultCount = 4
  vue3SDK.init({dom: rootDom ,onStart, onStop, defaultCount })
</script>

3.大致页面

image.png

4.总结分析

  • lib是解析不了router

5.源码仓库

  1. gitee.com/xiaxn/vue3-… 如果有不足的地方,还请多包含!
  2. 感谢前辈给的思路 ☞ zhuanlan.zhihu.com/p/269129503