Robin的主页

Tips

  1. 使用 -S-D 代替 --save--save-dev
  2. 锁定版本号,去删除 -S 和 -D 为你添加的那些 ^ 记号。它们非常危险,因为它们允许 npm install(或简写为 npm i)从 npm 库中拉取最新的小版本(语义化的版本号中的第2个数)。比如从 v6.1.0 到 v6.2.0 就是一个小版本发布。锁定版本号,最好使用 shrinkwrap:npm shrinkwrap 创建一个包含依赖的具体版本的新文件。
  3. 手动添加环境变量,防止系统环境变量影响 npm 命令执行。通过 npm run build --production=true 或者 npm run build --production=false 来覆盖掉可能存在的系统环境变量。
  4. 增加依赖包时记得加上 -D 或者 -S,大写 D 和 大写 S。

npm 使用注意点

注意点一 ./node_modules/.bin

npm官方文档对npm-run-script的描述:

In addition to the shell’s pre-existing PATH, npm run adds node_modules/.bin to the PATH 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 命令前必须确保以下两点:

  1. package.json 中的所有依赖包已经被正确安装;
  2. 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 的情况:

  1. 需要锁住某个因为不遵守 SemVer 规范而经常出问题的依赖包。
  2. 需要手动修改某些包的安装行为(依赖包的路径、依赖包版本等)。可以修改 npm-shrinkwrap.json 中的某个包的 resolved: "https://registry.npmjs.org/B/-/B-1.0.1.tgz" 下载路径到指定的 URI 上。
  3. 项目维护较少,需要保持依赖稳定。


Robin on February 16, 2017

- - - - - -
written by 陈烨彬 Robin Chen , and published under (CC) BY-NC-SA.