在npm上发布自己的包 全局包指令使用

  看着公司的另外一个同事写了一个静态资源服务器进行打包后的预览, 但是个人觉得他定义的指令实在是太长, 每次都得打一大串, 个人实在受不了. 于是做了个梦, 再梦里自己就写了这么一个东西, 第二天正好公司空闲没啥事干就开始琢磨着去写.

  需要准备的: node, npm账号, github仓库, 足够的耐性

  开干 :

  1.声明npm package.json

npm init

  2.随后键入package基本信息

name:  vsv  // 模块名称
version: (1.0.0) 1.0.1 // 基础版本号
description: 描述 // 模块描述
entry point: (index.js) index.js // 默认入口
test command: none // 测试指令
git repository: https://github.com/vok123....  // 个人git仓库地址
keywords: server // 关键字
author: vok // 作者
license: (ISC) 

最后输入 y 完成package.json编辑, 随后会生成一个package.json文件

  3.在目录下新建lib文件夹和readme.md并往里面塞点说明

  4.在lib下面新建lib.js

  

module.exports = { // 暴露模块
   fun: function () {
       console.log(‘我的第一个测试包‘);
   }
};    

  5.在跟目录新建index.js

  

var lib = require( ‘./lib/lib.js‘ );
module.exports = lib; //暴露模块

  6.注册npm账号:

    方法1:  npm 注册账号

    方法2: npm adduser 依次输入用户名, 密码, 邮箱就注册成功了, 注册成功会自动登录

    注意: (注意当前镜像源, 如果不是原版镜像源的需要求换原镜像源 , 可以使用 nrm 进行管理镜像源) 1.安装npm install -g nrm 2. 查看镜像源 nrm ls 3. 切换 nrm use npm

      如果有npm账号

    npm login  输入用户名, 密码, 邮箱

  7. 发布

    npm publish

  8. 使用包

npm installl --save vsv

  新建test.js

var funs = require(‘vsv‘);
funs.fun(); // 调用我们定义模块的方法

  当然这仅仅是应用的模块, 貌似并不是我想要的结果 , 我想要的vsv -p 8989就启动一个静态资源服务进行浏览呢! 这时候会想到是否把这个包全局安装 npm install -g vsv 就可以使用呢? 显然不行 , 光是解决vsv不是一个指令就是一个大问题, 还有定义的端口号也是一个问题. 接下来我们一步步来解决问题.

  首先我要借助 commander 命令行来解决指令问题

npm install --save commander //这里需要使用--save 进行安装 不然下面require(‘commander‘)会找不到模块

  把根目录新建src目录新建一个没有后缀的 vsv 文件并键入代码

const program = require(‘commander‘);

program
    .version(require(‘../package‘).version) // 设置版本
    .option(‘-p, --port [port]‘, ‘Input port !‘) // 自定义形参[port]
    .parse(process.argv); // 参数数组

console.log(program.port); // 使用自定义的port参数

  然后我们可以发布npm试试了 执行指令

npm publish

  发布完成后

npm install -g vsv

  安装完成后执行  vsv -p 8999 却发现报错了 (找不到指令)

  ‘vsv‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

  这时候需要我们在package.json里面配置 bin 节点 (跟 "scripts"同级)

  "lib": {

    "vsv": ‘./src/vsv‘

  }

  保存后修改package.json下version节点的版本号为1.0.1, 每次发布的时候要求版本号都要比上一个大

  然后 npm publish 进行npm包发布

  发布完成后npm install -g vsv 再次安装

  执行指令 vsv -p 8999

  发现还是报了错 (指令错误)

  ‘"C:\Users\Administrator\AppData\Roaming\npm\\node_modules\vsv\src\vsv"‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

  到这步的时候离成功已经不远了, 证明我们输入vsv 指令的时候能够找到对应的需要执行的文件了. 只差执行所编写的代码了, 代码是js 所以应该指定这个指令由node去执行.

  这时候我们需要告诉这个文件需要用node执行 , 在vsv文件的头部加上 #!/usr/bin/env node

#!/usr/bin/env node

const program = require(‘commander‘);

program
    .version(require(‘../package‘).version) // 设置版本
    .option(‘-p, --port [port]‘, ‘Input port !‘) // 自定义形参[port]
    .parse(process.argv); // 参数数组

console.log(program.port); // 使用自定义的port参数

  再次更改package.json的版本号进行发布, 安装

  在次执行vsv -p 8999

  发现这时候终于输出了 8999

  接下来就是配置打开浏览器和启动静态资源服务器了

  打开浏览器使用 open 这个npm包  npm install --save open 以及控制台颜色colors控制 npm install --save colors

  

// 使用自定义的port参数以及默认端口处理
  #!/usr/bin/env node

  const program = require(‘commander‘),
  main = require(‘../lib/main.js‘),
  open = require(‘open‘),
  colors = require(‘colors‘);

  program
    .version(require(‘../package‘).version)
    .usage(‘[entry]‘)
    .option(‘-p, --port [port]‘, ‘Input port !‘)
    .parse(process.argv);

  var ports = (program.port > 0 && program.port != true) ? program.port : 8080;
  // 监测端口是否被占用
  main.checkPort(ports).then(res => {
    main.createServer(ports);
    open(`http://localhost:${ports}`);
  }).catch((err) => {
    console.log(err);
  });

  新增/lib/main.js处理端口检查以及静态资源处理服务

const net = require(‘net‘),
  colors = require(‘colors‘),
  fs = require(‘fs‘),
  url = require(‘url‘),
  mime = require(‘./mime‘),
  config = require(‘./config‘),
  http = require(‘http‘),
  path = require(‘path‘);

module.exports = {
  checkPort (port) { // 监测端口
    return new Promise((resolve, reject) => {
      let server = net.createServer().listen(port);
      server.on(‘listening‘, () => { // 执行这块代码说明端口未被占用
        server.close();
        resolve(true, port);
      });
      server.on(‘error‘, (err) => {
        if (err.code === ‘EADDRINUSE‘) { // 端口已经被使用
          console.log(`${port}端口已经被占用 !`.underline.red);
          reject();
        }
      });
    });
  },
  createServer (port) { // 创建静态资源服务
    http.createServer((req, res) => {
      let pathName = url.parse(req.url).pathname;  // 获取文件名‘/xxx‘
      // 对中文进行解码,防止乱码
      pathName = decodeURI(pathName);

      // 重定向: 考虑定义标准的url,以‘/‘结尾.
      if (path.extname(pathName) === ‘‘) {  // 没有扩展名
        if (pathName.charAt(pathName.length - 1) !== ‘/‘) {
          pathName += ‘/‘;
          let redirect = encodeURI(‘http://‘ + req.headers.host + pathName); // 记得encodeURI,不然中文目录报错
          res.writeHead(301, {
            location: redirect
          });
        }
      }
      // 获取资源的绝对路径
      let realFilePath = path.resolve(process.cwd() + pathName);
      // 获取对应文件的文档类型
      let ext = path.extname(pathName); // 获取后缀名,如‘.html‘
      ext = ext ? ext.slice(1) : ‘notKnow‘;  // 取掉.符号
      if (ext.match(config.Expires.fileMatch)) {
        let expires = new Date();
        expires.setTime(expires.getTime() + config.Expires.maxAge * 1000);
        // 设置响应头
        res.setHeader(‘Expires‘, expires.toUTCString());
        res.setHeader(‘Cache-Control‘, ‘max-age=‘ + config.Expires.maxAge);
      }
      // 定义未知文档的类型MIME
      let contentType = mime[ext] || ‘text/plain‘; // 后缀名存在就进行映射,不存在就是‘text/plain‘
      // 判断文件是否存在
      fs.stat(realFilePath, (err, stats) => {
        // err
        if (err) {
          // 也可以定制自己的404页面
          res.writeHead(404, { ‘content-type‘: ‘text/html‘ });
          res.end(‘<h3>404 Not Found</h3>‘);
        }
        if (!stats) return;
        // 存在
        if (stats.isFile()) {
          res.writeHead(200, { ‘content-type‘: contentType });
          // 开始读取文件
          let stream = fs.createReadStream(realFilePath, {
            encoding: ‘utf8‘
          });
          // 读取时候错误处理
          stream.on(‘error‘, () => {
            res.writeHead(500, { ‘content-type‘: contentType });
          });
          // 返回文件内容
          stream.pipe(res);
        }
        // 路径是目录的情况,列出当前目录下文件
        if (stats.isDirectory()) {
          let html = ‘<head><meta charset="utf-8"></head>‘;
          // 读写该目录下的内容 files是文件数组
          fs.readdir(realFilePath, (err, files) => {
            if (err) {
              console.log(‘目录文件读取失败‘.red);
            } else {
              let tpath = ‘‘;
              for (let i = 0; i < files.length; i++) {
                tpath = realFilePath.replace(process.cwd(), ‘‘);
                // html += ‘<div><a href=‘‘+ tpath + ‘/‘ + files[i] + ‘‘>‘ + files[i] + ‘</a></div>‘;
                html += `<div><a href=‘${tpath}/${files[i]}‘>${files[i]}</a></div>`;
              }
            }
            res.writeHead(200, { ‘content-type‘: ‘text/html‘ });
            res.end(html);
          });
        }
      });
    }).listen(port, () => {
      console.log(`开启服务成功 >>>>> 端口: ${port}`.blue);
    });
  }
}

如果文章对你有帮助的话请留下你的足迹 , 拒绝做伸手党  ^_^ ~

代码 github

时间: 2024-08-02 22:57:28

在npm上发布自己的包 全局包指令使用的相关文章

在npm上发布一个自己的包

1.首先你要在npm上创建一个账号,这里需要输入邮箱的,注意激活邮箱否则无法publish自己的包 2.在本地创建一个文件夹,输入npm init初始化项目,这里是我使用npm init创建的package.json文件 这是我的包的index.js代码,很简单就是一个hello world 3.创建好package.json以及我们自己的模块代码文件(index.js)之后需要添加用户 npm adduser 接下来会提示输入用户名,密码以及邮箱,这些都是你之前在注册账号的时候输入的,如果邮箱

nodejs学习笔记四(模块化、在npm上发布自己的模块)

模块化: 1.系统模块:  http.querystring.url 2.自定义模块 3.包管理器 [系统模块] Assert      断言:肯定确定会出现的情况使用断言 stabiltry: locked   稳定性,锁定,再也不会改了 C/C++ ADDons      c的扩展:关键性的函数可以用c来写,提高稳定性 child Processes        子进程 Cluster                     集群 Command Line Opation        

如何使用@vue/cli 3.0在npm上创建,发布和使用你自己的Vue.js组件库

译者按: 你可能npm人家的包过成千上万次,但你是否有创建,发布和使用过自己的npm包? 原文: How to create, publish and use your own VueJS Component library on NPM using @vue/cli 3.0 译者: Fundebug 为了保证可读性,本文采用意译而非直译.另外,本文版权归原作者所有,翻译仅用于学习. 尽管我已经在工作上用了Vue.js一段时间,但我从不需要在npm上发布组件.但最近发现在不同的项目重写组件是件非

如何使用npm打包发布nodejs程序包

作者:zhanhailiang 日期:2014-11-20 不论基于任何语言开发内部项目,我们经常会在内部封装一些极具通用性的功能模块.如果我们觉得该通用模块对其它团队有可取之处,完全可以将其开源出去.npm就是发布nodejs程序包的最优工具. 1. 首先在npmjs.org注册一个账号:(可省) https://www.npmjs.org/signup 2. 通过npm adduser来注册新账号或登录老账号: [root@~/wade/nodejs/pv-tj]# npm adduser

使用cnpm搭建私有NPM仓库 发布npm包

关于如何使用cnpm搭建私有的npm仓库看这里→ http://blog.fens.me/nodejs-cnpm-npm/ 我本人还没有机会真正实践操作过,公司的npm仓库是我老大搭建的,我这里仅仅记录关于如何发布npm包以及在这过程中出现的问题以及解决的方案. 因为官方的npm上的模块是完全开源,但是公司自己项目有些模块与业务或者逻辑以及一些配置模块肯定不能开源啊,所以需要搭建私有的npm仓库. 1.准备工作 首先安装好npm 以及 cnpm . 现在安装node.js 里会一起安装好npm.

框架基础:ajax设计方案(六)--- 全局配置、请求格式拓展和优化、请求二进制类型、浏览器错误搜集以及npm打包发布

距离上一次博客大概好多好多时间了,感觉再不搞点东西出来,感觉就废了的感觉.这段时间回老家学习驾照,修养,然后7月底来上海求职(面了4家,拿了3家office),然后入职同程旅游,项目赶进度等等一系列的原因,导致没有太多时间去搞东西.感觉亏欠了好多,所以这次一次性补上.废话不多说了,我们直接进入主题. 介绍这次讲解的库的更新: ajax全局配置 请求参数的拓展(增加json)和重构优化 初始化参数类型检查 浏览器错误回收机制 增加ajax请求blob(二进制)类型 跨域问题的总结和支持 npm打包

vue封装插件并发布到npm上

vue封装插件并发布到npm上 项目初始化 首先,要创建项目,封装vue的插件用webpack-simple很合适,vue init webpack-simple 项目名称此命令创建我们的项目的目录,创建文件夹和文件,最后结构是这样的  然后根据需求,实现具体功能,这里我封装了一个轮播图组件mini-sliders,主要功能写在lib/slider.vue组件中 功能写好后,我们要写index.js来封装组件 import VueComment from './VueComment.vue' c

NPM 上传自己的包

NPM 上传自己的包 项目中经常 npm install,npm init啥的,那么如何上传自己的包到npm上呢. 注册账号 NPM官网 本地弄一个包 创建npm_test 文件夹 注:不能够有一些特殊字符命名文件夹,比如空格 cmd cd到目录下,键入 npm init 键入 npm login,输入用户名.密码.邮箱 键入 npm publish 报错: npm ERR! publish Failed PUT 403 npm ERR! code E403 npm ERR! You do no

创建一个自己的Vue UI组件库,并将它发布在npm上

本文仅限于入门级,没有成规模制作,希望能对你有所帮助. 因为在开发多个项目中可能会用到同一个组件,那么我们通过复制粘贴的形式更新,无异于是笨拙的,我们可以通过上传到npm后,不断迭代npm包来实现更新. 前期准备 初始化project 这里我们使用vue-cli来初始化一个vue项目. npm install -g @vue/cli or yarn global add @vue/cli vue create personal-component-set 首先我们来开发一个可复用的顶栏控件,这里