Node魔法堂:NPM入了个门
一、前言
NPM作为Node的模块管理和发布工具,作用与Ruby的gem、Python的pypl或setuptools、PHP的pear和.Net的Nuget一样。在当前前端工程化极速狂奔的年代,即使不做nodejs的开发,也需要学习和使用NPM的,谁叫grunt、bower、yeoman这一堆的工具都通过NPM发布呢?!
本文为针对非nodejs的开发者整理的NPM使用说明。当然最好的教程还是官网的啦!
二、什么是包?
nodejs以包的形式组织程序模块,而包的定义却十分简单——包含文件内容符合规范package.json文件的目录或归档文件。并通过<package-name>@<version>来唯一标识每个包。
三、灵魂——package.json
包的定义和NPM都围绕着package.json文件做文章,package.json文件其实就相当于JAVA中的MANIFEST.MF文件,用于存放模块的名称、版本、作者、机构、模块入口、依赖项等信息。首先我们通过 npm init 命令在当前工作目录下以用户引导的方式创建一个全新的package.json文件。然后通过 npm help json 命令打开帮助文档,并根据实际的项目需求自行初始化package.json的项目即可。下面将对基础配置项进行叙述。
name,必选项,表示模块名称。命名时不能包含js、node、和url中需要转义的字符,不能以.和_为开头。
version,必选项,表示模块的版本号。版本号以 主版本号(Major).副版本号(Minor).补丁版本号(Patch) 构成(如1.2.0)。而engines、dependencies和devDependencies等配置项中可使用语义化版本号语法,具体如下:(注意:版本号格式不对的话,在执行npm install时会报警告哦!)
1.1.1:精确下载安装1.1.1版本的包
>、<=、>、>=1.1.1:分别表示下载安装大于、小于等于、大于等于1.1.1版本的包
1.0.1-1.1.1:表示版本范围是包含1.0.1到1.1.1版本的包
~1.1.1:表示尽量采用靠近1.1.1版本的包,但可用的包版本范围是1.1.1-0到1.1.x-x版本的包
~1.1:表示下载安装1.1.x-x版本的包
~1:表示下载安装1.x.x-x版本的包
^1.1.1:表示包版本范围是1.1.1到1.x.x-x
^0.1.1:表示包版本范围是1.1.1到1.1.x-x
^1.1:表示包版本范围是1.1.x-x到1.x.x-x
^1:表示包版本范围是1.x.x-x
空格、x、*:表示任意版本即可
两个版本选择器间,空格表示and关系,||表示or关系。
main,必选项,模块入口文件相对路径(相对于模块根目录)。
description,可选项,表示模块功能描述,显示在 npm search <package-name> 中
keywords,可选项,数组类型,表示模块的关键字,显示在 npm search <package-name> 中
author,可选项,表示发起者信息。示例如下:
"author":{
"name": "fsjohnhuang",
"url": "http://fsjohnhuang.cnblogs.com/"
}
engines,可选项,依赖的node版本。示例如下:
"engines":{
"node": ">= 0.8.0"
}
repository,可选项,源码托管地址。示例如下:
"repository":{
"type": "git",
"url": "https://github.com/fsjohnhuang/iPromise.git"
}
scripts,可选项,自定义在cli中输入 npm <script> 时实际执行的程序。npm默认提供大量的script供我们调用。
dependencies和devDependencies,可选项,用于配置模块的生产环境依赖包和开发环境依赖包。当执行npm install时,npm会根据这两个配置项的值去下载安装相关的依赖包。两者的区别是devDependencies是模块开发过程的依赖包(如:grunt只在开发时有用的模块),并且当其他模块需要依赖当前模块时,当通过npm install <package-name>时会自动下载安装dependencies的包而不会下载devDependencies的包。
四、NPM的配置信息
现在我们对package.json有一定的了解了,现在就到理论+实践时间咯。在实践之前我们要先配置一下NPM的资源库(国内被墙,你懂的),内网用户还要配置一下网络代理地址等信息。
查看部分配置信息—— npm config ls
查看所有配置信息—— npm config ls -l
修改配置信息的三种方式:
1. 修改用户家目录的.npmrc文件(没有则新建一个);
2. 通过 npm config set <config> <config-value> 命令;
npm config set registry http://registry.npm.taobao.org/
npm config set proxy http://proxy.com:8081/
3. 通过--registry=<registry-uri>等命令可选项临时配置。
npm install grunt --registry=http://registry.npm.taobao.org
五、查找、安装/卸载、更新依赖包
在安心玩耍之前我们要先了解一件事件,就是包的作用范围分为 全局 和 本地 两种。
全局:用作在cli上直接调用,而无法在项目中通过require导入依赖包。如将grunt-cli安装到全局时,则可在cli中输入grunt调用了!
npm install -g grunt-cli
cmd或shell中直接调用
> grunt
本地:用作在项目中通过require导入依赖包,供项目使用。
那么全局和本地的依赖包到底是存放在哪里的呢?通过 npm root -g 和 npm root 可分别查看全局和本地的依赖包下载安装的绝对目录了。本地的依赖包会存放在当前项目根目录下的node_modules目录下。
现在我们可以正式操作依赖包了!
搜索阶段(操作远程资源库中的依赖包)
1. 搜索依赖包, npm search <package-name> 。
2. 查看依赖包的package.json信息, npm view <package-name> 。另外我们可以单独查看package.json某个配置。
查看包的依赖关系:`npm view <package-name> dependencies`
查看包的源文件地址:`npm view <package-name> repository.url`
查看包所依赖的node版本号:`npm view <package-name> engines`
查看本地包信息
1. 查看当前项目的本地依赖包, npm list
2. 查看全局依赖包, npm list -g
3. 查看本地依赖包是否不是最新版, npm outdated <package-name>
安装/卸载,更新包
1. 安装本地/全局依赖包, npm install <package-name> / npm install -g <package-name> (这样会下载安装最新的包,若下载安装特定版本号的包则 npm install <package-name>@<version> )
2. 卸载本地/全局依赖包, npm uninstall <package-name> / npm uninstall -g <package-name>
3. 更新本地/全局依赖包, npm update <package-name> / npm update -g <package-name>
六、发布包
站在使用者的角度,掌握上述章节的内容已经足够了,但当我们开发出好玩的项目而且又想和大家分享时,那么下面的内容就不得不了解了!
1. 注册一个registry帐号, npm adduser ,然后根据引导输入帐号、密码和邮箱地址。
2. 登录registry帐号, npm login ,登录信息会保存在客户端。
3. 发布项目, npm publish 。(建议发布版本从1.0.0开始)
经过上述步骤我们就可发布模块了。但这个时候你也许会考虑到项目中部分目录和文件不应该被发布出去,应该有一个像.gitignore的文件来配置这些排除项。看来你猜对了,那就是.npmignore文件,不过npm做得更灵活一些!
1. 默认不带.npmignore文件,若项目中带.gitignore则使用.gitignore文件内容的配置项;
2. 若带.npmignore文件则不使用.gitignore文件中的配置项;
3. 即使配置.npmignore文件,也无法排除package.json和README.*文件;
4. NPM内置设定以下文件必须被排除
.*.swp
.*.swp
._*
.DS_Store
.git
.hg
.lock-wscript
.svn
.wafpickle-*
CVS
npm-debug.log
七、总结
现在我们终于可以安心下载各种node依赖包来推进前端工程化的步伐了!
尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/4178019.html^_^肥仔John
八、参考
http://www.cnblogs.com/linjiqin/p/3765772.html
http://www.infoq.com/cn/articles/nodejs-npm-install-config/
http://www.infoq.com/cn/articles/msh-using-npm-manage-node.js-dependence
Node魔法堂:NPM入了个门的更多相关文章
- Java魔法堂:类加载器入了个门
一.前言 <Java魔法堂:类加载机制入了个门>中提及整个类加载流程中只有加载阶段作为码农的我们可以入手干预,其余均由JVM处理.本文将记录加载阶段的核心组件——类加载器的相关信息,以便日 ...
- JS魔法堂:属性、特性,傻傻分不清楚
一.前言 或许你和我一样都曾经被下面的代码所困扰 var el = document.getElementById('dummy'); el.hello = "test"; con ...
- JS魔法堂:那些困扰你的DOM集合类型
一.前言 大家先看看下面的js,猜猜结果会怎样吧! 可选答案: ①. 获取id属性值为id的节点元素 ②. 抛namedItem is undefined的异常 var nodes = documen ...
- JS魔法堂:不完全国际化&本地化手册 之 实战篇
前言 最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求--国际化&本地化.熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已. ...
- WebComponent魔法堂:深究Custom Element 之 面向痛点编程
前言 最近加入到新项目组负责前端技术预研和选型,一直偏向于以Polymer为代表的WebComponent技术线,于是查阅各类资料想说服老大向这方面靠,最后得到的结果是:"资料99%是英语 ...
- CSS魔法堂:重拾Border之——更广阔的遐想
前言 当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-t ...
- CSS魔法堂:重拾Border之——不仅仅是圆角
前言 当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-t ...
- CSS魔法堂:重拾Border之——图片作边框
前言 当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-t ...
- HTML5魔法堂:全面理解Drag & Drop API
一.前言 在HTML4的时代,各前端工程师为了实现拖拽功能可说是煞费苦心,初听HTML5的DnD API觉得那些痛苦的日子将一去不复返,但事实又是怎样的呢?下面我们一起来看看DnD API的真面 ...
随机推荐
- AWIT DBackup 0.0.20 发布,备份系统
AWIT DBackup 0.0.20 修复了几个小 bug. AllWorldIT DBackup 是一个备份系统,为每个目录创建一个独立的压缩包,这更便于搜索. 特点: 使用 xz, bzip2, ...
- Ember.js之动态创建模型
本人原文地址发布在:点击这里 What problem did we meet? As ember document suggestion, we may define a model as a st ...
- Android下集成Paypal支付
近期项目需要研究paypal支付,官网上的指导写的过于复杂,可能是老外的思维和中国人不一样吧.难得是发现下面这篇文章: http://www.androidhive.info/2015/02/andr ...
- Sensor(LIGHT)
package com.example.sensor01; import java.util.List; import android.hardware.Sensor; import android. ...
- note of introduction of Algorithms(Lecture 3 - Part1)
Lecture 3(part 1) Divide and conquer 1. the general paradim of algrithm as bellow: 1. divide the pro ...
- Kali Linux渗透测试实战 1.2 环境安装及初始化
1.2 环境安装及初始化 目录(?)[-] 环境安装及初始化 下载映像 安装虚拟机 安装Kali Linux 安装中文输入法 安装VirtualBox增强工具 配置共享目录和剪贴板 运行 Metasp ...
- 《C#图解教程》读书笔记之一:C#和.NET框架
本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.在.NET之前的编程世界 C#语言是在微软公司的.NET框架上开发程序而设计的,首先作者给大家纠正了一下C# ...
- Android SDK content Loader has encountered a problem.parseSdkContent failed
打开Eclipse,弹出Android SDK content Loader has encountered a problem.parseSdkContent failed,当点击detail按钮, ...
- [算法][三轴、六轴、九轴传感器算法分析] 1、分享一个三轴加速计matlab动态可视化脚本
一.有啥用 这里用的是LIS3DH三轴加速计,输出为X.Y.Z轴的加速度,通过串口连接电脑,电脑里运行matlab脚本通过串口实时获取数据并做可视化显示. 这里虽然是针对LIS3DH的,其实稍作修改即 ...
- [转]在cocos2d-x中让一个项目适配iphone、iphone retina、ipad、ipad retina四种分辨率
http://cankeyyin.blog.163.com/blog/static/12336178320124149391202/ 原理:将iphone的hd图片给ipad用,即: 使用原iphon ...