Node包管理与规范
1. 依赖管理
Section titled “1. 依赖管理”1.1. Npm
Section titled “1.1. Npm”- 使用
npm install # 安装所有依赖npm install <package-name> # 安装单个包npm install <package-name> --save-dev # 安装为开发依赖 (npm i -D)npm install <package-name> --save # 安装为生产依赖 (npm i -S)npm update # 更新所有包npm uninstall <package-name> # 卸载包
npm install --registry=https://registry.npmmirror.com # 安装时指定国内源npm config set registry https://registry.npmmirror.com # 设置国内源npm config get registry # 查看源配置- 特点
package.json: 项目的元数据文件,记录了项目的名称、版本、描述、依赖等信息。package-lock.json: 锁定依赖版本,确保不同环境下安装的依赖版本一致性。- 拥有庞大的生态系统和社区支持。
1.2. Yarn
Section titled “1.2. Yarn”- 使用
yarn add <package-name> # 添加包yarn global add <package-name> # 全局添加包yarn install # 安装所有依赖yarn remove <package-name> # 移除包yarn upgrade # 升级所有包yarn outdated # 检查过时的包yarn config set registry https://registry.npmmirror.com/ # 设置国内源- 特点
yarn.lock: 锁定依赖版本,确保不同环境下安装的依赖版本一致性。- 相对 npm 优势
- 更快 (引入并行下载)
- 版本锁定更严格
- 校验更严格
- 输出更简洁
- 离线支持更稳定
出现 certificate has expired 问题,可以尝试删除
yarn.lock文件后重新安装。
1.3. Pnpm
Section titled “1.3. Pnpm”也是一个包管理器,特点是速度快、节省磁盘空间。
- 安装
npm install -g pnpm # 全局安装 pnpm- 配置
# 为了防止 pnpm 把全局包和你的 NVM Node 版本混在一起(导致你换了 Node 版本后,全局安装的工具就找不到了),建议显式指定全局安装和全局 bin 的路径:
# 1. 设置全局安装包的存放位置pnpm config set global-dir "$HOME/.pnpm-global/store"
# 1. 设置全局可执行命令的存放位置pnpm config set global-bin-dir "$HOME/.pnpm-global/bin"
# 2. 建议配置到bashrcexport PNPM_HOME="$HOME/.pnpm-global"export PATH="$PNPM_HOME/bin:$PATH"- 使用
pnpm install # 安装所有依赖pnpm add <package-name> # 添加包pnpm add -D <package-name> # 添加为开发依赖pnpm add -S <package-name> # 添加为生产依赖pnpm update # 更新所有包pnpm remove <package-name> # 移除包- 特点
- 硬链接和符号链接: 通过内容可寻址存储,实现依赖的复用,大大节省磁盘空间。
pnpm-lock.yaml: 锁定依赖版本,比package-lock.json和yarn.lock更严格,能更好地保证一致性。- 非扁平化的
node_modules: 避免幽灵依赖和版本冲突。 - 速度快,性能优异。
1.4. Npx
Section titled “1.4. Npx”- 用于执行
node_modules中可执行文件或者直接运行远程 npm 包。 - 解决的问题:
- 无需全局安装包即可运行其可执行文件,避免全局污染。
- 可以方便地运行一次性命令或测试不同版本的工具。
- 使用:
npx <package-name> [arguments] # 执行包中的命令npx create-react-app my-app # 运行 create-react-app 包创建项目2. 常见函数
Section titled “2. 常见函数”- 路径函数
var path = require("path")path.resolve() //返回绝对路径3. 常见全局变量
Section titled “3. 常见全局变量”__dirname // 当前文件的路径4. 模块知识
Section titled “4. 模块知识”4.1. Commonjs 规范
Section titled “4.1. Commonjs 规范”- 导出
exports = modules.exports = {}; // 导出分类实施- 导入
const data = require("fs")import("fs").then(modele=>{}) // 动态导入4.2. ES6 规范
Section titled “4.2. ES6 规范”- 导出
export const a = "data" // 多数据导出export default a = "data"注意 export 出现多次、而 export default 只能出现一次。 export 可以导出变量表达式,export default 不可以。
- 导入
import {a as a_data} from "a" //从export导入数据并且重命名import a from "a" //从export default导入数据import("fs").then(modele=>{}) // 动态导入异步导入其实就是动态创建 script 的方式
4.3. Node 编译环境
Section titled “4.3. Node 编译环境”-
环境识别
- 以 cjs、js 为后缀的会默认使用 commonjs 规范、以 mjs 为后缀的文件会默认使用 ES6 规范
-
commonjs 环境导入 ES6 规范模块
-
方式 1
- 将文件后缀名修改为 mjs
-
方式 2
- 修改 pageckage.json 文件
{type:"module"} -
方式 3
- 使用 babel 进行编译
-
-
ES6 环境实导入 commonjs 规范模块
import { default as csv } from 'csvtojson';
5. 常见问题
Section titled “5. 常见问题”5.1. 记录一次 npm 安装被 kill 的问题
Section titled “5.1. 记录一次 npm 安装被 kill 的问题”- 问题原因是因为内存不够的问题
- 解决方式
- 新增内存
- 开启 swap
6. 常见的 node 包
Section titled “6. 常见的 node 包”- jsontocsv json 转化为 csv
- csvtojson csv 转化为 json
- lodash 工具库
- moment 处理时间库