npm 发布自己组件包


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



// 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





// /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