转自fcc, https://medium.freecodecamp.org/how-to-make-a-beautiful-tiny-npm-package-and-publish-it-2881d4307f78 ,
译文掘金: https://juejin.im/post/5c26c1b65188252dcb312ad6?utm_source=gold_browser_extension
一个 npm 模块 只 需要包含一个带有 name 和 version 属性的 package.json 文件。
步骤 1:npm 账户
你需要一个账号。这是流程的一部分。
https://www.npmjs.com/signup
步骤 2:登录
打开终端然后输入:
npm adduser
复制代码你也可以使用下面的命令:
npm login
复制代码这两个选一个跟着你混到死吧。
你会得到一个让你输入username、password 和 email的提示。把它们填在相应的位置吧!
你会得到类似下面的提示:
Logged in as bamblehorse to scope @username on registry.npmjs.org/.
棒极啦!
开始开发一个包
首先我们需要一个文件夹来装我们的代码。用一个你喜欢的方式随便建一个。我把我新建的包叫做 tiny 因为它真的很小。我为那些不熟悉命令行的人提供些新建相关的终端命令。
md tiny
在新建的文件夹中,我们需要 package.json 文件。如果你用过 Node.js — 那你肯定见过这个文件。这是一个 JSON 文件,它包含了你的项目信息以及众多的配置项。在本文中,我们只需关注其中的两项。
cd tiny && touch package.json
发布:第一次尝试
为了发布你的 npm 包,你需要执行规定好的命令:npm publish。
所以我们在创建好的包含空 package.json 的文件夹中试一下:
npm publish
报错:
npm ERR! file package.json
npm ERR! code EJSONPARSE
npm ERR! Failed to parse json
npm ERR! Unexpected end of JSON input while parsing near ''
npm ERR! File: package.json
npm ERR! Failed to parse package.json data.
npm ERR! package.json must be actual JSON, not just JavaScript.
npm ERR!
npm ERR! Tell the package author to fix their package.json file. JSON.parse
发布:第二次挣扎
我们先在 package.json 文件中给我们的包起个名字吧:
{
"name": "@bamlehorse/tiny"
}
复制代码你可能注意到了,我把我的 npm 用户名加到了开头。
这样做的意义是什么呢?
通过使用 @bamblehorse/tiny 代替 tiny,我们会创建一个在我们用户名 scope 下的一个包。这个叫做 scoped package。它允许我们将已经被其他包使用的名称作为包名,比如说,tiny 包 已经在 npm 中存在。
你可能在一些著名的包中见过这种命名方法,比如来自 Google 的 Angular。它们有几个 scoped packages,比如 @angular/core 和 @angular/http。
超级酷,对吧?
我们试着第二次发布我们的包:
npm publish
复制代码这次的报错信息少多了 — 有进步。
npm ERR! package.json requires a valid “version” field
复制代码每个 npm 包都需要一个版本,以便开发人员在安全地更新包版本的同时不会破坏其余的代码。npm 使用的版本系统被叫做 SemVer,是 Semantic Versioning 的缩写。
不要过分担心理解不了相较复杂的版本名称,下面是他们对基本版本命名的总结:
给定版本号 MAJOR.MINOR.PATCH,增量规则如下:
MAJOR 版本号的变更说明新版本产生了不兼容低版本的 API 等,
MINOR 版本号的变更说明你在以向后兼容的方式添加功能,接下来
PATCH 版本号的变更说明你在新版本中做了向后兼容的 bug 修复。
表示预发布和构建元数据的附加标签可作为 MAJOR.MINOR.PATCH 格式的扩展。
https://semver.org/
发布:第三次尝试
我们将要定义我们 package.json 中包的版本号:1.0.0 — 第一个主要版本。
{
"name": "@bamblehorse/tiny",
"version": "1.0.0"
}
复制代码开始发布吧!
npm publish
npm ERR! publish Failed PUT 402
npm ERR! code E402
npm ERR! You must sign up for private packages : @bamblehorse/tiny
我来解释一下。
Scoped packages 会被自动发布为私有包,因为这样不但对我们这样的独立用户有用,而且它们也被公司用于在项目之间共享代码。如果我们就发布这样一个包的话,那我们的旅程可能就要在此结束了。
我们只需改变下指令来告诉 npm 我们想让每个人都可以使用这个模块 — 不要把它锁进 npm 的保险库中。所以我们执行如下指令:
npm publish --access=public
Boom!
+ @bamblehorse/tiny@1.0.0
重构一下
如果我们想成为一个严谨的开发者,并且让我们的包得以广泛使用,那我们就需要向别人展示我们的代码同时也要让他们明白怎样使用我们的包。一般我们通过将代码放在公共平台并添加描述文件来实现。
我们也需要一些代码来实现。
实话说。
我们至今还没有写任何代码呢。
GitHub 就是一个放代码的好地方。 先建一个 新的仓库。
module.exports = function tiny(string) {
if (typeof string !== "string") throw new TypeError("Tiny wants a string!");
return string.replace(/\s/g, "");
};
一个 简易 的方法,用来移除字符串中的空格。
所有 npm 包都需要一个 index.js 文件。这是包的入口文件。随着复杂度升高,你可以采用不同的方式来实现它。
我们应该更新我们的迷你 package.json 文件并在 readme.md 文件中添加一些指令。
不然就没人知道怎样使用我们漂亮的代码啦。
package.json
{
"name": "@bamblehorse/tiny",
"version": "1.0.0",
"description": "Removes all spaces from a string",
"license": "MIT",
"repository": "bamblehorse/tiny",
"main": "index.js",
"keywords": [
"tiny",
"npm",
"package",
"bamblehorse"
]
}
解释一下!
我们添加了如下属性:
description:包的简介
repository:适合写上 GitHub 地址 — 所以你可以写成这种格式 username/repo
license:这里是 MIT 认证
main:包的入口文件,位置在文件夹的根目录
keywords:添加一些关键词更容易使你的包被搜索到
开始发布我们的棒棒的包吧。
版本
首先,我们用 npm version 命令来升级下包的版本。
这是一个主版本,因此我们输入:
npm version major
它会输出:
v2.0.0
发布!
让我们运行我们最喜欢的命令吧:
npm publish
完成:
+ @bamblehorse/tiny@2.0.0
一个酷酷的东西
Package Phobia 可以为你的包提供一个很棒的摘要。您也可以在 Unpkg 等网站上查看包内的文件。