FAQs1.npm的package.json中的~和^~会匹配最近的小版本依赖包,比如~1.2.3会匹配所有1.2.x版本,但不包括1.3.0^会匹配最新的大版本依赖包,比如^1.2.3会匹配所有1.x.x的包,包括1.3.0,但不包括2.0.0。您可能还会在package.json中看到模块版本号前面既没有~也没有^如下所示:"moment":"2.4.0"上面是安装的模块指定的确切版本号。它是通过命令参数-E或--save-exact指定版本号来安装的。以上模块对应的具体安装命令:npminstall--save-exactmoment@2.4.02.npmoutdate和第三方工具npm-checknpmoutdate该命令会列出项目中所有过时的包,如下:推荐一个更强大的检查依赖包的工具npm-check,具有更强大的包分析能力,可以通过添加参数提供交互式的更新方式。有关详细信息,请参阅其文档。安装完成后,npm-check检查项目依赖,显示如下:3.dependenciesordevDependenciesoroptionalDependenciesdependencies(生产环境的依赖包目录)devDependencies(开发环境的依赖包目录)在项目的package.json中使用命令npminstall--savemoduel安装的模块会注册到dependencies目录下(npm5开始通过npminstall不加--save和npminstall--save都是部分安装和将自动将模块写入package.json依赖项。)npminstall--devmodule将安装模块并自动将其写入package.json中的devDependencies。当你克隆一个新项目并在项目根目录下执行npminstall时,dependencies和devDependencies中的所有依赖都会被同时安装。当你的项目在生产环境只需要安装dependencies中的依赖时,执行npminstall--production命令。(如果NODE_ENV环境变量配置为production,那么执行npminstall只会安装dependencies里面的包,安装完成后,可以使用npmls查看安装包。)加上--production标志(或者当NODE_ENV环境变量设置为生产),npm将不会安装devDependencies中列出的模块。另外,你可能还会看到类似这样的:"optionalDependencies":{"gulp":"^3.9.1"}optionalDependencies是你在使用npminstallnpminstall--save-optionalgulp是注册在optional中的模块包依赖项,可选包安装??可以通过在项目中执行npminstall--no-optional来跳过。Tips:当有package-lock.jsonnpminstall--no-optional时,你可能会发现可选模块仍然安装(在其issuepage上有讨论),此时你可能需要添加另一个参数来执行npminstall--no-optional--no-package-lock可以做到。4.npmconfig查看和管理npm的基本配置。npmconfigls-l可以通过npmconfiggetproxy查看是否设置了npmproxy。npmconfigsetregistryhttps://registry.npm.taobao.org换一个更快的淘宝源,解决无法安装模块或速度慢的问题。5.npmcache当您使用命令npmconfiggetcache时,您将获得本地npm缓存的完整路径。什么是npm缓存?可以先从npminstall的执行过程说起(这部分参考阮一峰先生的博客):发出npminstall命令npm从注册表中查询模块压缩包的URL下载压缩包,存放在~/.npm(本地npm缓存路径)目录,将压缩包解压到当前项目的node_modules目录下。实际上有两个副本保存在本地。一个是~/.npm目录下的压缩包,一个是node_modules目录下的解压代码。但是,在运行npminstall时,只会检查node_modules目录,而不会检查~/.npm目录。如果某个模块在~/.npm下有压缩包,但没有安装在node_modules目录下,npm还是会从远程仓库下载一个新的压缩包。文中提到的离线安装阮老师提到的npminstall--cache-min命令有很多缺点,自npm5.0.0--cache-min和--cache-max已被弃用。(#15666)在V5中重写了我们要使用缓存中已经备份的模块来实现模块离线安装的缓存机制。缓存将由npm全局维护,开发人员无需担心。离线安装时将不再尝试连接到网络,并且将进行回退尝试从缓存中读取,或者干脆失败。也就是说,如果你离线,npm将无缝地使用你的缓存。以下新参数命令是从npmv5.0.0版本翻译而来的新的--prefer-offline选项将使npm跳过任何条件请求(304检查)过时的缓存数据,并且仅当缓存中缺少某些内容时才使用新的--prefer-online选项将强制npm重新验证缓存数据(使用304检查),忽略任何过时的检查,并使用重新验证的新数据刷新缓存。新的--offline选项将强制npm使用缓存或退出。如果它尝试安装缓存中不存在的任何内容,它将报告ENOTCACHED错误。一个新的npmcacheverify命令将回收你的缓存,减少不需要的东西的磁盘使用,并对索引和内容进行全面的完整性验证。6.package-lock.json如果在有问题的项目中使用npmv5或以上版本,会有这样一个文件,详细记录了已安装模块的详细信息。确定当前安装包的依赖关系,以便在后续重新安装时产生相同的依赖关系,同时忽略项目开发过程中某些依赖关系已经发生的更新。当你想通过搜索引擎了解package-lock.json问题时,你可能会被“坑”这个词吸引,你可能看到过“如果手动修改package.json文件中已有模块的版本,直接执行npminstall不会安装新指定的版本,只能通过npminstallxxx@yy”更新,但这是V5.0.0的问题。现在如果在V5.4.2版本之后更改package.json,并且package.json和lock文件不一样,那么在执行npmi的时候,npm会根据包中的版本号和语义来下载最新的包,并且将其更新为锁。详见此知乎回答。其他常用命令npmls查看已安装的模块npmuninstall卸载模块npmupdate更新模块npmhelp查看命令的详细帮助npmversion查看模块版本npmview查看模块注册信息npmpublish发布模块npmadduser用户登录npminit初始化项目,并引导在项目文件夹下创建一个package.json文件npmroot查看包的安装路径
