NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:
- 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
- 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
- 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
由于新版的nodejs已经集成了npm,所以之前npm也一并安装好了。同样可以通过输入 “npm -v” 来测试是否成功安装。命令如下,出现版本提示表示安装成功:
KendeMacBook-Pro:~ ken$ npm -v6.14.4
如果你安装的是旧版本的 npm,可以很容易得通过 npm 命令来升级,命令如下:
npm install npm -g/usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/npm-cli.jsnpm@6.14.4 /usr/local/lib/node_modules/npm
使用淘宝镜像的命令:
npm install -g cnpm --registry=https://registry.npm.taobao.org
使用 npm 命令安装模块
npm 安装 Node.js 模块语法格式如下:
npm install <Module Name>
以下实例,我们使用 npm 命令安装常用的 Node.js web框架模块 express:
npm install express
安装好之后,express 包就放在了工程目录下的 node_modules 目录中,因此在代码中只需要通过 require(‘express’) 的方式就好,无需指定第三方包路径。
var express = require('express');
全局安装与本地安装
npm 的包安装分为本地安装(local)、全局安装(global)两种,从敲的命令行来看,差别只是有没有-g而已,比如
npm install express # 本地安装npm install express -g # 全局安装
如果出现以下错误:
npm err! Error: connect ECONNREFUSED 127.0.0.1:8087
解决办法为:
$ npm config set proxy null
本地安装
- 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
- 可以通过 require() 来引入本地安装的包。
如果你遇到了使用 npm 安 装node_modules 总是提示报错:报错: npm resource busy or locked…..。
可以先删除以前安装的 node_modules :
npm cache cleannpm install
全局安装
- 将安装包放在 /usr/local 下或者你 node 的安装目录。
- 可以直接在命令行里使用。
如果你希望具备两者功能,则需要在两个地方安装它或使用 npm link。
接下来我们使用全局方式安装 express
npm install express -g
安装过程输出如下内容,第一行输出了模块的版本号及安装位置。
express@4.17.1├── accepts@1.3.7├── array - flatten@1.1.1├── body - parser@1.19.0├── content - disposition@0.5.3├── content - type@1.0.4├── cookie@0.4.0├── cookie - signature@1.0.6├── debug@2.6.9├── depd@1.1.2├── encodeurl@1.0.2├── escape - html@1.0.3├── etag@1.8.1├── finalhandler@1.1.2├── fresh@0.5.2├── merge - descriptors@1.0.1├── methods@1.1.2├── on - finished@2.3.0├── parseurl@1.3.3├── path - to - regexp@0.1.7├── proxy - addr@2.0.7├── qs@6.7.0├── range - parser@1.2.1├── safe - buffer@5.1.2├── send@0.17.1├── serve - static@1.14.1├── setprototypeof@1.1.1├── statuses@1.5.0├── type - is@1.6.18├── utils - merge@1.0.1└── vary@1.1.2
查看安装信息
你可以使用以下命令来查看所有全局安装的模块:
#npm查看全局安装过的包npm list -g --depth 0├── cnpm@6.2.0├── express@4.17.1├── npm@6.14.4└── react-native-cli@2.0.1
如果要查看某个模块的版本号,可以使用命令如下:
npm list -g express/Users/ken/.nvm/versions/node/v12.18.0/lib└── express@4.17.1
使用 package.json
package.json 位于模块的目录下,用于定义包的属性。
package.json 属性说明
- name - 包名
- version- 包的版本号
- description - 包的描述
- homepage - 包的官网 url
- author - 包的作者姓名。
- contributors - 包的其他贡献者姓名。
- dependencies - 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。
- repository - 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上。
- main - main 字段指定了程序的主入口文件,require(‘moduleName’) 就会加载这个文件。这个字段的默认值是模块根目录下面的 index.js。
- keywords - 关键字
接下来让我们来看下 express 包的 package.json 文件,位于 node_modules/express/package.json 内容:
{"_from": "express","_id": "express@4.17.1","_inBundle": false,"_integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==","_location": "/express","_phantomChildren": {},"_requested": {"type": "tag","registry": true,"raw": "express","name": "express","escapedName": "express","rawSpec": "","saveSpec": null,"fetchSpec": "latest"},"_requiredBy": ["#USER"],"_resolved": "https://repo.huaweicloud.com/repository/npm/express/-/express-4.17.1.tgz","_shasum": "4491fc38605cf51f8629d39c2b5d026f98a4c134","_spec": "express","_where": "/Users/ken","author": {"name": "TJ Holowaychuk","email": "tj@vision-media.ca"},"bugs": {"url": "https://github.com/expressjs/express/issues"},"bundleDependencies": false,"contributors": [{"name": "Aaron Heckmann","email": "aaron.heckmann+github@gmail.com"},{"name": "Ciaran Jessup","email": "ciaranj@gmail.com"},{"name": "Douglas Christopher Wilson","email": "doug@somethingdoug.com"},{"name": "Guillermo Rauch","email": "rauchg@gmail.com"},{"name": "Jonathan Ong","email": "me@jongleberry.com"},{"name": "Roman Shtylman","email": "shtylman+expressjs@gmail.com"},{"name": "Young Jae Sim","email": "hanul@hanul.me"}],"dependencies": {"accepts": "~1.3.7","array-flatten": "1.1.1","body-parser": "1.19.0","content-disposition": "0.5.3","content-type": "~1.0.4","cookie": "0.4.0","cookie-signature": "1.0.6","debug": "2.6.9","depd": "~1.1.2","encodeurl": "~1.0.2","escape-html": "~1.0.3","etag": "~1.8.1","finalhandler": "~1.1.2","fresh": "0.5.2","merge-descriptors": "1.0.1","methods": "~1.1.2","on-finished": "~2.3.0","parseurl": "~1.3.3","path-to-regexp": "0.1.7","proxy-addr": "~2.0.5","qs": "6.7.0","range-parser": "~1.2.1","safe-buffer": "5.1.2","send": "0.17.1","serve-static": "1.14.1","setprototypeof": "1.1.1","statuses": "~1.5.0","type-is": "~1.6.18","utils-merge": "1.0.1","vary": "~1.1.2"},"deprecated": false,"description": "Fast, unopinionated, minimalist web framework","devDependencies": {"after": "0.8.2","connect-redis": "3.4.1","cookie-parser": "~1.4.4","cookie-session": "1.3.3","ejs": "2.6.1","eslint": "2.13.1","express-session": "1.16.1","hbs": "4.0.4","istanbul": "0.4.5","marked": "0.6.2","method-override": "3.0.0","mocha": "5.2.0","morgan": "1.9.1","multiparty": "4.2.1","pbkdf2-password": "1.2.1","should": "13.2.3","supertest": "3.3.0","vhost": "~3.0.2"},"engines": {"node": ">= 0.10.0"},"files": ["LICENSE","History.md","Readme.md","index.js","lib/"],"homepage": "http://expressjs.com/","keywords": ["express","framework","sinatra","web","rest","restful","router","app","api"],"license": "MIT","name": "express","repository": {"type": "git","url": "git+https://github.com/expressjs/express.git"},"scripts": {"lint": "eslint .","test": "mocha --require test/support/env --reporter spec --bail --check-leaks test/ test/acceptance/","test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require test/support/env --reporter spec --check-leaks test/ test/acceptance/","test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require test/support/env --reporter dot --check-leaks test/ test/acceptance/","test-tap": "mocha --require test/support/env --reporter tap --check-leaks test/ test/acceptance/"},"version": "4.17.1"}
卸载模块
我们可以使用以下命令来卸载 Node.js 模块。
npm uninstall express
卸载后,你可以到 /node_modules/ 目录下查看包是否还存在,或者使用以下命令查看:
npm ls
更新模块
我们可以使用以下命令更新模块:
npm update express
搜索模块
使用以下来搜索模块:
npm search express
创建模块
创建模块,package.json 文件是必不可少的。我们可以使用 NPM 生成 package.json 文件,生成的文件包含了基本的结果。
$ npm initThis utility will walk you through creating a package.json file.It only covers the most common items, and tries to guess sensible defaults.See `npm help json` for definitive documentation on these fieldsand exactly what they do.Use `npm install <pkg> --save` afterwards to install a package andsave it as a dependency in the package.json file.Press ^C at any time to quit.name: (node_modules) runoob # 模块名version: (1.0.0)description: Node.js 测试模块(www.runoob.com) # 描述entry point: (index.js)test command: make testgit repository: https://github.com/runoob/runoob.git # Github 地址keywords:author:license: (ISC)About to write to ……/node_modules/package.json: # 生成地址{"name": "runoob","version": "1.0.0","description": "Node.js 测试模块(www.runoob.com)",……}Is this ok? (yes) yes
如果你以上的步骤都操作正确,你就可以跟其他模块一样使用 npm 来安装。
版本号
使用NPM下载和发布代码时都会接触到版本号。NPM使用语义版本号来管理代码,这里简单介绍一下。
语义版本号分为X.Y.Z三位,分别代表主版本号、次版本号和补丁版本号。当代码变更时,版本号按以下原则更新。
- 如果只是修复bug,需要更新Z位。
- 如果是新增了功能,但是向下兼容,需要更新Y位。
- 如果有大变动,向下不兼容,需要更新X位。
版本号有了这个保证后,在申明第三方包依赖时,除了可依赖于一个固定版本号外,还可依赖于某个范围的版本号。例如”argv”: “0.0.x”表示依赖于0.0.x系列的最新版argv。
NPM支持的所有版本号范围指定方式可以查看官方文档。
NPM 常用命令
除了本章介绍的部分外,NPM还提供了很多功能,package.json里也有很多其它有用的字段。
除了可以在查看官方文档,这里再介绍一些NPM常用命令。
NPM提供了很多命令,例如install和publish,使用npm help可查看所有命令。
- NPM提供了很多命令,例如install和publish,使用npm help可查看所有命令。
- 使用npm help
可查看某条命令的详细帮助,例如 npm help install。 - 在package.json所在目录下使用 npm install 可先在本地安装当前命令行程序,可用于发布前的本地测试。
- npm update
可以把当前目录下node_modules子目录里边的对应模块更新至最新版本。 - npm update
-g 可以把全局安装的对应命令行程序更新至最新版。 - npm cache clear 可以清空NPM本地缓存,用于对付使用相同版本号发布新版本代码的人。
- npm unpublish
@ 可以撤销发布自己发布过的某个版本代码。
使用淘宝 NPM 镜像
大家都知道国内直接使用 npm 的官方镜像是非常慢的,这里推荐使用淘宝 NPM 镜像。
淘宝 NPM 镜像是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。
你可以使用淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm:
npm install -g cnpm --registry=https://registry.npm.taobao.org
这样就可以使用 cnpm 命令来安装模块了:
cnpm install [name]
更多信息可以查阅:http://npm.taobao.org/
本地生成一个包
# 在 package.json 的代码目录里面执行下面命令npm pack
- 执行命令后,生成 xxx.tgz 文件,
- 进入需要安装此包的路径下,执行npm install xxx.tgz ,等待执行完即可安装成功
发布自己的npm
- 安装nodejs
- 注册npm帐户,https://www.npmjs.com/
- 开发你的module,更新至github
- 发布module 至 npm ```bash
npm init # 初始化项目 npm login # 登陆 npm publish # 发布
更新版本后发布
npm version 0.1.1 npm publish
npm adduser # 登陆
npm whomi # 查看登陆的用户
#
强制清除缓存
npm cache clean —force
npm config get registry # 检测是否按照淘宝镜像的方法 npm config set registry=http://registry.npmjs.org # 替换成原始 npm 源码 npm config set registry=http://registry.npm.taobao.org/ # 替换成淘宝源
⚠️ **注意: 如果出现的以下问题**```bashnpm: no_perms Private mode enable, only admin can publish this module
是更换过NPM源的问题引起的,所以直接换成原先的NPM源即可
npm config set registry=http://registry.npmjs.org
pm ERR! You do not have permission to publish "package-demo". Are you logged in as the correct user? : package-demo
提示没有权限,其实就是你的module名在npm上已经被占用啦,这时候你就去需要去npm搜索你的模块名称,如果搜索不到,就可以用,并且把package.json里的name修改成未占用的,重新 npm publish 就可以了
