Skip to content

npm init 和 npm install执行了哪些操作 #127

Open
@TieMuZhen

Description

@TieMuZhen

一、npm init

npm init执行的动作很简单,只是帮我们创建了package.json

二、npm install

npm install命令用来安装模块到node_modules目录。

npm install <packageName>

安装之前,npm install会先检查,node_modules目录之中是否已经存在指定模块。如果存在,就不再重新安装了,即使远程仓库已经有了一个新版本,也是如此。

如果你希望,一个模块不管是否安装过,npm都要强制重新安装,可以使用-f--force参数。


npm install <packageName> --force

三、registry

npm update命令怎么知道每个模块的最新版本呢?

答案是npm模块仓库提供了一个查询服务,叫做registry。以npmjs.org为例,它的查询服务网址是https://registry.npmjs.org/

这个网址后面跟上模块名,就会得到一个JSON对象,里面是该模块所有版本的信息。比如,访问https://registry.npmjs.org/react,就会看到react模块所有版本的信息。

它跟下面命令的效果是一样的。

npm view react

# npm view 的别名
npm info react
npm show react
npm v react

registry网址的模块名后面,还可以跟上版本号或者标签,用来查询某个具体版本的信息。比如, 访问 https://registry.npmjs.org/react/v0.14.6,就可以看到React0.14.6版。

返回的JSON对象里面,有一个dist.tarball属性,是该版本压缩包的网址。

dist: {
  shasum: '2a57c2cf8747b483759ad8de0fa47fb0c5cf5c6a',
  tarball: 'http://registry.npmjs.org/react/-/react-0.14.6.tgz' 
},

到这个网址下载压缩包,在本地解压,就得到了模块的源码。npm installnpm update命令,都是通过这种方式安装模块的。

四、模块的安装过程

Node模块的安装过程是这样的。

  1. 发出npm install命令
  2. npmregistry查询模块压缩包的网址
  3. 下载压缩包,存放在~/.npm目录
  4. 解压压缩包到当前项目的node_modules目录

注意,一个模块安装以后,本地其实保存了两份。一份是~/.npm目录下的压缩包,另一份是node_modules目录下解压后的代码。

但是,运行npm install的时候,只会检查node_modules目录,而不会检查~/.npm目录。也就是说,如果一个模块在~/.npm下有压缩包,但是没有安装在node_modules目录中,npm依然会从远程仓库下载一次新的压缩包。

这种行为固然可以保证总是取得最新的代码,但有时并不是我们想要的。最大的问题是,它会极大地影响安装速度。即使某个模块的压缩包就在缓存目录中,也要去远程仓库下载,这怎么可能不慢呢?

另外,有些场合没有网络(比如飞机上),但是你想安装的模块,明明就在缓存目录之中,这时也无法安装。

五、--cache-min 参数

为了解决这些问题,npm提供了一个--cache-min参数,用于从缓存目录安装模块。

--cache-min参数指定一个时间(单位为分钟),只有超过这个时间的模块,才会从registry下载。

npm install --cache-min 9999999 <package-name>

上面命令指定,只有超过999999分钟的模块,才从registry下载。实际上就是指定,所有模块都从缓存安装,这样就大大加快了下载速度。

但是,这并不等于离线模式,这时仍然需要网络连接。

参考文献

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions