0%

mac-node

1. nvm

nvm的目录是~/.nvm

1
nvm alias default 8.11.3 #使用node 8.11.3作为默认版本

1.1 特定node的目录

比如node 6.9.5的目录是
.nvm/versions/node/v6.9.5/lib/node_modules

2. yarn

npm模块的依赖,现在用yarn,它的缓存在~/.npm。

注意在安装nvm的情况下,不要再安装node了`brew install yarn –without-node

3. nvm alias default v8.16.2

绑定default版本后,然后npm所有安装库都会使用$HOME/.nvm/versions/node/v8.16.2/bin/,所以绝对不要复制此路径下的可执行文件到/usr/local/bin/中去,那样会导致找到相关文件的错误。

4. node写server的不便

  1. 对于数子的左移运算, 容易出现负数,这是因为js只有Double类型,没有Long类型。解决方案就是使用BigInt, 并且所有的运算都要是BigInt.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    > v0 = 2372662195
    2372662195
    > v0 << 4
    -692110544
    > v0 << 4 & 0xFFFF
    15152
    > b = BigInt(v0)
    2372662195n
    > b<<4n
    37962595120n
    > b<<4
  2. zlib的不便

  • node中zlib的inflate不支持windowBits为负数(即去掉head和tail)
  • zlib-sync 这个库支持设置windowBits=-15,但是它有严重的内存泄漏问题,我排除了好久才解决。由于有Rust FFI的基础,秉着内存谁分配谁清楚的规则,我查看了zlib-sync的原生代码,并没有原生端释放的代码,所以基本确定是它泄漏了原生的分配的内存,而且很夸张地泄漏了10倍左右压缩文件的大小。
  • pako支持windowBits=-15,也没有内存泄漏问题,所以最后选了它。不知道我一开始为什么用它没有成功,浪费时间在zlib-sync上了。
    node的Buffer.from(string)可能也有内存泄漏问题,头大。

https://docs.python.org/3/library/zlib.html

  1. 没有整数
    比如a = b/8 *8, 结果就是浮点数,需要手动转为整数
    1
    2
    3
    4
    5
    6
    7
    8
    const num = Math.floor(v.length / 8) * 8; // must use floor to cast to Int
    let ret = "";
    for (let i = 0; i < num; i += 8) {
    const x = v.subarray(i, i + 8);
    const _r = tea_decipher(x, k).toString("hex");
    ret += _r;
    }
    return ret;
    总的来说就是语言层面提供的类型系统不完整。

5. VS Code Debug

如果遇到要从stdin接受数据,那么需要修改console.

1
2
3
4
5
6
7
8
9
10
11
12
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"runtimeArgs": ["-r", "ts-node/register"],
"args": ["${workspaceFolder}/index.ts"],
"console": "integratedTerminal" // add this
}

ref: https://github.com/Microsoft/vscode/issues/47860

6. npm总是定位到另一个版本

使用nvm安装了node 16和18两个版本,但是npm总是定位到node 18的版本。这个就是很奇怪,删除重装也不行,环境变量和软连接检查了。后来我把node 16的版本删除了,还是继续报错,不过这个时候有日志了,看日子发现,npm读取了$HOME/.npmrc文件,里面配置了node 16的版本。到这文件中删除了prefix=~/.nvm/versions/node/v16.20.0,然后npm正常了。话说你这个Baidu Comate提示是怎么来的?

7. npm install -g @anthropic-ai/claude-code@latest 失败

1
2
3
4
5
6
7
npm error code ENOTEMPTY
npm error syscall rename
npm error path /Users/me/.nvm/versions/node/v22.17.0/lib/node_modules/@anthropic-ai/claude-code
npm error dest /Users/me/.nvm/versions/node/v22.17.0/lib/node_modules/@anthropic-ai/.claude-code-Rcrh6LlR
npm error errno -66
npm error ENOTEMPTY: directory not empty, rename '/Users/me/.nvm/versions/node/v22.17.0/lib/node_modules/@anthropic-ai/claude-code' -> '/Users/me/.nvm/versions/node/v22.17.0/lib/node_modules/@anthropic-ai/.claude-code-Rcrh6LlR'
npm error A complete log of this run can be found in: /Users/me/.npm/_logs/2025-09-18T08_11_19_906Z-debug-0.log

这个是因为claude-code-Rcrh6LlR是个临时目录,ENOTEMPTY 错误通常是由于之前未完成的安装操作残留了文件或目录,或者 npm 缓存存在问题所致。 通过清理缓存并手动删除错误信息中指示的冲突临时目录,大多数情况下都能解决这个问题。

8. yarn upgrade

  1. 升级单个模块至最新
    yarn upgrade package-name 将指定包升级到符合package.json中语义化版本范围限制的最新版本。

  2. 强制升级单个模块至最新
    yarn upgrade package-name –latest 忽略package.json中的版本限制,直接将包升级到其绝对最新版本。

  3. 升级单个模块至特定版本
    yarn upgrade package-name@x.x.x 将指定包升级到某个确切的版本号。

  4. 交互式升级多个模块
    yarn upgrade-interactive –latest 提供一个交互式界面,允许你自由选择要升级的包及其版本,非常灵活。

  5. 升级所有模块(遵守约束)
    yarn upgrade 将所有依赖包升级到符合package.json中版本声明的最新版本。

  6. 强制升级所有模块至最新
    yarn upgrade –latest 忽略所有版本约束,将所有包升级到其绝对最新版本。

💁 升级前的准备与升级后的检查

在开始升级之前,建议先检查当前项目中过时的包。这可以帮助你了解有哪些更新可用。
yarn outdated

这个命令会列出所有过时的依赖包,显示其当前版本、可升级的版本以及最新版本,为你提供全面的升级决策信息。

升级操作会更新 package.json 和 yarn.lock 文件。完成升级后,建议运行测试以确保项目兼容性。
yarn test

最后,记得将 package.json 和 yarn.lock 文件的变更提交到版本控制系统。

💡 实用技巧与注意事项

• 理解版本标识符:在 package.json 中,版本号前的符号有特定含义。^1.2.3 表示允许升级到次版本号和修订号的最新版(如 1.x.x),而 ~1.2.3 则只允许升级修订号(如 1.2.x)。使用 yarn upgrade 时会遵守这些规则,而 –latest 标志则会忽略它们。

• 谨慎使用 –latest:yarn upgrade –latest 或 –latest 标志虽然能让你用上最新版,但可能会跳过主版本升级,这有时会引入不兼容的变更。在生产项目中,建议在测试环境中充分验证后再使用此选项。

• 使用交互模式:yarn upgrade-interactive –latest 是一个非常好的折中方案。它可以让你可视化地选择要升级哪些包,避免一次性升级所有包可能带来的大规模变更风险。

希望这些信息能帮助你更自信地管理项目依赖!如果你在升级过程中遇到任何特定的问题,可以随时提出。