npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

starwars-names-dothide

v1.3.0

Published

Get random Star Wars names

Downloads

5

Readme

StarWars Names

Build Status codecov.io

GitHub 怎么用?Issue 还能通过 commit 来同步关闭?版本号是怎么定义的?如何自动发行版本?Commit 还有公约和规范?怎样做持续构建?……

也许在工作中您会遇到诸如此类的问题,不论您是菜鸟还是老手,这篇文章也许都能让你在其中找到一些有价值可借鉴的东西,这是一个教我学会「如何编写一个 JS 开源库」的实践项目,同时也让我领悟了许多开源项目的工程管理方法和工具,包括 版本管理、测试编写、自动版本发行、代码提交公约、持续构建(CI)、提交前测试、测试覆盖率及其报告 等,总体感觉受益匪浅,在此对教程原文[1]表示感谢,并决定将视频中的大量知识通过写作分享给诸位,在学习过程中我也加入了一些自己的思考,将视频内容转换成了更通俗的语言,没时间看视频的朋友兴许可以瞧瞧这里,对于简单的技能可以跳过,相关技能的章节已做了电梯,可以直达进行阅读。如果您觉得本文有用,请您赏颗⭐️

它让我学会了以下 新技能(√)

  • 技能 1账户建立:建立 GitHub 及 npmjs 账号
  • 技能 2账户配置:配置 NPM,并构建第一个库
  • 技能 3代码提交:提交开源库至 GitHub 【技能 3.1】免密登录:无需每次输入密码登录 Linux 主机
  • 【技能 4】代码发布:发布到 NPM Repo
  • 【技能 5】版本管理1:发布一个发行版本(Release Version)至 GitHub
  • 【技能 6】版本管理2:发布一个发行版本至 NPM
  • 【技能 7】版本管理3:发布一个 beta 版本
  • 【技能 8】单元测试:利用 Mocha 和 Chai 建立单元测试
  • 【技能 9】自动版本发行:利用 semantic-release 自动化发行
  • 【技能 10】代码提交公约:利用 commitizen 编写提交公约
  • 【技能 11】持续构建(CI)1:利用 TravisCI 持续构建
  • 【技能 12】提交前测试:利用 ghooks 做提交前自动化测试
  • 【技能 13】测试覆盖率1:利用 Istanbul 做代码覆盖
  • 【技能 14】测试覆盖率2:添加代码覆盖率报告
  • 【技能 15】GH特效:在 README 中添加徽章
  • 【技能 16】ES6支持1:添加 ES6 支持
  • 【技能 17】ES6支持2使用 Mocha & Babel 对测试添加 ES6 支持
  • 【技能 18】持续构建(CI)2:Travis 上的限制分支构建

项目的名称叫 starwars-names,有两个非常简单的功能,但重点不在这里,重点是借助这样一个微型 JS 库(Micro JS Lib),向人们展示整个过程,使我们能应用到大型 JS 库(Huge JS Lib)中去:

  1. 列出星球大战人物名( all )
  2. 随机输出一个人物名( random() )

最终,你可以这样使用它:

starWarsNames = require('starwars-names');
console.log(starWarsNames.all);
// List All StarWars Names
[
  "4-LOM",
  "Aayla Secura",
  "Admiral Ackbar",
  ...

  "Zam Wesell",
  "Zayne Carrick",
  "Zuckuss"
]

console.log(starWarsNames.random());
// Output a random starWarsName
"Revan"

让我们开始吧,首先找个目录,建个文件夹并进入:$ mkdir starwars-names && cd $_

技能 1 账户建立

GitHub 账号作为新时代的必要装备散发着其迷人的光环,但是有账号和会用是两码事,所以这个光环能不能发挥作用取决于账号底下内容的丰富程度。看完这篇文章我相信会对 GitHub 账号有新的认识,至少对我而言是这样。此外,我们还需要建立 npmjs 账号,用于发布 NPM 包(最终我们的开源项目将能以 $ npm install starwars-names 的方式进行安装)。

GitHub 账户

访问 https://github.com/,注册 GitHub 账号,并新建代码库(+ New repository),名称填写为 starwars-names,并填写描述后得到如下页面的代码:

echo "# starwars-names" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin [email protected]:<yourUserName>/starwars-names.git
git push -u origin master

在项目目录中直接执行以上代码,进行首次提交,然后回头看项目的页面就编程代码了。

NPM 账户

访问 https://www.npmjs.com/,注册 NPM 账号。

技能 2 账户配置

设置 GitHub 环境变量

其实主要有以下几项设置:

# 设置账户信息
$ git config --global user.name '<yourName>'
$ git config --global user.email '<yourEmail>'

# 设置命令别名
$ git config --global alias.st status
$ git config --global alias.cm commit
$ git config --global alias.co checkout
...

设置后,输入 $ cat ~/.gitconfig 可以查看设置情况

设置 npm 环境变量

由于我们后面要做 $ npm init 来生成 package.json 文件,但文件中的许多变量设置可以通过 npm 环境变量来设置,以省去每次输入的麻烦。我们去 https://docs.npmjs.com/misc/config 找到 init- 开头的四个变量

$ npm set init-author-name "<yourName>"
$ npm set init-author-email "<yourEmail>"
$ npm set init-author-url "https://github.com/<yourUserName>"
$ npm set init-license "MIT"
# 关于 license 选择可以参看这篇博客(http://blog.jobbole.com/44175/)

# 然后在本地添加你的账号
$ npm adduser
Username: # 输入 NPM 账户名
Password: # 输入密码
Email: (this IS public) # 输入你的邮箱(会公开)

没有 npm 命令?去 NodeJS 上下载 Node

设置后,输入 $ cat ~/.npmrc 可以查看设置情况

初始化 package.json

接着执行 $ npm init

...
Press ^C at any time to quit.
name: (starwars-names) # 默认回车
version: (1.0.0) # 默认回车
description: Get random StarWars Names
entry point: (index.js) # 建议改为 src/index.js
test command: # 暂无先留空
git repository: (https://github.com/<yourUserName>/starwars-names.git) # 提示你的 GitHub 库,回车
keywords: starwars random
license: (MIT) # 默认回车
... # 最后它会让你确认文件内容,并询问
Is this ok? (yes) # 回车后将在项目目录中建立 package.json

增加第三方依赖库

由于刚才我们设置了 enter point,所以先建文件夹和 index.js 文件:$ mkdir src && touch src/index.js 我们的项目功能需要引用另一个库 unique-random-array,在此我们正好学习引用依赖(Adding an Dependency),因此需要先安装这个库:

$ npm install --save unique-random-array 

至此,文件结构如下:

starwars-names/               * 项目目录
├── node_modules/             * Node 依赖目录
│   └── unique-random-array/  * unique-random-array 依赖库
│       └── ...
├── src/                      * 代码目录
│   └── index.js              * 项目主文件
├── package.json              * NPM 配置文件
└── README.md                 * README 文件

编写第一个库文件

在编辑 index.js 之前还需要创建一个数据文件 starwars-names.json,它的内容如下(已简化):

[
  "4-LOM",
  "Aayla Secura",
  "Admiral Ackbar",
  "Admiral Thrawn",
  // ...
  "Zam Wesell",
  "Zayne Carrick",
  "Zuckuss"
]

接着编辑 index.js 文件,它将会是这个样子:

// src/index.js
var uniqueRandomArray = require('unique-random-array');
var starWarsNames = require('./starwars-names.json');

module.exports = {
  all: starWarsNames,
  random: uniqueRandomArray(starWarsNames)
}

保存后,如果我们想做个快速的测试,可以打开 node 命令行工具: $ node

// node cli
> var lib = require('./src/index.js');
> lib.all
[
  "4-LOM",
  "Aayla Secura",
  "Admiral Ackbar",
  "Admiral Thrawn",
  ...
  "Zam Wesell",
  "Zayne Carrick",
  "Zuckuss"
]
> lib.random()
"Sebulba"
> lib.random()
"Jarael"

至此,我们完成了 NPM 的配置,并建立了第一个库文件,当前项目文件如下:

starwars-names/               * 项目目录
├── node_modules/             * Node 依赖目录
│   └── unique-random-array/  * unique-random-array 依赖库
│       └── ...
├── src/                      * 代码目录
│   ├── index.js              * 库主文件
│   └── starwars-name.json    * 数据文件
├── package.json              * NPM 配置文件
└── README.md                 * README 文件

技能 3 代码提交

这时,我们可以将现有的代码提交至 GitHub,不过在提交前我们需要先将你的机器跟 GitHub 做账号绑定(Adding SSH Keys to GitHub):

  • 首先打开 GitHub 网站并登陆,在右上角下拉选项中找到 Settings,然后找到左侧 SSH Keys,这时可以点击(New SSH Key)来添加你的钥匙。
  • 输入 Title # 给钥匙起个名字,比如我的是:Jack's MBP
  • 输入 Key # 这里有你想要的 Key 生成方法(https://help.github.com/articles/generating-an-ssh-key/)

保存后你的机器无需每次都输入账户密码即可提交代码了。

免密登录(SSH Key)

这个过程就如免密登录 Linux 主机的方法一样,这里简单扯几句。如果你希望访问某台 Linux 主机 / 服务器时不需要每次都输入密码,可以在该台机器上做如下操作:

  • 建立 authorized_keys 文件 $ touch ~/.ssh/authorized_keys
  • 然后将你刚才的 SSH Key 粘贴到这个文件里即可
  • 当然访问权限取决于你的账户权限

这时你再用 $ ssh <yourAccount>@<yourHost> 时就能直接登录了

代码提交

接着说代码提交,在提交前我们注意到 node_modules/ 这个文件夹是不需要做代码管理的,它是 npm 通过 package.json 文件自动生成的,因此我们可以将它忽略(使用 .gitignore文件),在项目根目录添加 .gitignore 文件,并加入一行 node_modules 即可。

  • 我们先运行一下: $ git status,确认一下需要被提交的文件
  • 然后将所有文件加入工作区: $ git add .
  • 接着执行提交命令: $ git commit -am '完成了功能 all 和 random'
  • 最后推送到 GitHub: $ git push

至此,我们完成了代码提交,项目结构如下:

starwars-names/               * 项目目录
├── node_modules/             * Node 依赖目录
│   └── unique-random-array/  * unique-random-array 依赖库
│       └── ...
├── src/                      * 代码目录
│   ├── index.js              * 库主文件
│   └── starwars-name.json    * 数据文件
├── .gitignore                * 登记 Git 代码忽略内容
├── package.json              * NPM 配置文件
└── README.md                 * README 文件

教程原文(Source)

[1] 《How to Write an Open Source JavaScript Library》 by Kent C. Dodds