Vue3封装自定义指令和hooks,并发布npm包

需求:封装一个函数要求监听DOM的宽高变化,并且支持自定义指令和hooks两种用法。

第一步:创建项目文件夹v-resize-xm

1.在v-resize-xm文件夹里面创建src文件夹

执行 pnpm init 命令 生成一个package.json文件

2.安装一下ts

sudo npm install -g typescript

3.执行 tsc --init生成一个 tsconfig.json 文件

4.在v-resize-xm文件夹下新建一个vite.config.ts文件

5.在v-resize-xm文件夹下新建一个index.d.ts声明文件

6.安装vue, 执行 pnpm install vue@3.2.47 -D (因为最终使用这个插件的用户他本地有vue)

7.安装vite, 执行 pnpm install vite@4.2.1 -D   (因为最终使用这个插件的用户他本地有vite)

编写v-resize-xm\src\index.ts业务文件

import type { App } from 'vue';
// 侦听元素宽高的变化
// Hooks
function useResize (el:HTMLElement, callback:Function) {
    let resize = new ResizeObserver((entries) => {
        // entries 是数组, 默认监听多个
        callback(entries[0].contentRect); // 将框高回传回去
    })
    resize.observe(el)
}

let app = createApp(); // 创建一个app出来

// vue插件使用如
// app.use(router).use(xxx); // 等
// 这个use实际上就是调用了底层的一个install方法
// vue插件就是要去实现install函数, 他就要就调用, 并且将这个app注入进去, 它的类型就是vue里面引入的App

// 自定义指令
const install = (app:App) => { // 最终给app提供一个install方法
    // 拿到这个app之后就可以去创建directive指令了
    app.directive('resize', {
        // 第一个参数是html元素, 第二个参数是binding对象,这个对象可以要求它传入一个函数
        mounted(el, binding) {
            // 刚好复用一下useResize
            // 指令的挂载
            useResize(el, binding.value);
        }
    })
}
// 将 install 注册到函数上面
useResize.install = install;

export default useResize;

第二步:在vite.config.ts里面配置一些打包的库

import { defineConfig } from 'vite';
// umd 支持amd cmd cjs 全局变量模式
export default defineConfig({
    // 开发vue3库模式文档 https://cn.vitejs.dev/guide/build.html#library-mode
    build:{
        lib:{
            entry:'./src/index.ts', // 入口
            name: 'useResize' // name和hooks名称一样就可以了
        },
        // 透传一些属性给rollup
        rollupOptions:{
            // 因为这是vue插件,用户本地已经有Vue环境了,此处Vue没必要打到包里面
            external:['vue'],
            output:{
                globals:{
                    useResize: 'useResize' // 提供一个全局变量给umd库用
                }
            }
        }
    }
})

第三步: 在package.json里面配置一些命令

"build": "vite build"

{
  "name": "v-resize-xm",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "vite build"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "vue": "3.2.47"
  }
}

执行npm run build构建dist包

我们看到dist目录打出来两个文件

v-resize-xm.mjs ES模式

v-resize-xm.umd.js 其他模式

第四步:编写ts声明文件 index.d.ts

declare const useResize: {
    (el: HTMLElement, callback: Function): void;
    install: (app:  App) => void;
};

export default useResize;

第五步:发布npm包

1.配置package.json的main属性,这个main一般就是require对应的目录

"main": "dist/v-resize-xm.umd.js",  umd它是支持commonJs规范的

2.配置package.json的module属性,这个module就是支持ES6的import引入

"module": "dist/v-resize-xm.mjs",

3.配置package.json的files数组属性

这里表示发往npm的目录,我们将dist目录和声明文件发上去

"files": [ "dist", "index.d.ts"],

4.修正版本号

"version": "1.0.1",

{
  "name": "v-resize-xm",
  "version": "1.0.0",
  "description": "",
  "main": "dist/v-resize-xm.umd.js",
  "module": "dist/v-resize-xm.mjs",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "vite build"
  },
  "keywords": [],
  "author": "",
  "files": [ "dist", "index.d.ts"],
  "license": "ISC",
  "devDependencies": {
    "vue": "3.2.47"
  }
}

5.  注册npm账号

npm注册地址

6.执行 npm adduser 命令添加npm账号

7.执行 npm login  命令登录

8.执行 npm publish 命令发布

9. 到npm官网搜索查看

第六步:测试使用发布的库

1.  在vue3 项目环境下执行 pnpm install 库名称 -S

Hooks用法

<template>
  <div id="resize">
    <img id="img" width="300" height="300" src="./assets/1.png">
  </div>
</template>
<script setup lang="ts">
import userResize from 'v-resize-xm';
import { onMounted } from 'vue';
// 因为这是操作DOM的 所以我们要等页面渲染完成在 onMounted 生命周期里面操作
onMounted(() => {
  userResize(document.querySelector('#resize') as HTMLElement,
    (e: any) => {
      console.log(e) // 获取元素长宽的变化
    }
  )
})
</script>
<style scoped>
#resize {
  border: 1px solid #ccc;
  resize: both;
  overflow: hidden;
}
</style>

自定义指令用法

在main.ts中引入并注册指令

import './assets/main.css'

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
import router from './router'

import useResize from 'v-resize-xm'; // 1、引入我们发布的指令插件

const app = createApp(App)

app.use(createPinia())
app.use(router)
app.use(useResize) // 2、注册指令
app.mount('#app')

在页面中使用v-resize="drag"指令和回调函数

<template>
  <div v-resize="drag" id="resize">
    <img id="img" width="300" height="300" src="./assets/1.png">
  </div>
</template>
<script setup lang="ts">
// import userResize from 'v-resize-xm';
import { onMounted } from 'vue';
const drag = (e: any) => {
  console.log(e) // 获取元素长宽变化
}
</script>
<style scoped>
#resize {
  border: 1px solid #ccc;
  resize: both;
  overflow: hidden;
}
</style>
  • 14
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue是一种用于构建用户界面的渐进式JavaScript框架,它可以通过封装组件来实现可复用、模块化以及易于维护的代码。下面我将介绍如何对Vue组件进行封装,并将其打发布npm上供他人使用。 首先,我们需要创建一个Vue项目,并在项目中使用Vue CLI来进行组件的开发和构建。可以通过以下命令创建一个新的Vue项目: ``` vue create my-component ``` 接下来,您可以通过Vue CLI支持的任何方式(如单文件组件、JavaScript脚本等)创建自定义组件。在组件的开发过程中,可以利用Vue提供的各种功能和特性,比如计算属性、生命周期钩子函数、模板语法等。确保你的组件功能完备、可复用且易于理解。 完成组件的开发后,我们需要将其打成可用的npmVue CLI可以帮助我们自动进行打,只需执行以下命令: ``` npm run build ``` 该命令将生成一个dist文件夹,其中含了打后的组件代码。 接下来,我们需要在项目的根目录中创建一个package.json文件,用于描述我们的npm,并设置一些配置信息。其中,name字段用于定义npm的名称,version字段用于定义npm的版本号。其他字段根据您的需要进行设置。然后,执行以下命令将package.json文件拷贝到dist文件夹中: ``` cp package.json dist/ ``` 然后,我们需要登录到npm官方网站,并创建一个账户。接着,使用以下命令进行登录: ``` npm login ``` 在登录成功后,使用以下命令发布npm: ``` npm publish dist/ ``` 完成上述步骤后,您的自定义Vue组件就已经发布到了npm上。其他开发者可以通过以下命令安装并使用您的组件: ``` npm install your-component ``` 然后,在他们的Vue项目中,可以通过import语句引入您的组件,并在模板中使用它。 至此,我们已经学习了如何封装定义Vue组件,并通过npm发布,供他人使用。希望这能帮助到您!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值