# 1. --save--save-dev 的区别

msbuild包为例

  1. npm install --save
  • 会把msbuild包安装到node_modules目录中
  • 会在package.jsondependencies属性下添加msbuild
  • 之后运行npm install命令时,会自动安装msbuildnode_modules目录中
  • 之后运行npm install --production或者注明NODE_ENV变量值为production时,会自动安装msbuildnode_modules目录中
  1. npm install --save-dev
  • 会把msbuild包安装到node_modules目录中
  • 会在package.jsondevDependencies属性下添加msbuild
  • 之后运行npm install命令时,会自动安装msbuildnode_modules目录中
  • 之后运行npm install --production或者注明NODE_ENV变量值为production时,不会自动安装msbuildnode_modules目录中

--save--save-dev的区别在于,--save安装的包,会被引入到我们最终输入的代码中,也就是最终会在用户浏览器执行的包,比如(jqueryvue)。 --save-dev安装的包只会在开发者的开发环境上执行,用于协助开发者的开发的,比如(webpackbabel)。

# 2. 关于cnpm

因为npm安装插件是从国外服务器下载,受网络影响大,可能出现异常,如果npm的服务器在中国就好了,所以我们乐于分享的淘宝团队干了这事。来自官网:“这是一个完整npmjs.org镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。”

  • 官方网址:http://npm.taobao.org
  • 安装:命令提示符执行npm install cnpm -g –registry=https://registry.npm.taobao.org
  • 注意:安装完后最好查看其版本号cnpm -v或关闭命令提示符重新打开,安装完直接使用有可能会出现错误

注:cnpmnpm用法完全一致,只是在执行命令时将npm改为cnpm

# 3. cnpmnpm的区别

  • cnpm是扁平化结构,把依赖都展开
  • npm是树形结构,一层一层。
  • 打包时cnpm慢

# 4. 设置 npm 的 registry 的几种方法

  1. 临时使用
npm --registry https://registry.npm.taobao.org install express
  1. 持久使用
npm config set registry https://registry.npm.taobao.org

配置后可通过下面方式来验证是否成功

npm config get registry 或  npm info express
  1. 通过cnpm使用
npm install -g cnpm --registry=https://registry.npm.taobao.org

# 5. prepack:“npm run build"的作用

package.json中的命令,加上pre就可以在该条命令前执行,比如prepack:“npm run build"。同理,加上post就可以在该条命令之后执行。

# 6. package-lock.json的作用

package-lock就是锁定安装时的包版本号,需要上传到git上,以保证其他人在install时候,大家的依赖版本相同。

它和package.json的区别在于(举个栗子):

"dependencies": {
  "@types/node": "^8.0.33",
}

这里的^向上尖号是定义向后(新)兼容依赖,如果types/node版本是超过8.0.33,并且是在大版本(8)上相同,就允许下载最新的types/node包。同一个大版本不同版本号之间存在差异,导致依赖库包行为特征有时候不兼容。

package.json文件只能锁定大版本即版本号的第一位,不能锁定后面的小版本,你每次npm install时候拉取的该大版本下面最新的版本,可能有些人之前就踩过类似的坑。

package-lock.json就是来解决包锁定不升级问题的。

如果要升级package-lock.json里面的库包,怎么操作呢?

npm install XXX@x.x.x 

注意: cnpm install的时候,就算你项目中有package-lock.json文件,cnpm也不会识别,仍会根据package.json来安装。

# 7. 版本号

使用 npm 下载和发布代码时都会接触到版本号。npm 使用语义版本号来管理代码,语义版本号分为 X.Y.Z 三位,分别代表主版本号、次版本号和补丁版本号。当代码变更时,版本号按以下原则更新。

  • 如果只是修复bug,需要更新Z位。
  • 如果是新增了功能,但是向下兼容,需要更新Y位。
  • 如果有大变动,向下不兼容,需要更新X位。

版本号中的“~” 和 “^”

  • ~1.2.2:表示安装1.2.x的最新版本(不低于1.2.2),但是不安装1.3.x,也就是说安装时不改变主版本号和次版本号。
  • ˆ1.2.2:表示安装1.x.x的最新版本(不低于1.2.2),但是不安装2.x.x,也就是说安装时不改变主版本号。需要注意的是,如果主版本号为0,则 “^” 和 “~” 行为相同,这是因为此时处于开发阶段,即使是次版本号变动,也可能带来程序的不兼容。
  • 1.2.2:表示安装1.2.2版本,使用 npm update 命令时不会更新此类包

# 8. npx常见用处

  1. 调用项目内部安装的模块 npx 的原理很简单,就是运行的时候,会到node_modules/.bin路径和环境变量$PATH里面,检查命令是否存在。

  2. 避免全局安装模块 比如,create-react-app这个模块是全局安装,npx 可以运行它,而且不进行全局安装。

# 9. npx作用

  1. 避免全局安装模块

    • 将create-react-app下载到临时目录,使用以后再删除。所以每一次执行npx create-react-app都会重新下载create-react-app
  2. 调用项目内部安装的模块

    • 比如安装了mocha,不可以在命令行中直接输入mocha,但是可以在package.json中新建script,比如:test: mocha --version
    • 若使用npx,就可以使用mocha命令了,如npx mocha --version

# 9.1. npm run的过程

每次npm run的时候都会新建一个shell,在shell中执行指定的脚本命令。shell会将node_modules/bin子目录加入path变量,执行结束后,再将path变量恢复原样。这样就可以调用内部的命令了。

# 10. 【错误处理】npm WARN checkPermissions Missing write access to /usr/local/lib/node_modules

这个问题的出现并不是管理员权限的问题,而是之前安装失败了,这个文件已经存在了,再次安装无法覆盖写入的问题。

  1. cnpm试试
  2. 删除重新安装