npm 发布自己组件包

发布到 npm 上

  • 首先创建自己的npm账号
npm init
npm install
npm uninstall
npm config edit // 编辑
npm config ls -l // 查看 .npmrc 配置文件
npm config get cache // 查看 npm 缓存目录
npm config get prefix // 查看通过 npm install -g 和 cnpm install -g 或者yarn global add 安装包的基础路径, lib/node_modules
npm root -g // 查看全局安装包路径
npm get registry // 查看本地源地址
  • 初始化普通项目项目
npm init

// 包名 不能使用大写字母、驼峰命名法
package name: vue-message-box
// 版本
version:
// 介绍
description:
// 入口
entry point
// 项目启动的时候要用什么命令来执行脚本文件(默认为node app.js)
test command
//
git repository
//
keywords
//
author
//
license:(ISC)

按照默认选项,我们初始化项目已经做好额,生成的 package.json 内容如下

{
"name": "vue-message-box",
"version": "1.0.0",
"description": "基于Vue的一个弹出窗",
"main": "index.js",
"scripts": {
"test": "npm start"
},
"author": "yingzi",
"license": "ISC"
}

完整 package.json

{
"name": "Hello World", //name属性就是你的模块名称
"version": "0.0.1", //version必须可以被npm依赖的一个node-semver模块解析
"author": "张三", //"author"是一个码农
"description": "第一个node.js程序", //一个描述,方便别人了解你的模块作用,搜索的时候也有用。
"mian":"index.js", //main属性指定了程序的主入口文件.
"keywords":["node.js","javascript"], //一个字符串数组,方便别人搜索到本模块
"repository": { //指定一个代码存放地址,对想要为你的项目贡献代码的人有帮助。
"type": "git",
"url": "https://path/to/url"
},
"license":"MIT", //你应该为你的模块制定一个协议,让用户知道他们有何权限来使用你的模块,以及使用该模块有哪些限制,如BSD-3-Clause 或 MIT之类的协议
"engines": {"node": "0.10.x"},
"bugs":{ //填写一个bug提交地址或者一个邮箱,被你的模块坑到的人可以通过这里吐槽
"url":"https://github.com/luoshushu",
"email":"bug@example.com"
},
"contributors":[{"name":"李四","email":"lisi@example.com"}], // "contributors"是一个码农数组。
"scripts": { //指定了运行脚本命令的npm命令行缩写。比如:输入npm run start时,所要执行的命令是node index.js。
"start": "node index.js"
},
"dependencies": { //指定了项目运行所依赖的模块
"express": "latest",
"mongoose": "~3.8.3",
"handlebars-runtime": "~1.0.12",
"express3-handlebars": "~0.5.0",
"MD5": "~1.2.0"
},
"devDependencies": { //指定项目开发所需要的模块
"bower": "~1.2.8",
"grunt": "~0.4.1",
"grunt-contrib-concat": "~0.3.0",
"grunt-contrib-jshint": "~0.7.2",
"grunt-contrib-uglify": "~0.2.7",
"grunt-contrib-clean": "~0.5.0",
"browserify": "2.36.1",
"grunt-browserify": "~1.3.0",
}
}

-package.json 详细介绍: http://caibaojian.com/npm/files/package.json.html

  • 登陆 npm
npm login
按照提示 输入 用户名密码即可

登陆是可能出现错误

npm ERR! code E409
npm ERR! 409 Conflict - PUT https://registry.npm.taobao.org/-/user/org.couchdb.user:wangjiaxin - [conflict] User wangjiaxin already exists npm ERR! A complete log of this run can be found in:
npm ERR! /Users/wangjiaxin/.npm/_logs/2021-12-13T07_24_53_438Z-debug.log

解决办法

npm login --registry https://registry.npmjs.org

或者修改 .npmrc 文件

registry=https://registry.npm.taobao.org/ 替换成 registry=https://registry.npmjs.org
426 Upgrade Required - PUT http://registry.npmjs.org/-/user/org.couchdb.user:wangjiaxin

解决办法

npm login --registry https://registry.npmjs.org

登陆成功

Logged in as wangjiaxin on https://registry.npmjs.org/.

发布包

npm publish --registry https://registry.npmjs.org

可能遇见问题

npm ERR! code E403
npm ERR! 403 403 Forbidden - PUT https://registry.npmjs.org/vue-message-box - Package name too similar to existing package vue-messagebox; try renaming your package to '@wangjiaxin/vue-message-box' and publishing with 'npm publish --access=public' instead
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, or
npm ERR! 403 on a server you do not have access to. npm ERR! A complete log of this run can be found in:
npm ERR! /Users/wangjiaxin/.npm/_logs/2021-12-13T07_33_48_520Z-debug.log
// 包名 vue-messagebox 和我们要发布的vue-message-box 包名太相似, 并改为用 npm publish --access=public 命令发布

问题二

npm ERR! code E403
npm ERR! 403 403 Forbidden - PUT https://registry.npmjs.org/vue-wjxlayout-box - Forbidden
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, or
npm ERR! 403 on a server you do not have access to. npm ERR! A complete log of this run can be found in:
npm ERR! /Users/wangjiaxin/.npm/_logs/2021-12-13T07_45_11_809Z-debug.log

原因是第一次注册npm账号,绑定邮箱没有验证,不允许发布包,到邮箱里验证一下即可

最后成功发布

问题三、重新登陆登陆授权即可

 You need to authorize this machine using `npm adduser`

问题四、可能是包名重复,更新包名

You do not have permission to publish "npm-vue-components". Are you logged in as the correct user

Twilio Authy 做验证使用

成功发布显示内容

npm notice
npm notice vue-wjxlayout-box@1.0.0
npm notice === Tarball Contents ===
npm notice 274B .idea/modules.xml
npm notice 458B .idea/npm-package.iml
npm notice 163B index.js
npm notice 79B npmrc
npm notice 212B package.json
npm notice === Tarball Details ===
npm notice name: vue-wjxlayout-box
npm notice version: 1.0.0
npm notice filename: vue-wjxlayout-box-1.0.0.tgz
npm notice package size: 782 B
npm notice unpacked size: 1.2 kB
npm notice shasum: 90feeedb143421ef4cef7733d39d1156e82c6079
npm notice integrity: sha512-xz69oRusl60Kq[...]5X7TdaEY27VZQ==
npm notice total files: 5
npm notice
+ vue-wjxlayout-box@1.0.0

删除 已发布包

npm unpublish --registry=https://registry.npmjs.org vue-wjxlayout-box@1.0.0

// 删除成功
- vue-wjxlayout-box@1.0.0

编辑一个vue组件发布到npm,并在项目中使用

  • 使用 vue-cli 创建一个项目
vue create yingzi-npm-conponment
  • 新增目录 package,修改src 目录为 examples,在package 目录下新建index.js 内容如下
// 安装导出组件
import UseMessageBox from "./message-box/index.js";
import UIButton from "./button"; // 存储组件列表
const components = [
UseMessageBox,
UIButton
]; const install = function(Vue) {
// 遍历注册全局组件
components.forEach(component => {
Vue.component(component.name, component);
}); Vue.prototype.$UseMessageBox = UseMessageBox; }; /* istanbul ignore if 判断是否是直接引入文件 */
if (typeof window !== 'undefined' && window.Vue) {
install(window.Vue);
}
// 导出的对象必须具有 install , can能被 Vue.use() 方法安装
export default {
install,
UseMessageBox,
UIButton
};
  • 新建 组件 UIButton 和 UseMessageBox
// 新建button 文件夹 下面新建 button.vue 和 index.js
// /src/button.vue
<template>
<div>
<slot>
我是组件按钮
</slot>
</div>
</template>
<script>
export default {
name: "UIButton",
}
</script> // index.js
import UIButton from './button' UIButton.install = function (Vue) {
Vue.component(UIButton.name, UIButton);
} export default UIButton; // 新建message-box文件夹 下新建 文件 index.js main.vue main.js
// /src/main.vue
<template>
<transition name="el-fade-in-linear">
<div class="message_box_layout" v-if="showClose">
<div class="message_box_content">
<slot name="title">
<div class="message_box_title">
<div class="message_box_title_content">
<span>{{ title }}</span>
</div>
</div>
</slot>
<slot name="section">
<div class="message_box_section">
{{ message }}
</div>
</slot>
<slot name="footer">
<div class="message_box_footer">
<button style="width: 125px" v-if="isShowCancel" @click="cancel"
>取消</button
>
<button
style="width: 125px; border: 0"
:style="{ backgroundColor: confirmBackgroundColor }"
@click="submit"
>确定</button
>
</div>
</slot>
</div>
</div>
</transition>
</template>
<script>
export default {
props: {
isShowClose: {
type: Boolean,
default: false
}
},
watch: {
isShowClose (v, o) {
console.log(v, o)
}
},
data() {
return {
confirmBackgroundColor: "",
showClose: "",
options: "",
isShowCancel: "",
title: "提示",
message: "提示内容"
};
},
created() {
console.log(this.props, this.isShowClose)
this.showClose = this.isShowClose;
},
methods: {
showMessageBox (option) {
this.options = option || undefined;
this.title = option.title || '提示';
this.message = option.message;
this.isShowCancel = !!option.isShowCancel;
this.showClose = true;
this.confirmBackgroundColor = option.confirmBackgroundColor || '';
},
cancel(){
if (this.options.cancel) {
this.options.cancel();
}
this.showClose = false;
},
submit(){
if (this.options.submit) {
this.options.submit();
}
this.showClose = false;
},
},
};
</script> <style scoped>
.message_box_layout {
position: fixed;
top: 0;
left: 0;
bottom: 0;
right: 0;
background: rgba(0,0,0, .7);
z-index: 9999;
}
.message_box_content {
width: 478px;
height: 240px;
background: #FFFFFF;
border-radius: 2px;
margin: auto;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -100%);
}
.message_box_title {
width: 100%;
height: 52px;
background: #FAFAFA;
display: flex;
justify-content: space-between;
align-items: center;
padding-left: 32px;
padding-right: 21px;
box-sizing: border-box;
font-size: 16px;
font-weight: 500;
color: rgba(0, 0, 0, 0.85); }
.message_box_title_content {
display: flex;
align-items: center;
}
span{
margin-left: 8px;
font-weight: 600;
}
.message_box_section {
width: 100%;
height: 129px;
padding: 48px 63px 0;
box-sizing: border-box;
font-size: 16px;
font-weight: 600;
color: rgba(0, 0, 0, 0.85);
line-height: 22px;
}
.message_box_footer {
display: flex;
justify-content: center;
} button {
width: 125px;
height: 32px;
border: 1px solid rgba(24,144,255,.8);
background: rgba(24,144,255,.8);
color: #FFFFFF;
cursor: pointer;
}
button:active {
background: rgba(24,144,255,.4);
}
</style> // /src/mian.js
import Vue from "vue";
import UseMessageBoxComponent from "./main.vue";
// import merge from "./mergepro"
const MessageBoxConstructor = Vue.extend(UseMessageBoxComponent); let instance;
const initInstance = () => {
instance = new MessageBoxConstructor({
el: document.createElement('div')
})
instance.$mount();
['modal', 'showClose', 'isShowClose'].forEach(prop => {
console.log('----- showClise -----', prop)
if (instance[prop] === undefined) {
instance[prop] = false;
}
});
console.log(instance)
document.body.appendChild(instance.$el);
} const UseMessageBox = function () {
if (!instance) {
initInstance();
}
} UseMessageBox.success = (option) => {
UseMessageBox();
instance.showMessageBox(option);
} export default UseMessageBox;
export { UseMessageBox } // 新建index.js
import UseMessageBox from "./src/main.js"; // UseMessageBox.install = function (Vue) {
// Vue.component(UseMessageBox.name, UseMessageBox);
// }; export default UseMessageBox;

配置vue.config.js


module.exports = {
pages: {
index: {
entry: 'examples/main.js',
template: 'public/index.html',
filename: 'index.html'
}
},
chainWebpack: config => {
config.module
.rule('js')
.include
.add('/packages')
.end()
.use('babel')
.loader('babel-loader')
}
}

package.json 下添加新的script,添加main配置

"main": "dist/myLib.common.js",
"script": {
"lib": "vue-cli-service build --target lib --name myLib packages/index.js"
} // description 组件库的描述文本
// keywords 组件库的关键词
// license 许可协议
// repository 组件库关联的git仓库地址
// homepage 组件库展示的首页地址
// main 组件库的主入口地址(在使用组件时引入的地址)
// private 声明组件库的私有性,如果要发布到npm公网上,需删除该属性或者设置为false
// publishConfig 用来设置npm发布的地址,这个配置作为团队内部的npm服务器来说非常关键,可以设置为私有的npm仓库

运行 npm run lib 生成组件包发布到 npm

安装使用

import YingZi from "yingzi-vue-components"
import 'yingzi-vue-components/dist/myLib.css';
Vue.use(YingZi)

补充npm发包文件白名单

//当执行npm publish命令,默认包含的文件(不区分大小写)有

package.json
README (and its variants)
CHANGELOG (and its variants)
LICENSE / LICENCE
package.json属性main指向的文件
默认忽略的有 .git
CVS
.svn
.hg
.lock-wscript
.wafpickle-N
.*.swp
.DS_Store
._*
npm-debug.log
.npmrc
node_modules
config.gypi
*.orig
package-lock.json (use shrinkwrap instead)
// 想设置发布文件的黑名单,通过.gitignore或.npmignore这两个文件来设置忽略的文件或文件夹。
// 果你在项目中增加了 .npmignore,那么其会完全替代掉 .gitignore 的作用。
// 想设置发布文件的白名单,设置package.json中的files属性。
// 例如 files:["package.json","src"]
// 这里的优先级是files>.npmignore>.gitignore

npm 常用命令

npm -v   //查看版本号

npm --help   //查看npm所有命令

npm adduser  //添加 npm 账号,也可以去npm官网注册

npm init  //构建项目说明,生成 package.json文件

npm view jquery versions //查看历史版本信息(最多只能显示100条)

npm view node versions --json //查看所有版本信息

npm view jquery version  //查看最新版本信息

npm info jquery  //查看所有版本及jquery的信息

npm ls jquery //查看本地安裝的jquery版本

npm ls jquery -g //查看全局安裝的jquery版本

npm i jquery@3.2.3 //安裝指定版本

npm i jquery //安装推荐的版本

npm i jquery@latest //安裝指定、最新版本

npm install gulp 简写 npm i gulp //安装依赖

npm install gulp -S -D

npm install gulp@3.0.0 --save

npm update gulp //可以把当前目录下node_modules子目录里边的对应模块更新至最新版本 

npm update gulp -g  //可以把全局安装的对应命令行程序更新至最新版

npm uninstall gulp@3.0.0 --save //卸载依赖

npm install cnpm -g --registry=https://registry.npm.taobao.org  //安装淘宝镜像

npm config list  //查看npm的配置

npm config set registry https://registry.npm.taobao.org  //设置淘宝镜像源

npm config set registry https://registry.npmjs.org //设置npm源

npm set disturl  https://npm.taobao.org/dist //设置资源库从淘宝库获取

npm cache clean --force //清空npm本地缓存 ,用于对付使用相同版本号发布新版本代码的人

npm run dev / test / build  //执行script命令

npm login //发布包时登录npm账号用的

npm  publish   //发布包到npm官方库

npm unpublish   test   //撤销已发布的包

npm  unpublish  test  --force  //强制撤销

npm  unpublish   test@1.0.2  //可以撤销发布自己发布过的某个版本代码

搭建私有npm

  • 通过docker verdaccio 搭建

添加成员

npm set registry http://npm.xxxx.com
npm adduser --registry http://npm.xxxx.com
username:xxxx
password:xxxx
email: xxxx

自己搭建服务器发布包时存在上传文件件限制

  • 发布 报错 413 Request Entity Too Large
http {
client_max_body_size 100m;
}

npm 发布自己组件包的更多相关文章

  1. npm 发布 vue 组件

    创建 vue 组件 1.创建vue项目,为了简洁方便,推荐使用webpack-simple构建一个项目 vue init webpack-simple your-project 2.在 src 目录下 ...

  2. 使用npm发布自己的包

    记录一下大概步骤: 去npm官网注册一个账号 在文件夹下执行npm init 创建 package.json 执行 npm login,并根据提示输入你的npm账号,密码,和邮箱 执行 npm pub ...

  3. npm发布vue组件流程

    初始化项目vue init webpack-simple XXX 定义组件略 发布配置1.package.json 2.webpack.config.js(注释部分为原配置) 发布1.登录 2.发布n ...

  4. 发布自己第一个npm 组件包(基于Vue的文字跑马灯组件)

    一.前言 总结下最近工作上在移动端实现的一个跑马灯效果,最终效果如下: 印象中好像HTML标签的'marquee'的直接可以实现这个效果,不过 HTML标准中已经废弃了'marquee'标签 既然HT ...

  5. 通过NPM快速发布你的NodeJS模块(组件包)

    1.更新 NPM - [ npm install -g npm | 该步骤可选:最好使用新版本] 楼主当前版本号 2.6.1 ,如果更新报错,可以尝试 国内淘宝镜像 $ npm -v 2.6.1 // ...

  6. 手把手教你用npm发布一个包,详细教程

    我们已经实现了路由的自动化构建,但是我们可以看到,一大串代码怼在里面.当然你也可以说,把它封装在一个JS文件里面,然后使用require('./autoRoute.js')给引入进来,那也行.但是,为 ...

  7. 怎么用npm发布一个包,详细教程

    我们已经实现了路由的自动化构建,但是我们可以看到,一大串代码怼在里面.当然你也可以说,把它封装在一个JS文件里面,然后使用require('./autoRoute.js')给引入进来,那也行.但是,为 ...

  8. 在 ASP.NET Core 项目中使用 npm 管理你的前端组件包

    一.前言 在项目的前端开发中,对于绝大多数的小伙伴来说,当然,也包括我,不可避免的需要在项目中使用到一些第三方的组件包.这时,团队中的小伙伴是选择直接去组件的官网上下载,还是图省事直接在网上搜索,然后 ...

  9. 使用npm发布、查看、引用、删除自己的包[小白推荐]

    前言  怎么使用npm发布自己的组件包呢?博主看了不少相关的文章,都没有一个好的讲述.要么丢三落四,要么就是复杂到外行人根本看不懂,甚至无从下手.于是,在博主的潜心钻研下,终于成功了!所以,我打算写一 ...

  10. vue发布自定义组件到npm

    一.使用 vue create currentdatetime创建项目(可查考https://cli.vuejs.org/zh/guide/creating-a-project.html),创建成功后 ...

随机推荐

  1. 基于 EventBridge 构建数据库应用集成

    ​简介:本文重点介绍 EventBridge 的新特性:数据库 Sink 事件目标. 作者:赵海 引言 事件总线 EventBridge 是阿里云提供的一款无服务器事件总线服务,支持将阿里云服务.自定 ...

  2. 360 政企安全集团基于 Flink 的 PB 级数据即席查询实践

    简介: Threat Hunting 平台的架构与设计,及以降低 IO 为目标的优化与探索.为什么以及如何使用块索引. 本文整理自 360 政企安全集团的大数据工程师苏军以及刘佳在 Flink For ...

  3. [FAQ] Cordova 模拟器中不能访问域名, 未联网 ?

    首先保证电脑已联网,然后打开模拟器的浏览器输入常用网址,看看是否能够联网. 如果访问失败,在本机中在 cmd 中 ping www.baidu.com 获得百度的ip地址,然后在浏览器中输入 http ...

  4. [FAQ] MetaMask ALERT: 交易出错. 合约代码执行异常.

    首先确认载入的合约地址是否是最新的,比如 web3 载入的 abi 格式的 json 文件名 正不正确. 其次需要检查合约逻辑是否都正确,以及是否是合约抛出的错误,这两点最好是通过写测试用例来保证. ...

  5. rails 给数据库表里加入索引

    创建迁移文件 rails g migration add_product_images_index 编写迁移文件 db/migrate/20170119093958_add_product_image ...

  6. docker-compse 安装nginx 配置目录挂载

    一.新建一个启动服务的目录 mkdir /usr/local/docker/compose cd /usr/local/docker/compose 二.新建文件docker-compose.yml ...

  7. linux基础命令及bash shell特性

    linux基础命令及bash shell特性 目录 linux基础命令及bash shell特性 1.linux基础命令 1.1 查看内核版本和linux发行版本 1.2 查看服务器硬件信息 1.3 ...

  8. Java中Future 用来做异步任务返回

    我们在开发中会有这种场景,我们要调用远程服务的一个方法,并且拿到返回值去使用.笔者最近项目中出现了一个ANR,具体是调用了远程服务,发生异常一直没有返回值,然后导致ANR. 怎么解决呢?找了一圈,发现 ...

  9. Linux(五):Linux的文档编辑器Vi

    什么是Vi 我们使用Windows的时候,记录或者存储信息,一般都是txt文本编辑,记事本,word文档等等,进行编程的时候,使用idea,eclipse等等,但是在Linux中,就比较直接了,不论你 ...

  10. AI回答总不满意?你的提问方式可能完全错误!

    AI回答总不满意?你的提问方式可能完全错误! 大家好,我是卷福同学,一个专注AI大模型整活的前阿里程序员,腾讯云社区2023新秀突破作者 向AI提问想写一篇论文,结果AI就生成2000字左右的文章后就 ...