npm
简介
npm全称为node package manager,即node包管理器,运行在node环境中
npm之所以要运行在node环境,而不是浏览器环境,根本原因是因为浏览器环境无法提供下载、删除、读取本地文件的功能。而node属于服务器环境,没有浏览器的种种限制,理论上可以完全掌握运行node的计算机
组成
npm由三部分组成:
- registry: 入口
- 可以想象成一个庞大的数据库
- 第三方库的开发者,将自己的库按照npm的规范,打包上传到数据库中
- 使用者通过统一的地址下载第三方包
- 官网:https://www.npmjs.com
- 查询包
- 注册,登录,管理个人信息
- CLI: command-line interface 命令行接口
- 安装好npm后,通过CLI来使用npm的各种功能
包的安装
- 设置registry地址
- npm config set registry https://registry.npm.taobao.org
- 查看registry
- npm config get registry
本地安装
- 在项目根目录使用 npm install 包名 或 npm i 包名 安装
- 本地安装的包出现在当前目录下的node-modules目录中,目录下的内容不适合直接传输到生产环境,通常使用.gitignore文件(node_modules)忽略该目录中的内容
- 如果本地安装的包带有CLI,npm会将它的CLI脚本放置到node_modules/.bin下,使用npx 命令名 即可调用
全局安装
- 全局安装的包放置在一个特殊的全局目录,使用命令npm config get prefix 查看
- 全局安装命令 npm install —global 包名 或 npm i -g 包名
- 全局安装的包并非所有工程可用,它仅提供全局的CLI工具
- 大部分情况下,都不需要全局安装包,除非:
- 包的版本非常稳定,很少有大的更新
- 提供的CLI工具在各个工程中使用的非常频繁
- CLI工具仅为开发环境提供支持,而非部署环境
包的配置
package.json
- 配置文件,通过npm init 创建,信息包括:
- name:包的名字,必须是英文,支持连接符
- version:主版本号.次版本号.补丁版本号
- description:包的描述
- homepage:官网地址
- author:包的作者,必须是有效的npm账户名,书写规范是account
- repository:代码存放位置
- main:入口文件
- package.json文件最重要的作用是记录当前工程的依赖
生产环境 dependencies
- npm i 包名
- npm i —save 包名
- npm i -S 包名
开发环境 devDependencies
- npm i —save-dev 包名
- npm i -D 包名
包的使用
- 使用nodejs导入模块时,如果模块路径不是以./或../开头,则node会认为导入的模块
来自于node_modules目录,例如:
var _ = require("lodash");
它首先会从当前目录的以下位置寻找文件
node_modules/lodash.jsnode_modules/lodash/入口文件
如果当前目录没有这样的文件,就会回溯到上级目录按照
同样的方式查找,到顶级目录都无法找到就抛出错误
- 入口文件按照以下规则确定:
- 查看导入包的package.json文件,读取main字段作为入口文件
- 若不包含mian字段,则使用index.js文件作为入口文件
- package-lock.json
npm在安装包的时候,会自动生成一个package-lock.json文件,该文件记录了安装包时的确切依赖关系
当移植工程时,如果移植了package-lock.json文件,恢复安装时,会按照package-lock.json文件中的确切依赖关系进行安装,最大限度地避免了差异
语义版本
版本规范
- 主版本号:仅当程序发生了重大变化时才会增长,如新增了重要功能、新增了大量的API、技术架构发生了重大变化
- 次版本号:仅当程序发生了一些小变化时才会增长,如新增了一些小功能、新增了一些辅助型的API
- 补丁版本号:仅当解决了一些 bug 或 进行了一些局部优化时更新,如修复了某个函数的 bug、提升了某个函数的运行效率 | 符号 | 描述 | 示例 | 示例描述 | | —- | —- | —- | —- | | > | 大于某个版本 | >1.2.1 | 大于1.2.1版本 | | >= | 大于等于某个版本 | >=1.2.1 | 大于等于1.2.1版本 | | < | 小于某个版本 | <1.2.1 | 小于1.2.1版本 | | <= | 小于等于某个版本 | <=1.2.1 | 小于等于1.2.1版本 | | - | 介于两个版本之间 | 1.2.1 - 1.4.5 | 介于1.2.1和1.4.5之间 | | x | 不固定的版本号 | 1.3.x | 只要保证主版本号是1,次版本号是3即可 | | ~ | 补丁版本号可增 | ~1.3.4 | 保证主版本号是1,次版本号是3,补丁版本号大于等于4 | | ^ | 此版本和补丁版本可增 | ^1.3.4 | 保证主版本号是1,次版本号可以大于等于3,补丁版本号可以大于等于4 | | | 最新版本 | | 始终安装最新版本 |
npm脚本
- start,stop,test脚本,不需要使用run
- 脚本中可以省略npx
- start脚本有默认值,node server.js
运行环境配置
三种运行环境
- 开发环境development
- 生产环境production
- 测试环境test
如何让node知道处于什么环境?
- global有一个属性是process,该属性是一个对象,包含了当前运行node程序的计算机的很多信息,其中有一个信息是env,是一个对象,包含了计算机中所有的系统变量,global.env.process
- 我们一般使用临时设置,可以配置 scripts 脚本,在设置好了 NODE_ENV 后启动程序
"scripts":{"start": "set NODE_ENV=development&&node index.js","build": "set NODE_ENV=production&&node index.js"}
- 为了避免不同系统的设置方式的差异,可以使用第三方库cross-env对环境变量进行设置
npm i -D cross-env 安装到开发环境"scripts":{"start": "cross-env NODE_ENV=development node index.js","build": "cross-env NODE_ENV=production node index.js"}
在node中读取package.json
var config = require(“package.json”),在node中导入json文件,会自动把数据转为js对象
npm命令
安装
- 精确安装最新版本
- npm install —save-exact 包名
- npm install -E 包名
- 安装指定版本
- npm install 包名@版本号
查询
- 查询包安装路径
- npm root -g
- 查看包的信息
- npm view/v/info/show 包名 子信息
- 查询安装包
- npm list/ls/ll/la -g —depth=依赖深度(数字)
更新
- 更新npm
- npm i -g npm (未全局安装时)
- npm update -g npm(安装npm需更新时)
- 检查哪些包需要更新
- npm outdated
- 更新包
- npm update -g 包名
- 卸载包
- npm uninstall/un -g 包名
发布包
准备工作
- 移除淘宝镜像源
- 到npm官网注册账号
- 本地使用npm cli 进行登录,
npm login 登录npm whoami 查看当前登录的账号npm logout 注销
- 创建工程根目录(npm不能有这个项目名)
- 使用npm init进行初始化
发布
- 开发
- 确定版本
- 使用命令 npm publish 完成发布
