npm

简介

npm全称为node package manager,即node包管理器,运行在node环境中

npm之所以要运行在node环境,而不是浏览器环境,根本原因是因为浏览器环境无法提供下载、删除、读取本地文件的功能。而node属于服务器环境,没有浏览器的种种限制,理论上可以完全掌握运行node的计算机

组成

npm由三部分组成:

  • registry: 入口
    • 可以想象成一个庞大的数据库
    • 第三方库的开发者,将自己的库按照npm的规范,打包上传到数据库中
    • 使用者通过统一的地址下载第三方包
  • CLI: command-line interface 命令行接口
    • 安装好npm后,通过CLI来使用npm的各种功能

包的安装

  • 查看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目录,例如:
  1. var _ = require("lodash");

它首先会从当前目录的以下位置寻找文件

  1. node_modules/lodash.js
  2. node_modules/lodash/入口文件

如果当前目录没有这样的文件,就会回溯到上级目录按照
同样的方式查找,到顶级目录都无法找到就抛出错误

  • 入口文件按照以下规则确定:
    1. 查看导入包的package.json文件,读取main字段作为入口文件
    2. 若不包含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 后启动程序
  1. "scripts":{
  2. "start": "set NODE_ENV=development&&node index.js",
  3. "build": "set NODE_ENV=production&&node index.js"
  4. }
  • 为了避免不同系统的设置方式的差异,可以使用第三方库cross-env对环境变量进行设置
  1. npm i -D cross-env 安装到开发环境
  2. "scripts":{
  3. "start": "cross-env NODE_ENV=development node index.js",
  4. "build": "cross-env NODE_ENV=production node index.js"
  5. }

在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 包名

发布包

准备工作

  1. 移除淘宝镜像源
  2. 到npm官网注册账号
  3. 本地使用npm cli 进行登录,
  1. npm login 登录
  2. npm whoami 查看当前登录的账号
  3. npm logout 注销
  1. 创建工程根目录(npm不能有这个项目名)
  2. 使用npm init进行初始化

发布

  1. 开发
  2. 确定版本
  3. 使用命令 npm publish 完成发布