一篇NPM小记

常见问题

1.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 来指定版本号安装的。上述模块对应的精确安装命令:npm install --save-exact moment@2.4.0

2.npm outdate与第三方工具npm-check

npm outdate此命令会列出项目中所有已经过时的包,像下面一样:

image

推荐使用检查依赖包更强大的一个工具 npm-check,更强大分析包的能力以及可以通过加上参数提供交互式更新方式,详情请参考其文档说明。安装完成后npm-check检查项目依赖包,展示像下面一样:

image

3.dependencies or devDependencies or optionalDependencies

dependencies(生产环境的依赖的包目录)devDependencies(开发环境的依赖包目录)

在项目的 package.json 使用命令 npm install --save moduel安装的模块会注册到 dependencies 目录中去(npm 5 开始 通过npm install不加--save 和npm install --save一样 都是局部安装并会把模块自动写入package.json中的dependencies里。)

npm install --dev module 并会安装模块并自动写入package.json中的 devDependencies 里。

当你 clone 下来了一个新项目在项目根目录下执行npm install的时候是会同时安装 dependencies 和 devDependencies中的所有依赖。当你的项目需要在生产环境中只需要安装 dependencies 中的依赖时,执行的是npm install --production命令。(如果配置了NODE_ENV环境变量为production,那么执行npm install就只安装dependencies里面的包。安装完后可以用npm ls查看安装的包的情况。)

With the --production flag (or when the NODE_ENV environment variable is set to production), npm will not install modules listed in devDependencies.

此外,你还有可能看到形如:

"optionalDependencies": {
    "gulp": "^3.9.1"
  }

optionalDependencies 是你在使用npm install npm install --save-optional gulp是所注册在可选依赖里的模块包,在项目执行npm install --no-optional就可以跳过可选包安装。

Tips : 在存在 package-lock.json 时npm install --no-optional你可能会发现依旧装上了可选模块,(它的issue页讨论),此时你可能还要加上另外一个参数执行npm install --no-optional --no-package-lock才能如愿。

4.npm config

查看和管理npm的基础配置。npm config ls -l

可以通过npm config get proxy查看你是否设置了npm 的代理。
npm config set registry https://registry.npm.taobao.org改成更快的淘宝源,解决出现安装不了模块或者速度慢的问题。

5.npm cache

当你使用命令 npm config get cache命令时 你会得到你的本地 npm 缓存的完整路径,npm 缓存是什么呢,可以先从npm install的执行过程说起(此部分参考阮一峰老师的博客):

  1. 发出npm install命令
  2. npm 向 registry 查询模块压缩包的网址
  3. 下载压缩包,存放在~/.npm(本地NPM缓存路径)目录
  4. 解压压缩包到当前项目的node_modules目录

实际上说一个模块安装以后,本地其实保存了两份。一份是~/.npm目录下的压缩包,另一份是node_modules目录下解压后的代码。但是,运行npm install的时候,只会检查 node_modules 目录,而不会检查~/.npm目录。如果一个模块在~/.npm下有压缩包,但是没有安装在node_modules目录中,npm 依然会从远程仓库下载一次新的压缩包。

阮老师在当时文中提到的离线安装时所说的有很多弊端的npm install --cache-min命令已经在npm 5.0.0开始被 deprecated 了

--cache-min and --cache-max have been deprecated. (#15666)

我们想利用已经在缓存中之前已经备份的模块实现离线模块安装的的 cache 机制已经在V5的时候重写了,缓存将由 npm 来全局维护不再需要开发人员操心,离线安装时将不再尝试连接网络,而是降级尝试从缓存中读取,或直接失败。就是如果你 offline ,npm将无缝地使用您的缓存。以下新增参数命令翻译自npm v5.0.0的release

  • 一个新的--prefer-offline选项将使npm跳过任何有条件的请求(304检查)过时的缓存数据,并且只有在缓存中丢失了某些内容时才能访问网络
  • 一个新的--prefer-online选项,它将强制 npm 重新验证缓存数据(使用304次检查),忽略任何过时检查,并用重新验证的新数据刷新缓存。
  • 一个新的 --offline 选项将强制npm使用缓存或退出。如果试图安装的任何内容尚未存在于缓存中,它将报 ENOTCACHED错误。
  • 一个新的npm cache verify命令,它将对你的缓存进行辣鸡回收,减少不需要的东西占据的磁盘使用量,并且会对索引和内容进行全面的完整性验证。

6.package-lock.json 问题

项目中如果是用 npm V5 以上版本就会有这么一个详细记录安装模块的细节的文件。确定当前安装的包的依赖,以便后续重新安装的时候生成相同的依赖,而忽略项目开发过程中有些依赖已经发生的更新。

你可能会看到过“如果手动修改了 package.json 文件中已有模块的版本,直接执行npm install不会安装新指定的版本,只能通过npm install xxx@yy更新” ,不过这是 V5.0.0 的问题,现在V5.4.2版本后如果改了package.json,且package.json和lock文件不同,那么执行npm i时npm会根据package中的版本号以及语义含义去下载最新的包,并更新至lock。详见这个知乎回答

其余常见命令

  • npm ls 查看安装的模块
  • npm uninstall 卸载模块
  • npm update 更新模块
  • npm help 查看某条命令的详细帮助
  • npm version 查看模块版本
  • npm view 查看模块的注册信息
  • npm publish 发布模块
  • npm adduser 用户登录
  • npm init 初始化项目,并在项目文件夹中引导创建一个package.json文件
  • npm root 查看包的安装路径
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • npm是什么 NPM的全称是Node Package Manager,是随同NodeJS一起安装的包管理和分发工具...
    build1024阅读 7,858评论 0 9
  • 什么是 NPM npm之于Node,就像pip之于Python,gem之于Ruby,composer之于PHP。 ...
    ihoey阅读 6,248评论 2 36
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 描述 npm从以下来源获取配置值,按优先级排序: 命令行标记 在命令行上放置--foo bar设置foo配置参数为...
    竹天亮阅读 44,056评论 0 8
  • Node.js使得在服务器端使用JavaScript编写应用程序成为可能。它是基于V8Javascript运行时并...
    间阳幕宾阅读 1,566评论 0 5