自己最近瞎捣鼓的一个东西在 GitHub 发布了v1.0.0版本,现在打算也放到npm上,使其使用起来更便捷

我要发布的这个npm包主要作用是方便前端开发,里面封装了一些我整理好的函数。由于是闲暇时刻写着玩儿的,所以它目前还比较简陋,感兴趣的朋友可以去GitHub上给个Star。

废话不多说,开整!

1. 初始化一个项目

本地项目文件夹的名字最好和我们要发布的npm包名称相同。

由于npm包名称不能重复,所以我们可以先前往npm官网查看名称是否已被抢注。比如我要发布的项目叫 BFUI,所以想把包命名为 bfui,经搜索,好家伙,被一个5年前的项目注册了。没办法,那就起名叫 bf-ui 吧。

在项目根目录打开终端,执行npm初始化:

1
npm init

一路回车即可,会在项目根目录生成一个 package.json 文件。

2. 开发并完善代码

在项目中完成代码的开发,比如写在 index.js 文件中

3. 完善package.json文件

这一步也可以在刚刚初始化项目的时候完成,看个人喜好。

  • name:包的名字,确保该名字是独一无二的
  • author:项目作者,可以写你的GitHub账号
  • contributors:代码的其他贡献者,格式为数组
    1
    2
    3
    4
    "contributors": [
    "zhangsan",
    "lisi"
    ]
  • version:包的版本,默认是1.0.0
  • description:包的描述,方便别人了解你的模块作用,搜索的时候也有用
  • keyword:这个挺重要,尽量用比较贴切的关键字作为这个包的索引,这样才能有更多的人搜索到你的包
  • homepage:项目主页 url。一般来说,我们打包的静态资源会部署在 CDN 上,为了让我们的应用知道去哪里加载资源,则需要我们设置一个根路径,这时可以通过 package.json 中的 homepage 字段设置应用的根路径。
  • bugs:填写一个 bug 提交地址或者一个邮箱,被你的模块坑到的人可以通过这里吐槽
  • license:你应该为你的开源代码模块制定一个开源协议,让用户知道他们有何权限来使用你的模块,以及使用该模块有哪些限制。MIT 是最少约束的选择;GPL 是最多约束的。如果是个人随意作品,建议 MIT 许可;如果是公司或者需要严格保护的开源产品,GPL。

    开源协议介绍

  • funding:在开源领域,资金是一个长期存在的问题。funding命令的作用是让维护 npm 的开发人员(为 Node.js 创建包)声明元数据,为有意愿的捐赠者指明捐赠平台。在 package.json 文件中添加了一个funding 字段, 可指向在线捐赠服务的 url,如 Patreon、Open Collective、GitHub Sponsors、License Zero 或者其他支付网站。
  • files:描述了将软件包作为依赖项安装时要包括的条目,默认值为["*"],这意味着它将包括所有文件。你还可以在包的根目录或子目录中提供 .npmignore 文件,以防止某些文件被发布。.npmignore 文件的工作原理与 .gitignore 一样。如果存在 .gitignore 文件,而缺少 .npmignore,则将改用 .gitignore 的内容。files字段内容会覆盖 .npmignore.gitignore 的内容。
  • main:入口文件,默认是index.js。main 字段是 package.json 中的另一种元数据功能,它可以用来指定加载的入口文件。假如你的项目是一个 npm 包,当用户安装你的包后,require(‘my-module’) 返回的是 main 字段中所列出文件的 module.exports 属性。当不指定 main 字段时,默认值是模块根目录下面的 index.js 文件。
  • browserslist:指定该模板供浏览器使用的版本。Browserify 这样的浏览器打包工具,通过它就知道该打包那个文件。
  • bin:用于将某些可执行 Javascript 文件公开给父包的字段。 此处列出的所有条目都可以通过$ PATH 获得。通俗点理解就是我们全局安装, 我们就可以在命令行中执行这个文件, 本地安装我们可以在当前工程目录的命令行中执行该文件。
  • repository:项目仓库地址
  • scripts:该字段用于列出在运行 npm/yarn run 时将要执行的小型 shell 脚本。请注意,包含:(冒号)的脚本是项目的全局变量,无论你当前的工作空间如何,都可以调用它们。最后,请注意,脚本总是相对于最近的工作空间(而不是 cmd)执行。
    1
    2
    3
    4
    5
    6
    "scripts": {
    "test": "jest",
    "build:dev": "webpack-cli --config ./webpack.dev.config.js",
    "build:test": "webpack-cli --config ./webpack.test.config.js",
    "build:pro": "webpack-cli --config ./webpack.pro.config.js"
    }
  • test command:测试命令

比如我这个项目的 package.json 文件大概是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
"name": "bf-ui",
"author": "Barry-Flynn",
"version": "1.0.0",
"description": "A growing front-end function assistant(前端功能小助手)",
"keywords": [
"javascript",
"css",
"ui",
"bf-ui",
"bfui"
],
"homepage": "https://github.com/Barry-Flynn/BFUI#readme",
"bugs": {
"url": "https://github.com/Barry-Flynn/BFUI/issues"
},
"license": "MIT",
"funding": {
"type": "QR-code",
"url": "https://docs.meta-code.top/BFUI/#/en-US/changelog#sponsor"
},
"files": ["*"],
"main": "BFUI.min.js",
"repository": {
"type": "git",
"url": "git+https://github.com/Barry-Flynn/BFUI.git"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
}
}

4. 添加LICENCE,说明开源协议

可到 SPDX License List 或者 Open Source Initiative 下载相应协议的模板。这里我选择的是MIT开源协议。

新建一个名为 LICENSE 的文件,并在里面粘贴进如下内容:

1
2
3
4
5
6
7
8
9
The MIT License (MIT)

Copyright (c) <year> <copyright holders>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

将上面的 <year><copyright holders> 修改为 对应的年份 和 版权拥有者名字

5. 添加 README.md 和 .gitignore

  • README.md 文件主要用于 该项目的一些说明,使用方法等。在一些npm包中的README.md中,还会看到一些好看的徽标信息。这些版本信息图标可以在 Shields 制作。
  • .gitignore 主要用于忽略不需要提交的文件更改。可以去 gitignore 下载对应的模板,然后自己修改修改。

6. 发布npm包

  1. 首先到 npm官网 上注册一个账号。注册的邮箱可能会被公开,登录时须使用邮箱收到的验证码。
  2. 在需要发布的项目文件中,终端输入 npm adduser,然后按照提示,输入对应的用户名,密码,邮箱,验证码。(这里需要注意,你的镜像必须是npm,而不是cnpm,可以使用nrm来管理你的镜像。)登录之后,可以终端输入npm whoami,如果出现你的名字,那就说明登录成功了。
  3. 最后输入 npm publish --access=public,即可发布成功。如果有报错,根据报错调整配置,比如包名被人占用就换个名字。(我遇到的报错在本文下方,可以往下翻用作参考)
  4. 在你的电脑上,直接 npm install 你的包名,来看看你的包是否发布成功了。当然,也可以在 npm官网 这里查找你发布的包。
  5. 如果你要更新你的 npm 包,记得修改 package.json 的版本号,而且一般比上一个版本要高一点,否则会报错。可以去了解一下版本号命名规范。

【发布npm包的报错】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
npm notice
npm notice package: bf-ui@1.0.0
npm notice === Tarball Contents ===
npm notice 13B .gitignore
npm notice 11.9kB BFUI-logo.png
npm notice 2.4kB BFUI.min.css
npm notice 6.6kB BFUI.min.js
npm notice 1.1kB LICENSE
npm notice 2.8kB README.md
npm notice 757B package.json
npm notice === Tarball Details ===
npm notice name: bf-ui
npm notice version: 1.0.0
npm notice filename: bf-ui-1.0.0.tgz
npm notice package size: 17.8 kB
npm notice unpacked size: 25.5 kB
npm notice shasum: 1816fbecbcb4e959e4363ea6269e3d57e0ed2c65
npm notice integrity: sha512-WavinTEWA+zkd[...]4nxfzFgvwTYBw==
npm notice total files: 7
npm notice
npm ERR! code E403
npm ERR! 403 403 Forbidden - PUT https://registry.npmjs.org/bf-ui - Package name too similar to existing package bfui; try renaming your package to '@barry-flynn/bf-ui' 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! C:\Users\10272\AppData\Local\npm-cache\_logs\2022-08-17T15_43_43_882Z-debug.log
  • 报错代码403: 禁止-放置 bf-ui。包名称与现有包bfui太相似;尝试将包重命名为“@barry-flynn/bf-ui”,并改为使用npm publish --access=public发布。

既然它让我改名并推荐改成 @barry-flynn/bf-ui,我就试了试能不能去掉横线还叫bfui,于是在package.json中把包名写成 @barry-flynn/bfui,没想到发布成功了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ npm publish --access=public
npm notice
npm notice package: @barry-flynn/bfui@1.0.0
npm notice === Tarball Contents ===
npm notice 13B .gitignore
npm notice 11.9kB BFUI-logo.png
npm notice 2.4kB BFUI.min.css
npm notice 6.6kB BFUI.min.js
npm notice 1.1kB LICENSE
npm notice 2.8kB README.md
npm notice 769B package.json
npm notice === Tarball Details ===
npm notice name: @barry-flynn/bfui
npm notice version: 1.0.0
npm notice filename: @barry-flynn/bfui-1.0.0.tgz
npm notice package size: 17.8 kB
npm notice unpacked size: 25.6 kB
npm notice shasum: fc4d8f4640978daba84c5eb9685e9a21d4f31a0d
npm notice integrity: sha512-7DbK2XdnWd1RB[...]xXUnJwlNUN+lQ==
npm notice total files: 7
npm notice
+ @barry-flynn/bfui@1.0.0

7. 发布Yarn包

【2022年08月19日】温馨提示:Yarn包无需手动发布,一段时间后会自动同步。以下关于发布Yarn包的内容可跳过阅读。

除了 npm,另一个常被使用的依赖包工具是 yarn

于是顺手也把 yarn 包发布一下吧,免得包名被占用啥的。

(1) 了解yarn

yarn是一个js包管理器,针对npm的缺陷改进的一个产品。

官网:https://yarnpkg.com/

中文文档官方地址:https://yarn.bootcss.com/

  • yarn优势:

    1. 速度快:并行安装、离线模式
    2. 安装版本锁定
    3. 更简洁的安装下载信息输出
    4. 多注册来源处理,防止安装包混乱
    5. 命令语法语义化改进,例如:yarn add/removenpm install/uninstall
  • 全局卸载:npm uninstall -g yarn

  • 全局安装:npm install -g yarn

  • 使用yarn安装项目依赖:yarn install 或者 yarn

  • 运行项目:yarn run serve

  • 查看版本:yarn -v

  • 查看镜像配置:yarn config get registry

  • 配置淘宝镜像:yarn config set registry https://registry.npm.taobao.org

  • 查看全局安装文件目录:yarn global dir

  • 环境变量配置(参考全局目录):C:\Users\Administrator\AppData\Local\Yarn\bin

(2) 发布yarn包

如果是单纯发布yarn包的话,前5步和本文发布npm包是几乎相同的,并且也需要第6步注册的npm账号。

所以直接在项目文件夹的终端里执行 yarn login 命令进行登录。运行此命令会提示你输入你在 npm registry 上注册的用户名和 email。但它不会向你索要密码,之后当你运行像 yarn publish 这种需要验证身份的命令时,你才必须输入密码。(如果输错,可以使用 yarn logout 你可以删除你的用户名和 email。)

  • 如果报下面的错,可以尝试不要用git bash面板,改成使用 cmd 或者 powerShell
    1
    2
    3
    4
    5
    $ yarn login
    yarn login v1.22.19
    error An unexpected error occurred: "Can't answer a question unless a user TTY".
    info If you think this is a bug, please open a bug report with the information provided in "E:\\BarryFlynn\\BFUI\\bfui\\yarn-error.log".
    info Visit https://yarnpkg.com/en/docs/cli/login for documentation about this command.

将准备工作完成后,就可以正式发布软件包啦,发布软件包的命令是 yarn publish。此时会要求我们输入要发布的新版本,不更改的话不用输入,直接回车就行:

1
2
3
4
5
E:\BarryFlynn\BFUI\bfui>yarn publish
yarn publish v1.22.19
[1/4] Bumping version...
info Current version: 1.0.0
question New version:

出现下方代码需要稍等片刻:

1
2
3
4
5
6
7
E:\BarryFlynn\BFUI\bfui>yarn publish
yarn publish v1.22.19
[1/4] Bumping version...
info Current version: 1.0.0
question New version:
[2/4] Logging in...
[3/4] Publishing...

有报错,“您不能在以前发布的版本1.0.0上发布”:

1
2
3
4
5
6
7
8
9
E:\BarryFlynn\BFUI\bfui>yarn publish
yarn publish v1.22.19
[1/4] Bumping version...
info Current version: 1.0.0
question New version:
[2/4] Logging in...
[3/4] Publishing...
error Couldn't publish package: "https://registry.yarnpkg.com/@barry-flynn%2fbfui: You cannot publish over the previously published versions: 1.0.0."
info Visit https://yarnpkg.com/en/docs/cli/publish for documentation about this command.

原来,通过 Yarn 发布的包会托管在 npm registry 上,用于全球分发。

所以,怪不得刚刚需要登录npm的账号。

那是不是…可以用 yarn 命令来安装 npm 发布的依赖包?但是我并没有在Yarn官网搜到刚刚在npm上发布的 @barry-flynn/bfui,所以?


这两天有事,过了两天发现已经可以在Yarn的官网也能搜索到那个包了,应该是同步起来有延迟。

并且在 Vue-Cli 可视化面板中也能够搜到 @barry-flynn/bfui 依赖包


【参考内容】:

[1]咸鱼老弟, 如何写一个npm包
[2]ikonan, package.json 详解
[3]HURRICANE_FAST, package.json 最全详解
[4]止无境之海, yarn的简单说明使用
[5]暖A暖, 发布Yarn包
[6]yarn, yarn publish

发布命令 yarn publish --access <public|restricted>
--access标志控制 npm 注册表是否将此包发布为公共包,或受限制。

[7]npm 包如何发布到yarn上