了解node包管理器 npm 的入门基础知识

120 1 年前
npm(全称 Node Package Manager,即“node包管理器”)是Node.js默认的、以JavaScript编写的软件包管理系统。

npm(全称 Node Package Manager,即“node包管理器”)是Node.js默认的、以JavaScript编写的软件包管理系统

npm完全用JavaScript写成,最初由艾萨克·施吕特(Isaac Z. Schlueter)开发。艾萨克表示自己意识到“模块管理很糟糕”的问题,并看到了PHPPEARPerlCPAN等软件的缺点,于是编写了npm

npm会随着Node.js自动安装。npm模块仓库提供了一个名为“registry”的查询服务,用户可通过本地的npm命令下载并安装指定模块。此外用户也可以通过npm把自己设计的模块分发到registry上面。

registry上面的模块通常采用CommonJS格式,而且都包含一个JSON格式的元文件。

npm 由三个独立的部分组成:

  • 网站:是开发者查找包(package)、设置参数以及管理 npm 使用体验的主要途径
  • 注册表(registry):是一个巨大的数据库,保存了每个包(package)的信息
  • 命令行工具 (CLI):通过命令行或终端运行。开发者通过 CLI 与 npm 打交道

安装或更新 npm

新版的nodejs已经集成了npm,如果安装好nodejsnpm也就自动安装好了。

  • 查看当前的版本:npm -v
  • 更新npm到最新版本:npm install npm@latest -g
  • 更新到下一个将发布的版本:npm install npm@next -g

初始化项目(创建node.js模块)

npm init [-f|--force|-y|--yes]

创建模块,package.json 文件是必不可少的。我们可以使用 NPM 生成 package.json 文件,生成的 package.json 文件包含了项目安装包的信息。

注意的是,npm init命令后,npm会询问你一系列问题,当你填入答案后才会正式结束初始化,如果不太想自定义一些关于项目的描述,可以直接敲 npm init --yesnpm init -y

npm init命令要输入的信息如下 (web)为我本地文件夹名,可以忽略:

  • package name: (web):模块的名称
  • version: (1.0.0):模块的版本
  • description::模块的描述
  • entry point: (index.js):模块的入口
  • test command::项目启动时脚本命令
  • git repository::如果有 Git 地址,可以将这个项目放到你的 Git 仓库里
  • keywords:关键词
  • author:作者
  • license: (ISC):项目要发行的时候需要的证书

如上所述,我们输入或忽略(忽略就是什么都不填,直接回车)后命令行展示以下信息

About to write to D:\vue\web\package.json:

{
  "name": "blog",
  "version": "1.0.1",
  "description": "这是我的博客",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}


Is this OK? (yes)

就这样,没错,输入yes回车,然后在web文件夹里就生成了一个package.json文件,基内容如下:

{
  "name": "blog",
  "version": "1.0.1",
  "description": "这是我的博客",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

关于package.json的更多内容,请查看 package.json 文件详解

如何安装本地包

npm install <package_name>

上述命令执行之后将会在当前的目录下创建一个 node_modules 的目录(如果不存在的话),然后将下载的包保存到这个目录下

有两种方式用来安装 npm 包:本地安装全局安装。至于选择哪种方式来安装,取决于我们如何使用这个包。

npm install <package_name> -g:安装一个本地包,如果加上-g选项则是安装全局包

  • 如果你自己的模块依赖于某个包,并通过 Node.jsrequire 加载,那么你应该选择本地安装,这种方式也是 npm install 命令的默认行为。
  • 如果你想将包作为一个命令行工具,(比如 grunt CLI),那么你应该选择全局安装。

本地安装和全局安装区别

本地安装

  • 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
  • 可以通过 require() 来引入本地安装的包。

全局安装

  • 将安装包放在 /usr/local 下或者你 node 的安装目录。
  • 可以直接在命令行里使用。

如果你希望具备两者功能,则需要在两个地方安装它或使用 npm link,同样在安装模块的时候,可以通过指定参数来修改package.json文件,如

$ npm install <package_name> --save:会把安装的包写到dependencies,表示的是正式环境的包

$ npm install <package_name> --save-dev:会把安装的包写到devDependencies,表示的是测试环境的包

查看模块的新版本

npm outdated

如何卸载模块

我们可以使用以下命令来卸载 Node.js 模块。

$ npm uninstall express

卸载后,你可以到 /node_modules/ 目录下查看包是否还存在,或者使用以下命令查看:

$ npm ls

npm uninstall是卸载包的命令,不过很多人安装包的时候知道加--save或者--save-dev命令,而卸载的时候就会忘了加,如果这个包是确定不需要使用的,就可以直接加--save或者--save-dev从package.json中删掉它。卸载全局的包只需要加个-g参数。

更新模块

我们可以使用以下命令更新模块:

$ npm update express

npm update命令可以更新本地package.json里面列举的包,当然,更新也会遵循package.json里面包的版本规则;不过更新全局的包不是用的update,而是直接重新npm install -g ,如果是更新所有全局的包,直接用npm update -g

搜索模块

使用以下来搜索模块:

$ npm search express

模块版本号

使用NPM下载和发布代码时都会接触到版本号。NPM使用语义版本号来管理代码,这里简单介绍一下。

语义版本号分为X.Y.Z三位,分别代表主版本号次版本号补丁版本号。当代码变更时,版本号按以下原则更新。

  • 如果只是修复bug,需要更新Z位。
  • 如果是新增了功能,但是向下兼容,需要更新Y位。
  • 如果有大变动,向下不兼容,需要更新X位。
  • 版本号有了这个保证后,在申明第三方包依赖时,除了可依赖于一个固定版本号外,还可依赖于某个范围的版本号。例如"argv": "0.0.x"表示依赖于0.0.x系列的最新版argv。

使用淘宝 NPM 镜像

大家都知道国内直接使用 npm 的官方镜像是非常慢的,这里推荐使用淘宝 NPM 镜像。

淘宝 NPM 镜像是一个完整 npmjs.org 镜像,可以用此代替官方版本(只读),同步频率目前为 10分钟一次,以保证尽量与官方服务同步。

使用淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm:

$ npm install -g cnpm --registry=https://registry.npm.taobao.org

这样就可以使用 cnpm 命令来安装模块了:

$ cnpm install [name]
分类栏目
© 2018邮箱:11407215#qq.comGitHub沪ICP备12039518号-6