Tips
- 使用
-S
和-D
代替--save
和--save-dev
。 - 锁定版本号,去删除 -S 和 -D 为你添加的那些 ^ 记号。它们非常危险,因为它们允许 npm install(或简写为 npm i)从 npm 库中拉取最新的小版本(语义化的版本号中的第2个数)。比如从 v6.1.0 到 v6.2.0 就是一个小版本发布。锁定版本号,最好使用 shrinkwrap:npm shrinkwrap 创建一个包含依赖的具体版本的新文件。
- 手动添加环境变量,防止系统环境变量影响 npm 命令执行。通过
npm run build --production=true
或者npm run build --production=false
来覆盖掉可能存在的系统环境变量。 - 增加依赖包时记得加上
-D
或者-S
,大写 D 和 大写 S。
npm 使用注意点
注意点一 ./node_modules/.bin
npm官方文档对npm-run-script的描述:
In addition to the shell’s pre-existing
PATH
,npm run
addsnode_modules/.bin
to thePATH
provided to scripts.
也就是说,npm会将./node_modules/.bin
中的命令加载到bash,可以直接调用执行。还有一点是:如果不使用./node_modules/.bin
的话,只需要在npm安装的时候加上--no-bin-links
参数,例如:npm i --no-bin-links
。
一些npm包通常会提供实用的命令行脚本,例如:rimraf。安装完rimraf之后,我们可以在./node_modules中看到如下:
➜ testDir tree node_modules -a
node_modules
├── .bin
│ └── rimraf -> ../rimraf/bin.js # 注意:这里是软链接文件, rimraf指向./node_modules/rimraf/bin.js
└── rimraf
├── LICENSE
├── README.md
├── bin.js
├── package.json
└── rimraf.js
2 directories, 7 files
然后在package.json
中的scripts
配置调用代码:
{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"run-rimraf": "rimraf ./someDirectoryOrFile"
},
"author": "Robin Chen> (https://robinchen.me)",
"license": "MIT",
"dependencies": {},
"devDependencies": {
"rimraf": "^2.6.1"
}
}
接着执行npm run run-rimraf
即可调用rimraf
,结果如下:
➜ test npm run run-rimraf
> test@1.0.0 run-rimraf /Users/robin/Desktop/fedev/test
> rimraf ./someDirectoryOrFile
SemVer(语义化版本)
Semantic Versioning 2.0.0(语义化版本)
contents below are summarized from SemVer: A Primer.
All packages published to npm are assumed to follow SemVer semantics.
The concept of SemVer ranges as used by npm was inspired by Bundler, the npm of the Ruby ecosystem. For a Ruby application, SemVer ranges have a greater impact than they do in Node.js.
In Ruby, as in many other software platforms, only a single, global version of a gem (package) can be loaded throughout an entire application.
SemVer ranges exist to permit newer versions of a package to be automatically installed automatically.
The major version 0 is supposed to be reserved for “initial development”, where “anything may change at any time”, so the “patch” and “minor, non-breaking changes” essentially have no meaning.
Thankfully fixed versioning is not widespread.
SemVer is an idealist that simply ignores the fallibility of humans—consumers are entirely at the mercy of package whether authors follow SemVer properly.
SemVer is a tool for development only.
npm & SemVer
npm 的包的版本号使用 SemVer 来进行命名,开发者在发布和更新 npm 包的时候,npm 默认这些包遵守了 SemVer 的命名规范。而实际上,并所有的包的版本号都遵循 SemVer 规范。
这时候,我们在使用 npm 包的时候就存一定的风险。通过 npm-shrinkwrap 命令可以锁住让项目的依赖包版本,从而解决了 npm 依赖包在语义化版本机制下潜在的开发风险。
执行 npm shrinkwrap
命令前必须确保以下两点:
package.json
中的所有依赖包已经被正确安装;- node_modules 中不存在多余的依赖包(未在
package.json
中列出的依赖包)。
接着执行npm shrinkwrap
命令之后,会生成一个 npm-shrinkwrap.json
配置文件。之后每次使用 npm install
命令安装依赖时,npm 就会先去判断 npm-shrinkwrap.json
是否存在以及其有效性。而 package.json
中有的包在 npm-shrinkwrap.json
不存在,这些包就通过 npm 通常行为进行安装。
SemVer 会给渐进式的开发带来很多的好处,在非必要的情况下,尽量不要使用 npm shrinkwrap
。
使用 npm shrinkwrap
的情况:
- 需要锁住某个因为不遵守 SemVer 规范而经常出问题的依赖包。
- 需要手动修改某些包的安装行为(依赖包的路径、依赖包版本等)。可以修改
npm-shrinkwrap.json
中的某个包的resolved: "https://registry.npmjs.org/B/-/B-1.0.1.tgz"
下载路径到指定的 URI 上。 - 项目维护较少,需要保持依赖稳定。
Related
- What is the difference between Bower and npm? - npm is for Node.js modules, but works for front-end also and solves dependency conflicts without nesting deoendencies, Bower is created solely for the front-end and uses a flat dependency tree.
- Nested Dependencies - Insight into why node_modules works the way it does.
- What’s the difference between dependencies, devDependencies and peerDependencies in npm package.json file? - dependencies are required to run, devDependencies only to develop.
- Awesome npm resources and tips
- One-line node modules
- yarn 的出现解决了 npm 的几个头疼的问题,yarn 增加了离线包缓存、保证不同环境下安装的一致性、安装过程请求失败自动重试等特性来提供一个快速、可信赖、安全的依赖管理方式。
Robin on February 16, 2017