# 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
2
3
解决: 普通用户的 ~/.bashrc
加上这个,重启 ~/.bashrc
source ~/.bashrc
注意:如果修改了 /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;
}
2
3
4
5
6
当需要进行字符串长度的判断时,将码点范围在补充平面的字符全部替换为下划线,这样长度判断就和实际显示的一致了
# 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
2
# 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 的区别
- 安全字符不同:
- escape(69个):*/@+-._0-9a-zA-Z
- encodeURI(82个):!#$&'()*+,/:;=?@-._~0-9a-zA-Z
- encodeURIComponent(71个):!'()*-._~0-9a-zA-Z
兼容性不同: escape 函数是从Javascript 1.0的时候就存在了,其他两个函数是在Javascript 1.5才引入的。但是由于Javascript 1.5已经非常普及了,所以实际上使用 encodeURI 和 encodeURIComponent 并不会有什么兼容性问题。
对 Unicode 字符的编码方式不同: 这三个函数对于ASCII字符的编码方式相同,均是使用百分号+两位十六进制字符来表示。但是对于 Unicode 字符,escape的编码方式是
%uxxxx
,其中的xxxx
是用来表示unicode字符的4位十六进制字符。这种方式已经被W3C废弃了。但是在ECMA-262标准中仍然保留着 escape 的这种编码语法。encodeURI 和 encodeURIComponent 则使用 UTF-8 对非 ASCII 字符进行编码,然后再进行百分号编码。这是RFC推荐的。因此建议尽可能的使用这两个函数替代escape进行编码。适用场合不同: encodeURI 被用作对一个完整的 URI 进行编码,而 encodeURIComponent 被用作对 URI 的一个组件进行编码。从上面提到的安全字符范围表格来看,我们会发现,encodeURIComponent 编码的字符范围要比 encodeURI 的大。我们上面提到过,保留字符一般是用来分隔URI组件(一个URI可以被切割成多个组件)或者子组件(如URI中查询参数的分隔符),如:冒号用于分隔scheme和主机,?号用于分隔主机和路径。由于encodeURI操纵的对象是一个完整的的URI,这些字符在URI中本来就有特殊用途,因此这些保留字符不会被encodeURI编码,否则意义就变了。
# 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' });
},
},
}
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
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 9.离线安装 pm2-logrotate
步骤:
- git clone https://github.com/keymetrics/pm2-logrotate.git
- cd pm2-logrotate
- npm install
- npm install npm-bundle -g
- npm-bundle then get file: pm2-logrotate-2.7.0.tgz
- scp pm2-logrotate-2.7.0.tgz to target
- pm2 install ~/pm2-logrotate-2.7.0.tgz (绝对路径)
# 10.ln: failed to create symbolic link ‘file.txt’: File exists
ln -s 改成 ln -sf
f
在很多软件的参数中意味着 force
ln -sf /usr/bin/bazel-1.0.0 /usr/bin/bazel
# 11.Linux软链接的创建,删除,修改
- 创建: ln -s 【目标目录】 【软链接地址】
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
2
- 删除: rm -rf 【软链接地址】
#正确的删除方式(删除软链接,但不删除实际数据)
rm -rf ./test_chk_ln
#错误的删除方式 (这样就会把原来test_chk下的内容删除)
rm -rf ./test_chk_ln/
2
3
4
5
- 修改: ln -snf 【新目标目录】 【软链接地址】