主要温习下npm知识,这篇不会很详细介绍npm的使用,而是记下认为有用的知识点。
package.json
name:
- 全部小写
- 单个单词,不能有空格
- 允许使用连字符和下划线
- bugs: issue地址
指定依赖类型
安装到生成依赖:
1 | npm install <package_name> [--save-prod] |
安装到开发依赖:
1 | npm install <package_name> --save-dev |
更新和检查更新
更新依赖:
1 | npm update |
检查过期包:
1 | npm outdated |
更新包版本
1 | npm version <update_type> |
update_type见下图。
语义化版本
当你的项目要分享给其他人时,你应该从1.0.0
版本开始(尽管有些项目没有遵循这一点)。
针对开发者
- 初次发布:1.0.0
- 修复bug等其他修改:1.0.1
- 增加不影响旧版本使用的功能时:1.1.0
- 增加不向下兼容的功能时:2.0.0
当升级版本号,下级的版本号要置为0
针对使用者
- Patch releases: 1.0 or 1.0.x or ~1.0.4
- Minor releases: 1 or 1.x or ^1.0.4
- Major releases: * or x
比如我们项目依赖jquery版本
^1.0.4
,当我们npm update
时,将会升级次要版本(Minor)到最新。
标签(dist-tag)
标签是对语义化版本的补充,使用它们来组织和标记不同版本的包。除了比semver编号更具人性可读性之外,标签还允许发布者更有效地分发他们的包。
打标签
1 | npm dist-tag add <pkg>@<version> [<tag>] |
发布标签
默认地,当我们运行npm publish
时将会自动打上latest
标签,如果你要发布其他名称的标签,比如:
1 | npm publish --tag beta |
安装标签
1 | npm install somepkg@beta |
因为dist-tag与semver共享相同的名称空间,所以请避免使用可能导致冲突的标记名称。最佳做法是避免使用以数字或字母“v”开头的标签。
理解包和模块之间的关系
Node.js和npm具有非常具体的包和模块定义,很容易混淆。我们将在这里讨论这些定义,使它们区别开来,并解释为什么某些默认文件以它们的方式命名。
概要
- 一个包是指被
package.json
描述的文件或目录。 - 一个模块是指可以被Node.js通过
require
加载的一些文件或目录。
什么是包
- a) 包含package.json文件描述的程序的文件夹。
- b) A gzipped tarball containing (a).
- c) A url that resolves to (b).
- d) A
@ that is published on the registry with (c). - e) A
@ that points to (d). - f) A
that has a latest tag satisfying (e). - g) A git url that, when cloned, results in (a).
什么是模块
- package.json包含main字段的文件的文件夹。
- 包含index.js文件的文件夹。
- 一个JavaScript文件。
大多数npm包都是模块
通常,加载Node.js程序中使用的npm包require,使它们成为模块。但是,并不要求npm包是一个模块!
某些包(例如cli包)仅包含可执行的命令行界面,并且不提供main在Node.js程序中使用的字段。这些包不是模块。
几乎所有的npm软件包都包含很多模块(因为它们加载的每个文件 require()都是一个模块)。
例如,如果您创建了一个文件,node_modules/foo.js然后有一个程序var f = require(‘foo.js’),它将加载该模块。但是,foo.js在这种情况下,它不是“包”,因为它没有package.json。
npm audit
npm audit 是 npm 6 新增的一个命令,可以允许开发人员分析复杂的代码并查明特定的漏洞。在刚刚发布的 npm 6.1.0 版本中,开发团队对该命令进行了完善。现在可使用 npm audit fix 子命令自动修复检测到的漏洞,而不必再自己进行跟踪和修复。
新版本针对 npm audit 还包括以下改进:
npm audit –json —— 新的子命令,用于以 JSON 格式打印报告
npm install 摘要输出中将包含审计软件包的数量
npm-audit-report@1.2.1 —— 对审计安装和输出格式进行了大幅调整,新格式更加紧凑,更符合 CLI 视觉风格,同时仍然提供所需的重要信息。
此外,npm 6.1.0 同样扩展了 npm init 命令的功能,新增对 git 包的支持,即 npm init
故障排除
- 更新node版本
- 更新npm版本
- 清除缓存:npm cache clean –force
- window上权限错误:
Error: ENOENT, stat 'C:\Users\<user>\AppData\Roaming\npm'
: 解决方法是确保C:\Users\\AppData\Roaming\npm存在并且可以使用普通用户帐户写入。
npm配置
npm从以下来源获取配置,按优先级顺序:
命令行
--foo bar
将会设置配置项foo值为bar,如果不传值,则设为true;--flag1 --flag2 -- bar
中flag1和flag2将被设为true,bar将作为命令行参数。
环境变量
以npm_config_/NPM_CONFIG_
开头的环境变量将会设置为配置项,如:npm_config_foo=bar
,将设置配置项foo的值为bar,没有給值的将设为true。
npmrc文件
这四个相关文件是:
- 当前项目下的配置文件(/path/to/my/project/.npmrc)
- 当前用户下的配置文件(默认是$HOME/.npmrc)
- 全局下的配置文件(默认是$PREFIX/etc/npmrc)
- npm的内置配置文件(/path/to/npm/npmrc)
查看npm当前配置
运行npm config ls -l
以查看npm内部的一组配置参数,如果未指定其他任何配置参数,则为默认值:
1 | ; cli configs |
查询简短语句
1 | -v: --version |
当前包的配置
1 | // package.json |
测试您的.npmignore或files配置是否有效
如果要在发布时仔细检查包中是否只包含您想要的文件,可以在npm pack本地运行命令,这将在工作目录中生成tarball,就像发布时一样。
链接包
npm link旨在安装开发包并实时查看更改,而无需继续重新安装。(当然,您需要重新链接或npm rebuild -g更新已编译的包。)
发布之前:确保您的包安装和工作
1 | npm install . -g |
那会告诉你它正在发挥作用。如果您只想创建指向工作目录的符号链接包,请执行以下操作:
1 | npm link |
要测试本地安装,请进入其他文件夹,然后执行以下操作:
1 | cd ../some-other-folder |
将其本地安装到该位置的node_modules文件夹中。
创建用户帐户
1 | npm adduser |
然后根据提示进行。
Semver语义化包的版本
安装:
1 | npm install --save semver |
示例:
1 | const semver = require('semver') |
package-lock.json
package-lock.json为npm修改node_modules树或的任何操作自动生成package.json。它描述了生成的确切树,以便后续安装能够生成相同的树,而不管中间依赖性更新。