node应用线上部署时锁定包的依赖版本
我们使用node开发时,经常需要依赖一些模块来完成功能需求,而我们所依赖的模块也必然会依赖其他模块,就这样一级一级的依赖,而且这些依赖模块并不为我们所控制。一个产品或项目的开发周期,少则几个周,多则几个月几年。开发人员往往在一开始时下载了依赖包发现能够正常工作后,便一直在依赖包的当前版本上工作,然而在线上服务器布属时往往是根据依赖配置文件,重新下载依赖包。可这个时候依赖链中的包的开发者很可能已经将某个模块升级了,而且并不能保证这些新的依赖包没有bug。一旦依赖链上的某个包出现bug,可能对产品造成严重影响,而且这个时候往往无法找回开发时所用的正确依赖,以及依赖的依赖的版本。
我们来看一个经典的例子:
假设有包A依赖包B,包B依赖包C:
//包A "name": "A", "version": "0.1.0", "dependencies": { "B": " 0.1.0" "name": "B", "version": "0.0.1", "dependencies": { "C": " 0.1.0" "name": "C", "version": "0.0.1" }
假设在开发时,我们运行npm install A得到以下的依赖链:
A@0.1.0 `-- B@0.0.1 `-- C@0.0.1
而在项目需要部署上线时,我们不可能把所有node_modules放到线上服务器中,所以将项目代码放到服务器时,我们便会运行npm install A,而恰恰这阶段,包B的版本更新到了0.0.8,所以我们在服务器上得到的依赖链就是:
A@0.1.0 `-- B@0.0.8 `-- C@0.0.1
如果B的新版本有问题,这时就会对产品造成难以预估的损失。
所以我们推荐当开发环境中,所有依赖模块都能正常工作时,便在部署到服务器之前将依赖包的版本锁住,这时候就运行这个命令:
npm shrinkwrap
我们会得到一个npm-shrinkwrap.json的文件,这个文件保存了所有当前使用的依赖模块的版本:
{ "name": "A", "version": "0.1.0", "dependencies": { "B": { "version": "0.0.1", "from": "B@^0.0.1", "resolved": "https://registry.npmjs.org/B/-/B-0.0.1.tgz", "dependencies": { "C": { "version": "0.0.1", "from": "org/C#v0.0.1", "resolved": "git://github.com/org/C.git#5c380ae319fc4efe9e7f2d9c78b0faa588fd99b4" }
将这个文件连同项目源码一同部署到服务器上,然后运行npm install这时候,npm会首先检查有没有npm-shrinkwrap.json文件,有的话会根据该文件中依赖包的版本以及resolve字段下载依赖包,这样就能够保证线上环境与开发环境一致。
from 与 resolve这个文件时根据我们当前项目中的node_modules中的模块的当前版本生成的。version代表当前模块版本,from表示的是package.json中对该依赖模块的版本描述,resolve代表当前模块的实际来源。
比如当你的package.json中对于某个依赖模块有如下描述:
"dependencies": { "acorn": "^3.0.0", .................................... }
当acorn模块安装后,它的package.json文件中会出现如下字段:
"_from": "acorn@ =3.0.0 4.0.0", "_resolved": "https://registry.npmjs.org/acorn/-/acorn-3.2.0.tgz",
这时候运行npm shrinkwrap便会出现:
"dependencies": { "acorn": { "version": "3.2.0", "from": "acorn@ =3.0.0 4.0.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.2.0.tgz" },
对于npm-shrinkwrap.json来说,这其中最重要的就是resolve字段。
使用npm shrinkwrap的注意事项 如果要安装新的依赖模块,一定要使用npm install --save 模块,这样保证package.json与npm-shrinkwrap.json文件同步更新。 node_modules中的模块必须能够包含package.json中的依赖模块,如果node_modules中不存在package.json中指定的依赖模块,运行npm shrinkwrap会报错;如果node_modules中包含有package.json中未指定的模块,根据官方说法是也会报错,但根据我的实验(windows7系统)并没有报错,npm-shrinkwrap.json会包含所有在node_modules中的模块。 npm-shrinkwrap.json中并不会包含devDependencies字段中的模块。 参考文章:npm-shrinkwrap-Lock down dependency versions
Node.js——path路径,http,npm与包,模块化 Node.js知识点 一、fs(文件系统) 二、path(路径) 三、http(服务器) 四、npm与包 五、模块化 一、fs(文件系统) (1) 读取指定文件内容 fs.readFile(path[,option],callback 参数1:字符串,表示文件的路径 参数2,表示以什么编码格式读取文件 参数3:读取完成后,通过会点函数读取结果 (2) 向指定的文件中写入内容 fs.writeFile(file,data[,options],callback) 参数1:指文件路径的字符串,表示文件的存放路径 参数2:表示要写入的内容 参数3:表示写入内容的格式,默认值是utf8
node的其他包 pnpm是一种新起的包管理器,从npm的下载量看,目前还没有超过yarn,但它的实现方式值得主流包管理器学习,某些开发者极力推荐使用pnpm
相关文章
- Node.js 应用 peer dependency 的用法
- Node.js 应用访问 https 服务器时遇到的错误消息 unable to get local issuer certificate
- node.js实现国标GB28181设备接入sip服务器解决方案SkeyeVSS国标视频云平台
- node可以用nvm快速切换版本,golang如何快速切换版本?用gvm就行。
- ORA-19244: XQTY0024 – invalid attribute node in element constructor ORACLE 报错 故障修复 远程处理
- ORA-18129: XUDY0030 – Invalid insertion of an attribute node ORACLE 报错 故障修复 远程处理
- 版本Linux下查看Node版本号的方法(linux查看node)
- Linux下使用nvm管理多版本Node.js(linuxnvm)
- 快速在Linux平台上安装Node.js(node安装linux)
- Node.js与MySQL的卓越结合(nodemysql)
- 使用Node.js和MySQL构建强大的Web应用程序(nodejsmysql)
- node.js与neo4j构建扩展性Web应用(nodeneo4j)
- Exploring the Roots of Oracle: Understanding the Importance of the Root Node(oracle根节点)
- Node和MSSQL:让数据解放自我(node mssql释放)
- 利用Node和MSSQL技术实现应用层事务处理(node mssql事务)
- 使用Node模块操作MSSQL数据库(node mssql模块)
- 利用Redis实现高效的Node限流(redis限流node)
- node.js应用后台守护进程管理器Forever安装和使用实例
- node.js中的fs.futimes方法使用说明
- Node.js开源应用框架HapiJS介绍