当前位置: 首页 > 后端技术 > Node.js

npm实战指南北

时间:2023-04-03 15:29:10 Node.js

npm是下载node自带的大礼包,想必大家都不陌生。不过关于npm,估计很大一部分只用了npminstallXXX和npmrunXXX。其实这里有很多有趣的命令&参数。关于npm,大概有两个作用:它可以让我们方便的从网上下载第三方的包来实现功能,它可以让我们自己写包上传到网上供别人下载下载。下载相关操作主要围绕install进行。命令来了。install可以简写为i,安装原来的依赖包。当我们在一个项目下,执行npmi安装当前项目的所有依赖包。包含所有依赖项、devDependencies、optionalDependencies和bundleDependencies。如果我们在执行npmi的时候加上--production参数,就表示是线上环境,devDependencies下的所有依赖都会被忽略。现在我们有以下package.json文件:{"dependencies":{"koa":"^2.5.0"},"devDependencies":{"eslint":"^4.19.1"}}如果你执行npmi,将安装所有依赖项。>npmls--depth=0├──eslint@4.19.1└──koa@2.5.0然后我们尝试加上--production参数,使用--only=prod[uction]也能达到效果。>npmls--depth=0└──koa@2.5.0使用--only=dev[elopment]只安装devDependencies的依赖。--depth=XXX用于设置显示路径的深度。默认情况下,将递归打印所有依赖项。安装新的依赖是直接安装项目原有依赖的操作。如果我们要添加一些依赖项,这里有一些选项需要了解。如果我们在执行install的时候加上--no-save、--save-dev等标志,就不会直接写入dependencies,而是会有一些其他的处理。各种选项:flagdescription--save-prod默认选项对应dependencies--no-save不将依赖写入package.json--save-dev,-D对应devDependencies--save-optional,-O对应optionalDependencies,在安装时可以通过指定--no-optional--save-bundle忽略该模块下的依赖,-B对应bundleDependencies,好像已经放弃了-.---save-exact,-Einstallan准确版本,版本号不会加^等标记--global,-g全局安装包,一般来说,更多参数需要管理员权限,请参考:https://docs.npmjs.com/cli/install在package.json中,经常可以看到依赖的版本号前有一个^或~。^和~会导致在重新安装依赖的时候按照规则安装最新的版本。例如,如果版本号是^2.1.0,它将匹配所有包>=2.1.0<3.0.0如果版本号是~2.1.0,它将匹配所有包>=2.1.0<2.2。0这个标识的好处是:一个包修复bug,只更新最后一个版本号。所有依赖它的包都不需要重新上传自己的package.json。所以,当涉及到可能导致不兼容的更新时,请务必修改版本号的前两位。.否则就是作弊-.-我们可以在安装包的时候指定tag或者versionnpmikoa@nextnpmikoa@2.0.0npmikoa@">=2.0.0<2.5.0"其中next是一个tagif如果不指定,默认有最新的。第二个指定安装2.0.0版本的koa。最后一个将在范围规则内选择最新版本进行安装。上传相关操作要上传,必须先开发。所以我们上传的整个过程大致是这样的:npminitcreatespackage.jsonfordevelopmentnpmshow,如果404,恭喜,这个名字还没有被占用。npm发布,上传包。其实在很多npminit的时候,我们创建package.json只是为了安装依赖,但是在执行npminit之后,我们要多次确认可选的内容。事实上,如果你加一个参数,npm是不会让你确认这些可选内容的。npminit-f、--force、-y、--yes都可以达到这个效果。当然,如果你想把这个文件夹打包发送,这些可选内容是必须的。如何在开发包的过程中进行本地调试在开发过程中,为了快速进行本地调试,可以执行这个命令:npmlink<你的包名>如果在当前包的文件夹下,可以直接执行npmlink,可以简写为npmln,然后在要调试的项目中执行npmlink<你的包名>,创建一个引用本地的链接。调试后,执行npmunlink删除链接。如何创建命令行可执行模块我们可以在package.json中添加一个bin字段来指定一个文件。{"bin":{"sayhi":"bin/hi"}}file./bin/hi:#!/usr/bin/envnodeconsole.log('hithere')如果使用-g进行全局安装,对应的命令会被注册,我们直接在终端执行即可。#!/usr/bin/env节点是必需的,路径可能会改变。npmshow方法好像文档里没有写。.但它确实存在。执行npmshowXXX会返回这个package对应的信息,也可以稍后直接获取JSON格式的值:npmshowkoaversionnpmshowkoadist-tags.latestnpmpublish当我们的package开发完成后,可以执行publish上传。对于npmpublish,后面也可以指定文件夹路径或者压缩包,但是两者都需要包含package.json文件(npm包的信息在这里),后面我们可以拼接--tag=XXXtoupload相应的tag,如果不写,默认会上传到latest。写标签的好处是我们可以同时维护多份代码,两者互不影响(但注意发布时不要忘记标签)。比如去年的node.js稳定版还是6,但是koa已经开始使用7.6+的async/await特性,所以他们发布了koa@next,现在是2.x,来支持新的语法。在后续的版本更新中,如果我们的包上线后发现有bug,我们需要修复。因为npm的限制,我们每次发布都要保证版本的一致性。npm为我们提供了三个命令:npmversionpatchnpmversionminornpmversionmajor这三个命令会依次修改版本的3.2.1位。major.minor.patchpatchpatch是变化最小的版本号,也就是我们上面说的bugfix,^和~会兼容。minor为minor,则修改中间的版本号。一般来说,新功能的加入需要修改这个版本号,因为可能会导致之前的用法发生变化。major的最后一个是版本号,只有在大更新后才会修改。比如我们亲爱的koa,在抛弃Generator拥抱async/await之后,直接发布了koa2.x。执行这三个命令的前提是你当前仓库没有未提交的变更。因为npm会直接帮你修改版本,添加commit记录,如果有未提交的改动,可能会造成版本冲突。执行完这些命令(或者手动修改版本号也没问题),执行npmpublish上传更新包。如果想自定义本次提交的信息,可以这样做:npmversionpatch-m"Upgradeversionto%s"%s会自动被npm替换为更新后的版本号并提交。更新的时候一定要加上对应的--tag,不然会默认推送到@latestnpmscripts关于package.json里面的scripts,不知道大家知道多少。如果你的包上传到npm,其实有很多类似于hooks的脚本。publish当你的包执行publish并上传到服务器时,这个脚本就会被执行。其实我们可以在这个地方执行gitpush操作,将这次修改直接推送到GitHub仓库,省去了不必要的命令敲击。或者如果你的包也上传到apm或者类似的同类仓库,你也可以直接在这里处理(省去多次繁琐的操作)。安装脚本将在安装包后执行。比如我们使用Flowtype开发一个package,我们可以直接将源码转为npm,然后在install命令中执行编译,去掉流注释。一些依赖node-gyp的包会有install:node-gyprebuild这个操作。uninstall如果你的包会影响一些全局数据(例如,某些包可能会重写.bashrc等文件)。这时候可以在卸载脚本中恢复那些修改过的项目(良心操作)。更多脚本hooks:https://docs.npmjs.com/misc/scriptsNotes最近看了npm文档,发现很多以前很少用到的命令&参数。感觉npm做的确实不错。其实,一些原本重复性的工作,使用npm相关命令就可以轻松解决。我希望你不要只是将它用于npm安装。最后:NPM爱你。参考资料https://docs.npmjs.com/cli/inithttps://docs.npmjs.com/misc/developershttps://docs.npmjs.com/cli/version