前端工程化 搭建私有组件库 组件从开发到发布私有npm仓库的全过程

news2024/11/17 15:57:18

前言
基于Vue3.0 + TS的组件从开发组件库到发布私有npm仓库的全过程

环境
这里列出本文所使用的环境版本

vue 3.0

vue/cli 4.5.9

nodeJs 14.15.1

npm 6.14.8

vue --version
@vue/cli 4.5.9

npm -v
6.14.8

node -v
v14.15.1
步骤

  1. 创建项目
    使用 vue-cli 创建一个 vue3 项目,假设项目名为 avatar-ui-vue

vue create avatar-ui-vue

选择自定义Manually select features,回车进入下一步

选中Choose Vue version、Babel 、TypeScript、 CSS Pre-processors 这4项,回车进入下一步

Choose a version of Vue.js that you want to start the project with 选择 3.x (Preview)
Use class-style component syntax? 输入n
Use Babel alongside TypeScript (required for modern mode, auto-detected polyfills, transpiling JSX)? 输入y
Pick a CSS pre-processor (PostCSS, Autoprefixer and CSS Modules are supported by default) 选择 Sass/SCSS (with dart-sass)
Where do you prefer placing config for Babel, ESLint, etc.? 选择 In dedicated config files
Save this as a preset for future projects? 输入y,回车后输入模板名保存模板

最后回车,等待项目创建完成

创建完成,目录结构如图

  1. 规划目录
    ├─ build // 编辑打包脚本目录,用于存放脚本文件
    │ ├─ rollup.config.js
    ├─ docs // 文档目录,用于生成 vuepress 文档页面
    │ ├─ .vuepress
    │ ├─ guide
    │ ├─ README.md
    ├─ examples // 原 src 目录,改成 examples 用于示例展示
    │ ├─ App.vue
    │ ├─ main.ts
    ├─ packages // 新增 packages 目录,用于编写存放组件,如button
    │ ├─ button
    │ ├─ index.ts
    ├─ typings // 新增 typings 目录,用于存放 .d.ts 文件,把shims-vue.d.ts移到这里
    │ ├─ shims-vue.d.ts
    ├─ .npmignore // 新增 .npmignore 配置文件
    ├─ vue.config.js // 新增 vue.config.js 配置文件

将 src 目录改为 examples ,并将里面的 assets 和 components 目录删除,移除 App.vue 里的组件引用。

调整后的目录结构如图

  1. 项目配置
    3.1 vue.config.js

新增 vue.config.js 配置文件,适配重新规划后的项目目录

const path = require(‘path’)

module.exports = {
// 修改 pages 入口
pages: {
index: {
entry: “examples/main.ts”, //入口
template: “public/index.html”, //模板
filename: “index.html” //输出文件
}
},
// 扩展 webpack 配置
chainWebpack: (config) => {
// 新增一个 ~ 指向 packages 目录, 方便示例代码中使用
config.resolve.alias
.set(‘~’, path.resolve(‘packages’))
}
}

3.2 .npmignore

新增 .npmignore 配置文件,组件发布到 npm 中,只有编译后的发布目录(例如lib)、package.json、README.md才是需要被发布的,所以我们需要设置忽略目录和文件

忽略目录

.idea
.vscode
build/
docs/
examples/
packages/
public/
node_modules/
typings/

忽略指定文件

babel.config.js
tsconfig.json
tslint.json
vue.config.js
.gitignore
.browserslistrc
*.map

3.3 tsconfig.json

修改 tsconfig.json 中 paths 的路径

"paths": {
  "@/*": [
    "src/*"
  ]
}

改为

"paths": {
  "~/*": [
    "packages/*"
  ]
}

修改 include 的路径

“include”: [
“src//*.ts",
"src/
/.tsx",
"src/**/
.vue”,
“tests//*.ts",
"tests/
/*.tsx”
]
改为

“include”: [
“examples//*.ts",
"examples/
/.tsx",
"examples/**/
.vue”,
“packages//*.ts",
"packages/
/.tsx",
"packages/**/
.vue”,
“typings//*.ts",
"tests/
/.ts",
"tests/**/
.tsx”
]
3.4 package.json

修改 package.json 中发布到 npm 的字段

name:包名,该名字是唯一的。可在 npm 官网搜索名字,如果存在则需换个名字。

version:版本号,每次发布至 npm 需要修改版本号,不能和历史版本号相同。

description:描述。

main:入口文件,该字段需指向我们最终编译后的包文件。

typings:types文件,TS组件需要。

keyword:关键字,以空格分离希望用户最终搜索的词。

author:作者信息

private:是否私有,需要修改为 false 才能发布到 npm

license: 开源协议

参考设置:

{
“name”: “avatar-ui-vue”,
“version”: “0.1.0”,
“private”: false,
“description”: “基于vue3+vant的前端组件库”,
“main”: “lib/index.min.js”,
“module”: “lib/index.esm.js”,
“typings”: “lib/index.d.ts”,
“keyword”: “vue3 vant”,
“license”: “MIT”,
“author”: {
“name”: “yourname”,
“email”: “youremail@126.com”
}
}

在 package.json 的 scripts 新增编译和发布的命令

“scripts”: {
“build”: “yarn build:clean && yarn build:lib && yarn build:esm-bundle && rimraf lib/demo.html”,
“build:clean”: “rimraf lib”,
“build:lib”: “vue-cli-service build --target lib --name index --dest lib packages/index.ts”,
“build:esm-bundle”: “rollup --config ./build/rollup.config.js”
}
其中 build:lib 是利用 vue-cli 进行 umd 方式打包,build:esm-bundle 是利用 rollup 进行 es 方式打包,具体参数解析如下:

–target: 构建目标,默认为应用模式。改为 lib 启用库模式。

–name: 输出文件名

–dest : 输出目录,默认 dist。改成 lib

[entry]: 入口文件路径,默认为 src/App.vue。这里我们指定编译 packages/ 组件库目录。

以下是完整package.json参考示例

{
“name”: “avatar-ui-vue”,
“version”: “0.1.0”,
“private”: false,
“description”: “基于vue3+vant的前端组件库”,
“main”: “lib/index.min.js”,
“module”: “lib/index.esm.js”,
“typings”: “lib/index.d.ts”,
“keyword”: “vue3 vant”,
“license”: “MIT”,
“author”: {
“name”: “zh”,
“email”: “”
},
“scripts”: {
“serve”: “vue-cli-service serve”,
“docs:dev”: “vuepress dev docs”,
“docs:build”: “vuepress build docs”,
“build”: “yarn build:clean && yarn build:lib && yarn build:esm-bundle && rimraf lib/demo.html”,
“build:clean”: “rimraf lib”,
“build:lib”: “vue-cli-service build --target lib --name index --dest lib packages/index.ts”,
“build:esm-bundle”: “rollup --config ./build/rollup.config.js”
},
“dependencies”: {
“core-js”: “^3.6.5”,
“vue”: “^3.0.0”
},
“devDependencies”: {
“@rollup/plugin-node-resolve”: “^13.0.5”,
“@vue/cli-plugin-babel”: “~4.5.0”,
“@vue/cli-plugin-typescript”: “~4.5.0”,
“@vue/cli-service”: “~4.5.0”,
“@vue/compiler-sfc”: “^3.0.0”,
“rollup”: “^2.58.0”,
“rollup-plugin-terser”: “^7.0.2”,
“rollup-plugin-typescript2”: “^0.30.0”,
“rollup-plugin-vue”: “^6.0.0”,
“sass”: “^1.26.5”,
“sass-loader”: “^8.0.2”,
“typescript”: “~4.1.5”
}
}

3.5 rollup.config.js

新增 rollup.config.js,rollup 打包脚本

// import vue from ‘rollup-plugin-vue’
import { nodeResolve } from ‘@rollup/plugin-node-resolve’
import path from ‘path’
// import commonjs from ‘@rollup/plugin-commonjs’
import { terser } from ‘rollup-plugin-terser’
import typescript from ‘rollup-plugin-typescript2’
import pkg from ‘…/package.json’
const deps = Object.keys(pkg.dependencies)
// eslint-disable-next-line @typescript-eslint/no-var-requires
const vue = require(‘rollup-plugin-vue’)

export default [
{
input: path.resolve(__dirname, ‘…/packages/index.ts’),
output: [
{
format: ‘es’,
file: pkg.module,
}
],
plugins: [
terser(),
nodeResolve(),
// commonjs(),
vue({
target: ‘browser’,
css: false,
exposeFilename: false,
}),
typescript({
tsconfigOverride: {
compilerOptions: {
declaration: true,
},
‘include’: [
‘packages//*',
‘typings/shims-vue.d.ts’,
],
‘exclude’: [
‘node_modules’,
'packages/
/tests/*’,
],
},
abortOnError: false,
}),
],
external(id) {
return /^vue/.test(id)
|| deps.some(k => new RegExp(‘^’ + k).test(id))
},
},
]

  1. 开发组件
    下面以Button组件作为开发示例,在 packages 目录下新建 index.ts 文件和 button 文件夹,在 button 下新建 index.ts 和 src/button.vue,结构如图

button.vue

button/index.ts,单独组件的入口文件,在其他项目可以使用 import { xxx } from ‘nandit-vue-vant’ 方式进行单个组件引用

import { App } from ‘vue’
import Button from ‘./src/button.vue’

// 定义 install 方法, App 作为参数
Button.install = (app: App): void => {
app.component(Button.name, Button)
}

export default Button
index.ts 作为组件库的入口文件,可以在其他项目的 main.ts 引入整个组件库,内容如下

import { App } from ‘vue’
import NdButton from ‘./button’

// 所有组件列表
const components = [ NdButton ]

// 定义 install 方法, App 作为参数
const install = (app: App): void => {
// 遍历注册所有组件
components.map((component) => app.component(component.name, component))
}

export {
NdButton
}

export default {
install
}

这样,我们就完成一个简单的 button 组件,后续需要扩展其他组件,按照 button 的结构进行开发,并且在 index.ts 文件中 components 组件列表添加即可。

  1. 编写示例
    组件开发完成后,我们本地先测试一下,没有问题再发布到 npm 仓库。在示例入口 main.ts 引用我们的组件库

import { createApp } from ‘vue’
import App from ‘./App.vue’
import NanditVue from ‘~/index’ // 这里 ~ 就是在 tsconfig.json 以及 vue.config.js 配置的 packages 路径

const app = createApp(App)
app.use(NanditVue)
app.mount(‘#app’)
App.vue 删除项目初始化的 HelloWorld 组件

组件示例
{{ count }}

启动项目,测试看看

yarn serve

  1. 发布组件
    组件开发并测试通过后,就可以发布到 npm 仓库提供给其他项目使用了,首先执行编译库命令,生成 lib 目录

yarn build

6.1 发布到npm官网

6.1.1 注册npm账号

前往官网注册 npm 账号,如果已注册过,则跳过此步骤

6.1.2 登录npm账号

在项目中 terminal 命令窗口登录 npm 账号

npm login
Username:
Password:
Email:(this IS public)
输入在 npm 注册的账号、密码、邮箱

6.1.3 发布

确保 registry 是 https://registry.npmjs.org

npm config get registry
如果不是则先修改 registry

npm config set registry=https://registry.npmjs.org
然后执行命令

npm publish
如果需要删除已发布的组件(不推荐删除已发布的组件),则执行以下命令(加 --force 强制删除)

npm unpublish --force
删除指定版本的包,比如包名为 nandit-vue-vant 版本 0.1.0

npm unpublish nandit-vue-vant@0.1.0
如果24小时内有删除过同名的组件包,那么将会发布失败,提示

npm ERR! code E403
npm ERR! 403 403 Forbidden - PUT https://registry.npmjs.org/
npm ERR! 403 In most cases, you or one of your dependencies are requesting
npm ERR! 403 a package version that is forbidden by your security policy.

npm ERR! A complete log of this run can be found in:
npm ERR! D:\tools\nodejs\node_cache_logs\2021-10-18T09_58_58_933Z-debug.log
只能换一个名称发布或者等24小时之后发布,所以不要随便删除已发布的组件(万一有项目已经引用)

在这里插入图片描述

搭建npm私库
1、安装verdaccio
首先电脑上要安装有nodejs
windows+r cmd 之后
npm install -g verdaccio
1
如下图所示:安装完成后如果没有提示错误则表示安装

2、启动verdaccio

3、修改配置文件 config.yaml

3.1 在配置文件的末尾添加listen: 0.0.0.0:4873【配置此选项则是允许任何外部的所有IP都可以访问到此服务】

使用本地库
verdaccio 服务启动完成后可通过 nrm 工具进行源地址切换

全局安装 nrm

$ npm install -g nrm
1
2
安装完成后通过如下命令查看已有配置

$ nrm ls
报错require open的话把这一行注释掉

  • npm ---------- https://registry.npmjs.org/
    yarn --------- https://registry.yarnpkg.com/
    tencent ------ https://mirrors.cloud.tencent.com/npm/
    cnpm --------- https://r.cnpmjs.org/
    taobao ------- https://registry.npmmirror.com/
    npmMirror ---- https://skimdb.npmjs.com/registry/

添加本地库至 nrm 配置列表

添加配置项

nrm add zh http://localhost:4873

切换 npm 源至私库

nrm use zh

添加环境用户并根据提示输入用户名密码,为后续传包做准备 (重要)

添加配置项

nrm add zh http://localhost:4873

切换 npm 源至私库

nrm use zh

添加环境用户并根据提示输入用户名密码,为后续传包做准备 (重要)

npm adduser --registry http://localhost:4873/

添加配置项

nrm add localNpm http://localhost:4873

切换 npm 源至私库

nrm use localNpm

直接发布

$ npm publish

或指定源

$ npm publish --registry http://localhost:4873

在这里插入图片描述

至此简单环境配置完毕

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/509309.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

震坤行工业超市建设数字化采购供应链的实践

震坤行工业超市建设数字化采购供应链的实践 行业洞察: 【行业洞察】是震坤行工业超市新媒体推出的专注于行业思考主题栏目。 在这里,您可以收获:行业专家对于新理念、新模式、新技术的深度洞见,关于企业采购实操的干货分享。本…

OpenCL编程指南-1.1OpenCL简介

什么是OpenCL OpenCL是面向由CPU、GPU和其他处理器组合构成的计算机进行编程的行业标准框架。这些所谓的 “异构系统” 已经成为一类重要的平台,OpenCL是直接满足这些异构系统需求的第一个行业标准。OpenCL于2008年12月首次发布,早期产品则在2009年秋天…

数据可视化工具 - ECharts折线图的编写

1 官网找到类似实例&#xff0c; 适当分析&#xff0c;并且引入到HTML页面中 <!DOCTYPE html> <html> <head><meta charset"utf-8"/><title>ECharts</title><!-- 引入刚刚下载的 ECharts 文件 --><script src"ech…

HTML与JavaScript联动

目录 一、数组&#xff08;增删查改&#xff09; 1.创建数组 2. 增加数组元素 3.删除数组中的元素 4.查看数组元素 5.修改数组元素 二、创建方法 1.函数 2.作用域 3.作用域链 三、对象 1.使用 字面量 创建对象 [常用] 2.使用 new Object 创建对象 四、JavaScript…

thinkphp报错 in_array() expects parameter 2 to be array, object given

我的问题是 foreach ($books as $k > $v) { if (in_array($v[id], $book_id)) { //这个地方报错的 $books[$k][check] checked; }else { $books[$k][check] ; } } 这个问题是因为 你的变…

5.9-5.10学习总结

项目分析&#xff1a; 1.用户共有的&#xff1a; 登录&#xff0c;注册&#xff0c;忘记密码&#xff0c;个人资料&#xff0c;修改密码 个人资料&#xff1a;包括生日&#xff08;日期栏选择&#xff09;&#xff0c;手机号&#xff0c;邮箱&#xff0c;学号&#xff0c;姓…

网络路径下倾斜模型生产流程-空三计算,像控刺点

网络路径下倾斜模型生产流程-空三计算&#xff0c;像控刺点 1.新建工程 ①新建工程文件夹 确定本机的网络路径&#xff0c;如演示机为192.168.100.10 在网络路径下新建工程文件夹&#xff0c;如//192.168.100.10/e/YNPE27 在工程文件夹下&#xff0c;新建工程存储文件夹CC和照片…

docker安装与配置docker镜像加速器

文章目录 前言一、准备工作二、docker安装三、配置镜像加速器1.配置中科大镜像加速器2.配置阿里云镜像加速器 前言 我真的受不了虚拟机了&#xff0c;我电脑上有9个虚拟机&#xff0c;占了132G&#xff01;&#xff01;&#xff01;我还不敢随便删&#xff0c;怕到时候要用。。…

聚观早报 | 菜鸟回应明年赴港 IPO;谷歌即将发布最新 AI 大模型

今日要闻&#xff1a;菜鸟回应明年赴港 IPO&#xff1b;谷歌即将发布最新 AI 大模型&#xff1b;中国移动推出周杰伦数字人&#xff1b;“老头乐”销量冠军雷丁汽车申请破产&#xff1b;网信部门工作组进驻斗鱼平台 菜鸟回应明年赴港 IPO 近日&#xff0c;有消息称&#xff0c…

跟着我学 AI丨ChatGPT 详解

随着人工智能的发展&#xff0c;聊天机器人成为了一个备受关注的领域。而ChatGPT作为其中的佼佼者&#xff0c;其功能和技术水平也越来越受到人们的关注。那么&#xff0c;什么是ChatGPT&#xff1f;它又有哪些优点和限制呢&#xff1f; ChatGPT是一款基于自然语言处理技术开发…

zed2i相机内参标定

参考&#xff1a; https://blog.csdn.net/yanpeng_love/article/details/107166922 https://blog.csdn.net/weixin_41954990/article/details/127928852 参考以上连接先安装kalibr。 注意&#xff1a; python包装不上&#xff0c;换成&#xff1a;pip install出现pyx找不到…

React JSX

文章目录 React JSX使用 JSX独立文件JavaScript 表达式样式注释数组HTML 标签 vs. React 组件 React JSX React 使用 JSX 来替代常规的 JavaScript。 JSX 是一个看起来很像 XML 的 JavaScript 语法扩展。 我们不需要一定使用 JSX&#xff0c;但它有以下优点&#xff1a; JSX…

Linux共享库、动态库详解

目录 一.静态库 二.动态库 三.静态库的制作与使用 四.动态库的制作与使用 在日常编程中我们不想让别人看到我们写的源码&#xff0c;但还需要发给对方使用&#xff0c;在这种情况下我们引入了静态库动态库&#xff0c;让对方用调库的方式也可以实现我们写的代码的功能&…

2023天津Web前端开发培训就业排行榜(你对Web前端工程师了解多少)

2023天津Web前端开发培训就业排行榜。前端开发技术在多个开发领域得到了广泛的应用&#xff0c;现在对前端开发技术人员的需求越来越大&#xff0c;没有基础要学好前端开发技术知识&#xff0c;更需要系统的学习。今天给大家分享一下Web前端程序员&#xff0c;0基础学前端&…

React 安装

文章目录 React 安装使用实例实例解析 通过 npm 使用 React使用 create-react-app 快速构建 React 开发环境 React 安装 React 可以直接下载使用&#xff0c;下载包中也提供了很多学习的实例。 你也可以直接使用 BootCDN 的 React CDN 库&#xff0c;地址如下&#xff1a; &l…

matlab实现BP神经网络(完整DEMO)

本站原创文章&#xff0c;转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com 目录 一、BP神经网络Demo代码 1.1 代码整体思路 1.2 BP神经网络Demo代码 二、运行结果 2.1 拟合曲线 2.2训练误差与预测误差 三、相关文章 3.1-BP的入门学习目录&#xff1a;老饼…

中大型连锁企业如何以数字化驱动业务创新增长

随着互联网、IT技术的发展&#xff0c;数字化转型逐渐成为时代发展的浪潮&#xff0c;对于中大型连锁企业而言&#xff0c;抓住机遇、创新增长是企业发展的关键。面对新的市场形势&#xff0c;企业需要让线上数据流动起来&#xff0c;解决业务数据的运力和流通问题&#xff0c;…

第6章 静态代理

第6章 静态代理 把所有静态资源的访问改为访问nginx&#xff0c;而不是访问tomcat&#xff0c;这种方式叫静态代理。因为nginx更擅长于静态资源的处理&#xff0c;性能更好&#xff0c;效率更高。 ​ 所以在实际应用中&#xff0c;我们将静态资源比如图片、css、html、js等交…

什么是企业内容管理?

为什么出现企业内容管理&#xff1f; 在数字经济的宏观背景下&#xff0c;企业建立了各种应用系统以满足企业各业务的管理需求&#xff0c;这些系统每天都在产生大量的数据和信息资源&#xff0c;但在企业实践中存在很多数据或资源无法被应用系统获取、处理和共享。 比如发票…

电力需求侧管理系统是什么?

摘要&#xff1a;电力是国民经济和居民生活的命脉&#xff0c;为贯彻落实国家对于节能减排工作的总体部署&#xff0c;深入推进电力需求侧管理工作、本文从电力需求侧能效管理平台所要实现的功能与应用信息技术两个方面&#xff0c;着重介绍平台研究建立的节电效益计算分析模型…