构建发布自己的npm package

文本将会介绍如何构建并发布自己编写的npm包,这里假定你的npm环境已经搭建完成,我们就直接切入主题

注册账号

想要在Npm上发布自己的软件包,就必须先在npm官网上注册一个账号
注册地址


注册完成后,我们就可以在命令行中登录刚刚注册的账号了:

$ npm login
Username: falm
Password:
Email: (this IS public) xxx@gmail.com
Logged in as falm on https://registry.npmjs.org/.

OK登录成功。

初始化

在这里我们开始构建Npm包,本文的例子是一个 过去时间的计算工具 比如:

2..days.ago() #=> 返回两天前的时间

好的,那么接下来就开始创建包目录

$ mkdir number-timeago && cd number-timeago
$ npm init

这里执行 npm init 命令之后,会让你填写关于包的信息,只要跟着提示填写就可以

name: (number-timeago) number-timeago  # 填写包名
version: (1.0.0)                       # 版本号
description: numeric time ago like rails ( 2..days.ago() ) # 描述
entry point: (index.js) number.timeago.js     #  入口文件名
test command:
git repository: https://github.com/falm/number-timeago.git  # git仓库地址
keywords: time,ago,numeric    # 关键字
author: falm  # 作者
license: (ISC) MIT   # 许可证

然后就会生成,Npm包的描述文件 package.json

# package.json
{
  "name": "number-timeago",
  "version": "1.0.0",
  "description": "numeric time ago like rails ( 2..days.ago() )",
  "main": "number.timeago.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/falm/number-timeago.git"
  },
  "keywords": [
    "time",
    "ago",
    "numeric"
  ],
  "author": "falm",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/falm/number-timeago/issues"
  },
  "homepage": "https://github.com/falm/number-timeago#readme"
}

主文件

这里我们将包的主代码,存放到 number.timeago.js 中,



(function (NumberTimeAgo) {

  if (typeof module === 'object' && typeof module.exports === 'object') {
    module.exports = NumberTimeAgo;  # node CommonJS
  } else if (typeof define === 'function' && define.amd) {
    define(['number_time_ago'], NumberTimeAgo);  # AMD
  } else {
    NumberTimeAgo();  # 直接引用
  }

})(function () {
# .....
});

入口文件,主要是一个自调用函数,核心的代码,作为闭包通过参数传入。
npm 使用CommonJS规范,模块化代码,所以这里将核心函数赋值给 module.exports
除此之外,还要考虑,有直接在浏览器中使用主文件,或是用AMD加载文件的情况,代码中也予以了支持。

测试

没有测试的Npm包,是不健全的,没法给人安全感,如果在生产项目中使用的话,说不定,那天你就崩溃了,所以我们构建的npm包也要有测试。
这里使用 mochachai 两个test工具进行测试(选用它们是个人偏好,你也可以使用其他的测试框架)

安装:

$ npm install mocha --save-dev
$ npm install chai --save-dev

安装时,使用npm的 --save-dev选项,将会把代码安装到./node_modules下,并且会在package.json中注册开发模式依赖,这样其他人下载你的代码后,运行 ** npm install ** 就可以运行测试了。

  "devDependencies": {
    "chai": "^3.5.0",
    "mocha": "^2.4.5"
  }

接下来创建测试文件。

$ mkdir test && touch test/number.timeago.js

测试代码:


var expect = require('chai').expect;
require('../number.timeago.js')();

describe('NumberTimeAgo', function(){

  describe('#number-time', function(){
    it('seconds', function(){
      expect(60..seconds).to.eq(1000*60);
    })
    it('days', function () {
      expect(2..days).to.eq(48..hours);
    });
  });

  describe('#time-ago', function(){
    it('ago()', function(){
      actualDay = 3..days.ago().getDay();
      expectDay = new Date(new Date() - 3..days).getDay();
      expect(actualDay).to.eq(expectDay);
    }) ;

  });

});

上面的测试代码这里就不解释了,接下来我们需要将测试命令添加到 ** package.json ** 中:

  "scripts": {
    "test": "node ./node_modules/.bin/mocha test"
  },

在 scripts/test 节点中添加好命令后,我们就可以是用 npm test 运行测试代码了。

$ npm test 
> node ./node_modules/.bin/mocha test
  NumberTimeAgo
    #number-time
      ✓ seconds
      ✓ days
    #time-ago
      ✓ ago()
  3 passing (12ms)

Good,测试用例全部通过了。

发布

这应该是本文中最简单的一步了,基于一开始我们已经登录了Npm 账号,所以执行一条命令:

npm publish

搞定。

结尾

本文中Npm包的github地址: number-timeago

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,463评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 什么是 NPM npm之于Node,就像pip之于Python,gem之于Ruby,composer之于PHP。 ...
    ihoey阅读 6,247评论 2 36
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,739评论 6 342
  • 这一周,挑战升级。 按照我自己制定的计划,从今天开始要每天看两章了。一开始是建议按页数来算的,可是停在章节中间,不...
    水轻扬阅读 295评论 0 0