npm 重点小结

npm做为javascript一个用得比较广的包管理工具,已经集成在了node里面,基本一安装node就能够用npm了,十分方便。这里的小结主要沿着官方文档的思路,挑出一些比较重点的,平时经常使用的部分进行说明,力求清晰与主次分明。

javascript

  1. 全局与本地安装html

    本地安装指的是只将包下载到当前项目的node_module文件夹,当安装的包只须要在项目中被require使用时,用本地安装;全局安装指将包下载到本机安装的npm建立的/lib/node_module文件夹,当安装的包须要在控制台打命令行运行时,就须要全局安装,好比gulp,express cli等等。vue

  2. package.jsonjava

    package.json文件是用来管理项目本地npm的下载包,用npm init命令建立,有一些须要留意的地方:node

    • 项目的命名是有必定要求的,小写,不能有空格,能够用下划线或者连字符。webpack

    • scripts 字段能够配置自定义的一些命令行语句,做用是简化命令行,并且统一命令行为npm run ...的格式,本身本身配置一些语义化的命令,举个例子:git

    "scripts": { "build": "webpack", "dev": "webpack-dev-server --inline --hot --quiet" },

    这样配置后在命令行打npm run build和打webpack的效果是同样的,这个例子看起来打的命令变长了,可是语义化更强了一些,一看就知道是项目构建;第二条命令npm run dev简化命令行的效果就很明显了。github

    • package.json里面还有两个比较重要的字段,即dependenciesdevDependenciesnpm install <package> --save会把安装的包写到dependencies,表示的是正式环境的包;npm install <package_name> --save-dev会把安装的包写到devDependencies,表示的是测试环境的包。不少人知道的就仅限于此了,测试和正式安装的版本不一样会怎么样?install的时候是装哪个?包的版本号是怎么控制的?这些深刻了解的人就很少了,下面来仔细说明一下:
  3. npm install的时候会将dependenciesdevDependencies里面的包所有安装,当两个里面的包版本不一样时,安装dependencies内的版本,同时会有invalid的提示:web

    其实dependenciesdevDependencies里面若是有相同的包这种状况是不该该出现的,缘由在于有些人对dependenciesdevDependencies有一些误解,以为devDependencies应该包含dependencies里面的内容,而后再在devDependencies中加入一些开发环境须要的包,其实devDependencies的意义在于增长一些开发环境须要的包以及一些未肯定是否要用的包,若是某个包是肯定要在线上用的,那么就直接写到dependencies就能够了,不须要在devDependencies中出现,简单来说就是devDependencies其实已经包括dependencies了。因此当你测试完一个包以为能够在线上使用时,你就能够把包写到dependencies里,而后删掉devDependencies中对应的包,保持包名不要重复出现,也有利于package.json文件的简洁。sql

    线上环境能够用npm install --production命令(或者配置了NODE_ENV环境变量为production),就只安装dependencies里面的包。安装完后能够用npm ls查看安装的包的状况。

  4. 全部的包安装后都会带版本号,版本号的规则要符合包node-semver的解析规则,下面直接举例说明:

    npm install sax@0.1.1 npm install sax@">=0.1.0 <0.2.0" npm install vue@^1.0.0 

    第一种是直接指定版本号

    第二种也是也很容易理解,相似的有< <= > >= =,不过写=1.0.0或者v1.0.01.0.0实际上是同样的,字符串中甚至还能够加上||,好比:1.2.7 || >=1.2.9 <2.0.0,来排除中间1.2.8这个版本,其余一些写法能够参考github上面[node-semver] (https://github.com/npm/node-semver)的用法说明,这里主要说明几个经常使用的

    • 缺省:版本号通常分三段,[major, minor, patch](主版本.此版本.补丁),版本能够缺省,表示没有限制这一段的版本,好比1.2表示1.2.0 - 1.2.9

    • -:连字符,能够简单规定版本范围,好比1.2.3 - 2.3.4至关于>=1.2.3 <=2.3.4,须要留意的是连字符左右要有空格空开;

    • * x X:星号表示任意数字,和缺省相似,1.2 1.2.* 1.2.x 1.2.X是同样的

    • ~:波浪号容许小版本迭代,规则分状况理解比较容易:若是有缺省值,则表示缺省部分任意迭代;若是没有缺省值,则表示只容许第三段即补丁的迭代,具体来看node-semver上举的例子(测试版本号有点不同,不过平时用得少就不列举了):

     1. ~1.2.3 :>=1.2.3 <1.3.0 2. ~1.2 : >=1.2.0 <1.3.0 (至关于1.2.x) 3. ~1 : >=1.0.0 <2.0.0 (至关于1.x) 4. ~0.2.3 : >=0.2.3 <0.3.0 5. ~0.2 : >=0.2.0 <0.3.0 (至关于0.2.x) 6. ~0 : >=0.0.0 <1.0.0 (至关于0.x) 
    • ^:上尖号和~含义相对,容许大版本迭代,规则一样分状况:若是有缺省值,则容许缺省值的前一位版本+1迭代;若是没有缺省值,则版本号容许从大到小第一个不为0那一位容许+1迭代,仍是直接看例子:
     ^1.2.3: >=1.2.3 <2.0.0 ^0.2.3: >=0.2.3 <0.3.0 ^0.0.3: >=0.0.3 <0.0.4 ^1.2.x:>=1.2.0 <2.0.0 ^0.0.x:>=0.0.0 <0.1.0 ^0.0:>=0.0.0 <0.1.0 ^1.x:>=1.0.0 <2.0.0 ^0.x:>=0.0.0 <1.0.0 

    以上就是常见的版本号控制语法了,固然还有一些更加高级的混用,不过我的感受容易引发出错混乱,仍是不要折腾了。版本在这里说了那么多,是由于版本是很重要的部分,如今不少包都是开源的,更新迭代很快,npm install <package> --save安装时写入package.json通常是^版本号的格式,在不一样时间用npm install安装package.json中的文件时,可能就会出现版本不一致引发的代码运行结果不一样。

    npm install还有一个参数是--save-optional这个会将包加入optionalDependencies中,这个平时用得比较少,从字面上理解是可选包,等有这样的需求再研究吧。

  5. npm outdated命令能够查看有新版本的包的版本状况,以下图所示,current是当前安装的包的版本,wanted是package.json里面写的版本,latest是最新版本:npm update命令能够更新本地package.json里面列举的包,固然,更新也会遵循package.json里面包的版本规则;不过更新全局的包不是用的update,而是直接从新npm install -g ,若是是更新全部全局的包,直接用npm update -g,话说这样变来变去不知道是出于什么考虑...

  6. npm uninstall是卸载包的命令,不过不少人安装包的时候知道加--save或者--save-dev命令,而卸载的时候就会忘了加,若是这个包是肯定不须要使用的,就能够直接加--save或者--save-dev从package.json中删掉它。卸载全局的包只须要加个-g参数。

  7. npm config是npm中查看配置信息的命令,主要涉及npmrc files 文件

    npm config set <key> <value> [-g|--global] npm config get <key> npm config delete <key> npm config list npm config edit npm get <key> npm set <key> <value> [-g|--global]
  8. npm docs <pkg> 这个命令能够直接打开包的官方文档网站,通常就是github了,不过打开速度不是很快。

  9. npm explore <pkg> [ -- <cmd>] explore 能够暂时定位到包的目录,能够查看修改包内的内容,固然修改完要用npm rebuilt <pkg>来从新编译包;cmd 能够添加一些命令行指令,官网给出的例子是-- git pull origin master,即更新本地git仓库,通常用在包的子模块的更新。exit或者ctrl C 能够退出包目录返回原来的目录地址。

  10. npm help 辅助命令,好比打npm help explore就会打开npm explore的html文档,有个相似的指令是npm help-search,当npm help命令没法定位到肯定文档时,就会自动调用npm help-search命令,好比打npm help b会在全部的npm help *命令的文档里面查找。

  11. npm install <pkg> npm install 后面能够带带版本号标签号的包名,或者压缩包、压缩包地址等等,下面是文档列举的方式,经常使用的就是直接指定包名了

    npm install [<@scope>/]<name> npm install [<@scope>/]<name>@<tag> npm install [<@scope>/]<name>@<version> npm install [<@scope>/]<name>@<version range> npm install <tarball file> npm install <tarball url> npm install <folder>
  12. npm link是用来连接全局包的命令,npm link主要是为模块开发者使用的一个命令,设想这样的一个情景:你开发了一个模块a并发布了(npm public),并在项目中引入这个模块,在使用过程当中发现了a有bug,你改动了a,因而须要从新npm public,发布完你又要回到本身的项目中用npm update命令来更新模块,若是只是小改动还好,若是是开发初期的频繁更新,那么就很浪费时间,毕竟本身开发的模块在本机还要更新,这个步骤明显不少余。npm link命令就是用来同步模块更新的,通常应用场景以下:

    本身开发的包名为appy,放在src/appy文件夹——cd to src/appy——npm link,将会把src/appy这个包复制到npm的全局模块安装文件夹node_modules内,并建立符号连接(symbolic link,应该是一个软连接)——本身的项目放在src/mysite文件夹——cd to src/mysite——npm link appy,那么项目中的appy包就会和src/appy相关联,每次npm publish后,项目文件夹里面的appy包都会随之更新。

    有时候这个包并非你开发的,可是你想contribute这个包时,也能够在本身的项目文件夹中直接用npm link <package>,这个包一样会被安装到全局,并和此项目中的包相关联。

  13. npm ls[ll | la]是和shell命令相似的语法,就是列举信息,默认以树形的方式列举包名,包括其依赖,llla列举的信息较为多一点。若是你想用json格式来列举,能够经过设置config文件的json字段来设置,用npm config set json true,则将以json格式来显示包及其依赖,不过这个字段是npm全局的,不少命令的显示都会变成json格式。其他还有一些蛮有用的配置项,好比若是列举的依赖过多,能够设置depth(int)参数来限制显示的层级,prod / production(Boolean)来只显示dependencies的依赖,dev(Boolean)来只显示devDependencies的依赖等等。

  14. npm prune,这个命令要和package.json文件路径下运行,将会移除package.json中没有列举的node_modules的包,若是是生产环境中或者加--production,将会移除devDependencies里面的包,用于清理多余的包资源。

  15. npm repo <package>,这个和上面的npm docs相似,通常也是打开的github网址。

  16. npm root [-g],打印出node_modules文件夹路径,加个-g能够查看全局包的安装路径,有时候忘了全局包安装路径这个小命令仍是蛮有用的。

  17. npm run <command>用npm run来跑package.json里面script字段内的命令,能够直接打npm run查看有哪些命令

  18. npm shrinkwrap,这个命令用来指定安装的包版本,主要是为了项目环境的稳定。由于传统的npm install安装的包写入package.json时每每带的是一个版本号范围,有时候为了在其余地方安装可以保持版本号一致或者在线上部署但愿项目稳定,因此但愿用npm install安装依赖时安装的包和测试经过时是同样的,或者说保持版本号一致,npm shrinkwrap就是这样的一个功能。npm shrinkwrap会在目录下面建立npm-shrinkwrap.json文件,里面是项目中已经安装的包(包括全部包内嵌套的包)的肯定版本号以及包的下载位置,当用npm install是,会直接安装npm-shrinkwrap.json文件内列举的包名。若是想要更新npm-shrinkwrap.json文件内的包,能够先用npm update <package>更新包,再用npm shrinkwrap命令来从新建立npm-shrinkwrap.json文件,npm shrinkwrap默认只肯定package.jsonde­pen­den­cies内的包,测试环境的包须要加--dev参数。

  19. npm update [-g] [<pkg>...]用来更新包,须要注意的是包更新依然须要符合package.json中的版本号范围,只会在版本号范围内更新最新版本的包。有-g--dev--save参数,没有加具体包名时默认更新全部的包。

  20. npm view能够查看不少信息,下面列举几个经常使用的:

    • npm view connect直接接包名查看包信息

    • npm view npm view ronn@0.3.5 dependencies查看包依赖

    • npm view connect versions查看包历史版本列表,若是version不加s则表示查看包最新版本。

以上列出的命令涉及到的是平常的使用范围,还有一些复杂的参数和设置就不列举了,实际上我的用到的命令很少,不少都是看文档的时候才知道的,若是有哪些错漏欢迎指出。除此以外,npm还有其余一些命令是关于发布包的流程与管理的,这部分就蛮复杂(主要是我没有发布包的经验),但愿之后有机会发布本身的包的时候再来写了。最后吐槽一下博客园的Markdown编辑器,总以为显示出来的效果实在是差点意思......

 

https://github.com/npm/node-semver

npm documentation

RYAN . What is npm shrinkwrap and when is it needed

npm link: [developing your own npm modules without tears](http://justjs.com/posts/npm-link-developing-your-own-npm-modules-without-tears

Oleksii Rudenko . Simple Way to Manage Local Node Modules Using NPM Link.

JeremyWei . 如何发布Node模块到NPM社区

相关文章
相关标签/搜索