需求:封装一个函数要求监听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-xmsrcindex.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用法
import userResize from 'v-resize-xm';
import { onMounted } from 'vue';
// 因为这是操作DOM的 所以我们要等页面渲染完成在 onMounted 生命周期里面操作
onMounted(() => {
userResize(document.querySelector('#resize') as HTMLElement,
(e: any) => {
c服务器托管网onsole.log(e) // 获取元素长宽的变化
}
)
})
#resize {
border: 1px solid #ccc;
resize: both;
overflow: hidden;
}
自定义指令用法
在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”指令和回调函数
// import userResize from 'v-resize-xm';
import { onMounted } from 'vue';
const drag = (e: any) => {
console.log(e) // 获取元素长宽变化
}
#resize {
border: 1px solid #ccc;
resize: both;
overflow: hidden;
}
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: 【专题】国企数字化转型全面提质增效报告PDF合集分享(附原数据表)
报告链接:http://tecdat.cn/?p=32086 原文出处:拓端数据公众号 数字化转型并不只限于新技术的实施与运营,它更多的是面向未来,往往会对企业的战略、人才、商业模式乃至组织方式造成深刻影响的全方位变化。中国企业实现数字经济转型的内在动力是由外…