# 2021-11 问题记录

# 1.linux 下 nvm 安装后切换用户报 nvm: command not found

问题: root 环境下安装了 nvm ,一切正常,切换普通用户之后,运行 nvm,就会报命令找不到 nvm: command not found

原因: 两个用户环境变量配置不一样,打开 root 用户的 ~/.bashrc,可以看到有 NVM_DIR 的环境变量,普通用户没得。

  export NVM_DIR="$HOME/.nvm"
  [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
  [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion
1
2
3

解决: 普通用户的 ~/.bashrc 加上这个,重启 ~/.bashrc

source ~/.bashrc
1

注意:如果修改了 /root/.nvm 的位置,则 $HOME 需要改成相应的路径。

# 2.判断字符串长度

由于 ECMAScript® 2015 (opens new window) 规范中规定,ECMAScript 字符串使用的是 UTF-16 编码。

所以有的字符会占用两个 UTF-16 的码元。直接使用 length 判断会返回 2。

解决:

const str = '';
const spRegexp = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;

if (str) {
  val = value.replace(spRegexp, '_').length;
}
1
2
3
4
5
6

当需要进行字符串长度的判断时,将码点范围在补充平面的字符全部替换为下划线,这样长度判断就和实际显示的一致了

参考 (opens new window)

# 3.Browserslist: caniuse-lite is outdated.

最近前端运行项目的时候,经常看到这个报错提示:

Browserslist: caniuse-lite is outdated. Please run: npx browserslist@latest --update-db

运行后也没有什么用。

解决:

# 用 npm 安装依赖的可以执行这个命令解决。 yarn 的还没找到解决方案 
npm --depth 20 update --save caniuse-lite browserslist
1
2

参考 (opens new window)

# 4.为什么要进行 URL 编码

问题: 经常遇到 URL 需要进行编码的情况,有时候又不需要。

RFC3986文档规定,RUL 中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符。

foo://example.com:8042/over/there?name=ferret#nose _/ ______/ _/_________/ _/ | | | | | scheme authority path query fragment

# 保留字符

RUL 可以划分成若干个组件,协议、主机、路径等。有一些字符(😕?#[]@)是用作分隔不同组件的。例如:冒号用于分隔协议和主机,/ 用于分隔主机和路径,? 用于分隔路径和查询参数,等等。还有一些字符(!$&'()*+,;=)用于在每个组件中起到分隔作用的,如=用于表示查询参数中的键值对,&符号用于分隔查询多个键值对。

所以当 URL 中出现规定之外的字符时,就需要进行编码。

RFC3986中指定了以下字符为保留字符:! * ' ( ) ; : @ & = + $ , / ? # [ ]

# 不安全字符

还有一些字符,当他们直接放在Url中的时候,可能会引起解析程序的歧义。

  • 空格:URL 在传输的过程,或者用户在排版的过程,或者文本处理程序在处理 URL 的过程,都有可能引入无关紧要的空格,或者将那些有意义的空格给去掉。
  • 引号以及<>:引号和尖括号通常用于在普通文本中起到分隔Url的作用
  • #:通常用于表示书签或者锚点
  • %:百分号本身用作对不安全字符进行编码时使用的特殊字符,因此本身需要编码
  • {}|^[]`~:某一些网关或者传输代理会篡改这些字符

# escape, encodeURI 和 encodeURIComponent 的区别

  1. 安全字符不同:
  • escape(69个):*/@+-._0-9a-zA-Z
  • encodeURI(82个):!#$&'()*+,/:;=?@-._~0-9a-zA-Z
  • encodeURIComponent(71个):!'()*-._~0-9a-zA-Z
  1. 兼容性不同: escape 函数是从Javascript 1.0的时候就存在了,其他两个函数是在Javascript 1.5才引入的。但是由于Javascript 1.5已经非常普及了,所以实际上使用 encodeURI 和 encodeURIComponent 并不会有什么兼容性问题。

  2. 对 Unicode 字符的编码方式不同: 这三个函数对于ASCII字符的编码方式相同,均是使用百分号+两位十六进制字符来表示。但是对于 Unicode 字符,escape的编码方式是 %uxxxx,其中的 xxxx 是用来表示unicode字符的4位十六进制字符。这种方式已经被W3C废弃了。但是在ECMA-262标准中仍然保留着 escape 的这种编码语法。encodeURI 和 encodeURIComponent 则使用 UTF-8 对非 ASCII 字符进行编码,然后再进行百分号编码。这是RFC推荐的。因此建议尽可能的使用这两个函数替代escape进行编码。

  3. 适用场合不同: encodeURI 被用作对一个完整的 URI 进行编码,而 encodeURIComponent 被用作对 URI 的一个组件进行编码。从上面提到的安全字符范围表格来看,我们会发现,encodeURIComponent 编码的字符范围要比 encodeURI 的大。我们上面提到过,保留字符一般是用来分隔URI组件(一个URI可以被切割成多个组件)或者子组件(如URI中查询参数的分隔符),如:冒号用于分隔scheme和主机,?号用于分隔主机和路径。由于encodeURI操纵的对象是一个完整的的URI,这些字符在URI中本来就有特殊用途,因此这些保留字符不会被encodeURI编码,否则意义就变了。

参考 (opens new window)

# 5.DvaJS Model 对象的属性

记个笔记

  • namespace: 当前 Model 的名称。整个应用的 State,由多个小的 Model 的 State 以 namespace 为 key 合成
  • state: 该 Model 当前的状态。数据保存在这里,直接决定了视图层的输出
  • reducers: Action 处理器,处理同步动作,用来算出最新的 State
  • effects:Action 处理器,处理异步动作
const store = {
  namespace: 'count',
  state: 0,
  reducers: {
    add(state) { return state + 1 },
  },
  effects: {
    *addAfter1Second(action, { call, put }) {
      yield call(delay, 1000);
      yield put({ type: 'add' });
    },
  },
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 7.离线安装 node

步骤:

# https://nodejs.org/dist 下载
scp node-v14.18.1-linux-x64.tar.xz targetServer
# 解压
tar xf node-v14.18.1-linux-x64.tar.xz
# 查看版本
cd node-v14.18.1-linux-x64
./bin/node -v
# 修改软链接
sudo ln -sf node-v14.18.1-linux-x64/bin/npm /usr/bin/npm
sudo ln -sf node-v14.18.1-linux-x64/bin/node /usr/bin/node
ln -snf node-v14.18.1-linux-x64 apps/node
1
2
3
4
5
6
7
8
9
10
11

# 8.离线安装 pm2

步骤:

# 先在可以在线安装 pm2 的机器安装
npm install pm2 -g
# 查看 npm 安装目录,比如 /usr/local/node
npm config get prefix
# 到 pm2 安装位置
cd /usr/local/node/lib/node_modules
# 打包 pm2
tar czvf pm2.tar.gz pm2/
scp pm2.tar.gz targetServer

# 登录部署服务器,查看 npm 安装目录,比如 /usr/local/node
npm config get prefix
# 解压 pm2
cd /usr/local/node/lib/node_modules
tar xvf pm2.tar.gz

# 修改软链接
ln -s /usr/local/node/lib/node_modules/pm2/bin/pm2 /usr/bin/pm2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 9.离线安装 pm2-logrotate

步骤:

  1. git clone https://github.com/keymetrics/pm2-logrotate.git
  2. cd pm2-logrotate
  3. npm install
  4. npm install npm-bundle -g
  5. npm-bundle then get file: pm2-logrotate-2.7.0.tgz
  6. scp pm2-logrotate-2.7.0.tgz to target
  7. pm2 install ~/pm2-logrotate-2.7.0.tgz (绝对路径)

ln -s 改成 ln -sf f 在很多软件的参数中意味着 force

ln -sf /usr/bin/bazel-1.0.0 /usr/bin/bazel
1

# 11.Linux软链接的创建,删除,修改

  • 创建: ln -s 【目标目录】 【软链接地址】
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
1
2
  • 删除: rm -rf 【软链接地址】
#正确的删除方式(删除软链接,但不删除实际数据)
rm -rf  ./test_chk_ln
 
#错误的删除方式 (这样就会把原来test_chk下的内容删除)
rm -rf ./test_chk_ln/ 
1
2
3
4
5
  • 修改: ln -snf 【新目标目录】 【软链接地址】
上次更新: 12/8/2021, 1:46:46 PM