极简 Node.js 入门 - 1.4 NPM & package.json
极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node
npm 是什么
npm 是 Node.js 的包管理工具,Node.js package manger,通过 npm Node.js 可以方便的使用第三方开发的开源模块,同时也可以把自己的模块发布到 npm 供其它开发者使用
npm 主要有三部分组成
- npm website:https://npmjs.com,开发者查找发现 package 的站点
- CLI:npm 命令行交互工具,安装、更新、删除
- registry:package 及其元信息存储的数据库
package.json
npm 通过 Node.js 模块根目录的 _package.json_
_ _文件获取模块元数据和依赖关系等,react 的 package.json 包含如下信息
可以通过 npm init 可以自助生成 package.json
{
"name": "react",
"description": "React is a JavaScript library for building user interfaces.",
"keywords": [
"react"
],
"version": "16.13.1",
"homepage": "https://reactjs.org/",
"bugs": "https://github.com/facebook/react/issues",
"license": "MIT",
"files": [
"LICENSE",
"README.md",
"build-info.json",
"index.js",
"cjs/",
"umd/",
"jsx-runtime.js",
"jsx-dev-runtime.js"
],
"main": "index.js",
"repository": {
"type": "git",
"url": "https://github.com/facebook/react.git",
"directory": "packages/react"
},
"engines": {
"node": ">=0.10.0"
},
"dependencies": {
"loose-envify": "^1.1.0",
"object-assign": "^4.1.1"
},
"browserify": {
"transform": [
"loose-envify"
]
}
}
name
name 是模块的唯一标识,安装、使用模块都需要使用模块的 name,可以使用字母、数字、下划线、 -
和.
,安装和使用 react 需要用到如下命令
npm install react
const react = require('react');
可以通过 scope 组织具有相关性的模块,模块名义 @
开头的包就是一个 scoped package,scope 就是 @ 和 / 之间的内容
@scope/project-name
babel7 相关的 presets 和 plugins 都有 @babel
的 scope
- @babel/preset-env
- @babel/preset-react
- @babel/plugin-transform-typescript
- @babel/plugin-transform-modules-amd
version
版本号遵从语义化版本规范,使用 x.y.z
形式,对应 主版本.次版本.修订版本
,版本号递增规则如下:
快捷命令
npm 提供了快捷升级命令
先行版本
x.y.z
格式是模块正式版本,重要模块为了保证稳定,会在放出正式版本之前提供先行版本
- alpha: 内部版本
- beta: 公测版本
- rc: Release candiate,正式版本的候选版本
这种特殊版本除非开发者精确声明使用,否则 npm install 不会自动安装对应版本内容,npm 上 react 部分版本记录
dependencies & devDependencies
dependencies 和 devDependencies 字段用来表示模块的依赖和开发环境依赖,模块依赖的版本号有些几种不同写法,来保证安装的时候使用对应的版本
x.y.z
使用精确版本号*
任意版本,第一次安装会使用模块最新版本^x.y.z
^2.3.7,x 位锁死,y、z 位使用最新版本3.x
和^3.0.0
含义相同,x 位使用指定版本,y、z 位使用最新~x.y.z
~2.3.7 x、y 锁定,z 位使用最新版本
npm 提供了快捷命令,可以在安装的时候就自动把对应内容写到 package.json 中
npm install <package_name> --save # 安装模块并写入 dependencies
npm install <package_name> --save-dev # 安装模块并写入 devDependencies
peerDependencies
有时候模块需要与宿主模块共享依赖,也就是有可能会用到某个模块,但自己不安装,希望宿主环境安装的时候使用 peerDependencies 声明,比如 react-dom 的 package.json 的使用
"dependencies": {
"loose-envify": "^1.1.0",
"object-assign": "^4.1.1",
"scheduler": "^0.19.0"
},
"peerDependencies": {
"react": "^16.13.0"
}
repository
repository 用来指定模块源代码信息
"repository": {
"type": "git",
"url": "https://github.com/facebook/react.git",
"directory": "packages/react"
},
main
main 来标识模块的默认入口文件,比如 react main: "index.js"
,下面两句写法含义相同
const react = require('react');
const react = require('react/index.js');