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提示是怎么来的?