当前位置: 首页 > news >正文

npm上传自己的包以及发布过程遇到的问题

大家好,我是前端追寻路上的【酱酱仔】

作为在前端领域不断探索的一员,在此记录开发中遇到的问题,如果你也遇到了相同的问题,希望本文对你有帮助。


前提:本文涉及的命令都是在要发布的包的根目录下执行的,在编辑器的集成终端或者cmd终端执行效果都是一样的【cmd运行要以管理员模式运行哈】。

以下是我npm发布自己的包过程中所遇到的问题汇总如下:

问题一:如何上传自己的包到npm

问题二:npm login和npm publish过程中经常报错 

问题三:npm包更新过程后,不同镜像下npm xx包版本不同 (大坑

针对以上问题作出以下操作解释说明哈:

问题一:如何上传自己的包到npm

1.1、首先需要去npm官网注册个人npm账号(这里注意邮箱号一定要是可用的)
1.2、其次需要创建npm包 (如果是发布组件可以创建vue-cli包,如果是发布js库之类的可以直接npm init包)
1.3、然后配置npm内配置文件等等
1.4、最终经过测试没问题后可以发布到npm官网

这里我拿封装npm组件为例,演示下操作流程

1.1、npm | Home (npmjs.com) 官网注册账号,有账号的话可以直接登录

1.2、我这里创建vue-cli脚手架,在里面创建npm配置文件(注意也要使用管理员命令运行

主要是基于使用cli3初始化一个项目工程:
全局安装vue-cli:

npm install -g @vue/cli

创建一个vue项目:

vue create llgtfoo-components-boxs

 

按照以上操作即可,这里基础的我这里不过多解释说明了哈

Vue创建脚手架的步骤(简单详细)-CSDN博客

 如果发现安装脚手架太慢,可切换成淘宝镜像

                命令说明                        命令操作
查看npm当前镜像npm config get registry
切换最新淘宝镜像npm config set registry https://registry.npmmirror.com
切换境外镜像npm config set registry https://registry.npmmirror.com
1.3、npm内配置文件信息

a.在项目中添加组件库文件夹:
在根目录下新建一个plugins文件夹,用来放组件,项目文件结构为:

b.添加配置文件
项目根目录下面添加vue.config.js文件,写入以下内容:
(主要是配置webpack的打包)

/** @Author: your name* @Date: 2024-07-22 20:11:02* @LastEditTime: 2024-07-22 20:20:19* @LastEditors: your name* @Description: In User Settings Edit* @FilePath: \health\vue.config.js*/
const path = require('path')
module.exports = {// 修改 pages 入口pages: {index: {entry: 'src/main.js', // 入口template: 'public/index.html', // 模板filename: 'index.html' // 输出文件}},// 扩展 webpack 配置chainWebpack: config => {// @ 默认指向 src 目录// 新增一个 ~ 指向 pluginsconfig.resolve.alias.set('~', path.resolve('plugins'))// 把 plugins 加入编译,因为新增的文件默认是不被 webpack 处理的config.module.rule('js').include.add(/plugins/).end().use('babel').loader('babel-loader').tap(options => {// 修改它的选项...return options})}
}

c.在新建的一个plugins文件夹下面编写npm包内组件

我这是把封装的组件在不同的文件夹,一个文件夹代表一个组件,后面在合理添加并继续封装。
***下面我以custom-tree这个组件为例:(是一个美观自定义树形显示组件)

d.****index.js文件内容:
为组件提供 install 方法,供组件对外按需引入

代码如下:

// 导入你的组件、指令和过滤器
import customTree from './components/custom-tree';
import screenHeight from '../utils/screenHeight';// 定义一个对象,包含插件的 install 方法和需要暴露的组件、指令、过滤器等
const lgbComponents = {install(Vue) {// 注册指令Vue.directive('screen-height', screenHeight);// 注册组件Vue.component('custom-tree', customTree);}
};// 导出插件对象
export default lgbComponents;

注:这个单独暴露组件的index.js,意思是如果这个工程值封装一个组件使用的话,就用这个index.js文件暴露install即可了。

e.在本地页面中使用组件:

在main.js中全局引入统一注册的plugins文件夹下面的index.js文件:

import MyComponents from '../plugins/index.js'
app.use(MyComponents); // 在 app 上使用 MyComponents 插件

本地页面直接使用组件的name名称即可

f.本地页面使用没有问题,这时候就可以npm打包发布了

库模式打包,配置package.json文件

    "scripts": {"dev": "vue-cli-service serve","build": "vue-cli-service build","lib": "vue-cli-service build --target lib --name lgb-components-box --dest lib plugins/index.js","lint": "vue-cli-service lint"},因为在vue-cli中,可以通过以下命令将一个单独的入口打包成库// target: 默认为构建应用,改为 lib 即可启用构建库模式
// name: 输出文件名
// dest: 输出目录,默认为 dist,这里我们改为 lib
// entry: 入口文件路径
vue-cli-service build --target lib --name lib [entry]

package.json中配置打包信息:

name:包名
version:包的版本号,每次发包这个版本号都要改
description:包的描述
private:是否私有,一般都是false
author:作者
license:npm包协议
keywords:关键字,供npm上模糊搜索到包
main: "lib/lgb-components-box.umd.min.js",打包后的入口文件
module: "lib/lgb-components-box.common.js",打包后的入口文件

g..gitignore文件中添加:

.DS_Store
node_modules
/dist# local env files
.env.local
.env.*.local# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?src/
plugins/
public/
vue.config.js
babel.config.js
*.map
*.html

h.把包的一些测试文件过滤掉,最终打包只留下直接封装的文件,即plugins中封装的暴露组件

在终端执行npm run lib 即可,执行结果:

i.发布包(注意一定要使用境外镜像,不然打包不了)

终端中执行发包命令
npm login 登录(如果没有npm账号需要自己注册,并认证邮箱)
这样既登录成功

需要 one-time 的话,在手机你的邮箱里面显示 npm的验证码
在输入npm publish 发布包,出现包名加版本号,即发布成功

这个过程境外镜像比较慢 经常包network错误,可换成自己手机热点连接电脑试试,多尝试几次

npm 上能找到自己发布的包:

j.使用发布的包

安装命令  npm install lgb-components-box

使用文档 见使用文档说明

项目里面使用如下main.js引入

import lgbComponentsBox from 'lgb-components-box'
import 'lgb-components-box/lib/lgb-components-box.css'Vue.use(lgbComponentsBox);
注:全局使用,组件可以单独引用

页面直接使用npm包里面的 组件name即可

<custom-tree  subtractHeightJt="140px" leftTitle="测试npm打包组件"></custom-tree>
问题二:npm login和npm publish过程中经常报错 

a.大部分原因因为使用境外镜像访问比较慢导致的。

b.一部分原因因为邮箱号的npm验证码错误导致。

c.一小部分原因你的包名在npm上面有重复的导致。

其他原因:

        1、npm 源不对,处理:npm config set registry https://registry.npmjs.org/    --   有些非官方源个人可能无权发布,比如淘宝镜像需要admin权限。

        2、文件夹名和package.json里的'name'属性一样时也无法发布,处理:将文件夹名或'name'改成不一致即可。

        3、如果你的 npm 账号未登录成功,也会发包失败。

npm login 没有出现 username,跳转cnpm注册的解决方法_npm username忘记了-CSDN博客

问题三:npm包更新过程后,不同镜像下npm xx包版本不同

        这种原因是因为 使用的淘宝镜像会延迟与国外镜像,所以在淘宝镜像下会是老版本,只有在境外镜像会同步管理端平台发布版本。

        因此刚发布更新的npm包文件也需要同样使用境外镜像npm install

常用的npm包命令

npm说明npm命令
npm登录npm login
npm发布npm publish
npm初始化包npm init
查看当前npm包版本npm view <package_name> versions
查看npm源npm config get registry
设置npm源npm config set registry <registry_url>
npm更新版本号

npm version <update_type>

 <update_type>可以是patchminormajor等标签。

npm取消发布npm unpublish <package_name>@<version>

这样你的npm包就发布上去啦,供多个项目使用噜,是不是感觉前端很有意思哈!!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Leetcode—263. 丑数【简单】
  • JCR一区级 | Matlab实现GA-Transformer-LSTM多变量回归预测
  • 前端系列-6 使用Vue3搭建前端工程与setup语法糖介绍
  • Java——————接口(interface) <详解>
  • java中log4j.properties配置文件浅析
  • Kubernetes 1.24 版弃用 Dockershim 后如何迁移到 containerd 和 CRI-O
  • 在 ArkTS 中集成 C 语言模块来管理文件描述符
  • (四)js前端开发中设计模式之工厂方法模式
  • 基于jeecgboot-vue3的Flowable流程仿钉钉流程设计器-发送信息服务处理
  • 记录安装android studio踩的坑 win7系统
  • 某数据泄露防护(DLP)系统NoticeAjax接口SQL注入漏洞复现 [附POC]
  • 集合的流式API与数据库查询:深入比较与实践
  • 【21】两数交换
  • 脚本运行:在 IPython 中执行 Python 脚本的步骤
  • UE4-字体导入
  • Google 是如何开发 Web 框架的
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • Android组件 - 收藏集 - 掘金
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Django 博客开发教程 16 - 统计文章阅读量
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • java8-模拟hadoop
  • Javascript基础之Array数组API
  • leetcode98. Validate Binary Search Tree
  • leetcode讲解--894. All Possible Full Binary Trees
  • NSTimer学习笔记
  • PHP CLI应用的调试原理
  • Wamp集成环境 添加PHP的新版本
  • 复习Javascript专题(四):js中的深浅拷贝
  • 今年的LC3大会没了?
  • 两列自适应布局方案整理
  • 日剧·日综资源集合(建议收藏)
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 微信公众号开发小记——5.python微信红包
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • #1014 : Trie树
  • #WEB前端(HTML属性)
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (安卓)跳转应用市场APP详情页的方式
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (二)正点原子I.MX6ULL u-boot移植
  • (蓝桥杯每日一题)love
  • (利用IDEA+Maven)定制属于自己的jar包
  • (论文阅读40-45)图像描述1
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (七)glDrawArry绘制
  • (三)模仿学习-Action数据的模仿
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (算法)Game
  • (算法设计与分析)第一章算法概述-习题
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (一)UDP基本编程步骤
  • (转)母版页和相对路径