NPM (node package manager) 入门 - 基础使用
什么是npm ?
npm 是 nodejs 的包管理和分发工具。它可以让 javascript 开发者能够更加轻松的共享代码和共用代码片段,并且通过 npm 管理你分享的代码也很方便快捷和简单。
截至目前 最新的稳定版 npm 是 3.3.12
本文译自 docs.npmjs.com ,有改动。
一、安装 Nodejs 和更新 npm
如果你是 windows 或者 Mac 用户,安装 nodejs 的最好办法就是到官网去下载一个安装包。安装完成后在控制台输入 node -v 如果正确返回 node 版本号,则说明安装成功。
安装完 nodejs 就已经有了 npm, 不过由于 nodejs 更新速度要慢于 npm ,因此在一般情况下要升级你的 npm 到最新版本,输入如下命令:
npm install npm -g
如果是 Linux ,可能需要通过 sudo 以 root 权限运行。
完成后运行 npm -v 可查看当前 npm 版本号。
二、修复 npm 相关权限问题
如果你在全局安装某个包时遇到 EACCES 错误,说明你没有权限在 npm 存放全局包文件的目录中写入文件。这里提供两个解决方案:
2.1、修改相关目录的权限
2.1.1、查找 npm 全局包文件存储路径
npm config get prefix
2.1.2、修改权限
sudo chown -R `user` <directory>
如果你不想改变整个目录的权限,也可以更改子文件夹 lib/node_modules、bin 和 share 目录的权限。
2.2、修改 npm 默认的全局包存放目录到新位置
可参考官网文档说明 https://docs.npmjs.com/getting-started/fixing-npm-permissions
三、局部安装 npm 包
npm 提供了两种包的安装形式:局部安装和全局安装。你可以通过你的项目使用情况选择如何安装。如果你的项目依赖于某个包,那么建议将改包安装到局部。其他其他条件下,比如你要在命令行工具中使用这个包,可选择在全局安装。
3.1、安装
安装一个 npm 包可以通过如下命令:
npm install package-name
这将会在当前位置创建一个 node_modules 文件夹(如果目录不存在),并且下载包文件到这个目录中。安装完成后可以看到 node_modules 目录下多了个文件夹。注:一般情况下如果安装失败目录会被删除。
3.2、安装时如何选择包版本
如果当前目录下不存在 package.json 文件,那么当执行 install 时将默认安装包的最新版本。
如果你有一个 package.json 文件在当前目录下,则根据 文件中声明的版本进行安装。
3.3、使用已安装的包
一旦安装完成一个包,你就可以在你的代码中使用它。例如:你创建了一个 Node module 并使用它。
安装完 lodash 后,创建一个文件 index.js 然后输入下面代码:
var lodash = require('lodash'); var output = lodash.without([1, 2, 3], 1);
console.log(output);
执行 node index.js 它将会输出 [2,3]
3.4、使用 package.json 和 --save 标志
另一个管理本地 npm package 的方法是在本地目录创建一个 package.json 文件。如果你有 package.json 文件在项目根目录,那么当执行 install 时 npm 会检查依赖并为其选择合适的版本进行安装。这会使你的依赖环境具备可重复性,意味着你可以与其他开发人员分享。
在你的项目目录中创建 package.json 文件并输入以下内容:
{
"name": "demo-app",
"version": "1.0.0"
}
使用 --save 标志下载一个包
npm install lodash --save
这将会在下载包文件之前修改 package.json 文件的依赖关系字段。现在打开刚才创建的 package.json 文件我们会发现多了个 dependencies 字段。
3.5、手动添加依赖关系到 package.json
你也可以手动添加依赖关系到 package.json,例如:
{
"name": "demo-app",
"version": "1.0.0",
"dependencies": {
"lodash": "^2.4.1",
"tap": "*"
}
}
运行 npm install ,执行结束后,你会发现node_modules 里包含 lodash 和 tap 这两个包。
需要注意的是,如果某个软件包已被安装,即使满足 package.json 的语义化版本规则,npm install 也并不会更新到最新版本。
因此,可靠地重新安装所有软件包到满足 package.json 语义化版本规则的最新版本的办法是删除 node_modules 文件夹 并运行 npm install
四、更新局部安装的软件包
我们项目所依赖的包可能会定期或不定期的进行更新,如果我们要使用更新后的新特性就需要更新本地已安装的软件包到新版本。
只需在包含 package.json 的目录中运行 npm update 即可。通过 npm outdated 可以检测包的当前版本和最新版本,通过他可以看到哪些包是过时的,但它并不会对本地软件包进行任何更改。
五、卸载本地已安装的软件包
你可以通过 npm uninstall package 命令卸载本地安装的软件包
npm uninstall lodash
如果要在卸载的同时从 package.json 依赖关系中解除依赖,可以通过使用 --save 标志
npm uninstall --save lodash
六、全局安装npm软件包
你可以根据自己的情况选择是否全局安装某个 npm 软件包,如果要进行全局安装可通过 npm install -g package-name 安装
npm install -g jshint
如果提示 EACCES 错误,是因为权限问题,你可以参考前面相关章节,或者使用 sudo 切换至 root 权限
sudo npm install -g jshint
七、更新全局安装的软件包
如果要更新全局安装的软件包,可以使用 npm install -g package-name
npm install -g jshint
如果知道哪些软件是需要更新的可以使用 npm outdated -g --depth=0 命令
如果要更新所有已全局安装的软件包,使用 npm update -g 命令。
八、卸载已全局安装的软件包
要卸载已全局安装的软件包,使用 npm unistall -g package-name 命令
npm uninstall -g jshint
九、创建一个 Node.js 模块
Node.js 模块是一种可以发布到 npm 的软件包,当你要创建一个新模块,首先需要创建一个 package.json 文件。
可以通过 npm init 创建一个 package.json ,他会引导你输入一些 package.json 的字段信息。有两个选项是必须输入的,分别是模块名称和版本号。你还需要输入一个名字用来作为入口程序的名称,默认为 index.js
如果你要为作者字段添加信息,可以使用下面的格式:
Your Name <email@example.com> (http://example.com)
package.json 文件创建完成后,你需要创建一个文件用来在模块被加载时执行,如果你上一步使用默认名字,那么该文件名就是 index.js
在文件中添加一个函数到 exports 对象的属性
exports.printMsg = function() {
console.log("This is a message from the demo package");
}
测试:
- 推送你的软件包到npm
- 在项目外创建一个空目录
- 执行 npm install package-name
- 创建一个 test.js 文件,require 你的包名字,然后执行上面的方法
- 执行 node test.js , 将输出上面函数中的代码
十、推送软件包到npm库
你可以推送任何包含 package.json 文件的文件夹,比如一个 node module
注册账号
要发布软件包,你必要有一个 npm 账号,如果没有可以使用 npm adduser 创建一个。然后使用 npm login 登录。
由于网络问题,我登陆不了。
所以,更多信息请参考 https://docs.npmjs.com/getting-started/publishing-npm-packages
十一、语义化版本号
语义化版本是一个标准,用来声明当前依赖可以在什么样的维度上有更新。
语义化版本号发布规范
如果一个项目发布出来,他的版本号必须从 1.0.0开始,尽管npm上的有些项目并没有遵循该标准。在此之后,版本更新应遵循一下原则:
- bug修复和其他小的改动:补丁发布,增加最后一个数字,例如1.0.1
- 增加新特性,不打破现有特性:小版本,增加中间的数字,如1.1.0
- 打破向后兼容性的变化:主要版本,增加第一个数字,例如2.0.0
更多信息请参考 https://docs.npmjs.com/misc/semver
十二、scoped-packages
scoped 就好比是一个 nmp modules 的命名空间。scoped-package 包名字以 @ 开始,scope 就是"@"与"/"之间的部分。
@scope/project-name
每一个 npm 用户都拥有一个自己的 scope
@username/project-name
你可以从 CLI documentation 获取到更多关于 scope 的详细信息。
12.1、更新 npm 和登陆
如果你要通过命令行登陆 npm 那么必须把 npm 升级到2.7.0以上版本。
sudo npm install -g npm
npm login
12.2、初始化一个scoped-package
通过在包名字前添加 scope 可创建一个 scoped-package
{
"name": "@username/project-name"
}
也可以通过在 npm init 命令后面增加 --scope 来创建一个scoped-pacasge
npm init --scope=username
也可以为 npm 配置的 scope 字段添设置一个值,这样以后就可以直接使用该 scope 进行 init
npm config set scope username
12.3、发布一个 scope-package
默认状态下 scoped package 包是私有的,如果要发布出去作为私有模块,你需要一个付费账号。
然而,你可以把 scoped package 免费的发布为共有包,只需要在发布时配置 access 选项即可。
npm publish --access=public
12.4、使用 scope-package
要使用 scope-package 需要在引用时填写完整的 scope-package 名字,类似下面的 package.json
{
"dependencies": {
"@username/project-name": "^1.0.0"
}
}
如果要在命令行使用
npm install @username/project-name --save
在代码中的引用语句
var projectName = require("@username/project-name")
十三、Working with npm Organizations
请参考 https://docs.npmjs.com/getting-started/working-with-orgs
写在后面
关于本文如果您有任何建议或疑问请在下面留言交流。
NPM (node package manager) 入门 - 基础使用的更多相关文章
- NPM(Node Package Manager,Node包管理器)
简介 每个Node应用都有一个包含该应用元数据的文件-package.json,包含应用名.版本号以及依赖等信息. 我们使用NPM从NPM库下载并安装第三方包. 所有下载的包以及其依赖都保存在node ...
- npm是什么NPM的全称是Node Package Manager
npm是什么NPM的全称是Node Package Manager
- [译]A Beginner’s Guide to npm — the Node Package Manager
原文: http://www.sitepoint.com/beginners-guide-node-package-manager/ Installing Node.js 验证你的安装是否成功. $ ...
- NPM Node.js 包管理
1.NPM 简介 1.1 NPM Node.js® 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,可方便地构建快速,可扩展的网络应用程序的平台.Node.js 使用事件驱动, ...
- npm 与 package.json 快速入门
npm 是前端开发广泛使用的包管理工具,之前使用 Weex 时看了阮一峰前辈的文章了解了一些,这次结合官方文章总结一下,加深下理解吧! 读完本文你将了解: 什么是 npm 安装 npm 更新 npm ...
- npm 与 package.json 快速入门教程
npm 与 package.json 快速入门教程 2017年08月02日 19:16:20 阅读数:33887 npm 是前端开发广泛使用的包管理工具,之前使用 Weex 时看了阮一峰前辈的文章了解 ...
- [转载]npm 与 package.json 快速入门教程
npm 与 package.json 快速入门教程 2017-08-02 19:16:20 拭心 阅读数 78648更多 分类专栏: 学学前端 版权声明:本文为博主原创文章,遵循CC 4.0 BY ...
- npm与package.json快速入门
本文转载自npm与package.json快速入门 导语 npm 是前端开发广泛使用的包管理工具,之前使用 Weex 时看了阮一峰前辈的文章了解了一些,这次结合官方文章总结一下,加深下理解吧! 读完本 ...
- Installing Node.js via package manager | Node.js
Installing Node.js via package manager | Node.js i386 (32-bit)
随机推荐
- 札记:android手势识别,MotionEvent
摘要 本文是手势识别输入事件处理的完整学习记录.内容包括输入事件InputEvent响应方式,触摸事件MotionEvent的概念和使用,触摸事件的动作分类.多点触摸.根据案例和API分析了触摸手势T ...
- Castle Core 4.0.0 alpha001发布
时隔一年多以后Castle 项目又开始活跃,最近刚发布了Castle Core 4.0.0 的alpha版本, https://github.com/castleproject/Core/releas ...
- 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[下]:管道是如何构建起来的?
在<中篇>中,我们对管道的构成以及它对请求的处理流程进行了详细介绍,接下来我们需要了解的是这样一个管道是如何被构建起来的.总的来说,管道由一个服务器和一个HttpApplication构成 ...
- Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用
通过本文你将学会如下内容: 1,如何使用Xamarin开发跨平台(Windows,Android,iOS)应用. 2,如何使用微软的登录界面登入Microsoft账号. 3,如何使用Outlook邮箱 ...
- My TWI
前言 对TWI没有什么特别的印象,因为有一个更出名的TWU,而我去年又刚好错过了它,因此TWU的光辉完全掩盖了TWI.对TWI印象最深的是在邮件中看到的38th北京的这期,看到他们的图文记录,在圈子中 ...
- 玩转spring boot——结合JPA入门
参考官方例子:https://spring.io/guides/gs/accessing-data-jpa/ 接着上篇内容 一.小试牛刀 创建maven项目后,修改pom.xml文件 <proj ...
- Web安全相关(五):SQL注入(SQL Injection)
简介 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据 ...
- 免费道路 bzoj 3624
免费道路(1s 128MB)roads [输入样例] 5 7 21 3 04 5 13 2 05 3 14 3 01 2 14 2 1 [输出样例] 3 2 04 3 05 3 11 2 1 题解: ...
- 关于CSS inline-block、BFC以及外边距合并的几个小问题
CSS inline-block和BCF对于初学者来说,总是弄不太明白,下面记录下我在学习这块知识的过程中遇到的几个问题,供大家参考,有不足的地方,欢迎大家批评指正. 一.在什么场景下会出现外边距合并 ...
- Android AndroidRuntime类
AndroidRuntime类是安卓底层很重要的一个类,它负责启动虚拟机以及Java线程,AndroidRuntime类在一个进程中只有一个实例对象保存在全局变量,gCurRuntime中.