赞
踩
目录
在我们很多开发过程中,不管是使用vue还是react,我都会导入第三方组件,比如我们最常用的element-ui/plus、antd、echarts…像这些已经封装好的组件可以在项目的任意地方使用,我们也会从npm仓库下载下来。但是由于一些公司/项目又有这些组件不适应的功能,从而我们又会自定义组件,在一些别的项目中遇到类似的功能,我们又会把封装好的组件复制到新的项目里,其实在这个过程中我们已经开始慢慢有构架的思想了,其实,我们可以将这些组件上传到npm仓库,要是在别的项目中有用到,直接再从npm安装使用即可。接下来小编就给大家详细说一下流程,跟着做即可(不管使用的是js还是ts,原理是类似的)。
npm init vue@latest
(vue3项目创建,详细看小编下的该文章:)
( node管理看小编下的该文章:)
- npm install // 初始化项目
- yarn run dev // 运行项目
在根目录下新建一个packages文件夹,文件夹下的分别是components和index.js。packages的主要作用就是放我们的公共组件,后续导出的,index.js是批量导出组件的。
- <script setup>
- defineOptions({ // vue3定义的一些配置项(vue3项目的组件名一般是根据文件名走的)
- name: 'w-icon'
- })
-
- const props = defineProps({ // 接受传参
- className: { // 传参的类名
- type: String
- }
- })
- </script>
-
- <template>
- <i class="icon iconfont" :class="`icon-a-${props.className}`"></i> // 封装的内容,将参数拼接
- </template>
-
- <style scoped> // 样式
- i {
- font-size: 100px;
- }
- </style>
注意:有不清楚的看vue3的官方文档
这种用法小编就不详细说了:找图标放到自己创建的项目中,然后在自己的项目中导入
index.html文件下:
<link rel="stylesheet" href="//at.alicdn.com/t/c/font_4613448_g8pczuzf37.css">
- import { defineAsyncComponent } from 'vue'
-
- const components = import.meta.glob('./components/*.vue')
- const registerGlobalComponent = (app) => {
- for (const [key, value] of Object.entries(components)) {
- const name = key.slice(key.lastIndexOf('/') + 1, key.lastIndexOf('.'))
- app.component(name, defineAsyncComponent(value))
- }
- }
-
- export default registerGlobalComponent
-- 注意:这里一定要以export default registerGlobalComponent的形式暴露出函数,否则在后续打包上传到npm后,使用会报错
批量注册组件可以看小编下的该文章:
vue:vue2与vue3如何全局注册公共组件(包括涉及到的相关方法函数的讲解)_vue2 vue3全局组件的使用-CSDN博客
(自此,我们的icon组件初步封装并注册成功)
- import registerGlobalComponent from '../packages/index'
-
- registerGlobalComponent(app)
<w-icon className="070_bangong" /> // 公共组件,直接使用即可,根据自己封装的内容传参数
注意用法:
说明封装没有问题!!
-- 在vite.config.js文件中添加改配置项:(该配置是yarn build时输出的信息)
- build: {
- outDir: 'npm_components', // 指定构建结果的输出目录
- target: 'es2015', // 指定要构建的目标环境,可以是某个浏览器的版本,或者是Node.js的版本
- minify: 'esbuild', // 是否为代码开启压缩
- cssTarget: 'chrome80',
- chunkSizeWarningLimit: 2000, // 设置大块大小(以字节为单位)的警告限制
- emptyOutDir: true, // 在构建前是否清空outDir目录
- rollupOptions: { // 修改内部Rollup配置
- // 请确保外部化那些你的库中不需要的依赖
- external: ['vue'],
- output: {
- // 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量
- globals: {
- vue: 'Vue',
- },
- },
- },
- lib: {
- entry: './packages/index.js', // 入口文件,可以是相对于项目根目录的路径
- name: 'npm_components', // 设置库的名称
- }
- }
npm config set registry=https://registry.npmjs.org
查看是否设置成功:
npm config get registry
npm adduser
跳转到该页面,输入邮箱的code即可
- "name": "npm_component_test", // 输出npm包名, 在npm中必须唯一
- "version": "1.0.0", // 版本号,如果需要再次输出,只需要版本号+1即可
- "private": false, // 设置为false,否则会打包错误
- "description": "这是一个icon的测试组件……", // 包的描述
- "type": "module", // 在 node 支持 ES 模块后,要求 ES 模块采用 .mjs 后缀文件名。只要遇到 .mjs 文件,就认为它是 ES 模块。如果不想修改文件后缀,就可以在 package.json文件中,指定 type 字段为 module。
- // 以下文件配置根据自己yanr buid打包的内容配置
- "main": "npm_components/npm_component_test.js", // 指定加载的入口文件
- "module": "npm_components/npm_component_test.umd.cjs", // 指定 ES 模块的入口文件
- "files": [ // 指定需要跟随一起发布的内容文件
- "npm_components/*.js",
- "npm_components/*.css",
- "npm_components/*.cjs",
- ],
npm publish --access=public
(当报如下错时一般是npm包重名了 )
修改以下name即可:
打npm包成功:
npm可以查看到:
npm install npm_component_test_1
- // 导入npm_component_test_1插件
- import A from 'npm_component_test_1' // 命名注意规范,小编偷懒
- import 'npm_component_test_1/npm_components/style.css' // 样式也要导入
-
- app.use(A)
由于使用的时icon,index.html需要导入小图标文件:
<link rel="stylesheet" href="//at.alicdn.com/t/c/font_4613448_g8pczuzf37.css">
- <script setup>
- </script>
-
- <template>
- <main>
- <w-icon className="070_anquan" />
- </main>
- </template>
展示如下:
到这里我们的组件就封装好了,并且可以直接从npm仓库下载使用!!!
以上也是小编的源码,如果大家先体验的化也可以直接使用上面的代码,为了方便大家测试,小编这个测试组件也不会删除,可以下载体验。
补充:如果大家需要删除自己发布的npm包,使用如下指令——
- npm unpublish [package-name] --force
-
- // 例如小编的: npm unpublish npm_component_test_1 --force
最后,大家伙都看到这,一键三连加关注就给小编吧,小编会陆续更新对大家有用的文章的!!!!
若有问题,也欢迎大家评论区留言互相讨论!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。