摘要:
  在使用Hexo的过程中,会需要优化主题的显示,来达到自己想要的一个效果,Hexo有强大的插件系统,开发者能轻松扩展功能而不用修改核心模块的源码。在Hexo中有两种形式的插件:脚本(Scripts)和插件(Packages),我可能更倾向于使用插件,这种方式对源码的改动方式应该是最小的了,而本文主要就是先介绍最基础的npm包的发布和管理。

1.npm介绍

  npm is the world's largest software registry. Open source developers from every continent use npm to share and borrow packages, and many organizations use npm to manage private development as well.

  官网是这样介绍npm的,翻译过来就是,npm是世界上最大的软件注册中心。来自各个大洲的开源开发者都使用npm来共享和借用包,许多组织也使用npm来管理私人开发。简单来说,npm就是javascript的包管理工具,类似pythonpipnpm是和Node.js一起发布的,只要安装了Node.jsnpm也默认会被安装。

  那么npm可以用用来干什么呢?

  • 为你的应用调整代码包,或者合并它们。
  • 下载可以立即使用的独立工具。
  • 运行包而不使用npx下载。
  • 与任何地方的任何npm用户共享代码。
  • 将代码限制给特定的开发人员。
  • 创建组织来协调包维护、编码和开发人员。
  • 使用组织形式组建虚拟团队。
  • 管理多个版本的代码和代码依赖关系。
  • 当底层代码更新时,可以轻松地更新应用程序。
  • 发现解决同一难题的多种方法。
  • 找到其他正在处理类似问题和项目的开发人员。

相关文档:

npm主页 https://www.npmjs.com/
npm说明文档(英文) https://docs.npmjs.com/
npm说明文档(中文) https://www.npmjs.cn/
node主页 https://nodejs.dev/
node说明文档(英文) https://nodejs.dev/learn
node说明文档(中文) http://nodejs.cn/learn

2.npm的基本使用

2.1注册账号

  这个没什么可写的,进入官网,点击Sign Up按照提示进行注册即可,注册还是很简单的,注册完毕之后要记得会提示验证邮箱,这个时候注意验证就好了,不验证的话可能会有问题。

2.2npm安装与更新

  上边已经有所提及,npmNode.js是一起发布的,只要安装了Node.jsnpm也是自动安装了的。

  • 查看npmNode.js版本
shell
1
2
node -v  # 查看node版本
npm -v # 查看npm版本
  • 更新npm版本
shell
1
npm install npm@latest -g

2.3npm管理插件

  • 安装插件
shell
1
2
3
4
5
npm install packageName            # 本地安装,安装到项目目录下,不在package.json中写入依赖
npm install packageName -g # 全局安装,安装在Node安装目录下的node_modules下
npm install packageName --save # 安装到项目目录下,并在package.json文件的dependencies中写入依赖,简写为-S
npm install packageName --save-dev # 安装到项目目录下,并在package.json文件的devDependencies中写入依赖,简写为-D
npm install packageName@version --save # 安装指定版本

  可以通过以上命令来对插件进行安装,还有一种就是自己按照相应的语法写一个package.json文件,然后在该文件所在目录执行npm install即可安装package.json文件中的所有插件。

  我一般还是只在Hexo中使用该命令,所以npm install packageName --save命令使用的较多,另外就是npm 5之后版本默认会修改package.json,不再需要--save参数,也就是说,就算现在去掉该参数,再通过npm install命令依然可以安装相应插件。更多内容可以这里:npm-install

  • 卸载插件
shell
1
2
npm uninstall packageName      # 删除packageName模块
npm uninstall -g packageName # 删除全局模块packageName
  • 更新插件
shell
1
2
3
4
5
6
7
# 更新一个或多个模块,加上-g参数,表示更新全局的模块
npm update packageName
npm update packageName -g

# 更新时同时修改package.json文件,不要--save也没有问题
npm update packageName --save-dev # 在package.json文件的devDependencies中写入依赖
npm update packageName --save

2.4npm项目初始化

  由于我是针对hexo插件来使用npm,所以文件夹命名按照hexo的插件要求命名,hexo要求插件文件夹名称开头必须为 hexo-,如此一来 hexo才会在启动时载入否则 hexo将会忽略它。

  • 创建文件夹
shell
1
2
3
4
# 进入自己相应的文件夹,并创建npm项目文件夹
mkdir hexo-npm-test
# 进入创建的文件夹
cd hexo-npm-test
  • 初始化文件夹
shell
1
npm init

  使用该命令初始化时,会打开项目初始化向导,在命令行窗口会提示让自己输入各个参数,所有显示信息如下所示:

shell
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
32
33
34
35
36
$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help init` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (hexo-npm-test)
version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to E:\MyStudy\VScode\hexofiles\hexo-npm-test\package.json:

{
"name": "hexo-npm-test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}


Is this OK? (yes) yes

  该命令有一个参数--yes,若使用以下命令,则创建默认package.json文件,不需要自己在命令行输入,后续直接修改该文件即可。

shell
1
npm init --yes

  创建的文件信息如下,内容与不带参数创建的一致,看个人喜好选择要不要带参数吧。

json
1
2
3
4
5
6
7
8
9
10
11
12
{
"name": "hexo-npm-test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
  • package.json参数解读
参数 说明
name 项目的名称。
version 项目的版本,默认是从V1.0.0开始,可以自己修改,遵守“大版本.次要版本.小版本”的格式。
scripts 指定了运行脚本命令的npm命令行缩写;
例如:"test": "tap test/*.js" 就表示执行npm run test的时候所要执行的命令为 tap test/*.js 。
bin 指定各个内部命令对应的可执行文件的位置。
main 指定加载的入口文件,require('moduleName')就会加载这个文件。这个字段的默认值是模块根目录下面的index.js。
author 项目的作者。
repository 项目代码存放地方类型,如:git或svn。
keywords 项目关键字。
description 项目简介,字符串,方便在npm search中搜索。
license 许可证。
dependencies dependencies字段指定了项目运行所依赖的模块;devDependencies指定项目开发所需要的模块。
它们都指向一个对象,该对象的各个成员,分别由模块名和对应的版本要求组成,表示依赖的模块及其版本范围。
devDependencies

  dependenciesdevDependencies对应的版本可以加上各种限定,主要有以下几种:

指定版本:比如1.2.2,遵循“大版本.次要版本.小版本”的格式规定,安装时只安装指定版本。
波浪号(tilde)+指定版本:比如~1.2.2,表示安装1.2.x的最新版本(不低于1.2.2),但是不安装1.3.x,也就是说安装时不改变大版本号和次要版本号。
插入号(caret)+指定版本:比如ˆ1.2.2,表示安装1.x.x的最新版本(不低于1.2.2),但是不安装2.x.x,也就是说安装时不改变大版本号。需要注意的是,如果大版本号为0,则插入号的行为与波浪号相同,这是因为此时处于开发阶段,即使是次要版本号变动,也可能带来程序的不兼容。
latest:安装最新版本。

2.5npm项目发布与管理

2.5.1检查npm

  这里为什么需要这一步呢,是因为有的时候自己可能为了让下载速度更快,就把源给换成了taobao,这个源在首次登录的时候可能会有问题,需要处理一下。

shell
1
2
3
4
5
6
7
# 检查npm源
npm config get registry

# 配置npm源
# 原始下载源:https://registry.npmjs.org/
# 更换下载源:https://registry.npm.taobao.org
npm config set registry https://registry.npm.taobao.org

2.5.2本地登录npm

  首次发布项目,需要登陆npm,使用以下命令登录,输入命令之后,填写自己的用户名,密码和注册的邮箱即可,这里要注意淘宝镜像只是提供下载,如果要登陆发布自己的项目, 必须要切换到官方npm源。

shell
1
2
3
4
# 更换npm源为官方源
npm config set registry https://registry.npmjs.org/
# 本地登录npm
npm login

  如果不换回官方npm源的话,登陆的时候就会一直卡死,更换后我出现过因为网络问题导致报错了的,这种的问题不大,出现以下提示说明登陆成功。

shell
1
Logged in as qidaink on https://registry.npmjs.org/.

2.5.3发布项目

  若项目已经编写完成,那我们就可以发布自己的项目啦,版本发布命令如下。

shell
1
npm publish

  出现以下提示内容代表发布成功,之前验证完邮箱,这里还会有发布成功的邮件提醒。

shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
npm notice 
npm notice package: hexo-npm-test@1.0.0
npm notice === Tarball Contents ===
npm notice 288B package.json
npm notice === Tarball Details ===
npm notice name: hexo-npm-test
npm notice version: 1.0.0
npm notice package size: 285 B
npm notice unpacked size: 288 B
npm notice shasum: 6ec63a53a3c7461ab49dd287e01fa04127cca207
npm notice integrity: sha512-a46dY8gsp1b2h[...]yf9NfS5tmr7dg==
npm notice total files: 1
npm notice
+ hexo-npm-test@1.0.0

2.5.4更新本地项目版本并发布

  • 手动修改

  手动修改package.json文件中的版本号。

shell
1
"version": "1.0.0"
  • 命令修改
shell
1
npm version patch

  以上命令可以在之前的版本上自动加1,运行完毕后,会出现更新版本的版本号。

  • 发布新版本
shell
1
npm publish

  通过该命令就可以发布新的版本到自己的npm仓库中去,而且之前的版本也存在,也可以通过npm进行安装。

2.5.5撤销版本的发布

  若是我们版本发布错误,我们应该如何撤回已经发布的版本呢?可以通过以下命令进行项目的删除或者某一版本的删除。

shell
1
2
npm unpublish packageName --force   # 强制撤销,可以删除整个项目
npm unpublish packageName@version   # 可以撤销发布自己发布过的某个版本

  如下例子,输入版本撤销命令后,会显示撤销的版本,前边会有一个-,说明撤销成功,此时查看npm会发现,该版本已经消失。不过这样的话,若撤销的版本是新版本,通过命令更新版本的时候,会跳过撤销的版本直接进入下一个版本。

shell
1
2
$ npm unpublish hexo-npm-test@1.0.1 
- hexo-npm-test@1.0.1

2.5.6查看版本信息

shell
1
2
3
npm view packageName versions         # 查看历史版本信息(最多只能显示100条)        
npm view packageName versions --json  # 查看所有版本信息
npm view packageName version    # 查看最新版本信息