Skip to content

NPM

安装机制

Pasted image 20221103214318.png

npm 创建和发布一个包的步骤

bash
npm set init.author.name "Oaker"
npm set init.author.email "[email protected] "
npm set init.author.url "http://oaker.bid"

npm init --yes
npm init --scope=cyio

npm i mocha chai -D

mkdir test && touch test/test.js

npm test

git tag v0.0.1
git push origin master --tags
npm publish --access public

开销评估

bundlephobia

私有 npm 仓库

  • 最简单 git 即可
  • 不好的地方是,使用 npm update 是无法更新私有模块,想更新只能重新安装一次。好处是不用搭建服务。

5 分钟内 3 种方法搭建企业内部私有 npm 仓库 - 掘金

npm 安装失败怎么办?

  1. 网络解决 绝大多数安装出问题,是网络问题引起的,npm 包往往依赖 github。 比如 node-sass 安装时,要下载对应系统的二进制文件,如果下载失败可能就要本地编译。 解决思路是使用代理来装这些包,npm 支持设置 http(s)代理,不支持 socks,解决方法是用 proxychains。

  2. 手动 clone https://npmjs.org/package/xxx 把 xxx 换成你要装的包名,在页面找到其源码托管页,通常是 github 把源代码 clone 下来,放到node_modules/xxx目录,检查这个目录下的 package.json,如果有依赖,按照同样方法操作。

《Node.js 入门系列》—— NPM 安装第三方模块常见问题

NPM 使用问题汇总 · Issue #565 · fex-team/fis

安装或升级 npm,需要全局,需要 sudo 或 win 下的管理员权限

bash
sudo npm install -g npm
proxychains npm install node-sass --save-dev

解决 gulp 等全局安装后,找不到命令

由于自定义了全局 npm 的路径,也就是 prefix,所以要告诉终端,执行如下命令

bash
echo -e "export PATH=$(npm prefix -g)/bin:$PATH" >> ~/.zshrc && source ~/.zshrc

特殊包安装

  • puppeteer PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true yarn add puppeteer 忽略 chromium 下载

与 yarn 比较

lockfile 可重现构建

tldr:

  • npm 使用版本大于 5.4.2
  • 维护者更新 lockfile,npm install --package-lock-only
  • 非维护者可用 yarn,修改包时,不要提交 lockfile,由维护者统一更新
  • lockfile 应尽量避免冲突,建议由一个人维护,这样本地 npm 版本差异不是问题
  • 建议升下 npm,大家统一使用 5.10.x 或 6.x.x,这样生成的 lockfile 规则一致

问题:package.json松散版本号,安装易变 解决方案 yarn 引入 lockfile 锁死加 手动升级

How Yarn Lock Files Work and Upgrading Dependencies

npm 5-6 lock 调整了子依赖版本号描述方式,减少 diff。精确安装看顶层。不影响行为,构建环境可忽略此问题 changes after install · Poltergeist/npmtest@59dad3enpm install changes package-lock.json from exact versions to loosly versions · Issue #20434 · npm/npm

理想情况,输入package.json,输出确定node_modules

影响因素:

  • 使用不同版本 npm,安装算法略有差异
  • 范围包,有更新,再安装时使用新版本
  • 子依赖即使写死版本号,也会更新
  • 安装包的远程库失效

A-B-C,A 指定 B 版本,但想用新的 C 怎么办

可重现依赖树,不必根据package.json重新计算依赖版本 规则,尝试根据 lockfile 描述还原,如果不可用或缺失,则回退到旧方式

npm update``npm rm``npm update会触发,使用选项--no-save避免保存

加入版本管理,可以记录变化

冲突,1. 人工解决package.json冲突 2. npm install --package-lock-only 自动解决 lockfile 冲突

推荐使用npx npm-merge-driver install --global,自动让 git 处理 lockfile 冲突

npm-package-locks | npm Documentation

lockfile 加 npm install 在部署时不能保证可靠还原,一旦出现问题 debug 麻烦

旧版本package.json依赖有更新且npm i时,会更新依赖和 lockfile 而不是 respect lockfile,5.4.2 后修复此问题,安装规则:why is package-lock being ignored? · Issue #17979 · npm/npm

5.7.1 引入npm ci只从 lockfile 进行复现安装。适用于纯净部署,比常规安装更快更严格,帮助捕获错误或增量安装引起的不一致

缺点是会删除 node_modules,安装时间会长些

lockfile 与 package.json依赖不匹配时,会报错,而不是更新 lockfile 如查node_modules存在,会先删掉 可以做为npm i失败的回退,大幅降低安装失败的情况

npm-ci | npm DocumentationThe npm Blog — Introducing npm ci for faster, more reliable...node.js - Why does "npm install" rewrite package-lock.json? - Stack Overflow

从 yarn 迁移 mixmaxhq/deyarn: A command-line tool for converting projects that use Yarn to npm.

语义化版本

文件正在使用,无法访问

  • 关闭编辑器、安全软件
  • 删除缓存
  • 重启
  • 以管理员权限安装,不推荐

PNPM

缺点:部分编辑器支持有问题?

yarn 2(Berry)

实际是另一个工具了,暂不考虑使用

  • 很多批评,包括 yarn 1 作者
  • facebook 等大的工程项目,没有升级

Yarn 1 vs Yarn 2 vs NPM - Red Shift

提示 gyp: No Xcode or CLT version detected

gyp: No Xcode or CLT version detected macOS Catalina | Anansewaa

生产构建

期望:只安装 dependencies,不安装 devDependencies 和 optionalDependencies

一般用不到 optionalDependencies

npm install --production
# or
export NODE_ENV=production

npm install --no-optional

With the --production flag (or when the NODE_ENV environment variable is set to production), npm will not install modules listed in devDependencies.

https://docs.npmjs.com/cli/install

debug - npm

源使用优先级

npm install --registry=http://registry.npm.taobao.org
  project config
    metrics-registry

如果只是少量项目使用私有源,建议使用project config方式。万一私有源访问出现问题,减少影响。

私有仓库

两个以上项目共享常量数据、工具函数

搭建: sinopia

维护:公共包修改,需要提升版本号,需要在每个引用公共包的项目升级

发布测试包

通过打 tag 方式发布的包,需要指定版本才能安装

sh
npm publish --tag alpha
npm publish --tag beta

image.png

配置优先级

Pasted image 20221103215444.png

image.pngimage.png

lockfileversion 2 vs 1

v1 => npm v5 and v6.
v2: => npm v7&v8, which is backwards compatible to v1 lockfiles.
v3: => npm v7&v8 without backwards compatibility