企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# npm、yarn、pnpm - 插入修饰符(^) 会安装基于当前主版本号不变,次版本号和修补版本号都是最新的版本,比如版本号是^2.5.16, 会安装2.x.x最新的版本。但是不会跨主版本号安装,比如3.0.0 - 波浪修饰符(~) 会安装基于当前主版本号和次版本号不变,修补版本号是最新的版本,比如版本号是^2.5.16, 会安装2.5.x最新的版本,比如2.5.18。 - 固定版本号 ## npm npm是根据语义版本控制semver设计:**主版本号.次版本号.补丁版本号** * **npm/yarn install 原理** ![](https://img.kancloud.cn/11/ec/11ec27e106bb57fe076686eac1cb20c4_1207x297.png) 一个项目依赖项目A,项目A依赖项目B,项目B依赖项目C ---->npm1/2 嵌套依赖、npm 3扁平依赖关系树 **npm安装速度慢**: npm首先遍历所有的项目依赖关系,再决定如何生成扁平的node_modules目录结构。npm为所有使用到的模块构建一个完整的依赖关系树,这是一个耗时的操作 npm是有**本地缓存**的,它保存了已经下载的每个版本的压缩包。本地缓存的内容可以通过npm cache ls命令进行查看。本地缓存的设计有助于减少安装时间。 产生**依赖结构的不确定**问题:也是 lock 文件诞生的原因,无论是package-lock.json(npm 5.x才出现)还是yarn.lock,都是为了保证 install 之后都产生确定的node_modules结构。 安全性: A依赖B,B依赖C,A当中是可使用 C ,但是A当中没有声明C这个依赖 ---> **非法访问** ### **npm处理依赖冲突** 如果遇到因为需要的版本要求不一致导致冲突,没办法放在平铺目录下的,回退到 npm v2 的处理方式,在该模块下的 node_modules 里存放冲突的模块。 - 比如:A依赖了B的低版本V1.0, C依赖了B的高版本V2.0,冲突的依赖B 模块将会以 npm v2 的处理方式放入子 `node_modules` 目录中 当一个依赖模块X定义在**peerDependencies**中而不是devDependencies或dependencies中时,依赖该模块的项目就不会自动下载该依赖 ## **yarn** yarn使用本地缓存。yarn无需互联网连接就能安装本地缓存的依赖项,它提供了**离线模式** 每个yarn安装都会生成一个类似于npm-shrinkwrap.json的yarn.lock文件,而且它是默认创建的。除了常规信息之外,**yarn.lock文件**还包含要安装的内容的校验和,以确保使用的库的版本相同 ## **pnpm** 优点:包安装速度极快;磁盘空间利用非常高效 使用基于内容寻址的文件系统来存储磁盘上所有的文件 软连接、硬链接:通过不同的路径引用方式去找到某个文件。pnpm 会在全局的 store 目录里存储项目 node_modules 文件的硬链接,然后在引用依赖的时候则是通过软连接去找到对应虚拟磁盘目录下(.pnpm 目录)的依赖地址。 迁移到 pnpm---开发环境:安装 pnpm, 移除 node_modules 文件夹, pnpm install即可, 日常使用与 npm 几乎无异 ## nrm / yrm 管理镜像源工具 ```shell npm install -g yrm npm install -g nrm yrm ls npm ----- https://registry.npmjs.org/ cnpm ---- http://r.cnpmjs.org/ taobao -- https://registry.npm.taobao.org/ nj ------ https://registry.nodejitsu.com/ rednpm -- http://registry.mirror.cqupt.edu.cn skimdb -- https://skimdb.npmjs.com/registry yarn ---- https://registry.yarnpkg.com 切换源: nrm use cnpm 添加自定义源: nrm add mrcdh http://registry.npm.mrcdh.org 删除配置:nrm del mrcdh 测试镜像源速度:nrm test cnpm ``` # npm包的制作发布 # vue 使用私有包 - 打包组件库,在page.json里配置新增一个lib打包命令--- npm run lib –target: 构建目标,默认为应用模式。这里为 lib 启用库模式。 –dest : 输出目录,默认 dist。这里改成 lib `[entry]`: 入口文件,默认src/App.vue。这里指定编译 components/ 组件库目录。 ```js "scripts": { "lib": "vue-cli-service build --target lib --name anyname --dest lib src/components/index.js" } ``` - 私有模块发布 项目clone下来:` git clone http://git.your-inc.com/anygroup/any-name.git ` 添加 package.json 配置, 注意限定 @scope:` npm init --scope=anygroup` 提交 push 上去, - 使用私有模块 package.json 中添加依赖, 例如: 依赖 @anygroup/any-name 这个私有模块 ` "@anygroup/any-name": "git+http://git.your-inc.com/anygroup/any-name.git#branch1"` 私有模块的包名只是带有 @scope 而已 ```js var Comone = require('@anygroup/any-name'); import Comone from '@anygroup/any-name' // 另外一种引用方式 ``` 更新私有模块: npm update无法更新私有模块 `npm install @anygroup/any-name`