如何将本地组件库上传到npm上

如何把本地开发的组件发布到npm上面,我们需要去了解vue封装组件的原理,利用vue.use(plugin)这个api, 我们需要把封装好的组件打包成vue库,并提供install方法发布到npm上去,Vue.use(plugin)自动执行插件中的install方法。

我们在这里主要介绍的是怎么把已经开发好的公共组件打包发布到npm上面。首先需要我们调整下目录结构 ----> 创建打包组件的文件 ----> 把打包文件发布到npm上

目录结构

  1. 在当前项目创建一个打包文件夹packages
  2. 将每个组件的文件调整下,每个组件下定义src/index (组件内容) 以及与src同级index目录(暴露当前组件)

在这里插入图片描述

import { App } from 'vue'
import calendar from './src/index.vue'

// 让这个组件可以通过use的形式使用
export default {
  install(app: App) {
    app.component('jsq-calendar', calendar)
  }
}
  1. 在文件下packages创建index.js文件
import { App } from 'vue'
import chooseArea from './chooseArea'
import chooseIcon from './chooseIcon'
import trend from './trend'
......

const components = [
    chooseArea,
    chooseIcon,
    trend,
    ......
]
export default {
    install(app: App) {
        components.map(item => {
            app.use(item)
        })
    }
}

创建打包命令

  1. 创建build.js用来打包组件
const path = require('path')
const { defineConfig, build } = require('vite')
const vue = require('@vitejs/plugin-vue')
const vueJsx = require('@vitejs/plugin-vue-jsx')
const fxExtra = require('fs-extra')
const fs = require('fs')

// 打包入口文件夹
const entryDir = path.resolve(__dirname, '../packages')
// 出口文件夹
const outDir = path.resolve(__dirname, '../lib')

// vite基础配置
const baseConfig = defineConfig({
    configFile: false,
    publicDir: false,
    plugins: [vue(), vueJsx()]
})

// rollup配置
const rollupOptions = {
    external: ['vue', 'vue-router'],
    output: {
        globals: {
            vue: 'Vue'
        }
    }
}

// 全量打包构建
const buildAll = async () => {
    await build({
        ...baseConfig,
        build: {
            rollupOptions,
            lib: {
                entry: path.resolve(entryDir, 'index.ts'),
                name: 'jsq-element-components',
                fileName: 'jsq-element-components',
                formats: ['es', 'umd']
            },
            outDir
        }
    })
}

// 单组件打包构建
// name组件名称
const buildSingle = async (name) => {
    await build({
        ...baseConfig,
        build: {
            rollupOptions,
            lib: {
                entry: path.resolve(entryDir, name),
                name: 'index',
                fileName: 'index',
                formats: ['es', 'umd']
            },
            outDir: path.resolve(outDir, name)
        }
    })
}

// 每个组件生产package.json
const createPackageJson = (name) => {
    const fileStr = `
      {
        "name": "${name}",
        "main": "index.umd.js",
        "module": "index.es.js",
        "style": "style.css"
      }
    `
    // 输出
    fxExtra.outputFile(
        path.resolve(outDir, `${name}/package.json`),
        fileStr,
        'utf-8'
    )
}

// 打包成库
const buildLib = async () => {
    await buildAll()

    // 获取组件名称组成的数组
    const components = fs.readdirSync(entryDir).filter(name => {
        const componentDir = path.resolve(entryDir, name)
        const isDir = fs.lstatSync(componentDir).isDirectory()
        return isDir && fs.readdirSync(componentDir).includes('index.ts')
    })

    // 循环构建
    for(const name of components) {
        await buildSingle(name)
        createPackageJson(name)
    }
}
buildLib()
  1. 在package.json创建打包组件命令:“lib”: "node ./build.js”
  2. 执行命令 npm run lib
  3. 在项目文件下会生产lib文件夹,这个就是发布到npm上的文件代码
    在这里插入图片描述
  4. lib文件下执行 npm init -y 生产package.json文件
{
    "name": "jsq-element-components", // 组件名称
    "version": "1.0.0", // 版本号
    "main": "index.umd.js",
    "module": "index.mjs",
    "types": "index.d.ts",
    "author": {
        "name": "jsq"
    },
    "keywords": [
        "ts",
        "封装组件",
        "vue-componets"
    ]
}

npm官网注册

  1. npm官网
  2. 注册账号
    在这里插入图片描述

代码发布到npm上

  1. cd 到当前lib文件下
cd lib 
  1. 先查看 npm 的 registry
npm config get registry
  1. 设置 npm 的 registry 为官方源
npm config set registry https://registry.npmjs.org
  1. 执行命令 npm login 登录到 npm
npm login
  1. 执行命令 npm publish 发布到 npm
npm publish
  1. 登录npm官网 点击packages 查看上传的代码
    在这里插入图片描述

项目使用

  1. npm install 项目文件名称
npm install jsq-element-components
  1. 在项目入口文件引入组件
import App from './App.vue'	
// 组件
import jsqUI from 'jsq-element-components'
// 组件样式
import 'jsq-element-components/style.css'

const app = createApp(App)
app.use(jsqUI)

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现将本地图片以base64格式上传到后端,可以使用以下步骤: 1. 在Vue项目中安装mavon-editor插件,可以使用npm进行安装:`npm install mavon-editor --save` 2. 在需要使用编辑器的Vue组件中引入mavon-editor并注册组件: ```vue <template> <mavon-editor v-model="content" @imgAdd="handleImgAdd"></mavon-editor> </template> <script> import 'mavon-editor/dist/css/index.css' import MavonEditor from 'mavon-editor' export default { components: { MavonEditor }, data() { return { content: '' } }, methods: { handleImgAdd(data) { // 处理图片上传 } } } </script> ``` 3. 在handleImgAdd方法中,可以使用FormData对象将base64格式的图片数据上传到后端,代码如下: ```javascript handleImgAdd(data) { const file = data.file const reader = new FileReader() const vm = this reader.readAsDataURL(file) reader.onload = function() { const formData = new FormData() formData.append('image', this.result) axios.post('/upload-image', formData).then(response => { vm.content += '<img src="' + response.data.url + '">' }) } } ``` 上述代码中,我们使用FileReader对象将文件读取为base64格式,然后创建FormData对象,将base64数据作为参数添加到formData中。最后,使用axios库的post方法将formData发送到后端。当上传成功后,我们将回调函数中的response.data.url作为图片的src属性,插入到编辑器中。 4. 在后端接收base64格式的图片数据,并将其转换为文件保存到服务器,最后返回图片的URL地址。这一部分需要根据后端框架和语言进行实现,这里不做过多介绍。 以上就是使用mavon-editor将本地图片以base64格式上传到后端并回显的步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值