diff --git a/docs/awk.html b/docs/awk.html index a5112eef..972d518d 100644 --- a/docs/awk.html +++ b/docs/awk.html @@ -34,14 +34,14 @@ document.documentElement.setAttribute('data-color-mode', mode); localStorage.setItem(LOCAL_NANE, mode); } -
这是 GNU awk 的单页快速参考备忘单,其中涵盖了常用的 awk
表达式和命令。
该程序可用于选择文件中的特定记录并对其执行操作
$ awk -F: '{print $1, $NF}' /etc/passwd
@@ -87,21 +87,21 @@
- | - | - |
---|---|---|
-F: | 冒号作为分隔符 | |
{...} | awk 程序 | |
print | 打印当前记录 | |
$1 | 第一个字段 | |
$NF | 最后一个字段 | |
/etc/passwd | 输入数据文件 |
BEGIN {<初始化>}
<pattern 1> {<计划动作>}
<pattern 2> {<计划动作>}
...
END {< 最后的动作 >}
-awk '
BEGIN { print "\n>>>Start" }
!/(login|shutdown)/ { print NR, $0 }
END { print "<<<END\n" }
' /etc/passwd
- $1 $2/$(NF-1) $3/$NF
▼ ▼ ▼
@@ -124,7 +124,7 @@
awk -F: '{print $1 "=" $6}' /etc/passwd
查看: Awk 变量
-awk 'BEGIN {print "hello world"}' # 打印 "hello world"
awk -F: '{print $1}' /etc/passwd # -F: 指定字段分隔符
@@ -135,11 +135,11 @@
# END 块在最后执行一次
awk -F: '{print $1} END { print "-done-"}' /etc/passwd
-awk -F: '$3>30 {print $1}' /etc/passwd
查看: Conditions 条件
-awk 'BEGIN{
while (a++ < 1000)
s=s " ";
@@ -147,7 +147,7 @@
}'
查看: Loops
-awk 'BEGIN {
fruits["mango"] = "yellow";
fruits["orange"] = "orange"
@@ -157,7 +157,7 @@
}'
查看: Awk 数组
-# => 5
awk 'BEGIN{print length("hello")}'
# => HELLO
@@ -166,8 +166,8 @@
awk 'BEGIN{print substr("hello", 1, 3)}'
查看: Functions
-:- | :- |
---|---|
$0 | 全线 |
$1, $2...$NF | 第一个,第二个……最后一个字段 |
NR | 记录总数(N umber of R ecords) |
NF | N个字段(N number of F ields) |
OFS | O utput F ield S eparator输出字段分隔符 (default " ") |
FS | input F ield S eparator 输入字段分隔符 (default " ") |
ORS | O utput R ecord S eparator 输出记录分隔符 (default "\n") |
RS | input R ecord S eparator 输入记录分隔符 (default "\n") |
FILENAME | 文件名 |
:- | :- |
---|---|
$1 == "root" | 第一个字段等于根 |
{print $(NF-1)} | 倒数第二个字段 |
NR!=1{print $0} | 从第 2 条记录开始 |
NR > 3 | 从第 4 条记录开始 |
NR == 1 | 第一次记录 |
END{print NR} | 总记录 |
BEGIN{print OFMT} | 输出格式 |
{print NR, $0} | 行号 |
{print NR " " $0} | 行号(选项卡) |
{$1 = NR; print} | 用行号替换第一个字段 |
$NF > 4 | 最后一个字段 > 4 |
NR % 2 == 0 | 甚至记录 |
NR==10, NR==20 | 记录 10 到 20 |
BEGIN{print ARGC} | 总 arguments |
ORS=NR%5?",":"\n" | 连接记录 |
打印总和和平均值
awk -F: '{sum += $3}
END { print sum, sum/NR }
@@ -310,7 +310,7 @@
if (match("One Two Three", "re"))
print RLENGTH }'
-:- | :- |
---|---|
ARGC | 数字或参数 |
ARGV | 参数数组 |
FNR | 文件记录数(F ile N umber of R ecords) |
OFMT | 数字格式 (default "%.6g") |
RSTART | 字符串中的位置 |
RLENGTH | 比赛时长 |
SUBSEP | 多维数组分隔符 (default "\034") |
ARGIND | 参数索引 |
:- | :- |
---|---|
ENVIRON | 环境变量 |
IGNORECASE | 忽略大小写 |
CONVFMT | 转换格式 |
ERRNO | 系统错误 |
FIELDWIDTHS | 固定宽度字段 |
awk -v var1="Hello" -v var2="Wold" '
END {print var1, var2}
' </dev/null
-awk -v varName="$PWD" '
END {print varName}' </dev/null
-:- | :- |
---|---|
{print $1} | 第一个字段 |
$2 == "foo" | 等于 |
$2 != "foo" | 不等于 |
"foo" in array | 在数组中 |
:- | :- |
---|---|
/regex/ | 行匹配 |
!/regex/ | 行不匹配 |
$1 ~ /regex/ | 字段匹配 |
$1 !~ /regex/ | 字段不匹配 |
:- | :- |
---|---|
($2 <= 4 || $3 < 20) | 或者 |
($1 == 4 && $3 < 20) | 和 |
+
-
--
+=
-=
%=
==
!=
>=
awk 'BEGIN {
if ("foo" ~ "^fo+$")
print "Fooey!";
}'
-awk 'BEGIN {
if ("boo" !~ "^fo+$")
print "Boo!";
}'
-awk 'BEGIN {
assoc["foo"] = "bar";
assoc["bar"] = "baz";
@@ -518,8 +518,8 @@
print "Fooey!";
}'
-函数 | 描述 |
---|---|
index(s,t) | 字符串 s 中出现字符串 t 的位置,如果未找到则为 0 |
length(s) | 字符串 s 的长度(如果没有 arg ,则为 $0 ) |
rand | 0 到 1 之间的随机数 |
substr(s,index,len) | 返回从索引开始的 s 的 len-char 子字符串(从 1 开始计数) |
srand | 为 rand 设置种子并返回之前的种子 |
int(x) | 将 x 截断为整数值 |
split(s,a,fs) | 将字符串 s 拆分为数组 a 由 fs 拆分,返回 a 的长度 |
match(s,r) | 字符串 s 中出现正则表达式 r 的位置,如果未找到,则为 0 |
sub(r,t,s) | 将 t 替换为字符串 s 中第一次出现的正则表达式 r (如果未给出 s ,则替换为 $0 ) |
gsub(r,t,s) | 用 t 替换字符串 s 中所有出现的正则表达式 r |
system(cmd) | 执行cmd并返回退出状态 |
tolower(s) | 字符串 s 转小写 |
toupper(s) | 字符串 s 转大写 |
getline | 将 $0 设置为当前输入文件中的下一个输入记录 |
awk '
# 返回最小数量
function find_min(num1, num2){
@@ -615,8 +615,8 @@
}
'
-awk 'BEGIN {
arr[0] = "foo";
arr[1] = "bar";
@@ -625,7 +625,7 @@
print(arr[0]); # => ""
}'
-awk 'BEGIN {
assoc["foo"] = "bar";
assoc["bar"] = "baz";
@@ -633,14 +633,14 @@
print("foo" in assoc); # => 1
}'
-awk 'BEGIN {
split("foo:bar:baz", arr, ":");
for (key in arr)
print arr[key];
}'
-awk 'BEGIN {
arr[0] = 3
arr[1] = 2
@@ -650,7 +650,7 @@
print(arr[i])
}'
-awk 'BEGIN {
multidim[0,0] = "foo";
multidim[0,1] = "bar";
@@ -658,7 +658,7 @@
multidim[1,1] = "boo";
}'
-awk 'BEGIN {
array[1,2]=3;
array[2,3]=5;
@@ -669,8 +669,8 @@
}
}'
-awk -v count=2 'BEGIN {
if (count == 1)
print "Yes";
@@ -678,12 +678,12 @@
print "Huh?";
}'
-awk -v count=2 'BEGIN {
print (count==1) ? "Yes" : "Huh?";
}'
-awk 'BEGIN {
assoc["foo"] = "bar";
assoc["bar"] = "baz";
@@ -691,7 +691,7 @@
print "Fooey!";
}'
-awk 'BEGIN {
assoc["foo"] = "bar";
assoc["bar"] = "baz";
@@ -699,7 +699,7 @@
print "Huh!";
}'
-awk -F: '{
switch (NR * 2 + 1) {
case 3:
@@ -715,20 +715,20 @@
}
}' /etc/passwd
-awk 'BEGIN {
for (i = 0; i < 10; i++)
print "i=" i;
}'
-awk 'BEGIN {
for (i = 1; i <= 100; i *= 2)
print i
}'
-awk 'BEGIN {
assoc["key1"] = "val1"
assoc["key2"] = "val2"
@@ -736,15 +736,15 @@
print assoc[key];
}'
-awk 'BEGIN {
for (argnum in ARGV)
print ARGV[argnum];
}' a b c
-awk -F: '{ x[NR] = $0 }
END {
for (i = NR; i > 0; i--)
@@ -752,14 +752,14 @@
}
' /etc/passwd
-awk -F: '{
for (i = NF; i > 0; i--)
printf("%s ",$i);
print ""
}' /etc/passwd
-awk -F: '{
s=0;
for (i = 1; i <= NF; i++)
@@ -767,7 +767,7 @@
print s
}' /etc/passwd
-awk -F: '
{for (i = 1; i <= NF; i++)
s += $i;
@@ -775,7 +775,7 @@
END{print s}
' /etc/passwd
-awk 'BEGIN {
while (a < 10) {
@@ -784,7 +784,7 @@
}
}'
-awk '{
i = 1
do {
@@ -793,7 +793,7 @@
} while (i <= 5)
}' /etc/passwd
-awk 'BEGIN {
break_num = 5
for (i = 0; i < 10; i++) {
@@ -803,7 +803,7 @@
}
}'
-awk 'BEGIN {
for (x = 0; x <= 10; x++) {
if (x == 5 || x == 6)
@@ -813,17 +813,17 @@
print ""
}'
-awk 'BEGIN{printf "|%10s|\n", "hello"}'
# | hello|
-awk 'BEGIN{printf "|%-10s|\n", "hello"}'
# |hello |
-特征符 | 描述 |
---|---|
c | ASCII 字符 |
d | 十进制整数 |
e , E , f | 浮点格式 |
o | 无符号八进制值 |
s | 细绳 |
% | 文字百分比 |
awk -F: '{
printf "%-10s %s\n", $1, $(NF-1)
}' /etc/passwd | head -n 3
@@ -868,7 +868,7 @@
bin /bin
daemon /sbin
-awk -F: 'BEGIN {
printf "%-10s %s\n", "User", "Home"
printf "%-10s %s\n", "----","----"}
@@ -882,8 +882,8 @@
bin /bin
daemon /sbin
-\
^
?
:- | :- |
---|---|
\b | 退格 |
\f | 换页 |
\n | 换行(换行) |
\r | 回车 |
\t | 水平选项卡 |
\v | 垂直选项卡 |
$ cat demo.awk
#!/usr/bin/awk -f
BEGIN { x = 23 }
@@ -943,7 +943,7 @@
$ awk -f demo.awk /etc/passwd
69
-这是开始使用 linux bash shell 脚本的快速参考备忘单。
#!/bin/bash
VAR="world"
echo "Hello $VAR!" # => Hello world!
@@ -50,7 +50,7 @@
执行脚本
$ bash hello.sh
-
NAME="John"
echo ${NAME} # => John (变量)
echo $NAME # => John (变量)
@@ -59,7 +59,7 @@
echo "${NAME}!" # => John! (变量)
NAME = "John" # => Error (关于空间)
-# 这是一个内联 Bash 注释。
: '
@@ -69,7 +69,7 @@
'
多行注释使用 :'
打开和 '
关闭
表示 | 描述 |
---|---|
$1 … $9 | 参数 1 ... 9 |
$0 | 脚本本身的名称 |
$1 | 第一个论点 |
${10} | 位置参数 10 |
$# | 参数数量 |
$$ | shell 的进程 id |
$* | 所有论据 |
$@ | 所有参数,从第一个开始 |
$- | 当前选项 |
$_ | 上一个命令的最后一个参数 |
见:特殊参数
-get_name() {
echo "John"
}
echo "You are $(get_name)"
见:函数
-if [[ -z "$string" ]]; then
echo "String is empty"
elif [[ -n "$string" ]]; then
@@ -137,7 +137,7 @@
fi
见:条件句
-echo {A,B}.js
表示 | 描述 |
---|---|
{A,B} | 与 A B 相同 |
{A,B}.js | 与 A.js B.js 相同 |
{1..5} | 与 1 2 3 4 5 相同 |
见:大括号扩展
-# => I'm in /当前/的/路径
echo "I'm in $(PWD)"
# Same as:
echo "I'm in `pwd`"
见:命令替换
-代码 | 描述 |
---|---|
${FOO%suffix} | 删除后缀 |
${FOO#prefix} | 删除前缀 |
${FOO%%suffix} | 去掉长后缀 |
${FOO##prefix} | 删除长前缀 |
${FOO/from/to} | 替换第一个匹配项 |
${FOO//from/to} | 全部替换 |
${FOO/%from/to} | 替换后缀 |
${FOO/#from/to} | 替换前缀 |
表示 | 描述 |
---|---|
${FOO:0:3} | 子串 (位置,长度) |
${FOO:(-3):3} | 从右边开始的子串 |
表示 | 描述 |
---|---|
${#FOO} | $FOO 的长度 |
表示 | 描述 |
---|---|
${FOO:-val} | $FOO ,如果未设置,则为 val |
${FOO:=val} | 如果未设置,则将 $FOO 设置为 val |
${FOO:+val} | val 如果设置了$FOO |
${FOO:?message} | 如果 $FOO 未设置,则显示消息并退出 |
echo ${food:-Cake} #=> $food or "Cake"
STR="/path/to/foo.cpp"
@@ -290,7 +290,7 @@
echo ${STR##*/} # foo.cpp
echo ${STR/foo/bar} # /path/to/bar.cpp
-name="John"
echo ${name} # => John
echo ${name:0:2} # => Jo
@@ -304,7 +304,7 @@
echo ${name:0:length} # => Jo
见:参数扩展
-SRC="/path/to/foo.cpp"
BASEPATH=${SRC##*/}
@@ -313,7 +313,7 @@
DIRPATH=${SRC%$BASEPATH}
echo $DIRPATH # => "/path/to/"
-STR="HELLO WORLD!"
echo ${STR,} # => hELLO WORLD!
echo ${STR,,} # => hello world!
@@ -326,8 +326,8 @@
echo "${ARR[@],}" # => hello world
echo "${ARR[@]^}" # => Hello World
-Fruits=('Apple' 'Banana' 'Orange')
Fruits[0]="Apple"
@@ -344,7 +344,7 @@
declare -a Numbers=(1 2 3)
Numbers+=(4 5) # 附加 => 1 2 3 4 5
-:- | - |
---|---|
${Fruits[0]} | 第一个元素 |
${Fruits[-1]} | 最后一个元素 |
${Fruits[*]} | 所有元素 |
${Fruits[@]} | 所有元素 |
${#Fruits[@]} | 总数 |
${#Fruits} | 第一节长度 |
${#Fruits[3]} | 第n个长度 |
${Fruits[@]:3:2} | 范围 |
${!Fruits[@]} | 所有 Key |
Fruits=('Apple' 'Banana' 'Orange')
for e in "${Fruits[@]}"; do
echo $e
done
-for i in "${!Fruits[@]}"; do
printf "%s\t%s\n" "$i" "${Fruits[$i]}"
done
-Fruits=("${Fruits[@]}" "Watermelon") # 推
Fruits+=('Watermelon') # 也推
@@ -412,7 +412,7 @@
Fruits=("${Fruits[@]}" "${Veggies[@]}") # 连接
lines=(`cat "logfile"`) # 从文件中读取
-function extract()
{
local -n myarray=$1
@@ -422,8 +422,8 @@
Fruits=('Apple' 'Banana' 'Orange')
extract Fruits 2 # => Orangle
-declare -A sounds
sounds[dog]="bark"
@@ -431,14 +431,14 @@
sounds[bird]="tweet"
sounds[wolf]="howl"
-echo ${sounds[dog]} # Dog's sound
echo ${sounds[@]} # All values
echo ${!sounds[@]} # All keys
echo ${#sounds[@]} # Number of elements
unset sounds[dog] # Delete dog
-for val in "${sounds[@]}"; do
echo $val
done
@@ -448,8 +448,8 @@
echo $key
done
-条件 | 描述 |
---|---|
[[ NUM -eq NUM ]] | 等于 |
[[ NUM -ne NUM ]] | 不等于 |
[[ NUM -lt NUM ]] | 少于 |
[[ NUM -le NUM ]] | 小于或等于 |
[[ NUM -gt NUM ]] | 大于 |
[[ NUM -ge NUM ]] | 大于或等于 |
(( NUM < NUM )) | 少于 |
(( NUM <= NUM )) | 小于或等于 |
(( NUM > NUM )) | 比...更棒 |
(( NUM >= NUM )) | 大于或等于 |
条件 | 描述 |
---|---|
[[ -z STR ]] | 空字符串 |
[[ -n STR ]] | |
[[ STR == STR ]] | 平等的 |
[[ STR = STR ]] | 相等(同上) |
[[ STR < STR ]] | 小于 (ASCII) |
[[ STR > STR ]] | 大于 (ASCII) |
[[ STR != STR ]] | 不相等 |
[[ STR =~ STR ]] | 正则表达式 |
if [[ -z "$string" ]]; then
echo "String is empty"
elif [[ -n "$string" ]]; then
@@ -554,32 +554,32 @@
echo "This never happens"
fi
-if [[ X && Y ]]; then
...
fi
-if [[ "$A" == "$B" ]]; then
...
fi
-if [[ '1. abc' =~ ([a-z]+) ]]; then
echo ${BASH_REMATCH[1]}
fi
-if (( $a < $b )); then
echo "$a is smaller than $b"
fi
-if [[ -e "file.txt" ]]; then
echo "file exists"
fi
-条件 | 描述 |
---|---|
[[ -e FILE ]] | 存在 |
[[ -d FILE ]] | 目录 |
[[ -f FILE ]] | 文件 |
[[ -h FILE ]] | 符号链接 |
[[ -s FILE ]] | 大小 > 0 字节 |
[[ -r FILE ]] | 可读 |
[[ -w FILE ]] | 可写 |
[[ -x FILE ]] | 可执行文件 |
[[ f1 -nt f2 ]] | f1 比 f2 新 |
[[ f1 -ot f2 ]] | f2 早于 f1 |
[[ f1 -ef f2 ]] | 相同的文件 |
条件 | 描述 |
---|---|
[[ -o noclobber ]] | 如果启用 OPTION |
[[ ! EXPR ]] | 不是 Not |
[[ X && Y ]] | 和 And |
[[ X || Y ]] | 或者 Or |
if [ "$1" = 'y' -a $2 -gt 0 ]; then
echo "yes"
fi
@@ -670,43 +670,43 @@
echo "no"
fi
-for i in /etc/rc.*; do
echo $i
done
-for ((i = 0 ; i < 100 ; i++)); do
echo $i
done
-for i in {1..5}; do
echo "Welcome $i"
done
-for i in {5..50..5}; do
echo "Welcome $i"
done
-i=1
while [[ $i -lt 4 ]]; do
echo "Number: $i"
((i++))
done
-i=3
while [[ $i -gt 0 ]]; do
echo "Number: $i"
((i--))
done
-for number in $(seq 1 3); do
if [[ $number == 2 ]]; then
continue;
@@ -714,7 +714,7 @@
echo "$number"
done
-for number in $(seq 1 3); do
if [[ $number == 2 ]]; then
# Skip entire rest of loop.
@@ -724,30 +724,30 @@
echo "$number"
done
-count=0
until [ $count -gt 10 ]; do
echo "$count"
((count++))
done
-while true; do
# here is some code.
done
-while :; do
# here is some code.
done
-cat file.txt | while read line; do
echo $line
done
-myfunc() {
echo "hello $1"
}
@@ -759,7 +759,7 @@
myfunc "John"
-myfunc() {
local myresult='some value'
echo $myresult
@@ -767,7 +767,7 @@
result="$(myfunc)"
-myfunc() {
return 1
}
@@ -778,9 +778,9 @@
echo "failure"
fi
-# 避免覆盖文件
# (echo "hi" > foo)
set -o noclobber
@@ -795,7 +795,7 @@
# 公开未设置的变量
set -o nounset
-# 不匹配的 glob 被删除
# ('*.foo' => '')
shopt -s nullglob
@@ -814,9 +814,9 @@
# ('lib/**/*.rb' => 'lib/a/b/c.rb')
shopt -s globstar
-命令 | 描述 |
---|---|
history | 显示历史 |
sudo !! | 使用 sudo 运行上一个命令 |
shopt -s histverify | 不要立即执行扩展结果 |
表达式 | 描述 |
---|---|
!$ | 展开最新命令的最后一个参数 |
!* | 展开最新命令的所有参数 |
!-n | 展开第 n 个最近的命令 |
!n | 展开历史中的第 n 个命令 |
!<command> | 展开最近调用的命令 <command> |
代码 | 描述 |
---|---|
!! | 再次执行最后一条命令 |
!!:s/<FROM>/<TO>/ | 在最近的命令中将第一次出现的 <FROM> 替换为 <TO> |
!!:gs/<FROM>/<TO>/ | 在最近的命令中将所有出现的 <FROM> 替换为 <TO> |
!$:t | 仅从最近命令的最后一个参数扩展基本名称 |
!$:h | 仅从最近命令的最后一个参数展开目录 |
!!
和 !$
可以替换为任何有效的扩展。
代码 | 描述 |
---|---|
!!:n | 仅扩展最近命令中的第 n 个标记(命令为 0 ;第一个参数为 1 ) |
!^ | 从最近的命令展开第一个参数 |
!$ | 从最近的命令中展开最后一个标记 |
!!:n-m | 从最近的命令扩展令牌范围 |
!!:n-$ | 从最近的命令中将第 n 个标记展开到最后 |
!!
可以替换为任何有效的扩展,即 !cat
、!-2
、!42
等。
$((a + 200)) # Add 200 to $a
$(($RANDOM%200)) # Random number 0..199
-(cd somedir; echo "I'm now in $PWD")
pwd # still in first directory
-command -V cd
#=> "cd is a function/alias/whatever"
-python hello.py > output.txt # 标准输出到(文件)
python hello.py >> output.txt # 标准输出到(文件),追加
@@ -959,13 +959,13 @@
python hello.py < foo.txt # 将 foo.txt 提供给 python 的标准输入
-source "${0%/*}/../share/foo.sh"
-DIR="${0%/*}"
-case "$1" in
start | up)
vagrant up
@@ -975,7 +975,7 @@
;;
esac
-trap 'echo Error at about $LINENO' ERR
@@ -986,7 +986,7 @@
set -o errtrace
trap traperr ERR
-printf "Hello %s, I'm %s" Sven Olga
#=> "Hello Sven, I'm Olga
@@ -996,7 +996,7 @@
printf "Print a float: %f" 2
#=> "Print a float: 2.000000"
-while [[ "$1" =~ ^- && ! "$1" == "--" ]]; do case $1 in
-V | --version )
@@ -1012,13 +1012,13 @@
esac; shift; done
if [[ "$1" == '--' ]]; then shift; fi
-if ping -c 1 google.com; then
echo "看来您的互联网连接正常"
fi
-表达式 | 描述 |
---|---|
$? | 最后一个任务的退出状态 |
$! | 最后一个后台任务的 PID |
$$ | shell PID |
$0 | shell 脚本的文件名 |
见特殊参数。
-if grep -q 'foo' ~/.bash_history; then
echo "您过去似乎输入过“foo”"
fi
-使用 \
转义这些特殊字符
cat <<END
hello world
END
-pwd # /home/user/foo
cd bar/
pwd # /home/user/foo/bar
cd -
pwd # /home/user/foo
-echo -n "Proceed? [y/n]: "
read ans
echo $ans
read -n 1 ans # 只有一个字符
-git commit && git push
git commit || echo "Commit failed"
-set -euo pipefail
IFS=$'\n\t'
-args=("$@")
args+=(foo)
args+=(bar)
echo "${args[@]}"
将参数放入数组中,然后追加
-提供基本语法和方法的 C 快速参考备忘单。
#include <stdio.h>
@@ -57,7 +57,7 @@
$ ./hello
# 输出 => Hello World
-
int myNum = 15;
@@ -76,20 +76,20 @@
// 声明多个变量
int x = 5, y = 6, z = 50;
-const int minutesPerHour = 60;
const float PI = 3.14;
最佳实践
const int BIRTHYEAR = 1980;
-// 这是一个注释
printf("Hello World!"); // 这是一个注释
/* 多行注释,上面的代码将打印出 Hello World!
到屏幕上,真是太棒了 */
-printf("I am learning C.");
int testInteger = 5;
printf("Number = %d", testInteger);
@@ -117,7 +117,7 @@
printf("a=%hX, b=%X, c=%lX\n", a, b, c);
// 输出 => a=56, b=5CB, c=1DAB83
-int a1=20, a2=345, a3=700;
int b1=56720, b2=9999, b3=20098;
int c1=233, c2=205, c3=1;
@@ -135,7 +135,7 @@
34 0 23
%-9d
中,d
表示以 10
进制输出,9
表示最少占 9
个字符的宽度,宽度不足以空格补齐,-
表示左对齐
char greetings[] = "Hello World!";
printf("%s", greetings);
@@ -157,7 +157,7 @@
// 输出 "Hell!"
C
没有 String 类型,使用 char
类型并创建一个字符 array
int time = 20;
if (time < 18) {
@@ -176,12 +176,12 @@
}
// 输出 -> "晚上好!"
-int time = 20;
(time < 18) ? printf("再会!") : printf("晚上好!");
-int day = 4;
switch (day) {
@@ -192,7 +192,7 @@
}
// 输出 -> "周四" (day 4)
-int i = 0;
while (i < 5) {
@@ -201,7 +201,7 @@
}
注意:不要忘记增加条件中使用的变量,否则循环永远不会结束,成为“死循环”!
-int i = 0;
do {
@@ -209,14 +209,14 @@
i++;
} while (i < 5);
-int i;
for (i = 0; i < 5; i++) {
printf("%d\n", i);
}
-int i;
@@ -238,7 +238,7 @@
}
示例跳过 4
的值
int i = 0;
while (i < 10) {
@@ -249,7 +249,7 @@
i++;
}
-int i = 0;
while (i < 10) {
@@ -260,7 +260,7 @@
printf("%d\n", i);
}
-int myNumbers[] = {25, 50, 75, 100};
printf("%d", myNumbers[0]);
@@ -289,7 +289,7 @@
myNumbers[2] = 75;
myNumbers[3] = 100;
-enum week { Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };
@@ -304,7 +304,7 @@
// 或者
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a = Mon, b = Wed, c = Sat;
-enum week {Mon = 1, Tues, Wed, Thurs} day;
scanf("%d", &day);
@@ -317,7 +317,7 @@
default: puts("Error!");
}
-// 创建一个整数变量来存储我们从用户那里得到的数字
int myNum;
@@ -330,7 +330,7 @@
// 输出用户输入的数字
printf("您输入的数字: %d", myNum);
-// 创建一个字符串
char firstName[30];
// 要求用户输入一些文本
@@ -340,7 +340,7 @@
// 输出文本
printf("Hello %s.", firstName);
-创建变量时,会为该变量分配一个内存地址
int myAge = 43;
@@ -348,14 +348,14 @@
// 输出:0x7ffe5367e044
要访问它,请使用引用运算符 (&
)
int myAge = 43; // 一个 int 变量
printf("%d", myAge); // 输出 myAge(43)的值
// 输出 myAge 的内存地址(0x7ffe5367e044)
printf("%p", &myAge);
-int myAge = 43; // 一个 int 变量
int* ptr = &myAge; // 名为 ptr 的指针变量,用于存储 myAge 的地址
@@ -366,7 +366,7 @@
printf("%p\n", ptr); // 用指针(0x7ffe5367e044)输出myAge的内存地址
-int myAge = 43; // 变量声明
int* ptr = &myAge; // 指针声明
@@ -376,8 +376,8 @@
// 取消引用:用指针输出 myAge 的值 (43)
printf("%d\n", *ptr);
-int myNum = 100 + 50;
int sum1 = 100 + 50; // 150 (100 + 50)
int sum2 = sum1 + 250; // 400 (150 + 250)
@@ -438,7 +438,7 @@
Operator Name Description Example +
加 将两个值相加 x + y
-
减 从另一个值中减去一个值 x - y
*
乘 将两个值相乘 x * y
/
除 将一个值除以另一个 x / y
%
取模 返回除法余数 x % y
++
增量 将变量的值增加 1 ++
--
乘量 将变量的值减 1 --x
-
符号 | 示例 | 如同 |
---|---|---|
= | x = 5 | x = 5 |
+= | x += 3 | x = x + 3 |
-= | x -= 3 | x = x - 3 |
*= | x *= 3 | x = x * 3 |
/= | x /= 3 | x = x / 3 |
%= | x %= 3 | x = x % 3 |
&= | x &= 3 | x = x & 3 |
|= | x |= 3 | x = x | 3 |
^= | x ^= 3 | x = x ^ 3 |
>>= | x >>= 3 | x = x >> 3 |
<<= | x <<= 3 | x = x << 3 |
int x = 5;
int y = 3;
@@ -555,7 +555,7 @@
符号 名称 示例 ==
等于 x ==
y !=
不等于 x !=
y >
大于 x >
y <
小于 x <
y >=
大于或等于 x >=
y <=
小于或等于 x <=
y
比较运算符用于比较两个值
-
符号 | 名称 | 说明 | 示例 |
---|---|---|---|
&& | 与 逻辑 | 如果两个语句都为真,则返回真 | x < 5 && x < 10 |
|| | 或 逻辑 | 如果其中一个语句为真,则返回真 | x < 5 || x < 4 |
! | 非 逻辑 | 反转结果,如果结果为真则返回假 | !(x < 5 && x < 10) |
unsigned int a = 60; /* 60 = 0011 1100 */
unsigned int b = 13; /* 13 = 0000 1101 */
@@ -607,7 +607,7 @@
c = a >> 2; /* 15 = 0000 1111 */
printf("Line 6 - c 的值是 %d\n", c );
-运算符 | 描述 | 实例 |
---|---|---|
& | 按位与操作,按二进制位进行"与"运算 | (A & B) 将得到 12 即为 0000 1100 |
| | 按位或运算符,按二进制位进行"或"运算 | (A | B) 将得到 61 即为 0011 1101 |
^ | 异或运算符,按二进制位进行"异或"运算 | (A ^ B) 将得到 49 即为 0011 0001 |
~ | 取反运算符,按二进制位进行"取反"运算 | (~A) 将得到 -61 即为 1100 0011 |
<< | 二进制左移运算符 | A << 2 将得到 240 即为 1111 0000 |
>> | 二进制右移运算符 | A >> 2 将得到 15 即为 0000 1111 |
数据类型 | 大小 Size | 范围 Range | 描述 Description |
---|---|---|---|
char | 1 字节 | −128 ~ 127 | 单个字符/字母/数字/ASCII |
signed char | 1 字节 | −128 ~ 127 | - |
unsigned char | 1 字节 | 0 ~ 255 | - |
int | 2 到 4 字节 | −32,768 ~ 32,767 | 存储整数 |
signed int | 2 字节 | −32,768 ~ 32,767 | |
unsigned int | 2 字节 | 0 ~ 65,535 | |
short int | 2 字节 | −32,768 ~ 32,767 | |
signed short int | 2 字节 | −32,768 ~ 32,767 | |
unsigned short int | 2 字节 | 0 ~ 65,535 | |
long int | 4 字节 | -2,147,483,648 ~ 2,147,483,647 | |
signed long int | 4 字节 | -2,147,483,648 ~ 2,147,483,647 | |
unsigned long int | 4 字节 | 0 ~ 4,294,967,295 | |
float | 4 字节 | ||
double | 8 字节 | ||
long double | 10 字节 |
// 创建变量
int myNum = 5; // 整数
float myFloatNum = 5.99; // 浮点数
@@ -807,7 +807,7 @@
数据类型 说 明 char
字符型 short
短整型 int
整型 long
长整型 float
单精度浮点型 double
双精度浮点型 void
无类型
-
格式说明符 | 数据类型 |
---|---|
%d 或 %i | int 整数 |
%f | float 单精度的十进制类型 |
%lf | double 高精度浮点数据或数字 |
%c | char 字符 |
%s | 用于 strings 字符串 |
short | int | long | |
---|---|---|---|
8 进制 | %ho | %o | %lo |
10 进制 | %hd | %d | %ld |
16 进制 | %hx / %hX | %x / %X | %lx / %lX |
int myNum = 5;
float myFloatNum = 5.99; // 浮点数
char myLetter = 'D'; // 字符串
@@ -878,8 +878,8 @@
printf("%f\n", myFloatNum);
printf("%c\n", myLetter);
-宏 | 描述 |
---|---|
__DATE__ | 当前日期,一个以 "MMM DD YYYY" 格式表示的字符常量 |
__TIME__ | 当前时间,一个以 "HH:MM:SS" 格式表示的字符常量 |
__FILE__ | 这会包含当前文件名,一个字符串常量 |
__LINE__ | 这会包含当前行号,一个十进制常量 |
__STDC__ | 当编译器以 ANSI 标准编译时,则定义为 1 |
ANSI C
定义了许多宏,您可以使用这些宏,但是不能直接修改这些预定义的宏
#include <stdio.h>
int main() {
@@ -989,13 +989,13 @@
printf("ANSI :%d\n", __STDC__);
}
-一个宏通常写在一个单行上。
#define message_for(a, b) \
printf(#a " 和 " #b ": 我们爱你!\n")
如果宏太长,一个单行容纳不下,则使用宏延续运算符 \
#include <stdio.h>
#define message_for(a, b) \
@@ -1010,7 +1010,7 @@
Carole 和 Debra: 我们爱你!
需要把一个宏的参数转换为字符串常量时,使用字符串常量化运算符 #
-
#include <stdio.h>
#define tokenpaster(n) printf ("token" #n " = %d", token##n)
@@ -1021,7 +1021,7 @@
return 0;
}
-#include <stdio.h>
#if !defined (MESSAGE)
@@ -1033,7 +1033,7 @@
return 0;
}
-int square(int x) {
return x * x;
}
@@ -1050,8 +1050,8 @@
return 0;
}
-int main() {
printf("Hello World!");
@@ -1080,7 +1080,7 @@
printf("晚上好!");
}
-// 创建函数
void myFunction() {
printf("晚上好!");
@@ -1093,7 +1093,7 @@
// 输出 -> "晚上好!"
// 输出 -> "晚上好!"
-void myFunction(char name[]) {
printf("Hello %s\n", name);
}
@@ -1105,7 +1105,7 @@
// Hello Liam
// Hello Jenny
-void myFunction(char name[], int age) {
printf("你好 %s 你 %d 岁了。\n",name,age);
}
@@ -1117,7 +1117,7 @@
// 你好 Liam 你 3 岁了。
// 你好 Jenny 你 14 岁了。
-int myFunction(int x) {
return 5 + x;
@@ -1144,7 +1144,7 @@
// 结果: 8 (5 + 3)
// 结果 = 8 (5 + 3)
-int sum(int k);
int main() {
int result = sum(10);
@@ -1160,7 +1160,7 @@
}
}
-#include <math.h>
printf("%f", sqrt(16)); // 平方根
printf("%f", ceil(1.4)); // 四舍五入 (入)
@@ -1180,8 +1180,8 @@
tan(x)
角度的正切
-
struct MyStructure { // 结构声明
int myNum; // 成员(int 变量)
char myLetter; // 成员(char 变量)
@@ -1198,7 +1198,7 @@
return 0;
}
-struct myStructure {
int myNum;
char myLetter;
@@ -1214,7 +1214,7 @@
}
使用 strcpy
函数为字符串赋值
// 创建一个名为 myStructure 的结构
struct myStructure {
@@ -1248,7 +1248,7 @@
s2.myNum = 20;
s2.myLetter = 'C';
-struct myStructure s1 = {
13, 'B', "Some text"
};
@@ -1257,7 +1257,7 @@
s2 = s1;
示例中,将 s1
的值复制到 s2
// 创建一个结构变量并为其赋值
struct myStructure s1 = {
13, 'B'
@@ -1270,8 +1270,8 @@
s1.myNum,
s1.myLetter);
-函数 | 描述 Description |
---|---|
fopen() | 打开 新文件或现有文件 |
fprintf() | 将数据写入 文件 |
fscanf() | 从文件中读取 数据 |
fputc() | 将一个字符写入 文件 |
fgetc() | 从文件中读取 一个字符 |
fclose() | 关闭 文件 |
fseek() | 将文件指针设置到给定位置 |
fputw() | 将整数写入 文件 |
fgetw() | 从文件中读取 一个整数 |
ftell() | 返回当前位置 |
rewind() | 将文件指针设置为文件的开头 |
C 库中有许多函数可以打开
/读取
/写入
/搜索
和关闭
文件
模式 Mode | 描述 Description |
---|---|
r | 以读取 模式打开一个文本文件,允许读取文件 |
w | 以写 模式打开一个文本文件,允许写入文件 |
a | 以追加 模式打开一个文本文件如果文件不存在,则会创建一个新文件 |
r+ | 以读写 模式打开一个文本文件,允许读写文件 |
w+ | 以读写 模式打开一个文本文件,允许读写文件 |
a+ | 以读写 模式打开一个文本文件,允许读写文件 |
rb | 以读取 模式打开二进制文件 |
wb | 以写入 模式打开二进制文件 |
ab | 以追加 模式打开二进制文件 |
rb+ | 以读写 模式打开二进制文件 |
wb+ | 以读写 模式打开二进制文件 |
ab+ | 以读写 模式打开二进制文件 |
#include<stdio.h>
void main( ) {
@@ -1404,7 +1404,7 @@
}
对文件执行所有操作后,必须关闭 fclose()
该文件
#include <stdio.h>
main() {
@@ -1415,7 +1415,7 @@
fclose(fp); // 关闭文件
}
-#include <stdio.h>
main(){
FILE *fp;
@@ -1427,7 +1427,7 @@
fclose(fp);
}
-#include <stdio.h>
main(){
@@ -1437,7 +1437,7 @@
fclose(fp); // 关闭文件
}
-#include<stdio.h>
#include<conio.h>
void main() {
@@ -1452,7 +1452,7 @@
getch();
}
-#include<stdio.h>
#include<conio.h>
@@ -1465,7 +1465,7 @@
getch();
}
-#include<stdio.h>
#include<conio.h>
@@ -1480,7 +1480,7 @@
getch();
}
-#include <stdio.h>
void main(){
FILE *fp;
@@ -1494,7 +1494,7 @@
}
将文件指针设置到给定位置
-#include<stdio.h>
#include<conio.h>
void main(){
@@ -1515,7 +1515,7 @@
// 输出
// Hello World!Hello World!
-#include <stdio.h>
#include <conio.h>
@@ -1535,8 +1535,8 @@
// 输出
// 文件大小: 18 bytes
-Docker
这份快速参考备忘单提供了文件权限的简要概述,以及 chmod 命令的操作
$ chmod [options] <permissions> <file>
-$ chmod 755 foo.txt
$ chmod +x quickref.py
$ chmod u-x quickref.py
$ chmod u=rwx,g=rx,o= quickref.sh
-$ chmod -R 755 my_directory
chmod
命令代表“更改模式”
权限:@@ -90,7 +90,7 @@
User | Group | Other | |
---|---|---|---|
读 (Read) | |||
写 (Write) | |||
执行 (Execute) |
Chmod 生成器允许您以数字和符号的形式快速、直观地生成权限。
-命令 | s | 含义 |
---|---|---|
400 | r-------- | 仅所有者可读 |
500 | r-x------ | 避免改变 |
600 | rw------- | 可由用户更改 |
644 | rw-r--r-- | 由用户读取和更改 |
660 | rw-rw---- | 可由用户和组更改 |
700 | rwx------ | 只有用户具有完全访问权限 |
755 | rwxr-xr-x | 只能由用户更改 |
775 | rwxrwxr-x | 群组共享模式 |
777 | rwxrwxrwx | 每个人都可以做任何事 |
$ ls -l
-rw-r--r-- 1 root root 3 Jun 29 15:35 a.log
drwxr-xr-x 2 root root 2 Jun 30 18:06 dir
-dir
的权限分析dir
的权限分析d rwx r-x r-x
┬ ─┬─ ─┬─ ─┬─
┆ ┆ ┆ ┆
@@ -161,7 +161,7 @@
┆ ╰─────────── 2. User |7 (4+2+1)
╰─────────────── 1. File Type | directory
-权限 | 描述 | 八进制 | 十进制 |
---|---|---|---|
--- | 没有权限 | 000 | 0 (0+0+0) |
--x | 执行 | 001 | 1 (0+0+1) |
-w- | 写 | 010 | 2 (0+2+0) |
-wx | 执行和写入 | 011 | 3 (0+2+1) |
r-- | 读 | 100 | 4 (4+0+0) |
r-x | 读取和执行 | 101 | 5 (4+0+1) |
rw- | 读和写 | 110 | 6 (4+2+0) |
rwx | 读取、写入和执行 | 111 | 7 (4+2+1) |
谁(缩写) | 含义 |
---|---|
u | 用户 |
g | 组 |
o | 其它 |
a | 全部,和 ugo 一样 |
缩写 | 权限 | 值 |
---|---|---|
r | 读 | 4 |
w | 写 | 2 |
x | 执行 | 1 |
- | 没有权限 | 0 |
缩写 | 文件类型 |
---|---|
d | 目录 |
- | 常规文件 |
l | 符号链接 |
Symbol | Description |
---|---|
+ | 添加 |
- | 删除 |
= | 设置 |
$ chmod 600 example.txt
$ chmod u=rw,g=,o= example.txt
$ chmod a+rwx,u-x,g-rwx,o-rwx example.txt
-$ chmod 664 example.txt
$ chmod u=rw,g=rw,o=r example.txt
$ chmod a+rwx,u-x,g-x,o-wx example.txt
-$ chmod 777 example.txt
$ chmod u=rwx,g=rwx,o=rwx example.txt
$ chmod a=rwx example.txt
-拒绝所有人的执行权限。
$ chmod a-x chmodExampleFile.txt
@@ -365,7 +365,7 @@
允许每个人读取、写入和执行文件并打开设置的 group-ID。
$ chmod =rwx,g+s chmodExampleScript.sh
-
要删除赋予文件的读写权限,请使用以下语法:
$ chmod o-rw example.txt
@@ -379,37 +379,37 @@
但是,如果你想删除组和其他人的所有权限,你可以使用 go= 来代替:
$ chmod go= example.txt
-
$ chmod +x ~/example.py
$ chmod u+x ~/example.py
$ chmod a+x ~/example.py
-$ chmod 754 foo.sh
$ chmod u=rwx,g=rx,o=r foo.sh
-$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/id_rsa
$ chmod 600 ~/.ssh/id_rsa.pub
$ chmod 400 /path/to/access_key.pem
-$ chmod -R 644 /var/www/html/
$ chmod 644 .htaccess
$ chmod 644 robots.txt
$ chmod 755 /var/www/uploads/
$ find /var/www/html -type d -exec chmod 755 {} \;
-$ chmod -R 644 /your_path
$ find /path -type d -exec chmod 755 {} \;
$ find /path -type f -exec chmod 644 {} \;
请参阅:命令替换
-颜色 | 颜色名称 | Hex RGB | 十进制 RGB |
---|---|---|---|
| aliceblue | #f0f8ff | 240 248 255 |
| antiquewhite | #faebd7 | 250 235 215 |
| aqua | #00ffff | 0 255 255 |
| aquamarine | #7fffd4 | 127 255 212 |
| azure | #f0ffff | 240 255 255 |
| beige | #f5f5dc | 245 245 220 |
| bisque | #ffe4c4 | 255 228 196 |
| black | #000000 | 0 0 0 |
| blanchedalmond | #ffebcd | 255 235 205 |
| blue | #0000ff | 0 0 255 |
| blueviolet | #8a2be2 | 138 43 226 |
| brown | #a52a2a | 165 42 42 |
| burlywood | #deb887 | 222 184 135 |
| cadetblue | #5f9ea0 | 95 158 160 |
| chartreuse | #7fff00 | 127 255 0 |
| chocolate | #d2691e | 210 105 30 |
| coral | #ff7f50 | 255 127 80 |
| cornflowerblue | #6495ed | 100 149 237 |
| cornsilk | #fff8dc | 255 248 220 |
| crimson | #dc143c | 220 20 60 |
| cyan | #00ffff | 0 255 255 |
| darkblue | #00008b | 0 0 139 |
| darkcyan | #008b8b | 0 139 139 |
| darkgoldenrod | #b8860b | 184 134 11 |
| darkgray | #a9a9a9 | 169 169 169 |
| darkgreen | #006400 | 0 100 0 |
| darkgrey | #a9a9a9 | 169 169 169 |
| darkkhaki | #bdb76b | 189 183 107 |
| darkmagenta | #8b008b | 139 0 139 |
| darkolivegreen | #556b2f | 85 107 47 |
| darkorange | #ff8c00 | 255 140 0 |
| darkorchid | #9932cc | 153 50 204 |
| darkred | #8b0000 | 139 0 0 |
| darksalmon | #e9967a | 233 150 122 |
| darkseagreen | #8fbc8f | 143 188 143 |
| darkslateblue | #483d8b | 72 61 139 |
| darkslategray | #2f4f4f | 47 79 79 |
| darkslategrey | #2f4f4f | 47 79 79 |
| darkturquoise | #00ced1 | 0 206 209 |
| darkviolet | #9400d3 | 148 0 211 |
| deeppink | #ff1493 | 255 20 147 |
| deepskyblue | #00bfff | 0 191 255 |
| dimgray | #696969 | 105 105 105 |
| dimgrey | #696969 | 105 105 105 |
| dodgerblue | #1e90ff | 30 144 255 |
| firebrick | #b22222 | 178 34 34 |
| floralwhite | #fffaf0 | 255 250 240 |
| forestgreen | #228b22 | 34 139 34 |
| fuchsia | #ff00ff | 255 0 255 |
| gainsboro | #dcdcdc | 220 220 220 |
| ghostwhite | #f8f8ff | 248 248 255 |
| gold | #ffd700 | 255 215 0 |
| goldenrod | #daa520 | 218 165 32 |
| gray | #808080 | 128 128 128 |
| green | #008000 | 0 128 0 |
| greenyellow | #adff2f | 173 255 47 |
| grey | #808080 | 128 128 128 |
| honeydew | #f0fff0 | 240 255 240 |
| hotpink | #ff69b4 | 255 105 180 |
| indianred | #cd5c5c | 205 92 92 |
| indigo | #4b0082 | 75 0 130 |
| ivory | #fffff0 | 255 255 240 |
| khaki | #f0e68c | 240 230 140 |
| lavender | #e6e6fa | 230 230 250 |
| lavenderblush | #fff0f5 | 255 240 245 |
| lawngreen | #7cfc00 | 124 252 0 |
| lemonchiffon | #fffacd | 255 250 205 |
| lightblue | #add8e6 | 173 216 230 |
| lightcoral | #f08080 | 240 128 128 |
| lightcyan | #e0ffff | 224 255 255 |
| lightgoldenrodyellow | #fafad2 | 250 250 210 |
| lightgray | #d3d3d3 | 211 211 211 |
| lightgreen | #90ee90 | 144 238 144 |
| lightgrey | #d3d3d3 | 211 211 211 |
| lightpink | #ffb6c1 | 255 182 193 |
| lightsalmon | #ffa07a | 255 160 122 |
| lightseagreen | #20b2aa | 32 178 170 |
| lightskyblue | #87cefa | 135 206 250 |
| lightslategray | #778899 | 119 136 153 |
| lightslategrey | #778899 | 119 136 153 |
| lightsteelblue | #b0c4de | 176 196 222 |
| lightyellow | #ffffe0 | 255 255 224 |
| lime | #00ff00 | 0 255 0 |
| limegreen | #32cd32 | 50 205 50 |
| linen | #faf0e6 | 250 240 230 |
| magenta | #ff00ff | 255 0 255 |
| maroon | #800000 | 128 0 0 |
| mediumaquamarine | #66cdaa | 102 205 170 |
| mediumblue | #0000cd | 0 0 205 |
| mediumorchid | #ba55d3 | 186 85 211 |
| mediumpurple | #9370db | 147 112 219 |
| mediumseagreen | #3cb371 | 60 179 113 |
| mediumslateblue | #7b68ee | 123 104 238 |
| mediumspringgreen | #00fa9a | 0 250 154 |
| mediumturquoise | #48d1cc | 72 209 204 |
| mediumvioletred | #c71585 | 199 21 133 |
| midnightblue | #191970 | 25 25 112 |
| mintcream | #f5fffa | 245 255 250 |
| mistyrose | #ffe4e1 | 255 228 225 |
| moccasin | #ffe4b5 | 255 228 181 |
| navajowhite | #ffdead | 255 222 173 |
| navy | #000080 | 0 0 128 |
| oldlace | #fdf5e6 | 253 245 230 |
| olive | #808000 | 128 128 0 |
| olivedrab | #6b8e23 | 107 142 35 |
| orange | #ffa500 | 255 165 0 |
| orangered | #ff4500 | 255 69 0 |
| orchid | #da70d6 | 218 112 214 |
| palegoldenrod | #eee8aa | 238 232 170 |
| palegreen | #98fb98 | 152 251 152 |
| paleturquoise | #afeeee | 175 238 238 |
| palevioletred | #db7093 | 219 112 147 |
| papayawhip | #ffefd5 | 255 239 213 |
| peachpuff | #ffdab9 | 255 218 185 |
| peru | #cd853f | 205 133 63 |
| pink | #ffc0cb | 255 192 203 |
| plum | #dda0dd | 221 160 221 |
| powderblue | #b0e0e6 | 176 224 230 |
| purple | #800080 | 128 0 128 |
| rebeccapurple | #663399 | 102 51 153 |
| red | #ff0000 | 255 0 0 |
| rosybrown | #bc8f8f | 188 143 143 |
| royalblue | #4169e1 | 65 105 225 |
| saddlebrown | #8b4513 | 139 69 19 |
| salmon | #fa8072 | 250 128 114 |
| sandybrown | #f4a460 | 244 164 96 |
| seagreen | #2e8b57 | 46 139 87 |
| seashell | #fff5ee | 255 245 238 |
| sienna | #a0522d | 160 82 45 |
| silver | #c0c0c0 | 192 192 192 |
| skyblue | #87ceeb | 135 206 235 |
| slateblue | #6a5acd | 106 90 205 |
| slategray | #708090 | 112 128 144 |
| slategrey | #708090 | 112 128 144 |
| snow | #fffafa | 255 250 250 |
| springgreen | #00ff7f | 0 255 127 |
| steelblue | #4682b4 | 70 130 180 |
| tan | #d2b48c | 210 180 140 |
| teal | #008080 | 0 128 128 |
| thistle | #d8bfd8 | 216 191 216 |
| tomato | #ff6347 | 255 99 71 |
| turquoise | #40e0d0 | 64 224 208 |
| violet | #ee82ee | 238 130 238 |
| wheat | #f5deb3 | 245 222 179 |
| white | #ffffff | 255 255 255 |
| whitesmoke | #f5f5f5 | 245 245 245 |
| yellow | #ffff00 | 255 255 0 |
| yellowgreen | #9acd32 | 154 205 50 |
Cron 最适合安排重复性任务。 可以使用关联的 at 实用程序来完成一次性任务的调度。
Min Hour Day Mon Weekday
分钟 小时 天 月 周
@@ -94,7 +94,7 @@
字段 | 范围 | 特殊字符 |
---|---|---|
分钟 Minute | 0 - 59 | , - * / |
小时 Hour | 0 - 23 | , - * / |
月份中的某天 | 1 - 31 | , - * ? / L W |
月 Month | 1 - 12 | , - * / |
星期几 | 0 - 6 | , - * ? / L # |
Example | Description |
---|---|
*/15 * * * * | 每 15 分钟 |
0 * * * * | 每隔一小时 |
0 */2 * * * | 每 2 小时 |
15 2 * * * | 每天凌晨 2 点 15 分 |
15 2 * * ? | 每天凌晨 2 点 15 分 |
10 9 * * 5 | 每周五上午 9:10 |
0 0 * * 0 | 每个星期日的午夜 |
15 2 * * 1L | 每月最后一个星期一凌晨 2 点 15 分 |
15 0 * * 4#2 | 每个月的第二个星期四早上 00:15 |
0 0 0 1 * * | 每个月的 1 日(每月) |
0 0 0 1 1 * | 每年 1 月 1 日(每年) |
@reboot | 每次重启 (非标准) |
特殊字符串 | 意义 |
---|---|
@reboot | 运行一次,在系统启动时 (非标准) |
@yearly | 每年运行一次,“0 0 1 1 *” (非标准) |
@annually | (与@yearly 相同)(非标准) |
@monthly | 每月运行一次,“0 0 1 * *” (非标准) |
@weekly | 每周运行一次,“0 0 * * 0” (非标准) |
@daily | 每天运行一次,“0 0 * * *” (非标准) |
@midnight | (与@daily 相同)(非标准) |
@hourly | 每小时运行一次,“0 * * * *” (非标准) |
- | - |
---|---|
crontab -e | 如果不存在,则编辑或创建一个 crontab 文件。 |
crontab -l | 显示 crontab 文件。 |
crontab -r | 删除 crontab 文件。 |
crontab -v | 显示您上次编辑 crontab 文件的时间。 (非标准) |
`echo "@reboot echo hi" | crontab` |
特殊字符 | 说明 |
---|---|
星号(*) | 匹配字段中的所有值或任何可能的值。 |
横杆(-) | 用于定义范围。例如:第 5 个字段(星期几)中的 1-5 每个工作日,即星期一到星期五 |
斜线 (/) | 第一个字段(分钟)/15 表示每十五分钟或范围的增量。 |
逗号(,) | 用于分隔项目。例如:第二个字段(小时)中的 2、6、8 在凌晨 2 点、早上 6 点和早上 8 点执行 |
L | 仅允许用于 月份中的某天 或 星期几 字段,星期几 中的 2L 表示每个月的最后一个星期二 |
井号 (#) | 仅允许用于 星期几 字段,后面必须在 1 到 5 的范围内。例如,4#1 表示给定月份的“第一个星期四”。 |
问号(?) | 可以代替“*”并允许用于月份和星期几。使用仅限于 cron 表达式中的 月份中的某天 或 星期几 。 |
这是一份关于 CSS 优点的快速参考备忘单,列出了选择器语法、属性、单位和其他有用的信息
CSS 功能丰富,不仅仅是布局页面
-<link
href="./path/to/stylesheet/style.css"
rel="stylesheet"
@@ -53,14 +53,14 @@
>
-<style>
body {
background-color: linen;
}
</style>
-<h2 style="text-align: center;">
居中文本
</h2>
@@ -69,38 +69,38 @@
</p>
-<div class="classname"></div>
<div class="class1 ... classn"></div>
支持一个元素上的多个类
-.post-title {
color: blue !important;
}
覆盖所有以前的样式规则
-h1 { }
#job-title { }
div.hero { }
div > p { }
查看: CSS 选择器
-color: #2a2aff;
color: green;
color: rgb(34, 12, 64, 0.6);
color: hsla(30 100% 50% / 0.6);
查看: Colors
-background-color: blue;
background-image: url("nyan-cat.gif");
background-image: url("../image.png");
查看: Backgrounds
-.page-title {
font-weight: bold;
font-size: 30px;
@@ -108,7 +108,7 @@
}
查看: Fonts
-.box {
position: relative;
top: 20px;
@@ -116,17 +116,17 @@
}
另见: Position
-animation: 300ms linear 0s infinite;
animation: bounce 300ms linear infinite;
查看: Animation
-/* 这是一行注释 */
/* 这是
多行注释 */
-div {
display: flex;
justify-content: center;
@@ -137,7 +137,7 @@
}
查看: Flexbox | Flex Tricks
-#container {
display: grid;
grid: repeat(2, 60px) / auto-flow 80px;
@@ -149,7 +149,7 @@
}
查看: Grid Layout
-counter-set: subsection;
counter-increment: subsection;
counter-reset: subsection 0;
@@ -161,37 +161,37 @@
}
查看: 动态内容
-h1, h2 {
color: red;
}
-h3.section-heading {
color: blue;
}
-div[attribute="SomeValue"] {
background-color: red;
}
-p:first-child {
font-weight: bold;
}
-.box:empty {
background: lime;
height: 80px;
width: 80px;
}
-选择器 | 说明 |
---|---|
p::after | 在 p 之后添加内容 # |
p::before | 在 p 之前添加内容 # |
p::first-letter | p中的第一个字母 # |
p::first-line | p 中的第一行 # |
::selection | 由用户选择 # |
::placeholder | 占位符 属性 # |
:root | 文档根元素 # |
:target | 突出显示活动锚点 # |
div:empty | 没有子元素的元素 # |
p:lang(en) | 带有 en 语言属性的 P # |
:not(span) | 不是跨度的元素 # |
:host | shadowDOM 中选择自定义元素 # |
::backdrop | 处于全屏模式的元素样式 # |
::marker | li 项目符号或者数字 # |
::file-selector-button | type="file" input 按钮 # |
选择器 | 说明 |
---|---|
input:checked | 检查 input # |
input:disabled | 禁用 input # |
input:enabled | 启用的 input # |
input:default | 有默认值的元素 # |
input:blank | 空的输入框 # |
input:focus | input 有焦点 # |
input:in-range | 范围内的值 # |
input:out-of-range | input 值超出范围 # |
input:valid | input 有效值 # |
input:invalid | input 无效值 # |
input:optional | 没有必需的属性 # |
input:required | 带有必需属性的 input # |
input:read-only | 具有只读属性 # |
input:read-write | 没有只读属性 # |
input:indeterminate | 带有 indeterminate 状态 # |
选择器 | 说明 |
---|---|
p:first-child | 第一个孩子 # |
p:last-child | 最后一个孩子 # |
p:first-of-type | 首先是某种类型 # |
p:last-of-type | 某种类型的最后一个 # |
p:nth-child(2) | 其父母的第二个孩子 # |
p:nth-child(3n42) | Nth-child(an + b) 公式 # |
p:nth-last-child(2) | 后面的二孩 # |
p:nth-of-type(2) | 其父级的第二个 p # |
p:nth-last-of-type(2) | ...从后面 # |
p:only-of-type | 其父级的唯一性 # |
p:only-child | 其父母的唯一孩子 # |
:is(header, div) p | 可以选择的元素 # |
:where(header, div) p | 与 :is 相同 # |
a:has(> img) | 包含 img 元素的 a 元素 # |
::first-letter | 第一行的第一个字母 # |
::first-line | 第一行应用样式 # |
font: italic 400 14px / 1.5 sans-serif
┈┈┬┈┈┈ ┈┬┈ ┈┬┈┈ ┈┬┈ ┈┬┈┈┈┈┈┈┈┈
样式 粗细 大小(必需的) 行高 字体(必需的)
-font-family: Arial, sans-serif;
font-size: 12pt;
letter-spacing: 0.02em;
-div {
/* 首字母大写 Hello */
@@ -633,27 +633,27 @@
text-transform: lowercase;
}
-@font-face {
font-family: 'Glegoo';
src: url('../Glegoo.woff');
}
-color: red;
color: orange;
color: tan;
color: rebeccapurple;
更多标准颜色名称
-color: #090;
color: #009900;
color: #090a;
color: #009900aa;
-color: rgb(34, 12, 64, 0.6);
color: rgba(34, 12, 64, 0.6);
color: rgb(34 12 64 / 0.6);
@@ -661,7 +661,7 @@
color: rgb(34.0 12 64 / 60%);
color: rgba(34.6 12 64 / 30%);
-color: hsl(30, 100%, 50%, 0.6);
color: hsla(30, 100%, 50%, 0.6);
color: hsl(30 100% 50% / 0.6);
@@ -669,21 +669,21 @@
color: hsl(30.0 100% 50% / 60%);
color: hsla(30.2 100% 50% / 60%);
-color: inherit;
color: initial;
color: unset;
color: transparent;
color: currentcolor; /* 关键字 */
-/* 全局值 */
color: inherit;
color: initial;
color: unset;
-background: #ff0 url(a.jpg) left top / 100px auto no-repeat fixed;
#abc url(b.png) center center / cover repeat-x local;
┈┬┈┈ ┈┬┈┈┈┈┈┈┈ ┈┬┈┈ ┈┬┈ ┈┈┬┈┈┈┈┈┈┈ ┈┈┬┈┈┈┈┈┈ ┈┈┬┈┈┈
颜色 图片 位置x 位置x 图片大小 图像重复方式 位置是在视口内固定
-background: url(img_flwr.gif) right bottom no-repeat, url(paper.gif) left top repeat;
background: url(img_man.jpg) no-repeat center;
@@ -743,57 +743,57 @@
rgba(13,232,230,1) 35%,
rgba(0,212,255,1) 100%);
-.column {
max-width: 200px; /* 最大宽度 200 像素 */
width: 500px; /* 宽度 500 像素 */
}
另见: max-width / min-width / max-height / min-height
-.block-one {
margin: 20px; /* 边距 20 像素 */
padding: 10px; /* 补白 10 像素 */
}
另见: 边距(margin) / 补白(padding)
-.container {
/* 设置的边框和补白的值是包含在 width 内的 */
box-sizing: border-box;
}
另见: box-sizing
-.invisible-elements {
visibility: hidden; /* 隐藏元素 */
}
另见: Visibility
-div {
/* 览器自己选择一个合适的外边距 */
margin: auto;
}
另见: 边距(margin)
-.small-block {
/* 浏览器总是显示滚动条 */
overflow: scroll;
}
另见: 溢出(overflow)
-animation: bounce 300ms linear 100ms infinite alternate-reverse both reverse
┈┬┈┈ ┈┬┈┈┈ ┈┬┈┈┈┈ ┈┈┬┈┈ ┈┈┈┬┈┈┈┈ ┈┈┬┈┈┈┈┈┈┈┈┈┈┈┈┈┈ ┈┈┬┈┈┈ ┈┈┬┈┈┈
动画名 动画时间 缓动函数 延迟 运行的次数 动画是否反向播放 如何将样式应用于其目标 是否运行或者暂停
-/* @keyframes duration | timing-function | delay |
iteration-count | direction | fill-mode | play-state | name */
@@ -857,13 +857,13 @@
animation: bounce 300ms linear infinite alternate-reverse;
animation: bounce 300ms linear 2s infinite alternate-reverse forwards normal;
-.one('webkitAnimationEnd oanimationend msAnimationEnd animationend')
-.container {
display: flex;
}
@@ -872,7 +872,7 @@
flex: 1 1 auto;
}
-.container {
display: flex;
@@ -899,7 +899,7 @@
justify-content: space-evenly; /* [ ■ ■ ■ ] */
}
-.container > div {
/* 这个: */
@@ -915,7 +915,7 @@
margin-left: auto; /* right */
}
-justify-content: flex-start | flex-end | center | space-between
@@ -950,7 +950,7 @@
╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╯
上面示例,假设主轴为从左到右
-flex-wrap: nowrap | wrap | wrap-reverse;
nowrap
:不换行(默认)
项目都排在一条线(又称"轴线")上
-flex-direction: row | row-reverse | column | column-reverse;
属性决定主轴的方向(即项目的排列方向)
-align-items: flex-start | flex-end | center | baseline | stretch;
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
@@ -1048,7 +1048,7 @@
┆ ╰┈┈╯ ┆ ┆ ┆
╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╯ ╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╯
-.item {
order: <integer>;
}
@@ -1065,7 +1065,7 @@
╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╯ ╰┈┈┈┈┈┈┈┈┈╯
属性 order 定义项目的排列顺序。数值越小,排列越靠前,默认为 0
.item {
flex-grow: <number>; /* default 0 */
}
@@ -1081,8 +1081,8 @@
╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╯
属性 flex-grow 定义项目的放大比例,默认为0
,即如果存在剩余空间,也不放大
.container {
display: flex;
}
@@ -1092,7 +1092,7 @@
margin: auto;
}
-.container {
display: flex;
/* 垂直的 */
@@ -1101,7 +1101,7 @@
justify-content: center;
}
-.container > .top {
order: 1;
}
@@ -1109,7 +1109,7 @@
order: 2;
}
-.container {
display: flex;
flex-direction: column;
@@ -1122,7 +1122,7 @@
}
一个固定高度的顶部栏和一个动态高度的内容区域
-.container {
display: flex;
@@ -1133,33 +1133,33 @@
.container > .date { flex: 1 0 120px; }
这会创建具有不同宽度的列,但会根据情况相应地调整大小
-.container {
align-items: center;
}
垂直居中所有项目
-.menu > .left { align-self: flex-start; }
.menu > .right { align-self: flex-end; }
-#grid-container {
display: grid;
width: 100px;
grid-template-columns: 20px 20% 60%;
}
-.grid {
display: grid;
width: 100px;
grid-template-columns: 1fr 60px 1fr;
}
-/* 行间距为 20px */
/* 列之间的距离是 10px */
#grid-container {
@@ -1167,37 +1167,37 @@
grid-gap: 20px 10px;
}
-CSS 语法:
.item {
grid-row: 1 / span 2;
}
-#grid-container {
display: block;
}
-#grid-container {
display: inline-grid;
}
-grid-row-gap: length;
任何合法的长度值,例如 px
或 %
。0
是默认值
.item1 {
grid-area: 2 / 1 / span 2 / span 3;
}
-.grid {
display: grid;
@@ -1206,17 +1206,17 @@
定义了一个长宽范围的闭区间
-CSS 语法:
grid-row-start: 2;
grid-row-end: span 2;
-#container {
display: grid;
justify-items: center;
@@ -1225,7 +1225,7 @@
grid-gap: 10px;
}
-.item {
grid-area: nav;
}
@@ -1236,7 +1236,7 @@
'nav nav . .';
}
-#grid-container {
display: grid;
justify-items: start;
@@ -1246,7 +1246,7 @@
}
网格项目位于行的右侧(末尾)
-#container {
display: grid;
align-items: start;
@@ -1255,8 +1255,8 @@
grid-gap: 10px;
}
-/* Set "my-counter" to 0 */
counter-set: my-counter;
@@ -1284,7 +1284,7 @@
counter-reset: my-counter;
另见: Counter set
-body { counter-reset: section; }
h3::before {
counter-increment: section;
@@ -1300,24 +1300,24 @@
content: counters(section, ".") " ";
}
-html {
scroll-behavior: smooth;
}
点击我页面会平滑滚动到入门
-br + br {
display: none;
}
-:empty {
display: none;
}
-html {
box-sizing: border-box;
}
@@ -1328,7 +1328,7 @@
}
有助于在不同的浏览器之间强制样式一致性,并为样式元素提供干净的盒子
-div {
cursor: url('path-to-image.png'), url('path-to-fallback-image.png'), auto;
/* 表情符号作为光标 */
@@ -1336,7 +1336,7 @@
}
-.overflow-ellipsis {
width: 200px;
white-space: nowrap;
@@ -1345,7 +1345,7 @@
}
一行文本截断显示省略号 (...)
-.overflow-truncate {
display: -webkit-box;
-webkit-box-orient: vertical;
@@ -1354,27 +1354,27 @@
}
多行文本截断到特定的行数,末尾显示省略号 (...)
-div {
width: calc(100% - 30px);
height: calc(100% - 30px);
}
calc()
CSS 函数允许您在指定 CSS 属性值时执行计算
.sticky {
position: sticky;
top: 0;
}
属性 sticky 能在滚动到顶部的位置固定住元素
-a[href^="http"]:empty::before {
content: attr(href);
}
如果你的 <a>
标签里面没有内容,将 href
的值作为内容展示
响应式布局中的字体大小应该能够根据每个视口进行调整,您可以使用 :root
根据视口高度和宽度计算字体大小
:root {
font-size: calc(1vw + 1vh + .5vmin);
@@ -1385,7 +1385,7 @@
font: 1rem/1.6 sans-serif;
}
-此 Curl 备忘清单包含命令和一些常见的 Curl 技巧示例。
Curl 是一种在服务器之间传输数据的工具,支持协议,包括 HTTP/FTP/IMAP/LDAP/POP3/SCP/SFTP/SMB/SMTP 等
-o <file> # --output: 写入文件
-u user:pass # --user: 验证
@@ -62,13 +62,13 @@
-i # --include: 在输出中包含 HTTP 标头
-I # --head: 仅标头
-
-X POST # --request
-L # 如果页面重定向,请点击链接
-F # --form: multipart/form-data 的 HTTP POST 数据
-# --data: HTTP post 数据
# URL 编码(例如,status="Hello")
-d 'data'
@@ -79,7 +79,7 @@
# --get: 通过 get 发送 -d 数据
-G
--A <str> # --user-agent
-b name=val # --cookie
@@ -90,7 +90,7 @@
--compressed # 使用 deflate/gzip
- --cacert <file>
--capath <dir>
@@ -98,12 +98,12 @@
--cert-type # der/pem/eng
-k, --insecure # 对于自签名证书
-apk add --update curl # alpine linux 中安装
-命令 | 说明 |
---|---|
curl -I https://www.baidu.com | curl 发请求 |
curl -v -I https://www.baidu.com | 带有详细信息的 curl 发请求 |
curl -X GET https://www.baidu.com | 使用显式 http 方法进行 curl |
curl --noproxy 127.0.0.1 http://www.stackoverflow.com | 没有 http 代理的 curl |
curl --connect-timeout 10 -I -k https://www.baidu.com | curl 默认没有超时 |
curl --verbose --header "Host: www.mytest.com:8182" www.baidu.com | curl 得到额外的标题 |
curl -k -v https://www.google.com | curl 获取带有标题的响应 |
$ curl -v -include \
--form key1=value1 \
--form upload=@localfilename URL
-$ curl -XGET http://${elasticsearch_ip}:9200/_cluster/nodes | python -m json.tool
-命令 | 说明 |
---|---|
curl -d "name=username&password=123456" <URL> | curl 发请求 |
curl <URL> -H "content-type: application/json" -d "{ \"woof\": \"bark\"}" | curl 发送 json |
curl -sSL https://get.rvm.io | bash
-命令 | 说明 |
---|---|
curl -L -s http://ipecho.net/plain, curl -L -s http://whatismijnip.nl | 获取我的公共 IP |
curl -u $username:$password http://repo.dennyzhang.com/README.txt | 带凭证的 curl |
curl -v -F key1=value1 -F upload=@localfilename <URL> | curl 上传 |
curl -k -v --http2 https://www.google.com/ | 使用 http2 curl |
curl -T cryptopp552.zip -u test:test ftp://10.32.99.187/ | curl ftp 上传 |
curl -u test:test ftp://10.32.99.187/cryptopp552.zip -o cryptopp552.zip | curl ftp 下载 |
curl -v -u admin:admin123 --upload-file package1.zip http://mysever:8081/dir/package1.zip | 使用凭证 curl 上传 |
curl -s -w \
'\nLookup time:\t%{time_namelookup}\nConnect time:\t%{time_connect}\nAppCon time:\t%{time_appconnect}\nRedirect time:\t%{time_redirect}\nPreXfer time:\t%{time_pretransfer}\nStartXfer time:\t%{time_starttransfer}\n\nTotal time:\t%{time_total}\n' \
-o /dev/null https://www.google.com
-curl -o /dev/null --silent -Iw "%{http_code}" https://example.com/my.remote.tarball.gz
-curl https://example.com | \
grep --only-matching 'src="[^"]*.[png]"' | \
@@ -242,24 +242,24 @@
-o "${i##*/}"; done
从站点下载所有 PNG 文件(使用GNU grep)
-curl --remote-name "https://example.com/linux-distro.iso"
重命名文件
curl --remote-name "http://example.com/index.html" --output foo.html
-curl --remote-name --continue-at - "https://example.com/linux-distro.iso"
-curl "https://www.{example,w3,iana}.org/index.html" --output "file_#1.html"
-curl "https://{foo,bar}.com/file_[1-4].webp" --output "#1_#2.webp"
@@ -278,8 +278,6 @@ function anchorPoint() {
Array.from(document.querySelectorAll('.h2wrap-body .wrap')).forEach((elm) => elm.classList.remove('active'))
if (elm?.tagName === 'H3') {
elm?.parentElement?.parentElement?.classList.add('active');
- const box = elm?.parentElement?.parentElement;
- console.log('elm:2', box, document.querySelectorAll('.h2wrap-body .wrap'))
}
}
anchorPoint();
@@ -290,7 +288,6 @@ function updateAnchor(element) {
tocanchor.classList.remove('is-active-link');
});
const anchor = element || document.querySelector(`a.tocs-link[href='${decodeURIComponent(window.location.hash)}']`);
- console.log('anchor', anchor)
if (anchor) {
anchor.classList.add('is-active-link');
}
diff --git a/docs/docker.html b/docs/docker.html
index 3bdc2b50..e9d46d27 100644
--- a/docs/docker.html
+++ b/docs/docker.html
@@ -34,16 +34,16 @@
document.documentElement.setAttribute('data-color-mode', mode);
localStorage.setItem(LOCAL_NANE, mode);
}
-这是 Docker 的快速参考备忘单。 你可以在这里找到最常见的 Docker 命令。
在后台创建和运行容器
$ docker run -d -p 80:80 docker/getting-started
@@ -64,7 +64,7 @@
--name my-nginx
- 指定名称nginx
- 要使用的镜像Example | Description |
---|---|
docker ps | 列出正在运行的容器 |
docker ps -a | 列出所有容器 |
docker ps -s | 列出正在运行的容器 (带 CPU / 内存) |
docker images | 列出所有镜像 |
docker exec -it <container> bash | 连接到容器 |
docker logs <container> | 显示容器的控制台日志 |
docker stop <container> | 停止容器 |
docker restart <container> | 重启一个容器 |
docker rm <container> | 移除一个容器 |
docker port <container> | 显示容器的端口映射 |
docker top <container> | 列出进程 |
docker kill <container> | 杀死一个容器 |
参数 <container>
可以是容器 id 或名称
Description | Example |
---|---|
docker start nginx-server | 开始 |
docker stop nginx-server | 停止 |
docker restart nginx-server | 重启 |
docker pause nginx-server | 暂停 |
docker unpause nginx-server | 取消暂停 |
docker wait nginx-server | 阻塞容器 |
docker kill nginx-server | 发送 SIGKILL |
docker attach nginx-server | 连接到现有容器 |
Example | Description |
---|---|
docker ps | 列出正在运行的容器 |
docker ps -a | 列出所有容器 |
docker logs nginx-server | 容器日志 |
docker inspect nginx-server | 检查容器 |
docker events nginx-server | 容器事件 |
docker port nginx-server | 公共端口 |
docker top nginx-server | 运行进程 |
docker stats nginx-server | 容器资源使用 |
docker diff nginx-server | 列出对容器所做的更改 |
docker create [options] IMAGE
-a, --attach # 附加标准输出/错误
-i, --interactive # 附加标准输入(交互式)
@@ -229,10 +229,10 @@
-v, --volume `pwd`:/app # mount(需要绝对路径)
-e, --env NAME=hello # 环境变量 env vars
-$ docker create --name my_redis --expose 6379 redis:3.0.2
-重命名容器
docker rename my-nginx nginx-server
@@ -242,9 +242,9 @@
更新容器
docker update --cpu-shares 512 -m 300M nginx-server
-Example | Description |
---|---|
docker images | 列出镜像 |
docker rmi nginx | 删除镜像 |
docker load < ubuntu.tar.gz | 加载一个 tarred 存储库 |
docker load --input ubuntu.tar | 加载一个 tarred 存储库 |
docker save busybox > ubuntu.tar | 将镜像保存到 tar 存档 |
docker history | 显示镜像的历史 |
docker commit nginx | 将容器另存为镜像。 |
docker tag nginx eon01/nginx | 标记镜像 |
docker push eon01/nginx | 推送镜像 |
$ docker build .
$ docker build github.com/creack/docker-firefox
$ docker build - < Dockerfile
@@ -300,9 +300,9 @@
$ docker build -f myOtherDockerfile .
$ curl example.com/remote/Dockerfile | docker build -f - .
-删除网络
docker network rm MyOverlayNetwork
@@ -321,7 +321,7 @@
断开容器与网络的连接
docker network disconnect MyOverlayNetwork nginx
-docker network create -d overlay MyOverlayNetwork
docker network create -d bridge MyBridgeNetwork
docker network create -d overlay \
@@ -336,9 +336,9 @@
--aux-address="my-nas=192.170.1.6" \
MyOverlayNetwork
-Docker 语法 | 说明 |
---|---|
docker search search_word | 在 docker hub 中搜索镜像。 |
docker pull user/image | 从 docker hub 下载镜像。 |
docker login | 向 docker hub 进行身份验证 |
docker push user/image | 将镜像上传到 docker hub。 |
登录到镜像仓库
$ docker login
@@ -387,7 +387,7 @@
$ docker push eon01/nginx
$ docker push eon01/nginx localhost:5000/myadmin/nginx
-
实例 | 说明 |
---|---|
docker stop -f $(docker ps -a -q) | 停止所有容器 |
docker rm -f $(docker ps -a -q) | 删除所有容器 |
docker rmi -f $(docker images -q) | 删除所有图像 |
检查卷
$ docker volume ls
清理未使用的卷
$ docker volume prune
-:- | :- |
---|---|
docker-compose up | 创建和启动容器 |
docker-compose up -d | 以分离模式创建和启动容器 |
docker-compose down | 停止和删除容器、网络、映像和卷 |
docker-compose logs | 查看容器的输出 |
docker-compose restart | 重启所有服务 |
docker-compose pull | 拉取所有图片服务 |
docker-compose build | 构建所有图像服务 |
docker-compose config | 验证并查看 Compose 文件 |
docker-compose scale <service_name>=<replica> | 规模特殊服务 |
docker-compose top | 显示正在运行的进程 |
docker-compose run -rm -p 2022:22 web bash | 启动 Web 服务并运行 bash 作为其命令,删除旧容器。 |
:- | :- |
---|---|
docker service create <options> <image> <command> | 创建新服务 |
docker service inspect --pretty <service_name> | 显示详细信息服务 |
docker service ls | 列出服务 |
docker service ps | 列出服务的任务 |
docker service scale <service_name>=<replica> | 规模特殊服务 |
docker service update <options> <service_name> | 更新服务选项 |
:- | :- |
---|---|
docker stack ls | 列出此 Docker 主机上所有正在运行的应用程序 |
docker stack deploy -c <composefile> <appname> | 运行指定的 Compose 文件 |
docker stack services <appname> | 列出与应用关联的服务 |
docker stack ps <appname> | 列出与应用关联的正在运行的容器 |
docker stack rm <appname> | 拆掉一个应用程序 |
:- | :- |
---|---|
docker-machine create --driver virtualbox myvm1 | 创建虚拟机(Mac、Win7、Linux) |
docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm1 | Win10 |
docker-machine env myvm1 | 查看有关您的节点的基本信息 |
docker-machine ssh myvm1 "docker node ls" | 列出集群中的节点 |
docker-machine ssh myvm1 "docker node inspect <node ID>" | 检查节点 |
docker-machine ssh myvm1 "docker swarm join-token -q worker" | 查看加入令牌 |
docker-machine ssh myvm1 | 打开与 VM 的 SSH 会话; 输入“exit”结束 |
docker-machine ssh myvm2 "docker swarm leave" | 让工人离开群体 |
docker-machine ssh myvm1 "docker swarm leave -f" | 让主人离开,杀群 |
docker-machine start myvm1 | 启动当前未运行的 VM |
docker-machine stop $(docker-machine ls -q) | 停止所有正在运行的虚拟机 |
docker-machine rm $(docker-machine ls -q) | 删除所有虚拟机及其磁盘映像 |
docker-machine scp docker-compose.yml myvm1:~ | 将文件复制到节点的主目录 |
docker-machine ssh myvm1 "docker stack deploy -c <file> <app>" | 部署应用 |
这是 Dockerfile 的快速参考备忘单。包含用户可以在命令行上调用以组装镜像的所有命令。
默认 Dockerfile
位于上下文的根目录中。
docker build -f /path/to/a/Dockerfile .
使用 -f
指向文件系统中任何位置的 Dockerfile
。
FROM [--platform=<platform>] <image> [AS <name>]
@@ -58,7 +58,7 @@
FROM ruby:2.2.2
FROM golang:1.19-alpine3.16 AS build-env
-ENV <key>=<value> ...
ENV APP_HOME /myapp
@@ -67,7 +67,7 @@
ENV MY_NAME="John Doe" MY_DOG=Rex\ The\ Dog \
MY_CAT=fluffy
-
RUN bundle install
@@ -83,7 +83,7 @@
COPY host_file.xyz /path/container_file.xyz
-ONBUILD RUN bundle install
# 与另一个文件一起使用时
@@ -92,7 +92,7 @@
指令将触发指令添加到镜像中,以便稍后执行,此时镜像用作另一个构建的基础。
-ENV my_var
SHELL ["/bin/bash", "-euo", "pipefail", "-c"]
# 使用严格模式:
@@ -102,7 +102,7 @@
使用 shell
将为 shell 命令打开严格模式。
EXPOSE 5900
CMD ["bundle", "exec", "rails", "server"]
-ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
@@ -139,7 +139,7 @@
ENTRYPOINT exec top -b
这将使用 shell 处理来替换 shell 变量,并将忽略任何 CMD
或 docker run
命令行参数。
LABEL version="1.0"
LABEL "com.example.vendor"="ACME Incorporated"
@@ -153,7 +153,7 @@
multi.label2="value2" \
other="value3"
-ARG <name>[=<default value>]
指令定义了一个变量,在构建时通过 docker build
命令使用 --build-arg <varname>=<value>
标志将其传递给构建器。
# 注释说明
*/temp*
*/*/temp*
@@ -197,7 +197,7 @@
:- - # comment
忽略 */temp*
在根的任何直接子目录中
排除名称以 temp
开头的文件和目录 */*/temp*
从根以下两级的任何子目录中
排除以 temp
开头的文件和目录 temp?
排除根目录中名称为
temp
的单字符扩展名的文件和目录
如果此文件存在,排除与其中的模式匹配的文件和目录,有利于避免 ADD
或 COPY
将敏感文件添加到镜像中。匹配是使用 Go 的 filepath.Match 规则完成的。
-
命令 | 说明 |
---|---|
FROM image | 构建的基础镜像 |
MAINTAINER email | (已弃用)维护者的名字 |
COPY [--chown=<user>:<group>] <src>... <dest> | 将上下文中的路径复制到位置 dest 的容器中 |
ADD [--chown=<user>:<group>] <src>... <dest> | 与 COPY 相同,但解压缩存档并接受 http url。 |
RUN <command> | 在容器内运行任意命令。 |
USER <user>[:<group>] | 设置默认用户名。 |
WORKDIR /path/to/workdir | 设置默认工作目录。 |
CMD command param1 param2 | 设置默认命令 |
ENV <key>=<value> ... | 设置环境变量 |
EXPOSE <port> [<port>/<protocol>...] | 运行时侦听指定的网络端口 |
FROM lipanski/docker-static-website:latest
# 使用 .dockerignore 文件来控制图像中的内容!
@@ -264,7 +264,7 @@
CMD ["/busybox", "httpd", "-f", "-v", "-p", "3000", "-c", "httpd.conf"]
缩小镜像过程查看原文,镜像 Dockerfile 源码。
-此快速参考备忘单提供了 Electron v21 API 说明和使用示例。
Electron 是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架
-mkdir my-app && cd my-app
@@ -114,29 +114,29 @@
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit()
}
})
-const win = new BrowserWindow({
frame: false
})
-const win = new BrowserWindow({
titleBarStyle: 'hidden'
})
-const win = new BrowserWindow({
titleBarStyle: 'customButtonsOnHover'
})
-创建一个名为 preload.js 的新脚本如下
window.addEventListener('DOMContentLoaded', () => {
@@ -165,7 +165,7 @@
win.loadFile('index.html')
}
-const { contextBridge } = require('electron')
contextBridge.exposeInMainWorld(
@@ -181,7 +181,7 @@
);
通过 preload.js
脚本将 versions
这一全局变量暴露给渲染器
const myWindow = new BrowserWindow({
webPreferences: {
spellcheck: true
@@ -194,9 +194,9 @@
'en-US', 'fr'
])
-const { app } = require('electron');
@@ -211,7 +211,7 @@
app.exit(0);
-:- | :- |
---|---|
quit | 尝试关闭所有窗口 # |
exit | 使用 exitCode 立即退出 # |
relaunch | 当前实例退出,重启应用 # |
isReady | 已完成初始化返回 boolean # |
whenReady | 初始化完成 # |
focus | 获得焦点/激活的 app # |
hide | 隐藏所有的应用窗口,不是最小化 # |
isHidden (mac) | 所有窗口是否都被隐藏 # |
show (mac) | 显示隐藏后的应用程序窗口 # |
setAppLogsPath | 设置或创建一个您的应用程序日志目录 # |
getAppPath | 获取当前应用程序目录 # |
getPath(name) | 与 name 关联的目录或文件的路径 # |
getFileIcon | 一个 NativeImage 类型的应用图标 # |
setPath(name) | 重写 name 的路径特定文件夹或文件 # |
getVersion | 应用程序的版本号 # |
getName | 应用程序的名称 # |
setName | 设置当前应用程序的名字 # |
getLocale | 当前应用程序区域 # |
getLocaleCountryCode | 获取双字母 ISO 3166 国家代码 # |
getSystemLocale | 当前系统语言环境 # |
addRecentDocument (win/mac) | 最近打开的文件列表添加新路径 # |
clearRecentDocuments (win/mac) | 清空最近打开的文档列表# |
setAsDefaultProtocolClient | 设置协议(URI scheme)默认处理程序 # |
removeAsDefaultProtocolClient | 移除默认处理器 # |
isDefaultProtocolClient | 可执行程序是否是协议 # |
getApplicationNameForProtocol | 返回默认处理器的应用程序名称 # |
getApplicationInfoForProtocol (win/mac) | 返回包含应用程序名称 # |
setUserTasks (win) | 添加 tasks 到Jump List的Tasks类别 # |
getJumpListSettings (win) | 获取跳转列表 # |
setJumpList (win) | 设置跳转列表 # |
requestSingleInstanceLock | 返回应用程序实例是否成功取了锁 # |
hasSingleInstanceLock | 返回应用实例当前是否持有单例锁 # |
releaseSingleInstanceLock | 释放所有创建的锁 # |
setUserActivity (mac) | 创建 NSUserActivity 并将其设置为当前活动 # |
getCurrentActivityType (mac) | 正在运行的 activity 的类型 # |
invalidateCurrentActivity (mac) | 使当前的Handoff用户活动无效 # |
resignCurrentActivity (mac) | 将当前 Handoff 用户活动标记为非活动,但不使其失效 # |
updateCurrentActivity (mac) | 将项目从 用户信息 合并到其当前 用户信息 字典中 # |
setAppUserModelId (win) | 改变当前应用的 Application User Model ID 为 id # |
setActivationPolicy (mac) | 为给定应用设置激活策略 # |
importCertificate (linux) | 将 pkcs12 格式的证书导入到平台证书库 # |
configureHostResolver | 配置主机解析器 (DNS 和 DNS-over-HTTPS) # |
disableHardwareAcceleration | 禁用当前应用程序的硬件加速 # |
disableDomainBlockingFor3DAPIs | GPU 进程频繁崩溃,在每个域的基础上重新启动,禁用该行为 # |
getAppMetrics | 返回 ProcessMetric[] # |
getGPUFeatureStatus | 返回 GPUFeatureStatus # |
getGPUInfo | GPU 信息 # |
setBadgeCount (mac/linux) | 应用设置计数器角标 # |
getBadgeCount (mac/linux) | 获取计数器(badge)显示的当前值 # |
isUnityRunning (linux) | 前桌面环境是否为 Unity 启动器 # |
getLoginItemSettings (mac/win) | 为 openAtLogin 设置相同的参数已确保正确的设置 # |
setLoginItemSettings (mac/win) | 传递指定应用程序名称的参数 # |
isAccessibilitySupportEnabled (mac/win) | 是否开启了辅助功能 # |
setAccessibilitySupportEnabled (mac/win) | 启用或禁用访问权限树视图 # |
showAboutPanel | 显示程序的"关于"面板选项 # |
setAboutPanelOptions | 设置 "关于" 面板选项 # |
isEmojiPanelSupported | 当前操作系统是否支持本地 emoji 选择器 # |
showEmojiPanel (mac/win) | 打开系统自身的emjio选取器 # |
startAccessingSecurityScopedResource (mac) | 开始访问安全范围内的资源 # |
enableSandbox | 在应用程序上启用完全沙盒模式 # |
isInApplicationsFolder (mac) | 是否从系统应用程序文件夹运行 # |
moveToApplicationsFolder (mac) | # |
isSecureKeyboardEntryEnabled (mac) | 是否已启用安全键盘输入 # |
setSecureKeyboardEntryEnabled (mac) | 在应用中启用安全键盘输入 # |
const { app } = require('electron');
let myWindow = null;
@@ -510,7 +510,7 @@
})
}
-:- | :- |
---|---|
will-finish-launching | 基础的启动的时候被触发 # |
ready | 完成初始化时,触发一次 # |
window-all-closed | 在程序关闭窗口前发信号 # |
before-quit | 当所有窗口被关闭后触发,应用程序将退出 # |
will-quit | 所有窗口被关闭后触发,应用程序将退出 # |
quit | 在应用程序退出时触发 # |
open-file (mac) | 在应用中打开一个文件时触发 # |
open-url (mac) | 应用中打开一个 URL 时触发 # |
activate (mac) | 当应用被激活时触发 # |
did-become-active (mac) | 不同设备的活动想要恢复时在切换期间触发 # |
continue-activity (mac) | 不同设备的活动通过 Handoff 想要恢复时触发 # |
will-continue-activity (mac) | 恢复来自不同设备的活动之前在切换期间触发 # |
continue-activity-error (mac) | 不同设备的活动无法恢复时在切换期间触发 # |
activity-was-continued (mac) | 活动在另一个设备上成功恢复后切换期间触发 # |
update-activity-state (mac) | 当即将在另一台设备上恢复切换时触发 # |
new-window-for-tab (mac) | 用户点击原生的 macOS 新标签按钮时触发 # |
browser-window-blur | 当 browserWindow 变得模糊时触发 # |
browser-window-focus | 当 browserWindow 获得焦点时触发 # |
browser-window-created | 创建新的 browserWindow 时触发 # |
web-contents-created | 创建新的 webContents 时触发 # |
certificate-error | 当对 url 的 certificate 证书验证失败触发 # |
select-client-certificate | 当一个客户证书被请求的时候发出 # |
login | 当 webContents 要进行基本身份验证时触发 # |
gpu-info-update | 每当有 GPU 信息更新时触发 # |
gpu-process-crashed | 当 gpu 进程崩溃或关闭(杀死)时触发 # |
renderer-process-crashed | 渲染器进程崩溃或关闭(杀死)时触发 # |
render-process-gone | 渲染器进程意外消失时触发 # |
child-process-gone | 子进程意外消失时触发 # |
accessibility-support-changed | 当 Chrome 的辅助功能状态改变时触发 # |
session-created | 创建了一个新的 session 后被触发 # |
second-instance | 在你的应用程序的首个实例中触发 # |
:- | :- |
---|---|
accessibilitySupportEnabled (mac/win) | 是否开启了辅助功能 # |
applicationMenu | 传递 Menu 来给此属性赋值 # |
badgeCount (mac/linux) | 返回应用角标计数的 Integer 属性 # |
commandLine | Chromium 使用的命令行参数 # |
dock (mac/只读) | 用户dock中对应用图标进行操作 # |
isPackaged (只读) | 应用是否已经打包 # |
name | 当前应用程序的名称 # |
userAgentFallback | 全局回退的用户代理字符串 # |
runningUnderRosettaTranslation | 提示下载应用程序的 arm64 版本 # |
runningUnderARM64Translation (mac/win) | 前应用正在使用 ARM64 运行环境 # |
:- | :- |
---|---|
width 整数 | 窗口的宽度(以像素为单位)。默认值 (800) |
height 整数 | 窗口的高度(以像素为单位)。默认值 (600) |
x 整数 (可选) | 窗口相对于屏幕左侧偏移量。默认值窗口居中 |
y 整数 (可选) | 窗口相对于屏幕顶端偏移量。默认值窗口居中 |
useContentSize boolean | (宽) 和 (高) 设置为web页面的尺寸。默认值 (false) |
center boolean | 窗口是否在屏幕居中。默认值 (false) |
minHeight 整数 | 窗口的最小高度。默认值 (0) |
maxWidth 整数 | 窗口的最大宽度。默认值不限 |
maxHeight 整数 | 窗口的最大高度。默认值不限 |
resizable boolean | 窗口大小是否可调整。默认值 (true) |
movable boolean (win/mac) | 窗口是否可移动。默认值 (true) |
minimizable boolean (win/mac) | 窗口是否可最小化。默认值 (true) |
maximizable boolean (win/mac) | 窗口是否最大化。默认值 (true) |
closable boolean (win/mac) | 窗口是否可关闭。默认值 (true) |
focusable boolean | 窗口是否可以聚焦. 默认值 (true)。在 Windows 中设置 (focusable: false) 也意味着设置了 (skipTaskbar: true) 在 Linux 中设置 (focusable: false) 时窗口停止与 wm 交互, 并且窗口将始终置顶 |
alwaysOnTop boolean | 窗口是否永远在别的窗口的上面。默认值 (false) |
fullscreen boolean | 窗口是否全屏。为 (false) 时 macOS 上按钮将被隐藏或禁用。默认值 (false) |
fullscreenable boolean | 窗口是否可以进入全屏状态。macOS上,最大化/缩放按钮是否可用 默认值 (true) |
simpleFullscreen boolean (mac) | 在 macOS 上使用 pre-Lion 全屏。默认值 (false) |
skipTaskbar boolean (win/mac) | 是否在任务栏中显示窗口。默认值 (false) |
kiosk boolean | 窗口是否进入kiosk模式。默认值 (false) |
title string | 默认窗口标题 默认为 ("Electron") 。如果由 (loadURL()) 加载的HTML文件中含有标签 (<title>) ,此属性将被忽略 |
icon NativeImage/string | 窗口图标。在 Windows 上推荐使用 (ICO) 图标来获得最佳的视觉效果, 默认使用可执行文件的图标 |
show boolean | 窗口是否在创建时显示。默认值 (true) |
paintWhenInitiallyHidden boolean | 当 (show) 为 (false) 并且渲染器刚刚被创建时,它是否应激活。为了让 (document.visibilityState) 在 (show: false) 的情况下第一次加载时正确地工作,你应该把这个设置成 (false)。设置为 (false) 将会导致 (ready-to-show) 事件不触发。默认值 (true) |
frame boolean | 设置为 (false) 时可以创建一个无边框窗口,默认值 (true) |
parent BrowserWindow | 指定父窗口 默认值 (null) |
modal boolean | 当前是否为模态窗口。只有当窗口是子窗口时才起作用。默认值 (false) |
acceptFirstMouse boolean (mac) | 点击 非活动窗口是否会穿透到 web contents。默认值 (false) |
disableAutoHideCursor boolean | 是否在打字时隐藏光标。默认值 (false) |
autoHideMenuBar boolean | 自动隐藏菜单栏,除非按了_(Alt)_键。默认值 (false) |
enableLargerThanScreen boolean (mac) | 使窗口尺寸可大于屏幕的大小。其他操作系统默认允许大于屏幕的窗口。默认值 (false) |
backgroundColor string | 窗口背景色,格式为 Hex, RGB, RGBA, HSL, HSLA 或 CSS 命名颜色。如果 (transparent) 设置为 (true),则支持 #AARRGGBB 格式的透明。默认值 (#FFF)(白色) |
hasShadow boolean | 窗口是否有阴影. 默认值 (true) |
opacity number (win/mac) | 设置窗口的初始透明度,在 0.0(全透明)和 1.0(完全不透明)之间 。 目前仅在 Windows 和 macOS上实现。 |
darkTheme boolean | 强制窗口使用深色主题,只在部分GTK+3桌面环境下有效。 默认值 (false). |
transparent boolean | 使窗口 透明。 默认值 (false). 在Windows上,仅在无边框窗口下起作用。 |
type string | 窗口的类型, 默认为普通窗口. 更多信息见下文 |
visualEffectState string (mac) | 在 macOS 上指定外观应如何响应窗口活动状态。 必须与 (vibrancy) 属性一起使用。 可能的值有 |
visualEffectState.followWindow | 当窗口处于激活状态时,后台应自动显示为激活状态,当窗口处于非激活状态时,后台应自动显示为非激活状态。 默认为该值。 |
visualEffectState.active | 后台应一直显示为激活状态。 |
visualEffectState.inactive | 后台应一直显示为非激活状态。 |
titleBarStyle string (win/mac) | 窗口标题栏样式。默认值 (default) |
titleBarStyle.default | 分别返回 mac 或者 win 的标准标题栏 |
titleBarStyle.hidden | 在一个隐藏的标题栏和一个全尺寸大小的内容窗口中取得结果。 在 macOS 内, 窗口将一直拥有位于左上的标准窗口控制器 (“traffic lights”)。 在 Windows上,当与 (titleBarOverlay: true) 合并时,它将激活窗口控件叠加(详情请参阅 (titleBarOverlay)),否则将不会显示窗口控件。 |
titleBarStyle.hiddenInset (mac) | 隐藏标题栏,使用窗口边缘稍微小的红绿灯按钮替代。 |
titleBarStyle.customButtonsOnHover (mac) | 隐藏的标题栏的全尺寸的内容窗口, 红绿灯按钮在鼠标悬停在窗口左上方时显示。**注意:**此选项目前是实验性的。 |
trafficLightPosition Point (mac) | 在无边框窗口中设置灯绿灯按钮位置。 |
roundedCorners boolean (mac) | 无边框窗口在 macOS 上,是否应该有圆角。 默认值为 (true)。 属性设置为 (false) ,将阻止窗口是可全屏的。 |
fullscreenWindowTitle | titleBarStyle 设置为 (hiddenInset) 时,在 macOS 全屏模式下标题栏显示标题。默认值为 (false). |
thickFrame boolean | 对 Windows 上的无框窗口使用 (WS_THICKFRAME) 样式,会增加标准窗口框架。 设置为 (false) 时将移除窗口的阴影和动画. 默认值为 (true)。 |
vibrancy string (mac) | 为窗口添加一种类型的动态效果,仅 macOS。 可以是 (appearance-based),(light),(dark),(titlebar),(selection),(menu),(popover),(sidebar),(medium-light),(ultra-dark),(header),(sheet),(window),(hud),(fullscreen-ui),(tooltip),(content),(under-window) 或 (under-page)。 请注意 (appearance-based),(light),(dark),(medium-light) 和 (ultra-dark) 已弃用,在 macOS Catalina (10.15) 中已经移除。 |
zoomToPageWidth boolean (mac) | 在 macOS 上控制,当按住 option 点击工具栏绿色红绿灯按钮或点击窗口 > 放大菜单项的行为。 如果为 (true),窗口为将会缩放到适合宽度,若为 (false) 将会放大到屏幕宽度。 这也会影响,直接调用 (maximize()) 的行为。 默认值为 (false). |
tabbingIdentifier string (mac) | 选项卡组名称,允许在原生选择卡中打开窗口,macOS 10.12+ 支持。 Windows 中,有相同选项卡标识的将会组合在一起。 这会添加一个原生新增选项卡按钮到你窗口的选项卡栏,同时 (app) 和窗口允许接收 (new-window-for-tab) 事件。 |
webPreferences Object | 网页功能设置。 |
webPreferences.devTools boolean | 是否开启 DevTools. 如果设置为 (false), 则无法使用 (BrowserWindow.webContents.openDevTools ()) 打开 DevTools。 默认值为 (true)。 |
webPreferences.nodeIntegration boolean | 是否启用Node integration. 默认值为 (false). |
webPreferences.nodeIntegrationInWorker boolean | 是否在Web工作器中启用了Node集成. 默认值为 (false). 更多内容参见 多线程 |
webPreferences.nodeIntegrationInSubFrames boolean 实验性 | 是否允许在子页面(iframe)或子窗口(child window)中集成Node.js; 预先加载的脚本会被注入到每一个iframe,你可以用 (process.isMainFrame) 来判断当前是否处于主框架(main frame)中。 |
webPreferences.preload string | 在页面运行其他脚本之前预先加载指定的脚本 无论页面是否集成Node, 此脚本都可以访问所有Node API 脚本路径为文件的绝对路径。 当 node integration 关闭时, 预加载的脚本将从全局范围重新引入node的全局引用标志参考示例 |
webPreferences.sandbox boolean | 如果设置该参数, 沙箱的渲染器将与窗口关联, 使它与Chromium OS-level 的沙箱兼容, 并禁用 Node. js 引擎。 它与 (nodeIntegration) 的选项不同,且预加载脚本的 API 也有限制。更多详情 |
webPreferences.session | Session 设置页面的 session 而不是直接忽略 Session 对象, 也可用 (partition) 选项来代替,它接受一个 partition 字符串. 同时设置了_(session)_ 和 _(partition)_时, (session) 的优先级更高. 默认使用默认的 session. |
webPreferences.partition | string (optional) - 通过 session 的 partition 字符串来设置界面session. 如果 (partition) 以 (persist:)开头, 该页面将使用持续的 session,并在所有页面生效,且使用同一个(partition). 如果没有 (persist:) 前缀, 页面将使用 in-memory session. 通过分配相同的 (partition), 多个页可以共享同一会话。 默认使用默认的 session. |
webPreferences.zoomFactor number | 页面的默认缩放系数, (3.0) 表示 (300%)。 默认值为 (1.0). |
webPreferences.javascript boolean | 是否启用 JavaScript 支持。 默认值为 (true)。 |
webPreferences.webSecurity boolean | 当设置为 (false), 它将禁用同源策略 (通常用来测试网站), 如果此选项不是由开发者设置的,还会把 _(allowRunningInsecureContent)_设置为 (true). 默认值为 (true) |
webPreferences.allowRunningInsecureContent boolean | 允许一个 https 页面运行来自http url的JavaScript, CSS 或 plugins。 默认值为 (false) |
webPreferences.images boolean | 允许加载图片。 默认值为 (true) |
webPreferences.imageAnimationPolicy string | 指定如何运行图像动画 (比如: GIF等). 可以是 (animate), (animateOnce) 或 (noAnimation)。默认值为 (animate) |
webPreferences.textAreasAreResizable boolean | 允许调整 TextArea 元素大小。 默认值为 (true) |
webPreferences.webgl boolean | 启用 WebGL 支持。 默认值为 (true) |
webPreferences.plugins boolean | 是否应该启用插件。 默认值为 (false) |
webPreferences.experimentalFeatures boolean | 启用 Chromium 的实验功能。 默认值为 (false) |
webPreferences.scrollBounce boolean (mac) | 启用滚动回弹(橡皮筋)效果。 默认值为 (false) |
webPreferences.enableBlinkFeatures string | 以 (逗号) 分隔的需要启用的特性列表,譬如 (CSSVariables,KeyboardEventKey) 在 RuntimeEnabledFeatures.json5 文件中查看被支持的所有特性 |
webPreferences.disableBlinkFeatures string | 以 (,) 分隔的禁用特性列表, 如 (CSSVariables,KeyboardEventKey) 在 RuntimeEnabledFeatures.json5 文件中查看被支持的所有特性 |
defaultFontFamily Object | 为 font-family 设置默认字体 |
defaultFontFamily.standard string | 默认值为 (Times New Roman) |
defaultFontFamily.serif string | 默认值为 (Times New Roman) |
defaultFontFamily.sansSerif string | 默认值为 (Arial) |
defaultFontFamily.monospace string | 默认值为 (Courier New) |
defaultFontFamily.cursive string | 默认值为 (Script) |
defaultFontFamily.fantasy string | 默认值为 (Impact) |
defaultFontSize Integer | 默认值为 (16) |
defaultMonospaceFontSize Integer | 默认值为 (13) |
minimumFontSize Integer | 默认值为 (0) |
defaultEncoding string | 默认值为 (ISO-8859-1) |
backgroundThrottling boolean | 是否在页面成为背景时限制动画和计时器。 这也会影响到 Visibility API。默认值为 (true) |
offscreen boolean | 是否绘制和渲染可视区域外的窗口。默认值为 (false)。更多详情, 请参见 offscreen rendering tutorial |
contextIsolation boolean | 是否在独立 JavaScript 环境中运行 Electron API和指定的_(preload)_ 脚本。默认为 (true)。 (预加载)脚本所运行的上下文环境只能访问其自身专用的 (文档) 和全局 (窗口),其自身一系列内置的JavaScript ((Array), (Object), (JSON), 等等) 也是如此,这些对于已加载的内容都是不可见的。 Electron API 将只在_(预加载)脚本中可用,在已加载页面中不可用。 这个选项应被用于加载可能不被信任的远程内容时来确保加载的内容无法篡改(预加载)_脚本和任何正在使用的Electron api。 该选项使用的是与Chrome内容脚本相同的技术。你可以在开发者工具Console选项卡内顶部组合框中选择 'Electron Isolated Context'条目来访问这个上下文 |
webviewTag boolean | 是否启用 (<webview>) tag标签。默认值为 (false)。注意: 为 (< webview>) 配置的 (preload) 脚本在执行时将启用节点集成, 因此应确保远程或不受信任的内容无法创建恶意的 (preload) 脚本 。 可以使用 webContents 上的 (will-attach-webview) 事件对 (preload) 脚本进行剥离, 并验证或更改 (<webview>) 的初始设置 |
additionalArguments string[] | strin一个将被附加到当前应用程序的渲染器进程中_(process.argv)_的字符串列表。可用于将少量的数据传递到渲染器进程预加载脚本中。 |
safeDialogs boolean | 是否启用浏览器样式的持续对话框保护。 默认值为 (false) |
safeDialogsMessage string | 当持续对话框保护被触发时显示的消息。 如果没有定义,那么将使用缺省的消息。注意:当前缺省消息是英文,并没有本地化 |
disableDialogs boolean | 是否完全禁用对话框。 覆盖 (safeDialogs)。 默认值为 (false) |
navigateOnDragDrop boolean | 将文件或链接拖放到页面上时是否触发页面跳转。 默认值为 (false) |
autoplayPolicy string | 窗口中内容要使用的自动播放策略,值可以是 (no-user-gesture-required), (user-gesture-required), (document-user-activation-required)。默认为 (no-user-gesture-required) |
disableHtmlFullscreenWindowResize boolean | 是否阻止窗口在进入 HTML 全屏时调整大小。默认值为 (false) |
accessibleTitle string | 仅提供给如屏幕读取器等辅助工具的替代标题字符串。此字符串不直接对用户可见 |
spellcheck boolean | 是否启用内置拼写检查器。 默认值为 (true) |
enableWebSQL boolean | 是否启用 WebSQL api。 默认值为 (true) |
v8CacheOptions string | 强制 blink 使用 v8 代码缓存策略。 可接受的值为: |
v8CacheOptions.none | 禁用代码缓存 |
v8CacheOptions.code | 基于启发式代码缓存 |
v8CacheOptions.bypassHeatCheck | 绕过启发式代码缓存,但使用懒编译。 |
v8CacheOptions.bypassHeatCheckAndEagerCompile | 与上面相同,除了编译是及时的。 默认策略是 (code) |
enablePreferredSizeMode boolean | 是否启用首选大小模式。 首选大小是包含文档布局所需的最小大小--无需滚动。 启用该属性将导致在首选大小发生变化时,在 (WebContents) 上触发 (preferred-size-changed) 事件。默认值为 (false) |
titleBarOverlay Object/Boolean | 当在 macOS 使用无框窗口结合 (win.setWindowButtonVisibility(true)) 或使用 (titleBarStyle) 以便标准窗口控制 (在 macOS为 "traffic lights") 可见,此属性将启用 Window Controls Overlay JavaScript APIs 和 CSS Environment Variables。指定 (true) 将导致覆盖默认系统颜色。 默认值为 (false) |
color String (win) | 启用窗口控制时覆盖面的 CSS 颜色 默认是系统颜色 |
symbolColor String (win) | 启用时窗口控制中符号的 CSS 颜色 默认是系统颜色 |
height Integer (win/mac) | 标题栏和 Window Controls Overlay,以像素为单位。 默认值为系统高度 |
const { BrowserWindow } = require('electron')
@@ -1322,7 +1322,7 @@
:- :- page-title-updated
文档更改标题时触发 # close
在窗口要关闭的时候触发 # closed
在窗口关闭时触发 # session-end
(win)因为强制关机/重启/会话注销而导致窗口会话结束时触发 # unresponsive
网页变得未响应时触发 # responsive
未响应的页面变成响应时触发 # blur
当窗口失去焦点时触发 # focus
当窗口获得焦点时触发 # show
当窗口显示时触发 # hide
当窗口隐藏时触发 # ready-to-show
当页面已经渲染完成(还没有显示)窗口可以被显示时触发# maximize
窗口最大化时触发 # unmaximize
当窗口从最大化状态退出时触发 # minimize
窗口最小化时触发 # restore
当窗口从最小化状态恢复时触发 # will-resize
(mac/win)调整窗口大小前触发 # resize
调整窗口大小后触发 # resized
(mac/win)当窗口完成调整大小后触发一次 # will-move
(mac/win)窗口移动前触发 # move
窗口移动到新位置时触发 # moved
(mac/win)当窗口移动到新位置时触发一次 # enter-full-screen
窗口进入全屏状态时触发 # leave-full-screen
窗口离开全屏状态时触发 # enter-html-full-screen
窗口进入由HTML API 触发的全屏状态时触发 # leave-html-full-screen
窗口离开由HTML API触发的全屏状态时触发 # always-on-top-changed
设置或取消设置窗口总是在其他窗口的顶部显示时触发 # app-command
请求一个应用程序命令时触发 # scroll-touch-begin
(mac)滚轮事件阶段开始时触发 # scroll-touch-end
(mac)滚轮事件阶段结束时触发 # scroll-touch-edge
(mac)滚轮事件阶段到达元素边缘时触发 # swipe
三指滑动时触发 # rotate-gesture
(mac)在触控板旋转手势上触发 # sheet-begin
(mac)窗口打开sheet(工作表) 时触发 # sheet-end
(mac)窗口关闭sheet(工作表) 时触发 # new-window-for-tab
(mac)当点击了系统的新标签按钮时触发 # system-context-menu
(win)当系统上下文菜单在窗口上触发时触发 #
-
:- | :- |
---|---|
win.destroy() | 强制关闭窗口 # |
win.close() | 尝试关闭窗口 # |
win.focus() | 聚焦于窗口 # |
win.blur() | 取消窗口的聚焦 # |
win.isFocused() | 判断窗口是否聚焦 # |
win.isDestroyed() | 判断窗口是否被销毁 # |
win.show() | 显示并聚焦于窗口 # |
win.showInactive() | 显示但不聚焦于窗口 # |
win.hide() | 隐藏窗口 # |
win.isVisible() | 判断窗口是否可见 # |
win.isModal() | 判断是否为模态窗口 # |
win.maximize() | 最大化窗口 # |
win.unmaximize() | 取消窗口最大化 # |
win.isMaximized() | 判断窗口是否最大化 # |
win.minimize() | 最小化窗口 # |
win.restore() | 窗口最小化状态恢复到以前的状态 # |
win.isMinimized() | 判断窗口是否最小化 # |
win.setFullScreen(flag) | 设置窗口是否应处于全屏模式 # |
win.isFullScreen() | 窗口当前是否已全屏 # |
win.setSimpleFullScreen(flag) (mac) | 进入或离开简单的全屏模式 # |
win.isSimpleFullScreen() | 窗口是否为简单全屏模式(pre-Lion) # |
win.isNormal() | 窗口是否处于正常状态(未最大化,未最小化,不在全屏模式下) # |
win.setAspectRatio(aspectRatio[, extraSize]) | 为内容视图保持的宽高比 # |
win.setBackgroundColor(backgroundColor) | 颜色,格式为 Hex,RGB,RGBA,HSL,HSLA 或 CSS 命名颜色 # |
win.previewFile(path[, displayName]) (mac) | 要用 QuickLook 预览的文件的绝对路径 # |
win.closeFilePreview() (mac) | 关闭当前打开的 # |
win.setBounds(bounds[, animate]) | 重置窗口,并且移动窗口到指定的位置 # |
win.getBounds() | 表示窗口的 bounds # |
win.getBackgroundColor() | 格式获取窗口的背景色,格式为 Hex (#RRGGBB ) # |
win.setContentBounds(bounds[, animate]) | 调整窗口的工作区 (如网页) 的大小并将其移动到所提供的边界。 # |
win.getContentBounds() | 窗口客户端区域的 bounds 对象 # |
win.getNormalBounds() | 包含正常状态下的窗口大小 # |
win.setEnabled(enable) | 禁用或者启用窗口 # |
win.isEnabled() | 窗口是否启用 # |
win.setSize(width, height[, animate]) | 调整窗口的 width 和 height # |
win.getSize() | 包含窗口的宽度和高度 # |
win.setContentSize(width, height[, animate]) | 将窗口的工作区 (如网页) 的大小调整为 width 和 height # |
win.getContentSize() | 包含窗口的宽度和高度 # |
win.setMinimumSize(width, height) | 设置窗口最小化的 width 和 height # |
win.getMinimumSize() | 包含窗口最小化的宽度和高度 # |
win.setMaximumSize(width, height) | 设置窗口最大化的 width 和 height # |
win.getMaximumSize() | 包含窗口最大化的宽度和高度 # |
win.setResizable(resizable) | 设置用户是否可以手动调整窗口大小 # |
win.isResizable() | 用户是否可以手动调整窗口大小 # |
win.setMovable(movable) (mac/win) | 设置用户是否可以移动窗口 # |
win.isMovable() (mac/win) | 窗口是否可以被用户拖动,在 Linux 上总是返回 true # |
win.setMinimizable(minimizable) (mac/win) | 设置用户是否可以手动将窗口最小化 # |
win.isMinimizable() (mac/win) | 用户是否可以手动最小化窗口 # |
win.setMaximizable(maximizable) (mac/win) | 设置用户是否可以手动最大化窗口 # |
win.isMaximizable() (mac/win) | 窗口是否可以最大化 # |
win.setFullScreenable(fullscreenable) | 设置最大化/缩放窗口按钮是切换全屏模式还是最大化窗口 # |
win.isFullScreenable() | 最大化/缩放窗口按钮是切换全屏模式还是最大化窗口 # |
win.setClosable(closable) (mac/win) | 设置用户是否可以手动关闭窗口。 在Linux上不起作用 # |
win.isClosable() (mac/win) | 窗口是否被用户关闭了 # |
win.setAlwaysOnTop(flag[, level][, relativeLevel]) | 设置窗口是否应始终显示在其他窗口的前面 # |
win.isAlwaysOnTop() | 当前窗口是否始终在其它窗口之前 # |
win.moveAbove(mediaSourceId) | 将窗口按z轴顺序移动到源窗口前面 # |
win.moveTop() | 无论焦点如何, 将窗口移至顶端(z轴上的顺序) # |
win.center() | 将窗口移动到屏幕中央 # |
win.setPosition(x, y[, animate]) | 将窗口移动到 x 和 y # |
win.getPosition() | 返回一个包含当前窗口位置的数组 # |
win.setTitle(title) | 将原生窗口的标题更改为 title # |
win.getTitle() | 网页的标题可以与原生窗口的标题不同 # |
win.setSheetOffset(offsetY[, offsetX]) (mac/win) | 改变macOS上sheet组件的附着点,默认情况下,sheet贴在窗口边框正下方 # |
win.flashFrame(flag) | 启动或停止闪烁窗口, 以吸引用户的注意 # |
win.setSkipTaskbar(skip) (mac/win) | 使窗口不显示在任务栏中 # |
win.setKiosk(flag) | 进入或离开 kiosk 模式 # |
win.isKiosk() | 判断窗口是否处于kiosk模式 # |
win.isTabletMode() (win) | 此 API 返回 窗口是否在平板电脑模式下,并且 调整大小 事件可以用于监听对平板模式的更改 # |
win.getMediaSourceId() | DesktopCapturerSource 的 id 格式的窗口 id # |
win.getNativeWindowHandle() | 窗口的平台特定句柄 # |
win.hookWindowMessage(message, callback) (win) | 钩住窗口消息。 当消息到达 WndProc 时调用 callback # |
win.isWindowMessageHooked(message) (win) | 返回 boolean - true 或false,具体取决于是否钩挂了消息 # |
win.unhookWindowMessage(message) (win) | 取消窗口信息的钩子 # |
win.unhookAllWindowMessages() (win) | 取消所有窗口信息的钩子 # |
win.setRepresentedFilename(filename) (mac) | 设置窗口所代表的文件的路径名,并且将这个文件的图标放在窗口标题栏上 # |
win.getRepresentedFilename() (mac) | 获取窗口当前文件路径 # |
win.setDocumentEdited(edited) (mac) | 明确指出窗口文档是否可以编辑,如果设置为true则将标题栏的图标变成灰色 # |
win.isDocumentEdited() (mac) | 判断当前窗口文档是否可编辑 # |
win.focusOnWebView() | # |
win.blurWebView() | # |
win.capturePage([rect]) | 在 rect 内捕获页面的快照 # |
win.loadURL(url[, options]) | 加载页面 # |
win.loadFile(filePath[, options]) | 加载页面 # |
win.reload() | 与 webContents.reload 相同 # |
win.setMenu(menu) (win/linux) | 将 menu 设置为窗口的菜单栏 # |
win.removeMenu() (win) | 删除窗口的菜单栏 # |
win.setProgressBar(progress[, options]) | 设置进度条的进度值 # |
win.setOverlayIcon(overlay, description) (win) | 设置进度条的进度值。 有效范围为 [0, 1.0] # |
win.setHasShadow(hasShadow) | 设置窗口是否有阴影 # |
win.hasShadow() | 判断窗口是否有阴影 # |
win.setOpacity(opacity) (win/mac) | 设置窗口的不透明度。 在Linux上不起作用。 超出界限的数值被限制在 [0, 1] 范围内 # |
win.getOpacity() | 介于 0.0 (完全透明) 和 1.0 (完全不透明) 之间。在Linux上,始终返回 1 # |
win.setShape(rects) (win/linux) | 对窗口形状的设置决定了窗口内系统允许绘制与用户交互的区域 # |
win.setThumbarButtons(buttons) (win) | 将指定的一组按钮添加到菜单栏的缩图工具栏上 # |
win.setThumbnailClip(region) (win) | 将窗口的区域设置为在任务栏中悬停在窗口上方时显示的缩略图图像 # |
win.setThumbnailToolTip(toolTip) (win) | 设置在任务栏中悬停在窗口缩略图上时显示的工具提示 # |
win.setAppDetails(options) (win) | 设置窗口任务栏按钮的属性 # |
win.showDefinitionForSelection() (mac) | 和 webContents.showDefinitionForSelection() 相同 # |
win.setIcon(icon) (win/linux) | 设置窗口图标 # |
win.setWindowButtonVisibility(visible) (mac) | 设置是否窗口交通灯需要显示 # |
win.setAutoHideMenuBar(hide) (win/linux) | 设置窗口菜单栏是否自动隐藏 # |
win.isMenuBarAutoHide() (win/linux) | 判断窗口的菜单栏是否自动隐藏 # |
win.setMenuBarVisibility(visible) (win/linux) | 设置菜单栏是否可见 # |
win.isMenuBarVisible() (win/linux) | 判断窗口的菜单栏是否可见 # |
win.setVisibleOnAllWorkspaces(visible[, options]) (mac/linux) | 设置窗口是否在所有工作空间上可见 # |
win.isVisibleOnAllWorkspaces() (mac/linux) | 判断窗口是否在所有工作空间上可见 # |
win.setIgnoreMouseEvents(ignore[, options]) | 忽略窗口内的所有鼠标事件 # |
win.setContentProtection(enable) (mac/linux) | 防止窗口内容被其他应用捕获 # |
win.setFocusable(focusable) (mac/linux) | 设置窗口是否可聚焦 # |
win.isFocusable() (mac/linux) | 返回当前窗口是否可以作为焦点被选中 # |
win.setParentWindow(parent) | 设置 parent 为当前窗口的父窗口 # |
win.getParentWindow() | 返回 BrowserWindow/null - 如果没有父窗口则为 null # |
win.getChildWindows() | 返回 BrowserWindow[] - 首页的子窗口 # |
win.setAutoHideCursor(autoHide) (mac) | 设置输入时是否隐藏光标 # |
win.selectPreviousTab() (mac) | 当启用本地选项卡,并且窗口中有另一个标签时,选择上一个选项卡 # |
win.selectNextTab() (mac) | 当启用本地选项卡,并且窗口中有另一个标签时,选择下一个选项卡 # |
win.mergeAllWindows() (mac) | 当启用本地选项卡并且存在多个打开窗口时,将所有窗口合并到一个带有多个选项卡的窗口中 # |
win.moveTabToNewWindow() (mac) | 如果启用了本机选项卡并且当前窗口中有多个选项卡,则将当前选项卡移动到新窗口中 # |
win.toggleTabBar() (mac) | 如果启用了本机选项卡并且当前窗口中只有一个选项卡,则切换选项卡栏是否可见 # |
win.addTabbedWindow(browserWindow) (mac) | 在该窗口中添加一个窗口作为选项卡,位于窗口实例的选项卡之后 # |
win.setVibrancy(type) (mac) | 在浏览器窗口中添加一个动态特效。 传递 null 或空字符串将会移除窗口上的动态效果 # |
win.setTrafficLightPosition(position) (mac) | 在无框窗口中设置自定义控制按钮的位置 # |
win.getTrafficLightPosition() (mac) | 在无框窗口中自定义控制按钮的位置 # |
win.setTouchBar(touchBar) (mac) | 设置窗口的触摸条布局 设置为 null 或undefined将清除触摸条 # |
win.setBrowserView(browserView) (实验) | # |
win.getBrowserView() (实验功能) | # |
win.addBrowserView(browserView) (实验功能) | # |
win.removeBrowserView(browserView) (实验功能) | # |
win.setTopBrowserView(browserView) (实验功能) | # |
win.getBrowserViews() (实验功能) | # |
win.setTitleBarOverlay(options) (win) | 在已开启 Window Controls Overlay 的窗口上,此方法将更新标题栏叠加层的样式 # |
const { BrowserWindow } = require('electron')
// 本例中 `win` 是我们的实例
@@ -1997,7 +1997,7 @@
:- :- win.webContents
此窗口拥有的 WebContents 对象 # win.id
代表了窗口的唯一ID # win.autoHideMenuBar
决定窗口菜单栏是否自动隐藏 # win.simpleFullScreen
决定窗口是否处于简单(pre-Lion) 全屏模式 # win.fullScreen
决定窗口是否处于全屏模式 # win.focusable
确定窗口是否可作为焦点被选中的属性 # win.visibleOnAllWorkspaces
决定窗口是否在所有工作区中可见 # win.shadow
决定窗口是否显示阴影 # win.menuBarVisible
决定菜单栏是否可见 # win.kiosk
决定窗口是否处于kiosk模式 # win.documentEdited
指明窗口文档是否已被编辑 # win.representedFilename
确定窗口代表的文件的路径名 # win.title
用于确定原生窗口的标题 # win.minimizable
决定窗口是否可被用户手动最小化 # win.maximizable
决定窗口是否可被用户手动最大化 # win.fullScreenable
决定是切换全屏模式还是最大化窗口 # win.resizable
决定窗口是否可被用户手动调整大小 # win.closable
决定窗口是否可被用户手动关闭 # win.movable
决定窗口是否可被用户移动 # win.excludedFromShownWindowsMenu
决定窗口是否从 Windows 菜单排除 # win.accessibleTitle
定义一个仅为辅助工具提供的替代标题 #
-
让我们开始将您的开发提高到光速。
ul>li*5
<ul>
<li></li>
@@ -59,7 +59,7 @@
<li></li>
</ul>
-nav>ul>li
<nav>
<ul>
@@ -67,7 +67,7 @@
</ul>
</nav>
-p[title="Hello world"]
<p title="Hello world"></p>
@@ -78,14 +78,14 @@
[a='value1' b="value2"]
<div a="value1" b="value2"></div>
-
a{Click me}
<a href="">Click me</a>
p>{Click }+a{here}+{ 继续}
<p>Click <a href="">here</a> 继续</p>
-#header
<div id="header"></div>
@@ -99,7 +99,7 @@
p.class1.class2.class3
<p class="class1 class2 class3"></p>
-
.class
<div class="class"></div>
@@ -119,13 +119,13 @@
</tr>
</table>
-div+p+bq
<div></div>
<p></p>
<blockquote></blockquote>
-ul>li.item$*3
<ul>
@@ -160,7 +160,7 @@
<li class="item4"></li>
</ul>
-div+div>p>span+em^bq
<div></div>
<div>
@@ -175,7 +175,7 @@
</div>
<blockquote></blockquote>
-div>(header>ul>li*2>a)+footer>p
<div>
<header>
@@ -206,8 +206,8 @@
<p></p>
</footer>
-!
或者 html:5
<!DOCTYPE html>
<html lang="en">
@@ -414,7 +414,7 @@
input:email 别名 inp[type=email]
<input type="email" name="" id="" />
-
input:url 别名 inp[type=url]
<input type="url" name="" id="" />
@@ -614,7 +614,7 @@
det 别名 details
<details></details>
-cmd Alias of command
<command />
@@ -836,8 +836,8 @@ Alias of command
${child}
<!--<![endif]-->
-:- | :- |
---|---|
pos | position:relative; |
pos:s | position:static; |
pos:a | position:absolute; |
pos:r | position:relative; |
pos:f | position:fixed; |
t | top:; |
t:a | top:auto; |
r | right:; |
r:a | right:auto; |
b | bottom:; |
b:a | bottom:auto; |
l | left:; |
l:a | left:auto; |
z | z-index:; |
z:a | z-index:auto; |
fl | float:left; |
fl:n | float:none; |
fl:l | float:left; |
fl:r | float:right; |
cl | clear:both; |
cl:n | clear:none; |
cl:l | clear:left; |
cl:r | clear:right; |
cl:b | clear:both; |
d | display:block; |
d:n | display:none; |
d:b | display:block; |
d:f | display:flex; |
d:if | display:inline-flex; |
d:i | display:inline; |
d:ib | display:inline-block; |
d:li | display:list-item; |
d:ri | display:run-in; |
d:cp | display:compact; |
d:tb | display:table; |
d:itb | display:inline-table; |
d:tbcp | display:table-caption; |
d:tbcl | display:table-column; |
d:tbclg | display:table-column-group; |
d:tbhg | display:table-header-group; |
d:tbfg | display:table-footer-group; |
d:tbr | display:table-row; |
d:tbrg | display:table-row-group; |
d:tbc | display:table-cell; |
d:rb | display:ruby; |
d:rbb | display:ruby-base; |
d:rbbg | display:ruby-base-group; |
d:rbt | display:ruby-text; |
d:rbtg | display:ruby-text-group; |
v | visibility:hidden; |
v:v | visibility:visible; |
v:h | visibility:hidden; |
v:c | visibility:collapse; |
ov | overflow:hidden; |
ov:v | overflow:visible; |
ov:h | overflow:hidden; |
ov:s | overflow:scroll; |
ov:a | overflow:auto; |
ovx | overflow-x:hidden; |
ovx:v | overflow-x:visible; |
ovx:h | overflow-x:hidden; |
ovx:s | overflow-x:scroll; |
ovx:a | overflow-x:auto; |
ovy | overflow-y:hidden; |
ovy:v | overflow-y:visible; |
ovy:h | overflow-y:hidden; |
ovy:s | overflow-y:scroll; |
ovy:a | overflow-y:auto; |
ovs | overflow-style:scrollbar; |
ovs:a | overflow-style:auto; |
ovs:s | overflow-style:scrollbar; |
ovs:p | overflow-style:panner; |
ovs:m | overflow-style:move; |
ovs:mq | overflow-style:marquee; |
zoo, zm | zoom:1; |
cp | clip:; |
cp:a | clip:auto; |
cp:r | clip:rect(top right bottom left); |
rsz | resize:; |
rsz:n | resize:none; |
rsz:b | resize:both; |
rsz:h | resize:horizontal; |
rsz:v | resize:vertical; |
cur | cursor:${pointer}; |
cur:a | cursor:auto; |
cur:d | cursor:default; |
cur:c | cursor:crosshair; |
cur:ha | cursor:hand; |
cur:he | cursor:help; |
cur:m | cursor:move; |
cur:p | cursor:pointer; |
cur:t | cursor:text; |
:- | :- |
---|---|
m | margin:; |
m:a | margin:auto; |
mt | margin-top:; |
mt:a | margin-top:auto; |
mr | margin-right:; |
mr:a | margin-right:auto; |
mb | margin-bottom:; |
mb:a | margin-bottom:auto; |
ml | margin-left:; |
ml:a | margin-left:auto; |
p | padding:; |
pt | padding-top:; |
pr | padding-right:; |
pb | padding-bottom:; |
pl | padding-left:; |
:- | :- |
---|---|
bxz | box-sizing:border-box; |
bxz:cb | box-sizing:content-box; |
bxz:bb | box-sizing:border-box; |
bxsh | box-shadow:inset hoff voff blur color; |
bxsh:r | box-shadow:inset hoff voff blur spread rgb(0, 0, 0); |
bxsh:ra | box-shadow:inset h v blur spread rgba(0, 0, 0, .5); |
bxsh:n | box-shadow:none; |
w | width:; |
w:a | width:auto; |
h | height:; |
h:a | height:auto; |
maw | max-width:; |
maw:n | max-width:none; |
mah | max-height:; |
mah:n | max-height:none; |
miw | min-width:; |
mih | min-height:; |
:- | :- |
---|---|
f | font:; |
f+ | font:1em Arial,sans-serif; |
fw | font-weight:; |
fw:n | font-weight:normal; |
fw:b | font-weight:bold; |
fw:br | font-weight:bolder; |
fw:lr | font-weight:lighter; |
fs | font-style:${italic}; |
fs:n | font-style:normal; |
fs:i | font-style:italic; |
fs:o | font-style:oblique; |
fv | font-variant:; |
fv:n | font-variant:normal; |
fv:sc | font-variant:small-caps; |
fz | font-size:; |
fza | font-size-adjust:; |
fza:n | font-size-adjust:none; |
ff | font-family:; |
ff:s | font-family:serif; |
ff:ss | font-family:sans-serif; |
ff:c | font-family:cursive; |
ff:f | font-family:fantasy; |
ff:m | font-family:monospace; |
ff:a | font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; |
ff:t | font-family: "Times New Roman", Times, Baskerville, Georgia, serif; |
ff:v | font-family: Verdana, Geneva, sans-serif; |
fef | font-effect:; |
fef:n | font-effect:none; |
fef:eg | font-effect:engrave; |
fef:eb | font-effect:emboss; |
fef:o | font-effect:outline; |
fem | font-emphasize:; |
femp | font-emphasize-position:; |
femp:b | font-emphasize-position:before; |
femp:a | font-emphasize-position:after; |
fems | font-emphasize-style:; |
fems:n | font-emphasize-style:none; |
fems:ac | font-emphasize-style:accent; |
fems:dt | font-emphasize-style:dot; |
fems:c | font-emphasize-style:circle; |
fems:ds | font-emphasize-style:disc; |
fsm | font-smooth:; |
fsm:a | font-smooth:auto; |
fsm:n | font-smooth:never; |
fsm:aw | font-smooth:always; |
fst | font-stretch:; |
fst:n | font-stretch:normal; |
fst:uc | font-stretch:ultra-condensed; |
fst:ec | font-stretch:extra-condensed; |
fst:c | font-stretch:condensed; |
fst:sc | font-stretch:semi-condensed; |
fst:se | font-stretch:semi-expanded; |
fst:e | font-stretch:expanded; |
fst:ee | font-stretch:extra-expanded; |
fst:ue | font-stretch:ultra-expanded; |
:- | :- |
---|---|
bg | background:#000; |
bg+ | background:#fff url() 0 0 no-repeat; |
bg:n | background:none; |
bgc | background-color:#fff; |
bgc:t | background-color:transparent; |
bgi | background-image:url(); |
bgi:n | background-image:none; |
bgr | background-repeat:; |
bgr:n | background-repeat:no-repeat; |
bgr:x | background-repeat:repeat-x; |
bgr:y | background-repeat:repeat-y; |
bgr:sp | background-repeat:space; |
bgr:rd | background-repeat:round; |
bga | background-attachment:; |
bga:f | background-attachment:fixed; |
bga:s | background-attachment:scroll; |
bgp | background-position:0 0; |
bgpx | background-position-x:; |
bgpy | background-position-y:; |
bgbk | background-break:; |
bgbk:bb | background-break:bounding-box; |
bgbk:eb | background-break:each-box; |
bgbk:c | background-break:continuous; |
bgcp | background-clip:padding-box; |
bgcp:bb | background-clip:border-box; |
bgcp:pb | background-clip:padding-box; |
bgcp:cb | background-clip:content-box; |
bgcp:nc | background-clip:no-clip; |
bgo | background-origin:; |
bgo:pb | background-origin:padding-box; |
bgo:bb | background-origin:border-box; |
bgo:cb | background-origin:content-box; |
bgsz | background-size:; |
bgsz:a | background-size:auto; |
bgsz:ct | background-size:contain; |
bgsz:cv | background-size:cover; |
:- | :- |
---|---|
lis | list-style:; |
lis:n | list-style:none; |
lisp | list-style-position:; |
lisp:i | list-style-position:inside; |
lisp:o | list-style-position:outside; |
list | list-style-type:; |
list:n | list-style-type:none; |
list:d | list-style-type:disc; |
list:c | list-style-type:circle; |
list:s | list-style-type:square; |
list:dc | list-style-type:decimal; |
list:dclz | list-style-type:decimal-leading-zero; |
list:lr | list-style-type:lower-roman; |
list:ur | list-style-type:upper-roman; |
lisi | list-style-image:; |
lisi:n | list-style-image:none; |
:- | :- |
---|---|
tbl | table-layout:; |
tbl:a | table-layout:auto; |
tbl:f | table-layout:fixed; |
cps | caption-side:; |
cps:t | caption-side:top; |
cps:b | caption-side:bottom; |
ec | empty-cells:; |
ec:s | empty-cells:show; |
ec:h | empty-cells:hide; |
:- | :- |
---|---|
c | color:#000; |
c:r | color:rgb(0, 0, 0); |
c:ra | color:rgba(0, 0, 0, .5); |
op | opacity:; |
:- | :- |
---|---|
va | vertical-align:top; |
va:sup | vertical-align:super; |
va:t | vertical-align:top; |
va:tt | vertical-align:text-top; |
va:m | vertical-align:middle; |
va:bl | vertical-align:baseline; |
va:b | vertical-align:bottom; |
va:tb | vertical-align:text-bottom; |
va:sub | vertical-align:sub; |
ta | text-align:left; |
ta:l | text-align:left; |
ta:c | text-align:center; |
ta:r | text-align:right; |
ta:j | text-align:justify; |
ta-lst | text-align-last:; |
tal:a | text-align-last:auto; |
tal:l | text-align-last:left; |
tal:c | text-align-last:center; |
tal:r | text-align-last:right; |
td | text-decoration:none; |
td:n | text-decoration:none; |
td:u | text-decoration:underline; |
td:o | text-decoration:overline; |
td:l | text-decoration:line-through; |
te | text-emphasis:; |
te:n | text-emphasis:none; |
te:ac | text-emphasis:accent; |
te:dt | text-emphasis:dot; |
te:c | text-emphasis:circle; |
te:ds | text-emphasis:disc; |
te:b | text-emphasis:before; |
te:a | text-emphasis:after; |
th | text-height:; |
th:a | text-height:auto; |
th:f | text-height:font-size; |
th:t | text-height:text-size; |
th:m | text-height:max-size; |
ti | text-indent:; |
ti:- | text-indent:-9999px; |
tj | text-justify:; |
tj:a | text-justify:auto; |
tj:iw | text-justify:inter-word; |
tj:ii | text-justify:inter-ideograph; |
tj:ic | text-justify:inter-cluster; |
tj:d | text-justify:distribute; |
tj:k | text-justify:kashida; |
tj:t | text-justify:tibetan; |
to | text-outline:; |
to+ | text-outline:0 0 #000; |
to:n | text-outline:none; |
tr | text-replace:; |
tr:n | text-replace:none; |
tt | text-transform:uppercase; |
tt:n | text-transform:none; |
tt:c | text-transform:capitalize; |
tt:u | text-transform:uppercase; |
tt:l | text-transform:lowercase; |
tw | text-wrap:; |
tw:n | text-wrap:normal; |
tw:no | text-wrap:none; |
tw:u | text-wrap:unrestricted; |
tw:s | text-wrap:suppress; |
tsh | text-shadow:hoff voff blur #000; |
tsh:r | text-shadow:h v blur rgb(0, 0, 0); |
tsh:ra | text-shadow:h v blur rgba(0, 0, 0, .5); |
tsh+ | text-shadow:0 0 0 #000; |
tsh:n | text-shadow:none; |
lh | line-height:; |
lts | letter-spacing:; |
lts-n | letter-spacing:normal; |
whs | white-space:; |
whs:n | white-space:normal; |
whs:p | white-space:pre; |
whs:nw | white-space:nowrap; |
whs:pw | white-space:pre-wrap; |
whs:pl | white-space:pre-line; |
whsc | white-space-collapse:; |
whsc:n | white-space-collapse:normal; |
whsc:k | white-space-collapse:keep-all; |
whsc:l | white-space-collapse:loose; |
whsc:bs | white-space-collapse:break-strict; |
whsc:ba | white-space-collapse:break-all; |
wob | word-break:; |
wob:n | word-break:normal; |
wob:k | word-break:keep-all; |
wob:ba | word-break:break-all; |
wos | word-spacing:; |
wow | word-wrap:; |
wow:nm | word-wrap:normal; |
wow:n | word-wrap:none; |
wow:u | word-wrap:unrestricted; |
wow:s | word-wrap:suppress; |
wow:b | word-wrap:break-word; |
:- | :- |
---|---|
bd | border:; |
bd+ | border:1px solid #000; |
bd:n | border:none; |
bdbk | border-break:close; |
bdbk:c | border-break:close; |
bdcl | border-collapse:; |
bdcl:c | border-collapse:collapse; |
bdcl:s | border-collapse:separate; |
bdc | border-color:#000; |
bdc:t | border-color:transparent; |
bdi | border-image:url(); |
bdi:n | border-image:none; |
bdti | border-top-image:url(); |
bdti:n | border-top-image:none; |
bdri | border-right-image:url(); |
bdri:n | border-right-image:none; |
bdbi | border-bottom-image:url(); |
bdbi:n | border-bottom-image:none; |
bdli | border-left-image:url(); |
bdli:n | border-left-image:none; |
bdci | border-corner-image:url(); |
bdci:n | border-corner-image:none; |
bdci:c | border-corner-image:continue; |
bdtli | border-top-left-image:url(); |
bdtli:n | border-top-left-image:none; |
bdtli:c | border-top-left-image:continue; |
bdtri | border-top-right-image:url(); |
bdtri:n | border-top-right-image:none; |
bdtri:c | border-top-right-image:continue; |
bdbri | border-bottom-right-image:url(); |
bdbri:n | border-bottom-right-image:none; |
bdbri:c | border-bottom-right-image:continue; |
bdbli | border-bottom-left-image:url(); |
bdbli:n | border-bottom-left-image:none; |
bdbli:c | border-bottom-left-image:continue; |
bdf | border-fit:repeat; |
bdf:c | border-fit:clip; |
bdf:r | border-fit:repeat; |
bdf:sc | border-fit:scale; |
bdf:st | border-fit:stretch; |
bdf:ow | border-fit:overwrite; |
bdf:of | border-fit:overflow; |
bdf:sp | border-fit:space; |
bdlen | border-length:; |
bdlen:a | border-length:auto; |
bdsp | border-spacing:; |
bds | border-style:; |
bds:n | border-style:none; |
bds:h | border-style:hidden; |
bds:dt | border-style:dotted; |
bds:ds | border-style:dashed; |
bds:s | border-style:solid; |
bds:db | border-style:double; |
bds:dtds | border-style:dot-dash; |
bds:dtdtds | border-style:dot-dot-dash; |
bds:w | border-style:wave; |
bds:g | border-style:groove; |
bds:r | border-style:ridge; |
bds:i | border-style:inset; |
bds:o | border-style:outset; |
bdw | border-width:; |
bdt, bt | border-top:; |
bdt+ | border-top:1px solid #000; |
bdt:n | border-top:none; |
bdtw | border-top-width:; |
bdts | border-top-style:; |
bdts:n | border-top-style:none; |
bdtc | border-top-color:#000; |
bdtc:t | border-top-color:transparent; |
bdr, br | border-right:; |
bdr+ | border-right:1px solid #000; |
bdr:n | border-right:none; |
bdrw | border-right-width:; |
bdrst | border-right-style:; |
bdrst:n | border-right-style:none; |
bdrc | border-right-color:#000; |
bdrc:t | border-right-color:transparent; |
bdb, bb | border-bottom:; |
bdb+ | border-bottom:1px solid #000; |
bdb:n | border-bottom:none; |
bdbw | border-bottom-width:; |
bdbs | border-bottom-style:; |
bdbs:n | border-bottom-style:none; |
bdbc | border-bottom-color:#000; |
bdbc:t | border-bottom-color:transparent; |
bdl, bl | border-left:; |
bdl+ | border-left:1px solid #000; |
bdl:n | border-left:none; |
bdlw | border-left-width:; |
bdls | border-left-style:; |
bdls:n | border-left-style:none; |
bdlc | border-left-color:#000; |
bdlc:t | border-left-color:transparent; |
bdrs | border-radius:; |
bdtrrs | border-top-right-radius:; |
bdtlrs | border-top-left-radius:; |
bdbrrs | border-bottom-right-radius:; |
bdblrs | border-bottom-left-radius:; |
:- | :- |
---|---|
cnt | content:''; |
cnt:n, ct:n | content:normal; |
cnt:oq, ct:oq | content:open-quote; |
cnt:noq, ct:noq | content:no-open-quote; |
cnt:cq, ct:cq | content:close-quote; |
cnt:ncq, ct:ncq | content:no-close-quote; |
cnt:a, ct:a | content:attr(); |
cnt:c, ct:c | content:counter(); |
cnt:cs, ct:cs | content:counters(); |
ct | content:; |
q | quotes:; |
q:n | quotes:none; |
q:ru | quotes:'\00AB' '\00BB' '\201E' '\201C'; |
q:en | quotes:'\201C' '\201D' '\2018' '\2019'; |
coi | counter-increment:; |
cor | counter-reset:; |
:- | :- |
---|---|
ol | outline:; |
ol:n | outline:none; |
olo | outline-offset:; |
olw | outline-width:; |
olw:tn | outline-width:thin; |
olw:m | outline-width:medium; |
olw:tc | outline-width:thick; |
ols | outline-style:; |
ols:n | outline-style:none; |
ols:dt | outline-style:dotted; |
ols:ds | outline-style:dashed; |
ols:s | outline-style:solid; |
ols:db | outline-style:double; |
ols:g | outline-style:groove; |
ols:r | outline-style:ridge; |
ols:i | outline-style:inset; |
ols:o | outline-style:outset; |
olc | outline-color:#000; |
olc:i | outline-color:invert; |
:- | :- |
---|---|
pgbb | page-break-before:; |
pgbb:au | page-break-before:auto; |
pgbb:al | page-break-before:always; |
pgbb:l | page-break-before:left; |
pgbb:r | page-break-before:right; |
pgbi | page-break-inside:; |
pgbi:au | page-break-inside:auto; |
pgbi:av | page-break-inside:avoid; |
pgba | page-break-after:; |
pgba:au | page-break-after:auto; |
pgba:al | page-break-after:always; |
pgba:l | page-break-after:left; |
pgba:r | page-break-after:right; |
orp | orphans:; |
wid | widows:; |
:- | :- |
---|---|
! | !important |
@font-face {
font-family:;
src:url(|);
}
-@font-face {
font-family: 'FontName';
src: url('FileName.eot');
@@ -2957,10 +2957,10 @@ Alias of command
font-weight: normal;
}
-@import url();
-@-webkit-keyframes identifier {
from { }
to { }
@@ -2978,12 +2978,12 @@ Alias of command
to { }
}
-@media screen {
}
-:- | :- |
---|---|
trf | transform:; |
trf:r | transform: rotate(angle); |
trf:rx | transform: rotateX(angle); |
trf:ry | transform: rotateY(angle); |
trf:rz | transform: rotateZ(angle); |
trf:sc | transform: scale(x, y); |
trf:sc3 | transform: scale3d(x, y, z); |
trf:scx | transform: scaleX(x); |
trf:scy | transform: scaleY(y); |
trf:scz | transform: scaleZ(z); |
trf:skx | transform: skewX(angle); |
trf:sky | transform: skewY(angle); |
trf:t | transform: translate(x, y); |
trf:t3 | transform: translate3d(tx, ty, tz); |
trf:tx | transform: translateX(x); |
trf:ty | transform: translateY(y); |
trf:tz | transform: translateZ(z); |
trfo | transform-origin:; |
trfs | transform-style:preserve-3d; |
:- | :- |
---|---|
ac | align-content:; |
ac:c | align-content:center; |
ac:fe | align-content:flex-end; |
ac:fs | align-content:flex-start; |
ac:s | align-content:stretch; |
ac:sa | align-content:space-around; |
ac:sb | align-content:space-between; |
ai | align-items:; |
ai:b | align-items:baseline; |
ai:c | align-items:center; |
ai:fe | align-items:flex-end; |
ai:fs | align-items:flex-start; |
ai:s | align-items:stretch; |
ap | appearance:${none}; |
as | align-self:; |
as:a | align-self:auto; |
as:b | align-self:baseline; |
as:c | align-self:center; |
as:fe | align-self:flex-end; |
as:fs | align-self:flex-start; |
as:s | align-self:stretch; |
bfv | backface-visibility:; |
bfv:h | backface-visibility:hidden; |
bfv:v | backface-visibility:visible; |
bg:ie | filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='x.png',sizingMethod='crop'); |
cm | /* ${child} */ |
colm | columns:; |
colmc | column-count:; |
colmf | column-fill:; |
colmg | column-gap:; |
colmr | column-rule:; |
colmrc | column-rule-color:; |
colmrs | column-rule-style:; |
colmrw | column-rule-width:; |
colms | column-span:; |
colmw | column-width:; |
d:ib+ | display: inline-block; *display: inline; *zoom: 1; |
jc | justify-content:; |
jc:c | justify-content:center; |
jc:fe | justify-content:flex-end; |
jc:fs | justify-content:flex-start; |
jc:sa | justify-content:space-around; |
jc:sb | justify-content:space-between; |
mar | max-resolution:res; |
mir | min-resolution:res; |
op+ | opacity: ; filter: alpha(opacity=); |
op:ie | filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100); |
op:ms | -ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)'; |
ord | order:; |
ori | orientation:; |
ori:l | orientation:landscape; |
ori:p | orientation:portrait; |
tov | text-overflow:${ellipsis}; |
tov:c | text-overflow:clip; |
tov:e | text-overflow:ellipsis; |
trs | transition:prop time; |
trsde | transition-delay:time; |
trsdu | transition-duration:time; |
trsp | transition-property:prop; |
trstf | transition-timing-function:tfunc; |
us | user-select:${none}; |
wfsm | -webkit-font-smoothing:${antialiased}; |
wfsm:a | -webkit-font-smoothing:antialiased; |
wfsm:n | -webkit-font-smoothing:none; |
wfsm:s, wfsm:sa | -webkit-font-smoothing:subpixel-antialiased; |
wm | writing-mode:lr-tb; |
wm:btl | writing-mode:bt-lr; |
wm:btr | writing-mode:bt-rl; |
wm:lrb | writing-mode:lr-bt; |
wm:lrt | writing-mode:lr-tb; |
wm:rlb | writing-mode:rl-bt; |
wm:rlt | writing-mode:rl-tb; |
wm:tbl | writing-mode:tb-lr; |
wm:tbr | writing-mode:tb-rl; |
:- | :- |
---|---|
anim | animation:; |
anim- | animation:name duration timing-function delay iteration-count direction fill-mode; |
animdel | animation-delay:time; |
animdir | animation-direction:normal; |
animdir:a | animation-direction:alternate; |
animdir:ar | animation-direction:alternate-reverse; |
animdir:n | animation-direction:normal; |
animdir:r | animation-direction:reverse; |
animdur | animation-duration:0s; |
animfm | animation-fill-mode:both; |
animfm:b | animation-fill-mode:backwards; |
animfm:bt, animfm:bh | animation-fill-mode:both; |
animfm:f | animation-fill-mode:forwards; |
animic | animation-iteration-count:1; |
animic:i | animation-iteration-count:infinite; |
animn | animation-name:none; |
animps | animation-play-state:running; |
animps:p | animation-play-state:paused; |
animps:r | animation-play-state:running; |
animtf | animation-timing-function:linear; |
animtf:cb | animation-timing-function:cubic-bezier(0.1, 0.7, 1.0, 0.1); |
animtf:e | animation-timing-function:ease; |
animtf:ei | animation-timing-function:ease-in; |
animtf:eio | animation-timing-function:ease-in-out; |
animtf:eo | animation-timing-function:ease-out; |
animtf:l | animation-timing-function:linear; |
:- | :- |
---|---|
fx | flex:; |
fxb | flex-basis:; |
fxd | flex-direction:; |
fxd:c | flex-direction:column; |
fxd:cr | flex-direction:column-reverse; |
fxd:r | flex-direction:row; |
fxd:rr | flex-direction:row-reverse; |
fxf | flex-flow:; |
fxg | flex-grow:; |
fxsh | flex-shrink:; |
fxw | flex-wrap: ; |
fxw:n | flex-wrap:nowrap; |
fxw:w | flex-wrap:wrap; |
fxw:wr | flex-wrap:wrap-reverse; |
tmatch, tm
<xsl:template match="" mode=""></xsl:template>
@@ -3606,7 +3606,7 @@ Alias of command
var
<xsl:variable name=""></xsl:variable>
-vare
<xsl:variable name="" select="" />
@@ -3650,7 +3650,7 @@ Alias of command
fall
<xsl:fallback></xsl:fallback>
-num
<xsl:number value="" />
@@ -3685,7 +3685,7 @@ Alias of command
!!!
<?xml version="1.0" encoding="UTF-8"?>
-有些表情符号代码不太容易记住,所以这里有一个小备忘单。
- | - |
---|---|
😄 | :smile: |
😆 | :laughing: |
😊 | :blush: |
😃 | :smiley: |
☺️ | :relaxed: |
😏 | :smirk: |
😍 | :heart_eyes: |
😘 | :kissing_heart: |
😚 | :kissing_closed_eyes: |
😳 | :flushed: |
😌 | :relieved: |
😆 | :satisfied: |
😁 | :grin: |
😉 | :wink: |
😜 | :stuck_out_tongue_winking_eye: |
😝 | :stuck_out_tongue_closed_eyes: |
😀 | :grinning: |
😗 | :kissing: |
😙 | :kissing_smiling_eyes: |
😛 | :stuck_out_tongue: |
😴 | :sleeping: |
😟 | :worried: |
😦 | :frowning: |
😧 | :anguished: |
😮 | :open_mouth: |
😬 | :grimacing: |
😕 | :confused: |
😯 | :hushed: |
😑 | :expressionless: |
😒 | :unamused: |
😅 | :sweat_smile: |
😓 | :sweat: |
😥 | :disappointed_relieved: |
😩 | :weary: |
😔 | :pensive: |
😞 | :disappointed: |
😖 | :confounded: |
😨 | :fearful: |
😰 | :cold_sweat: |
😣 | :persevere: |
😢 | :cry: |
😭 | :sob: |
😂 | :joy: |
😲 | :astonished: |
😱 | :scream: |
😫 | :tired_face: |
😠 | :angry: |
😡 | :rage: |
😤 | :triumph: |
😪 | :sleepy: |
😋 | :yum: |
😷 | :mask: |
😎 | :sunglasses: |
😵 | :dizzy_face: |
👿 | :imp: |
😈 | :smiling_imp: |
😐 | :neutral_face: |
😶 | :no_mouth: |
😇 | :innocent: |
👽 | :alien: |
💛 | :yellow_heart: |
💙 | :blue_heart: |
💜 | :purple_heart: |
❤️ | :heart: |
💚 | :green_heart: |
💔 | :broken_heart: |
💓 | :heartbeat: |
💗 | :heartpulse: |
💕 | :two_hearts: |
💞 | :revolving_hearts: |
💘 | :cupid: |
💖 | :sparkling_heart: |
✨ | :sparkles: |
⭐ | :star: |
🌟 | :star2: |
💫 | :dizzy: |
💥 | :boom: |
💥 | :collision: |
💢 | :anger: |
❗ | :exclamation: |
❓ | :question: |
❕ | :grey_exclamation: |
❔ | :grey_question: |
💤 | :zzz: |
💨 | :dash: |
💦 | :sweat_drops: |
🎶 | :notes: |
🎵 | :musical_note: |
🔥 | :fire: |
💩 | :hankey: |
💩 | :poop: |
💩 | :shit: |
👍 | :+1: |
👍 | :thumbsup: |
👎 | :-1: |
👎 | :thumbsdown: |
👌 | :ok_hand: |
👊 | :punch: |
👊 | :facepunch: |
✊ | :fist: |
✌️ | :v: |
👋 | :wave: |
✋ | :hand: |
✋ | :raised_hand: |
👐 | :open_hands: |
☝️ | :point_up: |
👇 | :point_down: |
👈 | :point_left: |
👉 | :point_right: |
🙌 | :raised_hands: |
🙏 | :pray: |
👆 | :point_up_2: |
👏 | :clap: |
💪 | :muscle: |
🤘 | :metal: |
🖕 | :fu: |
🏃 | :runner: |
🏃 | :running: |
👫 | :couple: |
👪 | :family: |
👬 | :two_men_holding_hands: |
👭 | :two_women_holding_hands: |
💃 | :dancer: |
👯 | :dancers: |
🙆♀️ | :ok_woman: |
🙅 | :no_good: |
💁 | :information_desk_person: |
🙋 | :raising_hand: |
👰♀️ | :bride_with_veil: |
🙇 | :bow: |
💏 | :couplekiss: |
💑 | :couple_with_heart: |
💆 | :massage: |
💇 | :haircut: |
💅 | :nail_care: |
👦 | :boy: |
👧 | :girl: |
👩 | :woman: |
👨 | :man: |
👶 | :baby: |
👵 | :older_woman: |
👴 | :older_man: |
👲 | :man_with_gua_pi_mao: |
👳♂️ | :man_with_turban: |
👷 | :construction_worker: |
👮 | :cop: |
👼 | :angel: |
👸 | :princess: |
😺 | :smiley_cat: |
😸 | :smile_cat: |
😻 | :heart_eyes_cat: |
😽 | :kissing_cat: |
😼 | :smirk_cat: |
🙀 | :scream_cat: |
😿 | :crying_cat_face: |
😹 | :joy_cat: |
😾 | :pouting_cat: |
👹 | :japanese_ogre: |
👺 | :japanese_goblin: |
🙈 | :see_no_evil: |
🙉 | :hear_no_evil: |
🙊 | :speak_no_evil: |
💂♂️ | :guardsman: |
💀 | :skull: |
🐾 | :feet: |
👄 | :lips: |
💋 | :kiss: |
💧 | :droplet: |
👂 | :ear: |
👀 | :eyes: |
👃 | :nose: |
👅 | :tongue: |
💌 | :love_letter: |
👤 | :bust_in_silhouette: |
👥 | :busts_in_silhouette: |
💬 | :speech_balloon: |
💭 | :thought_balloon: |
- | - |
---|---|
1️⃣ | :one: |
2️⃣ | :two: |
3️⃣ | :three: |
4️⃣ | :four: |
5️⃣ | :five: |
6️⃣ | :six: |
7️⃣ | :seven: |
8️⃣ | :eight: |
9️⃣ | :nine: |
🔟 | :keycap_ten: |
🔢 | :1234: |
0️⃣ | :zero: |
#️⃣ | :hash: |
🔣 | :symbols: |
◀️ | :arrow_backward: |
⬇️ | :arrow_down: |
▶️ | :arrow_forward: |
⬅️ | :arrow_left: |
🔠 | :capital_abcd: |
🔡 | :abcd: |
🔤 | :abc: |
↙️ | :arrow_lower_left: |
↘️ | :arrow_lower_right: |
➡️ | :arrow_right: |
⬆️ | :arrow_up: |
↖️ | :arrow_upper_left: |
↗️ | :arrow_upper_right: |
⏬ | :arrow_double_down: |
⏫ | :arrow_double_up: |
🔽 | :arrow_down_small: |
⤵️ | :arrow_heading_down: |
⤴️ | :arrow_heading_up: |
↩️ | :leftwards_arrow_with_hook: |
↪️ | :arrow_right_hook: |
↔️ | :left_right_arrow: |
↕️ | :arrow_up_down: |
🔼 | :arrow_up_small: |
🔃 | :arrows_clockwise: |
🔄 | :arrows_counterclockwise: |
⏪ | :rewind: |
⏩ | :fast_forward: |
ℹ️ | :information_source: |
🆗 | :ok: |
🔀 | :twisted_rightwards_arrows: |
🔁 | :repeat: |
🔂 | :repeat_one: |
🆕 | :new: |
🔝 | :top: |
🆙 | :up: |
🆒 | :cool: |
🆓 | :free: |
🆖 | :ng: |
🎦 | :cinema: |
🈁 | :koko: |
📶 | :signal_strength: |
🈵 | :u6e80: |
🈂️ | :sa: |
🚻 | :restroom: |
🚹 | :mens: |
🚺 | :womens: |
🚼 | :baby_symbol: |
🚭 | :no_smoking: |
🅿️ | :parking: |
♿ | :wheelchair: |
🚇 | :metro: |
🛄 | :baggage_claim: |
🉑 | :accept: |
🚾 | :wc: |
🚰 | :potable_water: |
🚮 | :put_litter_in_its_place: |
㊙️ | :secret: |
㊗️ | :congratulations: |
Ⓜ️ | :m: |
🛂 | :passport_control: |
🛅 | :left_luggage: |
🛃 | :customs: |
🉐 | :ideograph_advantage: |
🆑 | :cl: |
🆘 | :sos: |
🆔 | :id: |
🚫 | :no_entry_sign: |
🔞 | :underage: |
📵 | :no_mobile_phones: |
🚯 | :do_not_litter: |
🚱 | :non-potable_water: |
🚳 | :no_bicycles: |
🚷 | :no_pedestrians: |
🚸 | :children_crossing: |
⛔ | :no_entry: |
✳️ | :eight_spoked_asterisk: |
❇️ | :sparkle: |
✴️ | :eight_pointed_black_star: |
💟 | :heart_decoration: |
🆚 | :vs: |
📳 | :vibration_mode: |
📴 | :mobile_phone_off: |
💹 | :chart: |
💱 | :currency_exchange: |
♈ | :aries: |
♉ | :taurus: |
♊ | :gemini: |
♋ | :cancer: |
♌ | :leo: |
♍ | :virgo: |
♎ | :libra: |
♏ | :scorpius: |
♐ | :sagittarius: |
♑ | :capricorn: |
♒ | :aquarius: |
♓ | :pisces: |
⛎ | :ophiuchus: |
🔯 | :six_pointed_star: |
❎ | :negative_squared_cross_mark: |
🅰️ | :a: |
🅱️ | :b: |
🆎 | :ab: |
🅾️ | :o2: |
💠 | :diamond_shape_with_a_dot_inside: |
♻️ | :recycle: |
🔚 | :end: |
🔙 | :back: |
🔛 | :on: |
🔜 | :soon: |
🕐 | :clock1: |
🕜 | :clock130: |
🕙 | :clock10: |
🕥 | :clock1030: |
🕚 | :clock11: |
🕦 | :clock1130: |
🕛 | :clock12: |
🕧 | :clock1230: |
🕑 | :clock2: |
🕝 | :clock230: |
🕒 | :clock3: |
🕞 | :clock330: |
🕓 | :clock4: |
🕟 | :clock430: |
🕔 | :clock5: |
🕠 | :clock530: |
🕕 | :clock6: |
🕡 | :clock630: |
🕖 | :clock7: |
🕢 | :clock730: |
🕗 | :clock8: |
🕣 | :clock830: |
🕘 | :clock9: |
🕤 | :clock930: |
💲 | :heavy_dollar_sign: |
©️ | :copyright: |
®️ | :registered: |
™️ | :tm: |
❌ | :x: |
❗ | :heavy_exclamation_mark: |
‼️ | :bangbang: |
⁉️ | :interrobang: |
⭕ | :o: |
✖️ | :heavy_multiplication_x: |
➕ | :heavy_plus_sign: |
➖ | :heavy_minus_sign: |
➗ | :heavy_division_sign: |
💮 | :white_flower: |
💯 | :100: |
✔️ | :heavy_check_mark: |
☑️ | :ballot_box_with_check: |
🔘 | :radio_button: |
🔗 | :link: |
➰ | :curly_loop: |
〰️ | :wavy_dash: |
〽️ | :part_alternation_mark: |
🔱 | :trident: |
▪️ | :black_small_square: |
▫️ | :white_small_square: |
◾ | :black_medium_small_square: |
◽ | :white_medium_small_square: |
◼️ | :black_medium_square: |
◻️ | :white_medium_square: |
⬛ | :black_large_square: |
⬜ | :white_large_square: |
✅ | :white_check_mark: |
🔲 | :black_square_button: |
🔳 | :white_square_button: |
⚫ | :black_circle: |
⚪ | :white_circle: |
🔴 | :red_circle: |
🔵 | :large_blue_circle: |
🔷 | :large_blue_diamond: |
🔶 | :large_orange_diamond: |
🔹 | :small_blue_diamond: |
🔸 | :small_orange_diamond: |
🔺 | :small_red_triangle: |
🔻 | :small_red_triangle_down: |
- | - |
---|---|
🎍 | :bamboo: |
💝 | :gift_heart: |
🎎 | :dolls: |
🎒 | :school_satchel: |
🎓 | :mortar_board: |
🎏 | :flags: |
🎆 | :fireworks: |
🎇 | :sparkler: |
🎐 | :wind_chime: |
🎑 | :rice_scene: |
🎃 | :jack_o_lantern: |
👻 | :ghost: |
🎅 | :santa: |
🎄 | :christmas_tree: |
🎁 | :gift: |
🔔 | :bell: |
🔕 | :no_bell: |
🎋 | :tanabata_tree: |
🎉 | :tada: |
🎊 | :confetti_ball: |
🎈 | :balloon: |
🔮 | :crystal_ball: |
💿 | :cd: |
📀 | :dvd: |
💾 | :floppy_disk: |
📷 | :camera: |
📹 | :video_camera: |
🎥 | :movie_camera: |
💻 | :computer: |
📺 | :tv: |
📱 | :iphone: |
☎️ | :phone: |
☎️ | :telephone: |
📞 | :telephone_receiver: |
📟 | :pager: |
📠 | :fax: |
💽 | :minidisc: |
📼 | :vhs: |
🔉 | :sound: |
🔈 | :speaker: |
🔇 | :mute: |
📢 | :loudspeaker: |
📣 | :mega: |
⌛ | :hourglass: |
⏳ | :hourglass_flowing_sand: |
⏰ | :alarm_clock: |
⌚ | :watch: |
📻 | :radio: |
📡 | :satellite: |
➿ | :loop: |
🔍 | :mag: |
🔎 | :mag_right: |
🔓 | :unlock: |
🔒 | :lock: |
🔏 | :lock_with_ink_pen: |
🔐 | :closed_lock_with_key: |
🔑 | :key: |
💡 | :bulb: |
🔦 | :flashlight: |
🔆 | :high_brightness: |
🔅 | :low_brightness: |
🔌 | :electric_plug: |
🔋 | :battery: |
📲 | :calling: |
📧 | :email: |
📫 | :mailbox: |
📮 | :postbox: |
🛀 | :bath: |
🛁 | :bathtub: |
🚿 | :shower: |
🚽 | :toilet: |
🔧 | :wrench: |
🔩 | :nut_and_bolt: |
🔨 | :hammer: |
💺 | :seat: |
💰 | :moneybag: |
💴 | :yen: |
💵 | :dollar: |
💷 | :pound: |
💶 | :euro: |
💳 | :credit_card: |
💸 | :money_with_wings: |
📧 | :e-mail: |
📥 | :inbox_tray: |
📤 | :outbox_tray: |
✉️ | :envelope: |
📨 | :incoming_envelope: |
📯 | :postal_horn: |
📪 | :mailbox_closed: |
📬 | :mailbox_with_mail: |
📭 | :mailbox_with_no_mail: |
📦 | :package: |
🚪 | :door: |
🚬 | :smoking: |
💣 | :bomb: |
🔫 | :gun: |
🔪 | :hocho: |
💊 | :pill: |
💉 | :syringe: |
📄 | :page_facing_up: |
📃 | :page_with_curl: |
📑 | :bookmark_tabs: |
📊 | :bar_chart: |
📈 | :chart_with_upwards_trend: |
📉 | :chart_with_downwards_trend: |
📜 | :scroll: |
📋 | :clipboard: |
📆 | :calendar: |
📅 | :date: |
📇 | :card_index: |
📁 | :file_folder: |
📂 | :open_file_folder: |
✂️ | :scissors: |
📌 | :pushpin: |
📎 | :paperclip: |
✒️ | :black_nib: |
✏️ | :pencil2: |
📏 | :straight_ruler: |
📐 | :triangular_ruler: |
📕 | :closed_book: |
📗 | :green_book: |
📘 | :blue_book: |
📙 | :orange_book: |
📓 | :notebook: |
📔 | :notebook_with_decorative_cover: |
📒 | :ledger: |
📚 | :books: |
🔖 | :bookmark: |
📛 | :name_badge: |
🔬 | :microscope: |
🔭 | :telescope: |
📰 | :newspaper: |
🏈 | :football: |
🏀 | :basketball: |
⚽ | :soccer: |
⚾ | :baseball: |
🎾 | :tennis: |
🎱 | :8ball: |
🏉 | :rugby_football: |
🎳 | :bowling: |
⛳ | :golf: |
🚵 | :mountain_bicyclist: |
🚴 | :bicyclist: |
🏇 | :horse_racing: |
🏂 | :snowboarder: |
🏊 | :swimmer: |
🏄 | :surfer: |
🎿 | :ski: |
♠️ | :spades: |
♥️ | :hearts: |
♣️ | :clubs: |
♦️ | :diamonds: |
💎 | :gem: |
💍 | :ring: |
🏆 | :trophy: |
🎼 | :musical_score: |
🎹 | :musical_keyboard: |
🎻 | :violin: |
👾 | :space_invader: |
🎮 | :video_game: |
🃏 | :black_joker: |
🎴 | :flower_playing_cards: |
🎲 | :game_die: |
🎯 | :dart: |
🀄 | :mahjong: |
🎬 | :clapper: |
📝 | :memo: |
📝 | :pencil: |
📖 | :book: |
🎨 | :art: |
🎤 | :microphone: |
🎧 | :headphones: |
🎺 | :trumpet: |
🎷 | :saxophone: |
🎸 | :guitar: |
👞 | :shoe: |
👡 | :sandal: |
👠 | :high_heel: |
💄 | :lipstick: |
👢 | :boot: |
👕 | :shirt: |
👕 | :tshirt: |
👔 | :necktie: |
👚 | :womans_clothes: |
👗 | :dress: |
🎽 | :running_shirt_with_sash: |
👖 | :jeans: |
👘 | :kimono: |
👙 | :bikini: |
🎀 | :ribbon: |
🎩 | :tophat: |
👑 | :crown: |
👒 | :womans_hat: |
👞 | :mans_shoe: |
🌂 | :closed_umbrella: |
💼 | :briefcase: |
👜 | :handbag: |
👝 | :pouch: |
👛 | :purse: |
👓 | :eyeglasses: |
🎣 | :fishing_pole_and_fish: |
☕ | :coffee: |
🍵 | :tea: |
🍶 | :sake: |
🍼 | :baby_bottle: |
🍺 | :beer: |
🍻 | :beers: |
🍸 | :cocktail: |
🍹 | :tropical_drink: |
🍷 | :wine_glass: |
🍴 | :fork_and_knife: |
🍕 | :pizza: |
🍔 | :hamburger: |
🍟 | :fries: |
🍗 | :poultry_leg: |
🍖 | :meat_on_bone: |
🍝 | :spaghetti: |
🍛 | :curry: |
🍤 | :fried_shrimp: |
🍱 | :bento: |
🍣 | :sushi: |
🍥 | :fish_cake: |
🍙 | :rice_ball: |
🍘 | :rice_cracker: |
🍚 | :rice: |
🍜 | :ramen: |
🍲 | :stew: |
🍢 | :oden: |
🍡 | :dango: |
🥚 | :egg: |
🍞 | :bread: |
🍩 | :doughnut: |
🍮 | :custard: |
🍦 | :icecream: |
🍨 | :ice_cream: |
🍧 | :shaved_ice: |
🎂 | :birthday: |
🍰 | :cake: |
🍪 | :cookie: |
🍫 | :chocolate_bar: |
🍬 | :candy: |
🍭 | :lollipop: |
🍯 | :honey_pot: |
🍎 | :apple: |
🍏 | :green_apple: |
🍊 | :tangerine: |
🍋 | :lemon: |
🍒 | :cherries: |
🍇 | :grapes: |
🍉 | :watermelon: |
🍓 | :strawberry: |
🍑 | :peach: |
🍈 | :melon: |
🍌 | :banana: |
🍐 | :pear: |
🍍 | :pineapple: |
🍠 | :sweet_potato: |
🍆 | :eggplant: |
🍅 | :tomato: |
🌽 | :corn: |
- | - |
---|---|
🏠 | :house: |
🏡 | :house_with_garden: |
🏫 | :school: |
🏢 | :office: |
🏣 | :post_office: |
🏥 | :hospital: |
🏦 | :bank: |
🏪 | :convenience_store: |
🏩 | :love_hotel: |
🏨 | :hotel: |
💒 | :wedding: |
⛪ | :church: |
🏬 | :department_store: |
🏤 | :european_post_office: |
🌇 | :city_sunrise: |
🌆 | :city_sunset: |
🏯 | :japanese_castle: |
🏰 | :european_castle: |
⛺ | :tent: |
🏭 | :factory: |
🗼 | :tokyo_tower: |
🗾 | :japan: |
🗻 | :mount_fuji: |
🌄 | :sunrise_over_mountains: |
🌅 | :sunrise: |
🌠 | :stars: |
🗽 | :statue_of_liberty: |
🌉 | :bridge_at_night: |
🎠 | :carousel_horse: |
🌈 | :rainbow: |
🎡 | :ferris_wheel: |
⛲ | :fountain: |
🎢 | :roller_coaster: |
🚢 | :ship: |
🚤 | :speedboat: |
⛵ | :boat: |
⛵ | :sailboat: |
🚣 | :rowboat: |
⚓ | :anchor: |
🚀 | :rocket: |
✈️ | :airplane: |
🚁 | :helicopter: |
🚂 | :steam_locomotive: |
🚊 | :tram: |
🚞 | :mountain_railway: |
🚲 | :bike: |
🚡 | :aerial_tramway: |
🚟 | :suspension_railway: |
🚠 | :mountain_cableway: |
🚜 | :tractor: |
🚙 | :blue_car: |
🚘 | :oncoming_automobile: |
🚗 | :car: |
🚗 | :red_car: |
🚕 | :taxi: |
🚖 | :oncoming_taxi: |
🚛 | :articulated_lorry: |
🚌 | :bus: |
🚍 | :oncoming_bus: |
🚨 | :rotating_light: |
🚓 | :police_car: |
🚔 | :oncoming_police_car: |
🚒 | :fire_engine: |
🚑 | :ambulance: |
🚐 | :minibus: |
🚚 | :truck: |
🚋 | :train: |
🚉 | :station: |
🚆 | :train2: |
🚅 | :bullettrain_front: |
🚄 | :bullettrain_side: |
🚈 | :light_rail: |
🚝 | :monorail: |
🚃 | :railway_car: |
🚎 | :trolleybus: |
🎫 | :ticket: |
⛽ | :fuelpump: |
🚦 | :vertical_traffic_light: |
🚥 | :traffic_light: |
⚠️ | :warning: |
🚧 | :construction: |
🔰 | :beginner: |
🏧 | :atm: |
🎰 | :slot_machine: |
🚏 | :busstop: |
💈 | :barber: |
♨️ | :hotsprings: |
🏁 | :checkered_flag: |
🎌 | :crossed_flags: |
🏮 | :izakaya_lantern: |
🗿 | :moyai: |
🎪 | :circus_tent: |
🎭 | :performing_arts: |
📍 | :round_pushpin: |
🚩 | :triangular_flag_on_post: |
🇯🇵 | :jp: |
🇰🇷 | :kr: |
🇨🇳 | :cn: |
🇺🇸 | :us: |
🇫🇷 | :fr: |
🇪🇸 | :es: |
🇮🇹 | :it: |
🇷🇺 | :ru: |
🇬🇧 | :gb: |
🇬🇧 | :uk: |
🇩🇪 | :de: |
快速浏览 ES2015、ES2016、ES2017、ES2018 及以后的 JavaScript 新特性
+function fn () {
+ let x = 0
+ if (true) {
+ let x = 1 // 只在这个`if`里面
+ }
+}
+
+const a = 1
+
+let
是新的 var
。 常量(const
) 就像 let
一样工作,但不能重新分配。
+请参阅:Let 和 const
const message = `Hello ${name}`
+
+const str = `
+hello
+world
+`
+
+模板和多行字符串。 +请参阅:模板字符串
+let bin = 0b1010010
+let oct = 0o755
+
+请参阅:二进制和八进制文字
+const byte = 2 ** 8
+// 同: Math.pow(2, 8)
+
+"hello".repeat(3)
+"hello".includes("ll")
+"hello".startsWith("he")
+"hello".padStart(8) // " hello"
+"hello".padEnd(8) // "hello "
+"hello".padEnd(8, '!') // hello!!!
+"\u1E9B\u0323".normalize("NFC")
+
+Number.EPSILON
+Number.isInteger(Infinity) // false
+Number.isNaN("NaN") // false
+
+Math.acosh(3) // 1.762747174039086
+Math.hypot(3, 4) // 5
+Math.imul(Math.pow(2, 32) - 1, Math.pow(2, 32) - 2) // 2
+
+// 返回一个真实的数组
+Array.from(document.querySelectorAll("*"))
+// 类似于 new Array(...),但没有特殊的单参数行为
+Array.of(1, 2, 3)
+
+请参阅: 新方法
+class Circle extends Shape {
+
+ constructor (radius) {
+ this.radius = radius
+ }
+
+ getArea () {
+ return Math.PI * 2 * this.radius
+ }
+
+ expand (n) {
+ return super.expand(n) * Math.PI
+ }
+
+ static createFromDiameter(diameter) {
+ return new Circle(diameter / 2)
+ }
+}
+
+原型的语法糖。 +请参阅: 类
+new Promise((resolve, reject) => {
+ if (ok) { resolve(result) }
+ else { reject(error) }
+})
+
+用于异步编程。 +请参阅:Promises
+promise
+ .then((result) => { ··· })
+ .catch((error) => { ··· })
+
+promise
+ .then((result) => { ··· })
+ .catch((error) => { ··· })
+ .finally(() => {
+ /* 独立于成功/错误的逻辑 */
+ })
+
+当承诺被履行或被拒绝时,处理程序被调用
+Promise.all(···)
+Promise.race(···)
+Promise.reject(···)
+Promise.resolve(···)
+
+async function run () {
+ const user = await getUser()
+ const tweets = await getTweets(user)
+ return [user, tweets]
+}
+
+async
函数是使用函数的另一种方式。
+请参阅:异步函数
const [first, last] = ['Nikola', 'Tesla']
+
+let {title, author} = {
+ title: 'The Silkworm',
+ author: 'R. Galbraith'
+}
+
+支持匹配数组和对象。 +请参阅:解构
+const scores = [22, 33]
+const [math = 50, sci = 50, arts = 50] = scores
+
+// Result:
+// math === 22, sci === 33, arts === 50
+
+可以在解构数组或对象时分配默认值
+function greet({ name, greeting }) {
+ console.log(`${greeting}, ${name}!`)
+}
+
+greet({ name: 'Larry', greeting: 'Ahoy' })
+
+对象和数组的解构也可以在函数参数中完成
+function greet({ name = 'Rauno' } = {}) {
+ console.log(`Hi ${name}!`);
+}
+
+greet() // Hi Rauno!
+greet({ name: 'Larry' }) // Hi Larry!
+
+function printCoordinates({ left: x, top: y }) {
+ console.log(`x: ${x}, y: ${y}`)
+}
+
+printCoordinates({ left: 25, top: 90 })
+
+此示例将 x
分配给 left
键的值
for (let {title, artist} of songs) {
+ ···
+}
+
+赋值表达式也在循环中工作
+const { id, ...detail } = song;
+
+使用 rest(...)
运算符单独提取一些键和对象中的剩余键
const options = {
+ ...defaults,
+ visible: true
+}
+
+const options = Object.assign(
+ {}, defaults,
+ { visible: true })
+
+对象扩展运算符允许您从其他对象构建新对象。 +请参阅:对象传播
+const users = [
+ ...admins,
+ ...editors,
+ 'rstacruz'
+]
+
+const users = admins
+ .concat(editors)
+ .concat([ 'rstacruz' ])
+
+扩展运算符允许您以相同的方式构建新数组。 +请参阅:扩展运算符
+function greet (name = 'Jerry') {
+ return `Hello ${name}`
+}
+
+function fn(x, ...y) {
+ // y 是一个数组
+ return x * y.length
+}
+
+fn(...[1, 2, 3])
+// 与 fn(1, 2, 3) 相同
+
+Default(默认), rest, spread(扩展)。 +请参阅:函数参数
+setTimeout(() => {
+ ···
+})
+
+readFile('text.txt', (err, data) => {
+ ...
+})
+
+arr.map(n => n*2)
+// 没有花括号 = 隐式返回
+// 同: arr.map(function (n) { return n*2 })
+arr.map(n => ({
+ result: n*2
+}))
+// 隐式返回对象需要在对象周围加上括号
+
+类似函数,但保留了 this
。
+请参阅:箭头函数
function log(x, y = 'World') {
+ console.log(x, y);
+}
+
+log('Hello') // Hello World
+log('Hello', 'China') // Hello China
+log('Hello', '') // Hello
+
+function foo({x, y = 5} = {}) {
+ console.log(x, y);
+}
+
+foo() // undefined 5
+
+function foo() {}
+foo.name // "foo"
+
+module.exports = { hello, bye }
+
+同下:
+module.exports = {
+ hello: hello, bye: bye
+}
+
+请参阅:对象字面量增强
+const App = {
+ start () {
+ console.log('running')
+ }
+}
+// 同: App = { start: function () {···} }
+
+请参阅:对象文字增强
+const App = {
+ get closed () {
+ return this.status === 'closed'
+ },
+ set closed (value) {
+ this.status = value ? 'closed' : 'open'
+ }
+}
+
+请参阅:对象字面量增强
+let event = 'click'
+let handlers = {
+ [`on${event}`]: true
+}
+// 同: handlers = { 'onclick': true }
+
+请参阅:对象字面量增强
+const fatherJS = { age: 57, name: "张三" }
+Object.values(fatherJS)
+// [57, "张三"]
+Object.entries(fatherJS)
+// [["age", 57], ["name", "张三"]]
+
+import 'helpers'
+// 又名: require('···')
+
+import Express from 'express'
+// 又名: const Express = require('···').default || require('···')
+
+import { indent } from 'helpers'
+// 又名: const indent = require('···').indent
+
+import * as Helpers from 'helpers'
+// 又名: const Helpers = require('···')
+
+import { indentSpaces as indent } from 'helpers'
+// 又名: const indent = require('···').indentSpaces
+
+import
是新的 require()
。
+请参阅:Module imports
export default function () { ··· }
+// 又名: module.exports.default = ···
+
+export function mymethod () { ··· }
+// 又名: module.exports.mymethod = ···
+
+export const pi = 3.14159
+// 又名: module.exports.pi = ···
+
+const firstName = 'Michael';
+const lastName = 'Jackson';
+const year = 1958;
+export { firstName, lastName, year };
+
+export * from "lib/math";
+
+export
是新的module.exports
。
+请参阅:Module exports
as
关键字重命名import {
+ lastName as surname // 导入重命名
+} from './profile.js';
+
+function v1() { ... }
+function v2() { ... }
+
+export { v1 as default };
+// 等同于 export default v1;
+
+export {
+ v1 as streamV1, // 导出重命名
+ v2 as streamV2, // 导出重命名
+ v2 as streamLatestVersion // 导出重命名
+};
+
+button.addEventListener('click', event => {
+ import('./dialogBox.js')
+ .then(dialogBox => {
+ dialogBox.open();
+ })
+ .catch(error => {
+ /* Error handling */
+ })
+});
+
+ES2020提案 引入 import()
函数
const main = document.querySelector('main')
+
+import(`./modules/${someVariable}.js`)
+ .then(module => {
+ module.loadPageInto(main);
+ })
+ .catch(err => {
+ main.textContent = err.message;
+ });
+
+ES2020 为 import
命令添加了一个元属性 import.meta
,返回当前模块的元信息
new URL('data.txt', import.meta.url)
+
+Node.js 环境中,import.meta.url
返回的总是本地路径,即 file:URL
协议的字符串,比如 file:///home/user/foo.js
function* idMaker () {
+ let id = 0
+ while (true) { yield id++ }
+}
+
+let gen = idMaker()
+gen.next().value // → 0
+gen.next().value // → 1
+gen.next().value // → 2
+
+情况很复杂。 +请参阅:Generators
+let fibonacci = {
+ [Symbol.iterator]() {
+ let pre = 0, cur = 1;
+ return {
+ next() {
+ [pre, cur] = [cur, pre + cur];
+ return { done: false, value: cur }
+ }
+ }
+ }
+}
+
+for (var n of fibonacci) {
+ // 在 1000 处截断序列
+ if (n > 1000) break;
+ console.log(n);
+}
+
+用于迭代生成器和数组。 +请参阅:For..of iteration
+var gen = {};
+gen[Symbol.iterator] = function* () {
+ yield 1;
+ yield 2;
+ yield 3;
+};
+
+[...gen] // => [1, 2, 3]
+
+Generator
函数赋值给 Symbol.iterator
属性,从而使得 gen
对象具有了 Iterator
接口,可以被 ...
运算符遍历了
function* gen() { /* some code */ }
+var g = gen();
+
+g[Symbol.iterator]() === g // true
+
+gen
是一个 Generator
函数,调用它会生成一个遍历器对象g
。它的 Symbol.iterator
属性,也是一个遍历器对象生成函数,执行后返回它自己
这是用于 Node.js 的快速、不拘一格、极简主义的 Web 框架,包含 Express.js 的 API 参考列表和一些示例。
package.json
配置
@@ -70,7 +70,7 @@
Usage: express [options] [dir]
Options:
@@ -92,7 +92,7 @@
# 运行应用程序
$ DEBUG=myapp:* npm start
-var express = require('express')
var app = express()
@@ -167,7 +167,7 @@
console.dir(app.locals.email)
// => 'me@myapp.com'
-app.get('/', function (req, res) {
console.dir(res.headersSent) // false
res.send('OK')
console.dir(res.headersSent) // true
})
-:- | :- |
---|---|
res.append() | # |
res.attachment() | # |
res.cookie() | # |
res.clearCookie() | # |
res.download() | 提示要下载的文件 # |
res.end() | 结束响应过程 # |
res.format() | # |
res.get() | # |
res.json() | 发送 JSON 响应 # |
res.jsonp() | 发送带有 JSONP 支持的响应 # |
res.links() | # |
res.location() | # |
res.redirect() | 重定向请求 # |
res.render() | 渲染视图模板 # |
res.send() | 发送各种类型的响应 # |
res.sendFile() | 将文件作为八位字节流发送 # |
res.sendStatus() | # |
res.set() | # |
res.status() | # |
res.type() | # |
res.vary() | # |
为传递给此路由器的任何请求调用
router.use(function (req, res, next) {
@@ -563,45 +563,45 @@
// ..
})
-res
对象表示 Express
应用程序在收到 HTTP 请求时发送的 HTTP 响应
app.get('/user/:id', (req, res) => {
res.send('user ' + req.params.id)
})
-req
对象表示 HTTP
请求,并具有请求查询字符串、参数、正文、HTTP 标头等的属性
app.get('/user/:id', (req, res) => {
res.send('user ' + req.params.id)
})
-res.end()
res.status(404).end()
结束响应过程。这个方法其实来自 Node 核心,具体是 http.ServerResponse
的 response.end()
方法
res.json(null)
res.json({ user: 'tobi' })
res.status(500).json({ error: 'message' })
-app.all('/secret', function (req, res, next) {
console.log('访问秘密部分...')
next() // 将控制权传递给下一个处理程序
})
-app.delete('/', function (req, res) {
res.send('DELETE request to homepage')
})
-app.disable('trust proxy')
app.get('trust proxy')
// => false
-app.disabled('trust proxy')
// => true
@@ -609,19 +609,19 @@
app.disabled('trust proxy')
// => false
-var engines = require('consolidate')
app.engine('haml', engines.haml)
app.engine('html', engines.hogan)
-var express = require('express')
var app = express()
app.listen(3000)
-const express = require('express')
const app = express()
@@ -640,7 +640,7 @@
res.send('POST request to the homepage')
})
-function logOriginalUrl (req, res, next) {
console.log('ReqURL:', req.originalUrl)
next()
@@ -659,7 +659,7 @@
}
)
-app.set('view engine', 'pug')
在 views
目录下创建一个名为 index.pug
的 Pug
模板文件,内容如下
这是 Linux find 命令备忘清单的快速参考列表,包含常用选项和示例。
参数 | 示例 | 描述 |
---|---|---|
-type | find . -type d | 仅查找目录 |
-name | find . -type f -name "*.txt" | 按名称查找文件 |
-iname | find . -type f -iname "hello" | 按名称查找文件(不区分大小写) |
-size | find . -size +1G | 查找大于 1G 的文件 |
-user | find . -type d -user jack | 查找杰克的文件 |
-regex | find /var -regex '.*/tmp/.*[0-9]*.file' | 将正则表达式与查找一起使用 |
-maxdepth | find . -maxdepth 1 -name "a.txt" | 在当前目录和子目录中 |
-mindepth | find / -mindepth 3 -maxdepth 5 -name pass | 在子目录级别 2 和 4 之间 |
-type d | 目录 |
-type f | 文件 |
-type l | 符号链接 |
-type b | 缓冲块 |
-type c | 无缓冲字符 |
-type p | 命名管道 |
-type s | 插座 |
-size b | 512 字节块(默认) |
-size c | 字节 |
-size k | 千字节 |
-size M | 兆字节 |
-size G | 千兆字节 |
-size T | 太字节_(仅限 BSD)_ |
-size P | PB (仅 BSD) |
查找所有大于 10MB 的文件
$ find / -size +10M
@@ -198,7 +198,7 @@
$ find / -size +100M -size -1G
像往常一样,+
和 -
前缀表示大于和小于。
在当前目录中使用名称查找文件
$ find . -name tecmint.txt
@@ -217,7 +217,7 @@
查找目录下的所有php文件
$ find . -type f -name "*.php"
-查找权限为 777 的文件。
$ find . -type f -perm 0777 -print
@@ -236,7 +236,7 @@
查找可执行文件。
$ find / -perm /a=x
-根据用户查找单个文件
$ find / -user root -name tecmint.txt
@@ -249,24 +249,24 @@
查找用户的特定文件
$ find /home -user tecmint -iname "*.txt"
-$ find . -type f \( -name "*.sh" -o -name "*.txt" \)
查找带有 .sh
和 .txt
扩展名的文件
$ find /opt /usr /var -name foo.scala -type f
查找具有多个目录的文件
-$ find . -type d -empty
删除目录中的所有空文件
$ find . -type f -empty -delete
-Option | Description |
---|---|
atime | 访问时间(上次文件 |
mtime | 修改时间(上次文件 |
ctime | 更改时间(上次文件 |
Option | Description |
---|---|
-mtime +0 | 24 小时前修改 |
-mtime 0 | 从现在到 1 天前修改 |
-mtime -1 | 不到 1 天前修改(与 -mtime 0 相同) |
-mtime 1 | 24 至 48 小时前修改 |
-mtime +1 | 超过 48 小时前修改 |
-mtime +1w | 上次修改时间超过 1 周前 |
-atime 0 | 从现在到 24 小时前最后一次访问 |
-atime +0 | 访问时间超过 24 小时 |
-atime 1 | 在 24 至 48 小时前访问 |
-atime +1 | 访问时间超过 48 小时 |
-atime -1 | 不到 24 小时前访问过(与 -atime 0 相同) |
-ctime -6h30m | 文件状态在过去 6 小时 30 分钟内发生变化 |
查找最近 50 天修改的文件
$ find / -mtime 50
@@ -368,9 +368,9 @@
查找最近 1 小时内访问过的文件
$ find / -amin -60
-查找并删除多个文件
$ find . -type f -name "*.mp3" -exec rm -f {} \;
@@ -384,32 +384,32 @@
查找特定文件并删除
$ find / -type f -name *.mp3 -size +10m -exec rm {} \;
-
$ find ./ -type f -exec sed -i 's/find/replace/g' {} \;
$ find ./ -type f -readable -writable -exec sed -i "s/old/new/g" {} \;
参见:sed 命令
-$ find . -type f -name 'file*' -exec mv {} {}_renamed \;
$ find . -type f -name 'file*' -exec sh -c 'x="{}"; mv "$x" "${x}.bak"' \;
-$ find . -name '*.mp3' -exec mv {} /tmp/music \;
查找并将其移动到特定目录
-$ find . -name '*2020*.xml' -exec cp -r "{}" /tmp/backup \;
查找并将其复制到特定目录
-$ find download -type f -iname '*.csv' | xargs cat > merged.csv
$ find download -type f -name '*.gz' -exec cat {} \; > output
-$ find . -printf "%T+\t%p\n" | sort
$ find . -printf "%T+\t%p\n" | sort -r
-查找文件并将权限设置为 644。
$ find / -type f -perm 0777 -print -exec chmod 644 {} \;
@@ -417,7 +417,7 @@
查找目录并将权限设置为 755。
$ find / -type d -perm 777 -print -exec chmod 755 {} \;
-
$ find . -type f -name "*.java" | xargs tar cvf myfile.tar
$ find . -type f -name "*.java" | xargs tar rvf myfile.tar
@@ -434,8 +434,6 @@ function anchorPoint() {
Array.from(document.querySelectorAll('.h2wrap-body .wrap')).forEach((elm) => elm.classList.remove('active'))
if (elm?.tagName === 'H3') {
elm?.parentElement?.parentElement?.classList.add('active');
- const box = elm?.parentElement?.parentElement;
- console.log('elm:2', box, document.querySelectorAll('.h2wrap-body .wrap'))
}
}
anchorPoint();
@@ -446,7 +444,6 @@ function updateAnchor(element) {
tocanchor.classList.remove('is-active-link');
});
const anchor = element || document.querySelector(`a.tocs-link[href='${decodeURIComponent(window.location.hash)}']`);
- console.log('anchor', anchor)
if (anchor) {
anchor.classList.add('is-active-link');
}
diff --git a/docs/git.html b/docs/git.html
index ba72b2a5..60080f3c 100644
--- a/docs/git.html
+++ b/docs/git.html
@@ -34,15 +34,15 @@
document.documentElement.setAttribute('data-color-mode', mode);
localStorage.setItem(LOCAL_NANE, mode);
}
-本备忘单总结了常用的 Git 命令行指令,以供快速参考。
创建一个新的本地存储库
$ git init [project name]
@@ -52,7 +52,7 @@
将存储库克隆到指定目录
$ git clone git_url 指定目录
-在工作目录中显示修改后的文件,为您的下一次提交暂存
$ git status
@@ -84,7 +84,7 @@
在指定分支之前应用当前分支的任何提交
$ git rebase [branch]
-
设置将附加到您的提交和标签的名称
$ git config --global user.name "name"
@@ -97,7 +97,7 @@
在文本编辑器中编辑全局配置文件
$ git config --global --edit
-列出所有本地分支
$ git branch
@@ -120,7 +120,7 @@
标记当前提交
$ git tag my_tag
-显示当前活动分支的提交历史
$ git log
@@ -136,7 +136,7 @@
以人类可读的格式显示 Git 中的任何对象
$ git show [SHA]
-从该 Git 远程获取所有分支
$ git fetch [alias]
@@ -156,7 +156,7 @@
将另一个分支的一个特定提交合并到当前分支
$ git cherry-pick [commit_id]
-添加一个 git URL 作为别名
$ git remote add [alias] [url]
@@ -172,7 +172,7 @@
更改 git repo 的 URL
$ git remote set-url origin [git_url]
-保存已修改和分阶段的更改
$ git stash
@@ -185,7 +185,7 @@
丢弃存储堆栈顶部的更改
$ git stash drop
-从项目中删除文件并暂存删除以进行提交
$ git rm [file]
@@ -195,7 +195,7 @@
显示所有提交日志,并指示任何移动的路径
$ git log --stat -M
-/logs/*
# “!” 意思是不要忽视
!logs/.gitkeep
@@ -207,8 +207,8 @@
.sass-cache
.gitignore
文件指定了 Git 应该忽略的未跟踪的文件
new
$ git branch -m <new>
@@ -226,7 +226,7 @@
按内容搜索更改
$ git log -S'<a term in the source>'
@@ -237,7 +237,7 @@
$ git log --pretty=oneline --graph --decorate --all
-列出所有分支及其上游
$ git branch -vv
@@ -254,22 +254,22 @@
删除本地存在远程不存在的分支
git remote prune origin
-
$ git commit -v --amend
重写最后的提交信息
-git config core.fileMode false
不再将文件的权限变化视作改动
-$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
也可以看看:更多别名
-# 查看git 的设置
$ git config --get core.ignorecase
# 设置大小写敏感
@@ -277,7 +277,7 @@
# 远程有俩相同目录,通过这种方式清除掉,然后提交记录
$ git rm -r --cached <目录/文件>
-$ git rebase -i HEAD~3
# 表示要修改当前版本的倒数第三次状态
@@ -315,13 +315,13 @@
# 最后,确保没有人提交进行推送,最好不要加 -f 强制推送
$ git push -f origin master
-# 撤销一条记录
$ git reset --hard HEAD~1
# 强制同步到远程仓库
$ git push -f origin HEAD:master
-# 如果有的修改以及加入暂存区的话
$ git reset --hard
# 还原所有修改,不会删除新增的文件
@@ -329,19 +329,19 @@
# 下面命令会删除新增的文件
$ git clean -xdf
-$ git rev-parse HEAD # e10721cb8859b2c
# 获取短 hash
$ git rev-parse --short HEAD # e10721c
-$ git branch --merged master | grep -v '^\*\| master' | xargs -n 1 git branch -d
-$ git config --global core.quotepath false
-# 切换到 B 分支
$ git checkout <B>
# 将 A 分支 <hash-id> 的内容 pick 到 B 分支
@@ -360,8 +360,6 @@ function anchorPoint() {
Array.from(document.querySelectorAll('.h2wrap-body .wrap')).forEach((elm) => elm.classList.remove('active'))
if (elm?.tagName === 'H3') {
elm?.parentElement?.parentElement?.classList.add('active');
- const box = elm?.parentElement?.parentElement;
- console.log('elm:2', box, document.querySelectorAll('.h2wrap-body .wrap'))
}
}
anchorPoint();
@@ -372,7 +370,6 @@ function updateAnchor(element) {
tocanchor.classList.remove('is-active-link');
});
const anchor = element || document.querySelector(`a.tocs-link[href='${decodeURIComponent(window.location.hash)}']`);
- console.log('anchor', anchor)
if (anchor) {
anchor.classList.add('is-active-link');
}
diff --git a/docs/github-actions.html b/docs/github-actions.html
index 879fe8a1..46cac18d 100644
--- a/docs/github-actions.html
+++ b/docs/github-actions.html
@@ -34,7 +34,7 @@
document.documentElement.setAttribute('data-color-mode', mode);
localStorage.setItem(LOCAL_NANE, mode);
}
-
本备忘单总结了 Github Actions 常用的配置说明,以供快速参考。
GitHub Actions 的仓库中自动化、自定义和执行软件开发工作流程,有四个基本的概念,如下:
@@ -90,7 +90,7 @@name: GitHub Actions Demo
on:
push:
@@ -112,7 +112,7 @@
- run: npm run build
存放到 .github/workflows
目录中,命名为 ci.yml
,当 push
代码到仓库 main
分支中,该配置自动运行配置。
push
事件触发 workflow
on: push
@@ -144,7 +144,7 @@
release:
types: [published]
-jobs:
my_first_job: # 第一个任务
name: My first job
@@ -153,7 +153,7 @@
name: My second job
通过 jobs (jobs.<job_id>.name)
字段,配置一项或多项需要执行的任务
通过 needs (jobs.<job_id>.needs)
字段,指定当前任务的依赖关系
jobs:
job1:
@@ -163,7 +163,7 @@
needs: [job1, job2]
上面配置中,job1
必须先于 job2
完成,而 job3
等待 job1
和 job2
的完成才能运行。因此,这个 workflow
的运行顺序依次为:job1
、job2
、job3
jobs:
job1:
@@ -183,7 +183,7 @@
steps:
- run: echo ${{needs.job1.outputs.output1}} ${{needs.job1.outputs.output2}}
-每个步骤都可以指定以下三个字段
jobs.<job_id>.steps.name # 步骤名称
# 该步骤运行的命令或者 action
@@ -221,7 +221,7 @@
- run: npm install
- run: npm run build
-jobs.<job_id>.environment
使用单一环境名称的示例
@@ -232,14 +232,14 @@ name: production_environment url: https://github.com -GitHub
会保留 GITHUB_
环境变量前缀供 GitHub
内部使用。设置有 GITHUB_
前缀的环境变量或密码将导致错误。
- name: 测试 nodejs 获取环境变量
env:
API_TOKEN: ${{ secrets.API_TOKEN }}
在 https://github.com/<用户名>/<项目名称>/settings/secrets
中添加 secrets
API_TOKEN
,在工作流中设置环境变量 API_TOKEN
在 if
条件下使用表达式时,可以省略表达式语法 (${{ }}
),因为 GitHub 会自动将 if
条件作为表达式求值
steps:
- uses: actions/hello-world-action@v1.1
@@ -250,7 +250,7 @@
env:
MY_ENV_VAR: ${{ <expression> }}
-
( )
(逻辑分组)[ ]
(指数)||
(或者)属性名称 | 类型 | 描述 |
---|---|---|
github (object) | 工作流程中任何作业或步骤期间可用的顶层上下文。 | |
github.event (object) | 完整事件 web 挂钩有效负载。 更多信息请参阅“触发工作流程的事件”。 | |
github.event_path (string) | 运行器上完整事件 web 挂钩有效负载的路径。 | |
github.workflow (string) | 工作流程的名称。 如果工作流程文件未指定 name,此属性的值将是仓库中工作流程文件的完整路径。 | |
github.job (string) | 当前作业的 job_id。 | |
github.run_id (string) | 仓库中每个运行的唯一编号。 如果您重新执行工作流程运行,此编号不变。 | |
github.run_number (string) | 仓库中特定工作流程每个运行的唯一编号。 此编号从 1(对应于工作流程的第一个运行)开始,然后随着每个新的运行而递增。 如果您重新执行工作流程运行,此编号不变。 | |
github.actor (string) | 发起工作流程运行的用户的登录名。 | |
github.repository (string) | 所有者和仓库名称。 例如 Codertocat/Hello-World。 | |
github.repository_owner (string) | 仓库所有者的名称。 例如 Codertocat。 | |
github.event_name (string) | 触发工作流程运行的事件的名称。 | |
github.sha (string) | 触发工作流程的提交 SHA。 | |
github.ref (string) | 触发工作流程的分支或标记参考。 | |
github.head_ref (string) | 工作流程运行中拉取请求的 head_ref 或来源分支。 此属性仅在触发工作流程运行的事件为 pull_request 时才可用。 | |
github.base_ref (string) | 工作流程运行中拉取请求的 base_ref 或目标分支。 此属性仅在触发工作流程运行的事件为 pull_request 时才可用。 | |
github.token (string) | 代表仓库上安装的 GitHub 应用程序进行身份验证的令牌。 这在功能上等同于 GITHUB_TOKEN 密码。 更多信息请参阅“使用 GITHUB_TOKEN 验证身份”。 | |
github.workspace (string) | 使用 checkout 操作时步骤的默认工作目录和仓库的默认位置。 | |
github.action (string) | 正在运行的操作的名称。 在当前步骤运行脚本时,GitHub 删除特殊字符或使用名称 run。 如果在同一作业中多次使用相同的操作,则名称将包括带有序列号的后缀。 例如,运行的第一个脚本名称为 run1,则第二个脚本将命名为 run2。 同样,actions/checkout 第二次调用时将变成 actionscheckout2。 |
Github 上下文是访问有关工作流运行、运行器环境、作业和步骤的信息的一种方式
-环境变量 | 描述 |
---|---|
CI | 始终设置为 true |
HOME | 用于存储用户数据的 GitHub 主目录路径。 例如 /github/home |
GITHUB_WORKFLOW | 工作流程的名称。 |
GITHUB_RUN_ID | 仓库中每个运行的唯一编号。 如果您重新执行工作流程运行,此编号不变。 |
GITHUB_RUN_NUMBER | 仓库中特定工作流程每个运行的唯一编号。 此编号从 1(对应于工作流程的第一个运行)开始,然后随着每个新的运行而递增。 如果您重新执行工作流程运行,此编号不变。 |
GITHUB_ACTION | 操作唯一的标识符 (id)。 |
GITHUB_ACTIONS | 当 GitHub 操作 运行工作流程时,始终设置为 true。 您可以使用此变量来区分测试是在本地运行还是通过 GitHub 操作 运行。 |
GITHUB_ACTION_PATH | GitHub 操作所在的路径 |
GITHUB_ACTOR | 发起工作流程的个人或应用程序的名称。 例如 octocat |
GITHUB_API_URL | 返回 API URL 。例如:https://api.github.com |
GITHUB_REPOSITORY | 所有者和仓库名称。 例如 octocat/Hello-World |
GITHUB_EVENT_NAME | 触发工作流程的 web 挂钩事件的名称 |
GITHUB_EVENT_PATH | 具有完整 web 挂钩事件有效负载的文件路径。 例如 /github/workflow/event.json |
GITHUB_WORKSPACE | GitHub 工作空间目录路径。 如果您的工作流程使用 actions/checkout 操作,工作空间目录将包含存储仓库副本的子目录。 如果不使用 actions/checkout 操作,该目录将为空。 例如 /home |
GITHUB_SHA | 触发工作流程的提交 SHA。 例如 ffac537e6cbbf9 |
GITHUB_REF | 触发工作流程的分支或标记参考。 例如 refs/heads/feature-branch-1。 如果分支或标记都不适用于事件类型,则变量不会存在 |
GITHUB_HEAD_REF | 仅为复刻的仓库设置。头部仓库的分支 |
GITHUB_BASE_REF | 仅为复刻的仓库设置。基础仓库的分支 |
另见: 默认环境变量
-作为表达式的一部分,可以使用 boolean
, null
, number
或 string
数据类型
env:
@@ -469,7 +469,7 @@
myString: Mona the Octocat
myStringInBraces: ${{ 'It''s source!' }}
-startsWith('Hello world', 'He') // 返回 true
另见: 函数 startsWith,此函数不区分大小写
-format('{{Hello {0} {1} {2}!}}', 'Mona', 'the', 'Octocat')
// 返回 '{Hello Mona the Octocat!}'.
另见: 函数 format
-join(github.event.issue.labels.*.name, ', ')
// 也许返回 'bug, help wanted'.
另见: 函数 join
-toJSON(job)
// 也许返回 { "status": "Success" }.
另见: 函数 toJSON
-steps:
...
- name: The job has succeeded
if: ${{ success() }}
-steps:
...
- name: The job has failed
if: ${{ failure() }}
-- name: Test
run: |
@@ -561,14 +561,14 @@
echo "$VERSION"
-- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{secrets.GITHUB_TOKEN}}
publish_dir: ./build
-- name: Modify Version
shell: bash
run: |
@@ -581,7 +581,7 @@
with:
rename: '@wcj/github-package-test'
-- name: Checkout
uses: actions/checkout@v3
with:
@@ -596,7 +596,7 @@
# git submodule sync --recursive
# git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --remote --force --recursive --checkout ant.design
-使用 jobs.<job_id>.needs
识别在此作业运行之前必须成功完成的任何作业。它可以是一个字符串,也可以是字符串数组。 如果某个作业失败,则所有需要它的作业都会被跳过,除非这些作业使用让该作业继续的条件表达式。
jobs:
@@ -621,7 +621,7 @@
needs: [job1, job2]
在此示例中,job3
使用 always()
条件表达式,因此它始终在 job1
和 job2
完成后运行,不管它们是否成功。
- name: Sync to Gitee
run: |
@@ -636,7 +636,7 @@
mirror uiwjs uiw
-- run: npm publish --access public
env:
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
@@ -655,7 +655,7 @@
package: packages/data/package.json
它有个好处,检测 package.json
中版本号是否发生变更,来决定是否提交版本,不会引发流程错误。
Artifacts 是 GitHub Actions 为您提供持久文件并在运行完成后使用它们或在作业(文档)之间共享的一种方式。
要创建工件并使用它,您将需要不同的操作:上传和下载。 要上传文件或目录,您只需像这样使用它:
@@ -675,7 +675,7 @@ with: name: my-artifact -- name: Setup Node
uses: actions/setup-node@v2
with:
@@ -696,7 +696,7 @@
- run: npm run build --if-present
- run: npm test
-# https://www.basefactor.com/github-actions-docker
- name: Docker login
@@ -719,7 +719,7 @@
docker push ${{ secrets.DOCKER_USER }}/ant.design:$VERSION
docker push ${{ secrets.DOCKER_USER }}/ant.design:latest
-- name: Create Tag
id: create_tag
uses: jaywcjlove/create-tag-action@main
@@ -727,7 +727,7 @@
package-path: ./package.json
根据 package-path
指定的 package.json
检测 version
是否发生变化来创建 tag
- name: Generate Changelog
id: changelog
uses: jaywcjlove/changelog-generator@main
@@ -738,7 +738,7 @@
run: echo "${{ steps.changelog.outputs.changelog }}"
-- name: '登录到 GitHub 注册表'
run: echo ${{ github.token }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin
@@ -756,7 +756,7 @@
docker tag ghcr.io/jaywcjlove/reference:latest ghcr.io/jaywcjlove/reference:${{steps.changelog.outputs.version}}
docker push ghcr.io/jaywcjlove/reference:${{steps.changelog.outputs.version}}
-- name: 生成一个文件,并将它提交到 master 分支
run: |
@@ -783,7 +783,7 @@
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
-创建一个文件,然后将其作为构件上传
jobs:
example-job:
@@ -807,13 +807,13 @@
with:
name: output-log-file
-- name: Clean temp directory
run: rm -rf *
working-directory: ./temp
使用 working-directory
关键字,您可以指定运行命令的工作目录(./temp
)
jobs:
job1:
runs-on: ubuntu-latest
@@ -823,7 +823,7 @@
working-directory: scripts
作业中的所有 run
步骤提供默认的 shell
和 working-directory
使用 bash
运行脚本
steps:
- name: Display the path
@@ -839,7 +839,7 @@
shell: python
您可以使用 shell
关键字覆盖运行器操作系统中的默认 shell
设置
:- | :- |
---|---|
create-tag-action | 根据 package.json 创建 Tag / Release |
changelog-generator | 生成 changelog 日志 |
github-action-modify-file-content | 修改仓库文件内容 |
github-action-contributors | 生成贡献(contributors.svg)图片 |
generated-badges | 生成徽章(Badges)图片 |
coverage-badges-cli | 生成覆盖率徽章(Badges)图片 |
action-ejs | 基于 ejs 生成 HTML |
github-action-package | 修改 JSON 文件内容 |
markdown-to-html-cli | Markdown 转换成 HTML |
ncipollo/release-action | 创建 Release |
peaceiris/actions-gh-pages | 将文件或文件夹内容提交到 gh-pages 分支 |
该备忘单提供了帮助您使用 Golang 的基本语法和方法。
package main
import "fmt"
func main() {
@@ -51,7 +51,7 @@
Hello, world!
或者在 Go repl 中尝试一下
-var s1 string
s1 = "Learn Go!"
// 一次声明多个变量
@@ -64,7 +64,7 @@
d := true // bool
参见:基本类型
-package main
import "fmt"
// 程序的入口点
@@ -77,19 +77,19 @@
}
-// 单行注释
/* 这是
多行注释 */
-if true {
fmt.Println("Yes!")
}
参见:条件控制
-s1 := "Hello" + "World"
s2 := `A "raw" string literal
can include line breaks.`
@@ -99,7 +99,7 @@
fmt.Println(string(s1[0:5]))
字符串的类型为 字符串
num := 3 // int
num := 3. // float64
num := 3 + 4i // complex128
@@ -107,18 +107,18 @@
var u uint = 7 // uint (unsigned)
var p float32 = 22.7 // 32-bit float
-x := 5
x++
fmt.Println("x + 4 =", x + 4)
fmt.Println("x * 4 =", x * 4)
参见:更多操作符
-isTrue := true
isFalse := false
-fmt.Println(true && true) // true
fmt.Println(true && false) // false
fmt.Println(true || true) // true
@@ -126,7 +126,7 @@
fmt.Println(!true) // false
参见:更多操作符
-┌────┬────┬────┬────┬─────┬─────┐
| 2 | 3 | 5 | 7 | 11 | 13 |
@@ -148,7 +148,7 @@
fmt.Println(a[0], a[1]) //=> Hello World
fmt.Println(a) // => [Hello World]
-var twoDimension [2][3]int
for i := 0; i < 2; i++ {
for j := 0; j < 3; j++ {
@@ -158,7 +158,7 @@
// => 2d: [[0 1 2] [1 2 3]]
fmt.Println("2d: ", twoDimension)
-func main () {
b := *getPointer()
fmt.Println("Value is", b)
@@ -173,7 +173,7 @@
*a = 234
参见:指针(Pointers)
-s := make([]string, 3)
s[0] = "a"
s[1] = "b"
@@ -186,28 +186,28 @@
slice := []int{2, 3, 4}
另见:切片示例
-const s string = "constant"
const Phi = 1.618
const n = 500000000
const d = 3e20 / n
fmt.Println(d)
-i := 90
f := float64(i)
u := uint(i)
// 将等于字符Z
s := string(i)
-i := 90
// 需要导入“strconv”
s := strconv.Itoa(i)
fmt.Println(s) // Outputs: 90
-package main
import (
"fmt"
@@ -224,7 +224,7 @@
fmt.Println(string("hello"[1]))
}
-package main
import (
@@ -263,7 +263,7 @@
}
另见:fmt
-实例 | Result |
---|---|
Contains("test", "es") | true |
Count("test", "t") | 2 |
HasPrefix("test", "te") | true |
HasSuffix("test", "st") | true |
Index("test", "e") | 1 |
Join([]string{"a", "b"}, "-") | a-b |
Repeat("a", 5) | aaaaa |
Replace("foo", "o", "0", -1) | f00 |
Replace("foo", "o", "0", 1) | f0o |
Split("a-b-c-d-e", "-") | [a b c d e] |
ToLower("TEST") | test |
ToUpper("test") | TEST |
a := 10
if a > 20 {
fmt.Println(">")
@@ -333,7 +333,7 @@
fmt.Println("=")
}
-x := "hello go!"
if count := len(x); count > 0 {
fmt.Println("Yes")
@@ -344,7 +344,7 @@
fmt.Println("Uh oh")
}
-x := 42.0
switch x {
case 0:
@@ -359,12 +359,12 @@
}
参见:Switch
-for i := 0; i <= 10; i++ {
fmt.Println("i: ", i)
}
-nums := []int{2, 3, 4}
sum := 0
for _, num := range nums {
@@ -372,14 +372,14 @@
}
fmt.Println("sum:", sum)
-i := 1
for i <= 3 {
fmt.Println(i)
i++
}
-for i := 0; i <= 5; i++ {
if i % 2 == 0 {
continue
@@ -387,14 +387,14 @@
fmt.Println(i)
}
-for {
fmt.Println("loop")
break
}
-package main
import (
@@ -411,7 +411,7 @@
}
参见:结构(Structs)
-v := Vertex{X: 1, Y: 2}
// Field names can be omitted
v := Vertex{1, 2}
@@ -419,7 +419,7 @@
v := Vertex{X: 1}
您还可以输入字段名
-m := make(map[string]int)
m["k1"] = 7
@@ -435,13 +435,13 @@
n := map[string]int{"foo": 1, "bar": 2}
fmt.Println(n) // => map[bar:2 foo:1]
-v := &Vertex{1, 2}
v.X = 2
Doing v.X
is the same as doing (*v).X
, when v
is a pointer.
func plus(a int, b int) int {
return a + b
}
@@ -451,7 +451,7 @@
fmt.Println(plus(1, 2))
fmt.Println(plusPlus(1, 2, 3))
-func vals() (int, int) {
return 3, 7
}
@@ -459,7 +459,7 @@
fmt.Println(a) // => 3
fmt.Println(b) // => 7
-r1, r2 := func() (string, string) {
x := []string{"hello", "world"}
return x[0], x[1]
@@ -467,7 +467,7 @@
// => hello world
fmt.Println(r1, r2)
-func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
@@ -477,7 +477,7 @@
fmt.Println(x) // => 7
fmt.Println(y) // => 10
-func sum(nums ...int) {
fmt.Print(nums, " ")
total := 0
@@ -491,7 +491,7 @@
nums := []int{1, 2, 3, 4}
sum(nums...) // => [1 2 3 4] 10
-import --> const --> var --> init()
func main() {
// 将函数赋给名称
add := func(a, b int) int {
@@ -516,7 +516,7 @@
fmt.Println(add(3, 4)) // => 7
}
-func scope() func() int{
outer_var := 2
foo := func() int {return outer_var}
@@ -525,7 +525,7 @@
// Outpus: 2
fmt.Println(scope()())
-func outer() (func() int, int) {
outer_var := 2
inner := func() int {
@@ -539,20 +539,20 @@
fmt.Println(inner()) // => 200
fmt.Println(val) // => 101
-import "fmt"
import "math/rand"
-import (
"fmt" // 给 fmt.Println
"math/rand" // 给 rand.Intn
)
另见:导入
-import r "math/rand"
@@ -565,22 +565,22 @@
r.Intn()
-package main
// 一个内部包只能被另一个包导入
// 那是在以内部目录的父级为根的树内
package internal
另见:内部包
-// 以大写字母开头
func Hello () {
···
}
另见:导出的名称
-package main
import (
@@ -603,7 +603,7 @@
}
参见:Goroutines, Channels
-package main
import (
@@ -627,7 +627,7 @@
}
参见:WaitGroup
-ch <- 1
ch <- 2
ch <- 3
@@ -644,7 +644,7 @@
v, ok := <- ch
参见:范围和关闭
-ch := make(chan int, 2)
ch <- 1
ch <- 2
@@ -653,8 +653,8 @@
// 所有 goroutine 都处于休眠状态 - 死锁
参见:缓冲通道
-func main() {
defer func() {
fmt.Println("Done")
@@ -662,7 +662,7 @@
fmt.Println("Working...")
}
-func main() {
var d = int64(0)
defer func(d *int64) {
@@ -673,16 +673,16 @@
}
defer
函数使用当前值d
,除非我们使用指针在 main
末尾获取最终值
func main() {
defer fmt.Println("Done")
fmt.Println("Working...")
}
-type Shape interface {
Area() float64
Perimeter() float64
}
-type Rectangle struct {
Length, Width float64
}
结构 Rectangle
通过实现其所有方法隐式实现接口 Shape
func (r Rectangle) Area() float64 {
return r.Length * r.Width
}
@@ -729,15 +729,15 @@
}
在 Shape
中定义的方法在Rectangle
中实现
func main() {
var r Shape = Rectangle{Length: 3, Width: 4}
fmt.Printf("Type of r: %T, Area: %v, Perimeter: %v.", r, r.Area(), r.Perimeter())
}
-+ | & | += | &= | && | == | != | ( | ) |
- | | | -= | |= | || | < | <= | [ | ] |
* | ^ | *= | ^= | <- | > | >= | { | } |
/ | << | /= | <<= | ++ | = | := | , | ; |
% | >> | %= | >>= | -- | ! | ... | . | : |
&^ | &^= |
本备忘单旨在快速提醒使用命令行程序 grep 所涉及的主要概念,并假设您已经了解其用法。
搜索标准输出(即文本流)
$ grep [options] search_string
@@ -55,7 +55,7 @@
$ grep 'mellon' myfile.txt
文件名中接受通配符。
-
选项 | 示例 | 说明 |
---|---|---|
-i | grep -i ^DA demo.txt | 忘记区分大小写 |
-w | grep -w "of" demo.txt | 仅搜索完整的单词 |
-A | grep -A 3 'Exception' error.log | 匹配字符串后显示 3 行 |
-B | grep -B 4 'Exception' error.log | 在匹配字符串前显示 4 行 |
-C | grep -C 5 'Exception' error.log | 在匹配字符串周围显示 5 行 |
-r | grep -r 'github.io' /var/log/nginx/ | 递归搜索 (在子目录内) |
-v | grep -v 'warning' /var/log/syslog | 返回所有与模式不匹配的行 |
-e | grep -e '^al' filename | 使用正则表达式 (以'al'开头的行) |
-E | grep -E 'ja(s|cks)on' filename | 扩展正则表达式 (包含 jason 或 jackson 的行) |
-c | grep -c 'error' /var/log/syslog | 计算匹配数 |
-l | grep -l 'robot' /var/log/* | 打印匹配文件的名称 |
-o | grep -o search_string filename | 只显示字符串的匹配部分 |
-n | grep -n "go" demo.txt | 显示匹配的行号 |
有关更复杂的要求,请参阅完整版的正则表达式备忘单。
-:- | :- |
---|---|
. | 任何字符 |
? | 可选且只能出现一次 |
* | 可选的,可以多次出现 |
+ | 必需并且可以多次出现 |
:- | :- |
---|---|
{n} | 前一项恰好出现 n 次 |
{n,} | 上一个项目出现 n 次或更多 |
{,m} | 上一个项目最多出现 n 次 |
{n,m} | 上一项出现在 n 到 m 次之间 |
:- | :- |
---|---|
[:alpha:] | 任何大小写字母 |
[:digit:] | 任何数字 |
[:alnum:] | 任何大小写字母或数字 |
[:space:] | 任何空格 |
:- | :- |
---|---|
[A-Za-z] | 任何大小写字母 |
[0-9] | 任何数字 |
[0-9A-Za-z] | 任何大小写字母或数字 |
:- | :- |
---|---|
^ | 行的开头 |
$ | 行结束 |
^$ | 空行 |
\< | 词的开头 |
\> | 词尾 |
history | grep git
输入过 git
命令的记录
grep -l "text" file1 file2 file3...
-grep "text" . -r -n
.
表示当前目录。
# 目录中所有的 .php 和 .html 文件中
# 递归搜索字符 "main()"
@@ -299,7 +299,7 @@
# 在搜索结果中排除 filelist 文件列表里的文件
grep "main()" . -r --exclude-from filelist
-grep "text" -n file_name
# 或
@@ -308,14 +308,14 @@
#多个文件
grep "text" -n file_1 file_2
-echo "hello world" | grep -i "HELLO"
# hello
-grep -c "text" file_name
-Homebrew 是 macOS(或Linux)缺少的包管理器,备忘清单包含 brew 命令的使用与安装
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
@@ -60,7 +60,7 @@
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
-brew switch git 2.5.0 | 更改版本 |
---|---|
brew list --versions git | 看看你有什么版本 |
命令 | 说明 |
---|---|
brew info git | 列出版本、注意事项等 |
brew cleanup git | 删除旧版本 |
brew edit git | 编辑此软件包 |
brew cat git | 打印这个软件包 |
brew home git | 打开主页 |
brew search git | 搜索公式 |
命令 | 说明 |
---|---|
brew install --cask firefox | 安装火狐浏览器 |
brew list --cask | 列出已安装应用 |
Cask 命令用于与图形应用程序交互
-命令 | 说明 |
---|---|
brew update | 更新 brew 和 cask |
brew upgrade | 升级所有软件包 |
brew list | 已安装列表 |
brew outdated | 升级需要什么? |
brew doctor | 诊断冲泡问题 |
brew pin <formula> | 防止指定软件包升级 |
brew unpin <formula> | 允许升级指定的软件包 |
$ brew cleanup # 删除旧版本的已安装软件包
$ brew cleanup <formula> # 删除旧版本指定软件包
# 显示所有将被删除的软件包(试运行)
$ brew cleanup -n
-# 列出所有当前点击的源码仓库(点击)
$ brew tap
# 使用 https 从 Github 中点击软件包源码仓库以点击
@@ -227,7 +227,7 @@
# 从存储库中删除给定的源码仓库
$ brew untap <user/repo>
-# 列出所有已安装的软件包
$ brew list
# 显示所有本地可用的 brew 配方
@@ -237,7 +237,7 @@
# 显示有关软件包的信息
$ brew info <formula>
-命令 | 说明 |
---|---|
brew help | 打印帮助信息 |
brew help <sub-command> | 打印子命令的帮助信息 |
此备忘清单是 HTML 实体及其编号和名称的完整列表。还包括可以用 HTML 表示的 ASCII 字符的完整列表。
HTML | Symbol | Numeric | 描述 | Hex | CSS (ISO) | JS (Octal) |
---|---|---|---|---|---|---|
" | " | " | 引号 | u+0022 ISOnum | \0022 | \42 |
# | # | # | 数字符号 | u+0023 ISOnum | \0023 | \43 |
$ | $ | $ | 美元符号 | u+0024 ISOnum | \0024 | \44 |
% | % | % | 百分号 | u+0025 ISOnum | \0025 | \45 |
& | & | & | 和号 | u+0026 ISOnum | \0026 | \46 |
' | ' | ' | 撇号 | u+0027 ISOnum | \0027 | \47 |
( | ( | ( | 左括号 | u+0028 ISOnum | \0028 | \50 |
) | ) | ) | 右括号 | u+0029 ISOnum | \0029 | \51 |
* | * | * | 星号 | u+002A ISOnum | \002a | \52 |
+ | + | + | 加号 | u+002B ISOnum | \002b | \53 |
, | , | , | 逗号 | u+002C ISOnum | \002c | \54 |
− | - | - | 连字符减号 | u+002D ISOnum | \002d | \55 |
. | . | . | 句号 | u+002E ISOnum | \002e | \56 |
/ | / | / | 固相线 | u+002F ISOnum | \002f | \57 |
: | : | : | 冒号 | u+003A ISOnum | \003a | \72 |
; | ; | ; | 分号 | u+003B ISOnum | \003b | \73 |
< | < | < | 少于 | u+003C ISOnum | \003c | \74 |
= | = | = | 等于 | u+003D ISOnum | \003d | \75 |
> | > | > | 大于号 | u+003E ISOnum | \003e | \76 |
? | ? | ? | 问号 | u+003F ISOnum | \003f | \77 |
@ | @ | @ | 在标志处 | u+0040 ISOnum | \0040 | \100 |
[ | [ | [ | 左方括号 | u+005B ISOnum | \005b | \133 |
\ | \ | \ | 反斜杠 | u+005C ISOnum | \005c | \134 |
] | ] | ] | 右方括号 | u+005D ISOnum | \005d | \135 |
^ | ^ | ^ | 抑扬顿挫 | u+005E ISOnum | \005e | \136 |
_ | _ | _ | 低线 | u+005F ISOnum | \005f | \137 |
` | ` | ` | 重音 | u+0060 ISOnum | \0060 | \u0060 |
{ | { | { | 左大括号 | u+007b ISOnum | \007b | \173 |
| | | | | | 竖线 | u+007c ISOnum | \007c | \174 |
} | } | } | 右大括号 | u+007d ISOnum | \007d | \175 |
~ | ~ | 波浪号 | u+007e ISOnum | \007e | \176 |
HTML | Symbol | Numeric | 描述 | Hex | CSS (ISO) | JS (Octal) |
---|---|---|---|---|---|---|
|   | no-break space | %A0 | \00a0 | \240 | |
¡ | ¡ | ¡ | inverted exclamation mark | %A1 | \00a1 | \241 |
¢ | ¢ | ¢ | cent sign | %A2 | \00a2 | \242 |
£ | £ | £ | pound sterling sign | %A3 | \00a3 | \243 |
¤ | ¤ | ¤ | general currency sign | %A4 | \00a4 | \244 |
¥ | ¥ | ¥ | yen sign | %A5 | \00a5 | \245 |
₹ | ₹ | ₹ | Indian Rupee (INR) sign | U+20B9 | \20B9 | \u20B9 |
¦ | ¦ | ¦ | broken (vertical) bar | %A6 | \00a6 | \246 |
§ | § | § | section sign | %A7 | \00a7 | \247 |
¨ | ¨ | ¨ | umlaut (dieresis) | %A8 | \00a8 | \250 |
© | © | © | copyright sign | %A9 | \00a9 | \251 |
ª | ª | ª | ordinal indicator, feminine | %AA | \00aa | \252 |
« | « | « | angle quotation mark, left | %AB | \00ab | \253 |
¬ | ¬ | ¬ | not sign | %AC | \00ac | \254 |
­ | | ­ | soft hyphen | %AD | \00ad | \255 |
® | ® | ® | registered sign | %AE | \00ae | \256 |
¯ | ¯ | ¯ | macron | %AF | \00af | \257 |
° | ° | ° | degree sign | %B0 | \00b0 | \260 |
± | ± | ± | plus-or-minus sign | %B1 | \00b1 | \261 |
² | ² | ² | superscript two | %B2 | \00b2 | \262 |
³ | ³ | ³ | superscript three | %B3 | \00b3 | \263 |
´ | ´ | ´ | acute accent | %B4 | \00b4 | \264 |
µ | µ | µ | micro sign | %B5 | \00b5 | \265 |
¶ | ¶ | ¶ | pilcrow (paragraph sign) | %B6 | \00b6 | \266 |
· | · | · | middle dot | %B7 | \00b7 | \267 |
¸ | ¸ | ¸ | cedilla | %B8 | \00b8 | \270 |
¹ | ¹ | ¹ | superscript one | %B9 | \00b9 | \271 |
º | º | º | ordinal indicator, masculine | %BA | \00ba | \272 |
» | » | » | angle quotation mark, right | %BB | \00bb | \273 |
¼ | ¼ | ¼ | fraction one-quarter | %BC | \00bc | \274 |
½ | ½ | ½ | fraction one-half | %BD | \00bd | \275 |
¾ | ¾ | ¾ | fraction three-quarters | %BE | \00be | \276 |
¿ | ¿ | ¿ | inverted question mark | %BF | \00bf | \277 |
À | À | À | capital A, grave accent | %C0 | \00c0 | \300 |
Á | Á | Á | capital A, acute accent | %C1 | \00c1 | \301 |
 |  |  ; | capital A, circumflex accent | %C2 | \00c2 | \302 |
à | à | à | capital A, tilde | %C3 | \00c3 | \303 |
Ä | Ä | Ä | capital A, dieresis or umlaut mark | %C4 | \00c4 | \304 |
Å | Å | Å | capital A, ring | %C5 | \00c5 | \305 |
Æ | Æ | Æ | capital AE diphthong (ligature) | %C6 | \00c6 | \306 |
Ç | Ç | Ç | capital C, cedilla | %C7 | \00c7 | \307 |
È | È | È | capital E, grave accent | %C8 | \00c8 | \310 |
É | É | É | capital E, acute accent | %C9 | \00c9 | \311 |
Ê | Ê | Ê | capital E, circumflex accent | %CA | \00ca | \312 |
Ë | Ë | Ë | capital E, dieresis or umlaut mark | %CB | \00cb | \313 |
Ì | Ì | Ì | capital I, grave accent | %CC | \00cc | \314 |
Í | Í | Í | capital I, acute accent | %CD | \00cd | \315 |
Î | Î | Î | capital I, circumflex accent | %CE | \00ce | \316 |
Ï | Ï | Ï | capital I, dieresis or umlaut mark | %CF | \00cf | \317 |
Ð | Ð | Ð | capital Eth, Icelandic | %D0 | \00d0 | \320 |
Ñ | Ñ | Ñ | capital N, tilde | %D1 | \00d1 | \321 |
Ò | Ò | Ò | capital O, grave accent | %D2 | \00d2 | \322 |
Ó | Ó | Ó | capital O, acute accent | %D3 | \00d3 | \323 |
Ô | Ô | Ô | capital O, circumflex accent | %D4 | \00d4 | \324 |
Õ | Õ | Õ | capital O, tilde | %D5 | \00d5 | \325 |
Ö | Ö | Ö | capital O, dieresis or umlaut mark | %D6 | \00d6 | \326 |
× | × | × | multiply sign | %D7 | \00d7 | \327 |
Ø | Ø | Ø | capital O, slash | %D8 | \00d8 | \330 |
Ù | Ù | Ù | capital U, grave accent | %D9 | \00d9 | \331 |
Ú | Ú | Ú | capital U, acute accent | %DA | \00da | \332 |
Û | Û | Û | capital U, circumflex accent | %DB | \00db | \333 |
Ü | Ü | Ü | capital U, dieresis or umlaut mark | %DC | \00dc | \334 |
Ý | Ý | Ý | capital Y, acute accent | %DD | \00dd | \335 |
Þ | Þ | Þ | capital THORN, Icelandic | %DE | \00de | \336 |
ß | ß | ß | small sharp s, German (sz ligature) | %DF | \00df | \337 |
à | à | à | small a, grave accent | %E0 | \00e0 | \340 |
á | á | á | small a, acute accent | %E1 | \00e1 | \341 |
â | â | â | small a, circumflex accent | %E2 | \00e2 | \342 |
ã | ã | ã | small a, tilde | %E3 | \00e3 | \343 |
ä | ä | ä | small a, dieresis or umlaut mark | %E4 | \00e4 | \344 |
å | å | å | small a, ring | %E5 | \00e5 | \345 |
æ | æ | æ | small ae diphthong (ligature) | %E6 | \00e6 | \346 |
ç | ç | ç | small c, cedilla | %E7 | \00e7 | \347 |
è | è | è | small e, grave accent | %E8 | \00e8 | \350 |
é | é | é | small e, acute accent | %E9 | \00e9 | \351 |
ê | ê | ê | small e, circumflex accent | %EA | \00ea | \352 |
ë | ë | ë | small e, dieresis or umlaut mark | %EB | \00eb | \353 |
ì | ì | ì | small i, grave accent | %EC | \00ec | \354 |
í | í | í | small i, acute accent | %ED | \00ed | \355 |
î | î | î | small i, circumflex accent | %EE | \00ee | \356 |
ï | ï | ï | small i, dieresis or umlaut mark | %EF | \00ef | \357 |
ð | ð | ð | small eth, Icelandic | %F0 | \00f0 | \360 |
ñ | ñ | ñ | small n, tilde | %F1 | \00f1 | \361 |
ò | ò | ò | small o, grave accent | %F2 | \00f2 | \362 |
ó | ó | ó | small o, acute accent | %F3 | \00f3 | \363 |
ô | ô | ô | small o, circumflex accent | %F4 | \00f4 | \364 |
õ | õ | õ | small o, tilde | %F5 | \00f5 | \365 |
ö | ö | ö | small o, dieresis or umlaut mark | %F6 | \00f6 | \366 |
÷ | ÷ | ÷ | divide sign | %F7 | \00f7 | \367 |
ø | ø | ø | small o, slash | %F8 | \00f8 | \370 |
ù | ù | ù | small u, grave accent | %F9 | \00f9 | \371 |
ú | ú | ú | small u, acute accent | %FA | \00fa | \372 |
û | û | û | small u, circumflex accent | %FB | \00fb | \373 |
ü | ü | ü | small u, dieresis or umlaut mark | %FC | \00fc | \374 |
ý | ý | ý | small y, acute accent | %FD | \00fd | \375 |
þ | þ | þ | small thorn, Icelandic | %FE | \00fe | \376 |
ÿ | ÿ | ÿ | small y, dieresis or umlaut mark | %FF | \00ff | \377 |
HTML | Symbol | Numeric | 描述 | Hex | CSS (ISO) | JS (Octal) |
---|---|---|---|---|---|---|
Œ | Œ | Œ | latin capital ligature oe | u+0152 ISOlat2 | \0152 | \u0152 |
œ | œ | œ | latin small ligature oe | u+0153 ISOlat2 | \0153 | \u0153 |
Š | Š | Š | latin capital letter s with caron | u+0160 ISOlat2 | \0160 | \u0160 |
š | š | š | latin small letter s with caron | u+0161 ISOlat2 | \0161 | \u0161 |
Ÿ | Ÿ | Ÿ | latin capital letter y with diaeresis | u+0178 ISOlat2 | \0178 | \u0178 |
ƒ | ƒ | ƒ | latin small f with hook | u+0192 ISOtech | \0192 | \u0192 |
HTML | Symbol | Numeric | 描述 | Hex | CSS (ISO) | JS (Octal) |
---|---|---|---|---|---|---|
Α | Α | Α | greek capital letter alpha | u+0391 | \0391 | \u0391 |
Β | Β | Β | greek capital letter beta | u+0392 | \0392 | \u0392 |
Γ | Γ | Γ | greek capital letter gamma | u+0393 ISOgrk3 | \0393 | \u0395 |
Δ | Δ | Δ | greek capital letter delta | u+0394 ISOgrk3 | \0394 | \u0394 |
Ε | Ε | Ε | greek capital letter epsilon | u+0395 | \0395 | \u0395 |
Ζ | Ζ | Ζ | greek capital letter zeta | u+0396 | \0396 | \u0396 |
Η | Η | Η | greek capital letter eta | u+0397 | \0397 | \u0397 |
Θ | Θ | Θ | greek capital letter theta | u+0398 ISOgrk3 | \0398 | \u0398 |
Ι | Ι | Ι | greek capital letter iota | u+0399 | \0399 | \u0399 |
Κ | Κ | Κ | greek capital letter kappa | u+039A | \039a | \u039a |
Λ | Λ | Λ | greek capital letter lambda | u+039B ISOgrk3 | \039b | \u039b |
Μ | Μ | Μ | greek capital letter mu | u+039C | \039c | \u039c |
Ν | Ν | Ν | greek capital letter nu | u+039D | \039d | \u039D |
Ξ | Ξ | Ξ | greek capital letter xi | u+039E ISOgrk3 | \039e | \u039e |
Ο | Ο | Ο | greek capital letter omicron | u+039F | \039f | \u039f |
Π | Π | Π | greek capital letter pi | u+03A0 ISOgrk3 | \03a0 | \u03a0 |
Ρ | Ρ | Ρ | greek capital letter rho | u+03A1 | \03a1 | \u03a1 |
Σ | Σ | Σ | greek capital letter sigma | u+03A3 ISOgrk3 | \03a3 | \u03A3 |
Τ | Τ | Τ | greek capital letter tau | u+03A4 | \03a4 | \u03A4 |
Υ | Υ | Υ | greek capital letter upsilon | u+03A5 ISOgrk3 | \03a5 | \u03A5 |
Φ | Φ | Φ | greek capital letter phi | u+03A6 ISOgrk3 | \03a6 | \u03A6 |
Χ | Χ | Χ | greek capital letter chi | u+03A7 | \03a7 | \u03A7 |
Ψ | Ψ | Ψ | greek capital letter psi | u+03A8 ISOgrk3 | \03a8 | \u03A8 |
Ω | Ω | Ω | greek capital letter omega | u+03A9 ISOgrk3 | \03a9 | \u03A9 |
α | α | α | greek small letter alpha | u+03B1 ISOgrk3 | \03b1 | \u03b1 |
β | β | β | greek small letter beta | u+03B2 ISOgrk3 | \03b2 | \u03b2 |
γ | γ | γ | greek small letter gamma | u+03B3 ISOgrk3 | \03b3 | \u03b3 |
δ | δ | δ | greek small letter delta | u+03B4 ISOgrk3 | \03b4 | \u03b4 |
ε | ε | ε | greek small letter epsilon | u+03B5 ISOgrk3 | \03b5 | \u03b5 |
ζ | ζ | ζ | greek small letter zeta | u+03B6 ISOgrk3 | \03b6 | \u03b6 |
η | η | η | greek small letter eta | u+03B7 ISOgrk3 | \03b7 | \u03b7 |
θ | θ | θ | greek small letter theta | u+03B8 ISOgrk3 | \03b8 | \u03b8 |
ι | ι | ι | greek small letter iota | u+03B9 ISOgrk3 | \03b9 | \u03b9 |
κ | κ | κ | greek small letter kappa | u+03BA ISOgrk3 | \03ba | \u03ba |
λ | λ | λ | greek small letter lambda | u+03BB ISOgrk3 | \03bb | \u03bb |
μ | μ | μ | greek small letter mu | u+03BC ISOgrk3 | \03bc | \u03bc |
ν | ν | ν | greek small letter nu | u+03BD ISOgrk3 | \03bd | \u03bd |
ξ | ξ | ξ | greek small letter xi | u+03BE ISOgrk3 | \03be | \u03be |
ο | ο | ο | greek small letter omicron | u+03BF NEW | \03bf | \u03bf |
π | π | π | greek small letter pi | u+03C0 ISOgrk3 | \03c0 | \u03c0 |
ρ | ρ | ρ | greek small letter rho | u+03C1 ISOgrk3 | \03c1 | \u03c1 |
ς | ς | ς | greek small letter final sigma | u+03C2 ISOgrk3 | \03C2 | \u03c2 |
σ | σ | σ | greek small letter sigma | u+03C3 ISOgrk3 | \03C3 | \u03c3 |
τ | τ | τ | greek small letter tau | u+03C4 ISOgrk3 | \03C4 | \u03c4 |
υ | υ | υ | greek small letter upsilon | u+03C5 ISOgrk3 | \03C5 | \u03c5 |
φ | φ | φ | greek small letter phi | u+03C6 ISOgrk3 | \03C6 | \03c6 |
χ | χ | χ | greek small letter chi | u+03C7 ISOgrk3 | \03C7 | \u03c7 |
ψ | ψ | ψ | greek small letter psi | u+03C8 ISOgrk3 | \03C8 | \u03c8 |
ω | ω | ω | greek small letter omega | u+03C9 ISOgrk3 | \03C9 | \u03c9 |
ϑ | ϑ | ϑ | greek small letter theta symbol | u+03D1 NEW | \03D1 | \u03D1 |
ϒ | ϒ | ϒ | greek upsilon with hook symbol | u+03D2 NEW | \03D2 | \u03D2 |
ϖ | ϖ | ϖ | greek pi symbol | u+03D6 ISOgrk3 | \03D6 | \u03D6 |
HTML | Symbol | Numeric | 描述 | Hex | CSS (ISO) | JS (Octal) |
---|---|---|---|---|---|---|
  |   | en space | u+2002 ISOpub | \2002 | \u2002 | |
  |   | em space | u+2003 ISOpub | \2003 | \u2003 | |
  |   | thin space | u+2009 ISOpub | \2009 | \u2009 | |
‌ | | ‌ | zero width non-joiner | u+200C NEW RFC 2070 | \200C | \u200C |
‍ | | ‍ | zero width joiner | u+200D NEW RFC 2070 | \200D | \u200d |
‎ | | ‎ | left-to-right mark | u+200E NEW RFC 2070 | \200E | \u200e |
‏ | | ‏ | right-to-left mark | u+200F NEW RFC 2070 | \200F | \u200f |
– | – | – | en dash | u+2013 ISOpub | \2013 | \u2013 |
— | — | — | em dash | u+2014 ISOpub | \2014 | \u2014 |
‘ | ‘ | ‘ | left single quotation mark | u+2018 ISOnum | \2018 | \u2018 |
’ | ’ | ’ | right single quotation mark | u+2019 ISOnum | \2019 | \u2019 |
‚ | ‚ | ‚ | single low-9 quotation mark | u+201A NEW | \201A | \u201a |
“ | “ | “ | left double quotation mark | u+201C ISOnum | \201C | \u201c |
” | ” | ” | right double quotation mark | u+201D ISOnum | \201D | \u201d |
„ | „ | „ | double low-9 quotation mark | u+201E NEW | \201E | \u201e |
† | † | † | dagger | u+2020 ISOpub | \2020 | \u2020 |
‡ | ‡ | ‡ | double dagger | u+2021 ISOpub | \2021 | \u2021 |
‰ | ‰ | ‰ | per mille sign | u+2030 ISOtech | \2030 | \u2030 |
‹ | ‹ | ‹ | single left-pointing angle quotation mark | u+2039 ISO proposed | \2039 | \u2039 |
› | › | › | single right-pointing angle quotation mark | u+203A ISO proposed | \203A | \u203a |
• | • | • | bullet, aka. black small circle | u+2022 ISOpub | \2022 | \u2219 |
… | … | … | horizontal ellipsis, aka three dot leader | u+2026 ISOpub | \2026 | \u2026 |
′ | ′ | ′ | prime, aka minutes, aka feet | u+2032 ISOtech | \2032 | \u2032 |
″ | ″ | ″ | double prime, aka seconds, aka inches | u+2033 ISOtech | \2033 | \u2033 |
‾ | ‾ | ‾ | overline, aka spacing overscore | u+203E NEW | \203E | \u203e |
⁄ | ⁄ | ⁄ | fraction slash | u+2044 NEW | \2044 | \u8260 |
HTML | Symbol | Numeric | 描述 | Hex | CSS (ISO) | JS (Octal) |
---|---|---|---|---|---|---|
℘ | ℘ | ℘ | script capital P, aka power set, aka Weierstrass p | u+2118 ISOamso | \2118 | \u2118 |
ℑ | ℑ | ℑ | blackletter capital I, aka imaginary part | u+2111 ISOamso | \2111 | \u2111 |
ℜ | ℜ | ℜ | blackletter capital R, aka real part symbol | u+211C ISOamso | \211C | \u211c |
™ | ™ | ™ | trade mark sign | u+2122 ISOnum | \2122 | \u2122 |
ℵ | ℵ | ℵ | alef symbol | u+2135 NEW | \2135 | \u |
HTML | Symbol | Numeric | 描述 | Hex | CSS (ISO) | JS (Octal) |
---|---|---|---|---|---|---|
← | ← | ← | leftwards arrow | u+2190 ISOnum | \2190 | \u2190 |
↑ | ↑ | ↑ | upwards arrow | u+2191 ISOnum | \2191 | \u2191 |
→ | → | → | rightwards arrow | u+2192 ISOnum | \2192 | \u2192 |
↓ | ↓ | ↓ | downwards arrow | u+2193 ISOnum | \2193 | \u2193 |
↔ | ↔ | ↔ | left right arrow | u+2194 ISOamsa | \2194 | \u2194 |
↵ | ↵ | ↵ | downwards arrow with corner leftwards, aka carriage return | u+21B5 NEW | \21B5 | \u21b5 |
⇐ | ⇐ | ⇐ | leftwards double arrow can be used for ‘is implied by’ | u+21D0 ISOtech | \21D0 | \u21d0 |
⇑ | ⇑ | ⇑ | upwards double arrow | u+21D1 ISOamsa | \21D1 | \u21d1 |
⇒ | ⇒ | ⇒ | rightwards double arrow | u+21D2 ISOtech | \21D2 | \u21d2 |
⇓ | ⇓ | ⇓ | downwards double arrow | u+21D3 ISOamsa | \21D3 | \ud1d3 |
⇔ | ⇔ | ⇔ | left right double arrow | u+21D4 ISOamsa | \21D4 | \u21d4 |
◄ | ◄ | black left pointing triangle | U+25C0 | \25C0 | \u25c0 | |
► | ► | black right pointing triangle | u+25B6 | \25b6 | \u25b6 | |
▲ | ▲ | black up pointing triangle | u+25B2 | \25b2 | \25b2 | |
▼ | ▼ | black down pointing triangle | u+25BC | \25bc | \25bc |
HTML | Symbol | Numeric | 描述 | Hex | CSS (ISO) | JS (Octal) |
---|---|---|---|---|---|---|
∀ | ∀ | ∀ | for all | u+2200 ISOtech | \2200 | \u2200 |
∂ | ∂ | ∂ | partial differential | u+2202 ISOtech | \2202 | \u2202 |
∃ | ∃ | ∃ | there exists | u+2203 ISOtech | \2203 | \u2203 |
∅ | ∅ | ∅ | empty set, aka null set, aka diameter | u+2205 ISOamso | \2205 | \u2205 |
∇ | ∇ | ∇ | nabla, aka bakad difference | u+2207 ISOtech | \2207 | \u2207 |
∈ | ∈ | ∈ | element of | u+2208 ISOtech | \2208 | \u2208 |
∉ | ∉ | ∉ | not an element of | u+2209 ISOtech | \2209 | \u2209 |
∋ | ∋ | ∋ | contains as member | u+220B ISOtech | \220B | \u220b |
∏ | ∏ | ∏ | n-ary product, aka product sign | u+220F ISOamsb | \220F | \u03a0 |
∑ | ∑ | ∑ | n-ary sumation | u+2211 ISOamsb | \2211 | \u03a3 |
− | − | − | minus sign | u+2212 ISOtech | \2212 | \u2212 |
∗ | ∗ | ∗ | asterisk operator | u+2217 ISOtech | \2217 | \u2217 |
√ | √ | √ | square root, aka radical sign | u+221A ISOtech | \221A | \u221a |
∝ | ∝ | ∝ | proportional to | u+221D ISOtech | \221D | \u221d |
∞ | ∞ | ∞ | infinity | u+221E ISOtech | \221E | \u221e |
∠ | ∠ | ∠ | angle | u+2220 ISOamso | \2220 | \u2220 |
∧ | ⊥ | ⊥ | logical and, aka wedge | u+2227 ISOtech | \2227 | \u2227 |
∨ | ⊦ | ⊦ | logical or, aka vee | u+2228 ISOtech | \2228 | \u2228 |
∩ | ∩ | ∩ | intersection, aka cap | u+2229 ISOtech | \2229 | \u2229 |
∪ | ∪ | ∪ | union, aka cup | u+222A ISOtech | \222A | \u222a |
∫ | ∫ | ∫ | integral | u+222B ISOtech | \222B | \u222b |
∴ | ∴ | ∴ | therefore | u+2234 ISOtech | \2234 | \u2234 |
∼ | ∼ | ∼ | tilde | u+223C ISOtech | \223C | \u223c |
≅ | ≅ | ≅ | approximately equal to | u+2245 ISOtech | \2245 | \u2245 |
≈ | ≈ | ≈ | almost equal to, aka asymptotic to | u+2248 ISOamsr | \2248 | \u2248 |
≠ | ≠ | ≠ | not equal to | u+2260 ISOtech | \2260 | \u2260 |
≡ | ≡ | ≡ | identical to | u+2261 ISOtech | \2261 | \u2261 |
≤ | ≤ | ≤ | less-than or equal to | u+2264 ISOtech | \2264 | \u2264 |
≥ | ≥ | ≥ | greater-than or equal to | u+2265 ISOtech | \2265 | \u2265 |
⊂ | ⊂ | ⊂ | subset of | u+2282 ISOtech | \2282 | \u2282 |
⊃ | ⊃ | ⊃ | superset of | u+2283 ISOtech | \2283 | \u2283 |
⊄ | ⊄ | ⊄ | not a subset of | u+2284 ISOamsn | \2284 | \u2284 |
⊆ | ⊆ | ⊆ | subset of or equal to | u+2286 ISOtech | \2286 | \u2286 |
⊇ | ⊇ | ⊇ | superset of or equal to | u+2287 ISOtech | \2287 | \u2287 |
⊕ | ⊕ | ⊕ | circled plus, aka direct sum | u+2295 ISOamsb | \2295 | \u2295 |
⊗ | ⊗ | ⊗ | circled times, aka vector product | u+2297 ISOamsb | \2297 | \u2297 |
⊥ | ⊥ | ⊥ | up tack | u+22A5 ISOtech | \22A5 | \u22a5 |
⋅ | ⋅ | ⋅ | dot operator | u+22C5 ISOamsb | \22C5 | \u22c5 |
HTML | Symbol | Numeric | 描述 | Hex | CSS (ISO) | JS (Octal) |
---|---|---|---|---|---|---|
⌈ | ⌈ | ⌈ | left ceiling, aka apl upstile | u+2308 ISOamsc | \2308 | \u2308 |
⌉ | ⌉ | ⌉ | right ceiling | u+2309 ISOamsc | \2309 | \u2309 |
⌊ | ⌊ | ⌊ | left floor, aka apl downstile | u+230A ISOamsc | \230A | \u230a |
⌋ | ⌋ | ⌋ | right floor | u+230B ISOamsc | \230B | \u230b |
⟨ | 〈 | 〈 | left-pointing angle bracket | u+2329 ISOtech | \2329 | \u2329 |
⟩ | 〉 | 〉 | right-pointing angle bracket | u+232A ISOtech | \232A | \u232a |
此 HTML 快速参考备忘单以可读布局列出了常见的 HTML
和 HTML5
标记。
<!DOCTYPE html>
<html lang="en">
@@ -58,7 +58,7 @@
</html>
或者在 jsfiddle
-<!-- 这是代码注释 -->
<!--
@@ -66,12 +66,12 @@
大量的行。
-->
-<p>我来自快速参考</p>
<p>分享快速参考备忘单。</p>
请参阅:段落元素
-<a href="https://github.com/jaywcjlove/reference">
Github
</a>
@@ -105,7 +105,7 @@
:- :- href
超链接指向的 URL rel
链接 URL 的关系 target
链接目标位置:_self
/_blank
/_top
/_parent
请参阅:<a> 属性
-
<img loading="lazy"
src="https://xxx.png"
alt="在此处描述图像"
@@ -150,7 +150,7 @@
src
(URL/路径)必填,图片位置 alt
描述图像 width
图像宽度 height
图像高度 loading
浏览器应该如何加载
请参阅:图像嵌入元素
-
<b>粗体文字</b>
<strong>这段文字很重要</strong>
<i>斜体文本</i>
@@ -168,7 +168,7 @@
<kbd>Ctrl</kbd>
<blockquote>文本块引用</blockquote>
-<h1> 这是标题 1 </h1>
<h2> 这是标题 2 </h2>
<h3> 这是标题 3 </h3>
@@ -177,7 +177,7 @@
<h6> 这是标题 6 </h6>
您的页面上应该只有一个 h1
:- | :- |
---|---|
<div></div> | 页面内容的划分或部分 |
<span></span> | 其他内容中的文本部分 |
<p></p> | 文本段落 |
<br> | 换行 |
<hr> | 水平分割线 |
这些标签用于将页面划分为多个部分
-<iframe
id="inlineFrameExample"
@@ -221,37 +221,37 @@
</iframe>
-请参阅:内联框架元素
-<script type="text/javascript">
let text = "Hello 快速参考";
alert(text);
</script>
-<body>
...
<script src="app.js"></script>
</body>
-<style type="text/css">
h1 {
color: purple;
}
</style>
-<head>
...
<link rel="stylesheet" href="style.css"/>
</head>
-<body>
<header>
<nav>...</nav>
@@ -264,7 +264,7 @@
</footer>
</body>
-<header>
<nav>
<ul>
@@ -275,7 +275,7 @@
</nav>
</header>
-:- | :- |
---|---|
article | 独立的内容 |
aside | 次要内容 |
audio | 嵌入声音或音频流 |
bdi | 双向隔离元件 |
canvas | 通过JavaScript绘制图形 |
data | 机器可读内容 |
datalist | 一组预定义选项 |
details | 其他信息 |
dialog | 对话框或子窗口 |
embed | 嵌入外部应用程序 |
figcaption | 图形的标题或图例 |
figure | 插图 |
footer | 页脚或最不重要的 |
header | 刊头或重要信息 |
main | 文件的主要内容 |
mark | 突出显示的文本 |
meter | 已知范围内的标量值 |
nav | 导航链接的一部分 |
output | 计算的结果 |
picture | 用于多个图像源的容器 |
progress | 任务的完成进度 |
rp | 提供回退括号 |
rt | 定义字符的发音 |
ruby | 表示ruby注释 |
section | 一系列相关内容中的组 |
source | 媒体元素的资源 |
summary | 元素的摘要 |
template | 定义HTML片段 |
time | 时间或日期 |
track | 媒体元素的字幕信息 |
video | 嵌入视频 |
wbr | 换行机会 |
<video controls="" width="100%">
<source src="https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4" type="video/mp4">
很抱歉,您的浏览器不支持嵌入式视频。
</video>
-<audio
controls
src="https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3">
@@ -435,11 +435,11 @@
</audio>
-<ruby>
汉 <rp>(</rp><rt>hàn</rt><rp>)</rp>
字 <rp>(</rp><rt>zì</rt><rp>)</rp>
@@ -448,7 +448,7 @@
</ruby>
-<ul>
<li>User <bdi>hrefs</bdi>: 60 points</li>
<li>User <bdi>jdoe</bdi>: 80 points</li>
<li>User <bdi>إيان</bdi>: 90 points</li>
</ul>
-<progress value="50" max="100"></progress>
-<p>我爱<mark>备忘清单</mark></p>
我爱备忘清单
-<table>
<thead>
@@ -499,7 +499,7 @@
</tbody>
</table>
-属性 | 说明 |
---|---|
colspan | 单元格应跨越的列数 |
headers | 单元格与一个或多个标题单元格相关 |
rowspan | 单元格应跨越的行数 |
请参阅:td#属性
-<ul>
<li>I'm an item</li>
<li>I'm another item</li>
@@ -616,7 +616,7 @@
</ul>
请参阅:无序列表元素
-<ol>
<li>I'm the first item</li>
<li>I'm the second item</li>
@@ -624,7 +624,7 @@
</ol>
请参阅:有序列表元素
-<dl>
<dt>A Term</dt>
<dd>Definition of a term</dd>
@@ -633,8 +633,8 @@
</dl>
请参阅:描述列表元素
-<form method="POST" action="api/login">
<label for="mail">邮箱: </label>
@@ -649,7 +649,7 @@
<label for="ck">记住我</label>
</form>
-HTML <form>
元素用于收集信息并将其发送到外部源。
属性 | 说明 |
---|---|
name | 脚本形式的名称 |
action | 表单脚本的URL |
method | HTTP方法,POST /GET (默认) |
enctype | 介质类型,请参见enctype |
onsubmit | 提交表单时运行 |
onreset | 在窗体重置时运行 |
<!-- 嵌套标签 -->
<label>Click me
<input type="text" id="user" name="name"/>
@@ -710,32 +710,32 @@
<input id="user" type="text" name="name"/>
for
在标签中引用输入的id
属性
<label for="Name">Name:</label>
<input type="text" name="Name" id="">
-请参阅:HTML输入标记
-<textarea rows="2" cols="30" name="address" id="address"></textarea>
-Textarea 是一个多行文本输入控件
-<input type="radio" name="gender" id="m">
<label for="m">Male</label>
<input type="radio" name="gender" id="f">
<label for="f">Female</label>
-单选按钮用于让用户只选择一个
-<input type="checkbox" name="s" id="soc">
<label for="soc">Soccer</label>
<input type="checkbox" name="s" id="bas">
<label for="bas">Baseball</label>
-复选框允许用户选择一个或多个
-<label for="city">City:</label>
<select name="city" id="city">
<option value="1">Sydney</option>
@@ -765,7 +765,7 @@
<option value="3">Cromwell</option>
</select>
-选择框是选项的下拉列表
-<fieldset>
<legend>Your favorite monster</legend>
<input type="radio" id="kra" name="m">
@@ -784,7 +784,7 @@
<label for="sas">Sasquatch</label>
</fieldset>
-<label for="b">Choose a browser: </label>
<input list="list" id="b" name="browser"/>
<datalist id="list">
@@ -806,7 +806,7 @@
<option value="Microsoft Edge">
</datalist>
-<form action="register.php" method="post">
<label for="foo">Name:</label>
<input type="text" name="name" id="foo">
@@ -827,7 +827,7 @@
<input type="reset" value="重置">
</form>
-将数据提交到服务器
重置为默认值
输入标记是一个空元素,用于标识要从用户处获取的特定类型的字段信息。
<input type="text" name="?" value="?" minlength="6" required />
@@ -946,7 +946,7 @@
:- :- type="…"
正在输入的数据类型 value="…"
默认值 name="…"
用于在 HTTP 请求中描述此数据 id="…"
其他 HTML 元素的唯一标识符 readonly
停止用户修改 disabled
停止任何交互 checked
单选或复选框是否选中 required
是强制性的,参阅必填 placeholder="…"
添加临时,请参阅::placeholder autocomplete="off"
禁用自动完成 autocapitalize="none"
禁用自动大写 inputmode="…"
显示特定键盘,请参阅inputmode list="…"
关联的datalist的id maxlength="…"
最大字符数 minlength="…"
最小字符数 min="…"
范围和编号上的最小数值 max="…"
范围和编号上的最大数值 step="…"
数字如何在范围和数字中递增 pattern="…"
指定一个正则表达式,请参阅pattern autofocus
集中精力 spellcheck
执行拼写检查 multiple
是否允许多个值 accept=""
file 中需要文件类型上载控件
请参阅:<input>元素 的属性
-
type="checkbox" | |
type="radio" | |
type="file" | |
type="hidden" | |
type="text" | |
type="password" | |
type="image" | |
type="reset" | |
type="button" | |
type="submit" |
type="color" | |
type="date" | |
type="time" | |
type="month" | |
type="datetime-local" | |
type="week" | |
type="email" | |
type="tel" | |
type="url" | |
type="number" | |
type="search" | |
type="range" |
input:focus | 当键盘聚焦时 |
meta 标记描述 HTML 文档中的元数据。它解释了关于 HTML 的其他材料。
<meta charset="utf-8">
@@ -1109,7 +1109,7 @@
<meta name="viewport" content="width=device-width">
<meta name="viewport" content="width=1024">
-<meta property="og:type" content="website">
<meta property="og:locale" content="en_CA">
<meta property="og:title" content="HTML cheatsheet">
@@ -1119,7 +1119,7 @@
<meta property="og:description" content="Description of this page">
Facebook、Instagram、Pinterest、LinkedIn 等使用。
-<meta name="twitter:card" content="summary">
<meta name="twitter:site" content="@QuickRef_ME">
<meta name="twitter:title" content="HTML cheatsheet">
@@ -1128,14 +1128,14 @@
<meta name="twitter:image" content="https://xxx.com/image.jpg">
请参阅:Twitter 卡片文档
-<meta name="ICBM" content="45.416667,-75.7">
<meta name="geo.position" content="45.416667;-75.7">
<meta name="geo.region" content="ca-on">
<meta name="geo.placename" content="Ottawa">
请参阅:Geotagging
-htop 是一个交互式流程查看器,此 htop 备忘清单包含 htop 命令
$ apt install htop # Debian
$ dnf install htop # Fedora
$ emerge sys-process/htop # Gentoo
@@ -57,7 +57,7 @@
$ Compile htop # GoboLinux
htop 的软件包在大多数发行版中都可用下载
-长选项的强制参数对于短选项也是强制的
@@ -102,7 +102,7 @@:- | :- |
---|---|
-d --delay=DELAY | 更新之间的延迟,以十分之一秒为单位 |
-C --no-color --no-colour | 以单色模式启动 htop |
-h --help | 显示帮助消息并退出 |
-p --pid=PID,PID... | 仅显示给定的PID |
-s --sort-key COLUMN | 按此列排序(对列列表使用--sort-key 帮助) |
-u --user=USERNAME | 仅显示给定用户的进程 |
-v --version | 输出版本信息并退出 |
-t --tree | 在树状视图中显示流程 |
:- | :- |
---|---|
R | 运行中 |
S | 休眠 |
T | 追踪/停止 |
Z | 僵尸 |
D | 磁盘睡眠 |
:- | :- |
---|---|
F1 , h , ? | 转到帮助屏幕 |
F10 , q | 退出 |
Space | 标记或取消标记进程 |
U | 取消标记所有进程(删除所有使用 Space 键添加的标记) |
s | 跟踪进程系统调用:如果安装了 strace(1) ,按下此键会将其附加到当前选定的进程,呈现进程发出的系统调用的实时更新 |
l | 显示进程打开的文件:如果安装了 lsof(1) ,按下该键将显示进程打开的文件描述符列表 |
F2 , S | 转到设置屏幕,您可以在其中配置屏幕顶部显示的仪表,设置各种显示选项,在配色方案中进行选择,并选择显示的列,以何种顺序显示 |
F3 , / | 逐步搜索所有显示进程的命令行。当前选定(突出显示)的命令将在您键入时更新。在搜索模式下,按 F3 将循环匹配出现的事件 |
F4 , \ | 增量进程过滤:输入部分进程命令行,仅显示名称匹配的进程。要取消过滤,请再次输入过滤选项并按 Esc |
F5 , t | 树视图:按父级组织进程,并将它们之间的关系布局为树。切换键将在树和您之前选择的排序视图之间切换。选择排序视图将退出树视图 |
F6 | 在排序视图上,选择一个字段进行排序,也可以通过 < 和 > 访问。当前排序字段由标题中的突出显示。在树视图中,展开或折叠当前子树。树节点中的“+”指示符表示它已折叠 |
F7 , ] | 增加所选进程的优先级(从“nice”值中减去)。这只能由超级用户完成 |
F8 , [ | 降低选定进程的优先级(添加到“nice”值) |
F9 , k | “杀死”进程:向一个或一组进程发送一个在菜单中选择的信号。如果进程被标记,则将信号发送到所有标记的进程。如果没有标记,则发送到当前选定的进程 |
+ , - | 在树视图模式下,展开或折叠子树。 |
a | (在多 CPU 机器上)设置 CPU 亲和性:标记允许进程使用的 CPU |
u | 仅显示指定用户拥有的进程 |
F | “跟随”进程:如果排序顺序导致当前选定的进程在列表中移动,则使选择栏跟随它。这对于监控进程很有用:这样,您可以使进程始终在屏幕上可见。使用移动键时,“跟随”失效。 |
p | 在适用的情况下显示运行程序的完整路径(这是一个切换键) |
Ctrl-L | 刷新:重绘屏幕并重新计算数值 |
Numbers | PID搜索:输入进程ID,选择突出显示将移至它 |
:- | :- |
---|---|
M | 按内存 使用情况排序 (最高兼容性键) |
P | 按CPU 使用情况排序 (最高兼容性键) |
T | 按时间 排序 (最高兼容性键) |
I | 反转 排序顺序 |
K | 隐藏内核 线程 |
H | 隐藏用户 线程 |
HTTP 状态码备忘清单。 每个 HTTP 状态代码的快速参考。
:- | - |
---|---|
200 | 返回成功,GET,DELETE 请求成功 |
204 | 无内容,POST 请求成功 |
301 | 永久重定向 |
302/307 | 临时重定向 |
304 | 未修改,自上次请求以来 |
331 | 用户名正确,需要密码 |
332 | 需要登录帐户 |
400 | 错误请求,缺少 API 请求的必需属性 |
401 | 未授权,无效凭据进行身份验证将 |
403 | 禁地,该请求不被允许 |
404 | 未找到,无法访问资 |
405 | 方法不允许,不支持该请求 |
409 | 冲突,冲突资源已存在 |
412 | 该请求被拒绝 |
422 | 无法处理,无法处理该实体 |
429 | 请求过多,用户超出了应用速率限制 |
500 | 服务器错误,在处理请求时,服务器出现问题 |
530 | 未登录 |
:- | - |
---|---|
500 | 语法错误,命令无法识别。这可能包括诸如命令行太长之类的错误 |
501 | 在参数中有语法错误 |
502 | 未执行命令 |
503 | 错误的命令序列 |
504 | 未执行该参数的命令 |
530 | 未登录 |
532 | 存储文件需要帐户 |
550 | 未执行请求的操作。文件不可用(例如,未找到文件,没有访问权限) |
551 | 请求的操作异常终止:未知的页面类型 |
552 | 请求的文件操作异常终止:超出存储分配(对于当前目录或数据集) |
553 | 未执行请求的操作。不允许的文件名 |
永久性否定的完成答复,该命令不成功,错误是永久性的。如果客户端重试命令,将再次出现同样的错误。
-这是理解和编写 INI 格式配置文件的快速参考备忘单,此清单包含配置的内容,结构和语法等内容。
INI 是一种固定标准格式的配置文件,INI配置方法来自 MS-DOS 操作系统
; 这里是注释
[owner]
@@ -55,7 +55,7 @@
file="acme payroll.dat"
现在已成为许多配置的非正式标准,其它操作系统可能使用 .conf
或 .cfg
作为后缀
名称
和值
构成,等号 (=) 分隔注释 (;
)
; 这里是注释文本,将被忽略
@@ -82,7 +82,7 @@
foo = bar # 这是另一个内联注释
在某些情况下注释必须单独出现在行上
-[
和 ]
中[section]
domain = jaywcjlove.github.io
@@ -126,7 +126,7 @@
[.subsection]
foo = bar
-序列 | 意思 |
---|---|
\\ | \ (单个反斜杠,转义转义字符) |
\' | 撇号 |
\" | 双引号 |
\0 | 空字符 |
\a | 铃声/警报/声音 |
\b | 退格键,某些应用程序的贝尔字符 |
\t | 制表符 |
\r | 回车 |
\n | 换行 |
\; | 分号 |
\# | 数字符号 |
\= | 等号 |
\: | 冒号 |
\x???? | 十六进制代码点的 Unicode 字符对应于 ???? |
[section]
domain = jaywcjlove.github.io
array[]=first value
@@ -209,7 +209,7 @@
}
}
-这是一个符合 ISO 639-1 标准的 ISO 语言代码列表,它为多语言网站提供参考。
639-1 代码 | ISO 语言(中文)名称 | ISO 语言名称 | 本地名称 (地名) |
---|---|---|---|
aa | 阿法尔语 | Afar | Afaraf |
ab | 阿布哈兹语 | Abkhaz | аҧсуа бызшәа |
ae | 阿维斯陀语 | Avestan | avesta |
af | 南非語 | Afrikaans | Afrikaans |
ak | 阿坎语 | Akan | Akan |
am | 阿姆哈拉语 | Amharic | አማርኛ |
an | 阿拉贡语 | Aragonese | aragonés |
ar | 阿拉伯语 | Arabic | اللغة العربية |
as | 阿萨姆语 | Assamese | অসমীয়া |
av | 阿瓦尔语 | Avaric | авар мацӀ |
ay | 艾马拉语 | Aymara | aymar aru |
az | 阿塞拜疆语 | Azerbaijani | azərbaycan dili |
ba | 巴什基尔语 | Bashkir | башҡорт теле |
be | 白俄罗斯语 | Belarusian | беларуская мова |
bg | 保加利亚语 | Bulgarian | български език |
bh | 比哈尔语 | Bihari | भोजपुरी |
bi | 比斯拉马语 | Bislama | Bislama |
bm | 班巴拉语 | Bambara | bamanankan |
bn | 孟加拉语 | Bengali | বাংলা |
bo | 藏语 | Tibetan | བོད་ཡིག |
br | 布列塔尼语 | Breton | brezhoneg |
bs | 波斯尼亚语 | Bosnian | bosanski jezik |
ca | 加泰隆语 | Catalan | Català |
ce | 车臣语 | Chechen | нохчийн мотт |
ch | 查莫罗语 | Chamorro | Chamoru |
co | 科西嘉语 | Corsican | corsu |
cr | 克里语 | Cree | ᓀᐦᐃᔭᐍᐏᐣ |
cs | 捷克语 | Czech | čeština |
cu | 古教会斯拉夫语 | Old Church Slavonic | ѩзыкъ словѣньскъ |
cv | 楚瓦什语 | Chuvash | чӑваш чӗлхи |
cy | 威尔士语 | Welsh | Cymraeg |
da | 丹麦语 | Danish | dansk |
de | 德语 | German | Deutsch |
dv | 迪维西语 | Divehi | Dhivehi |
dz | 不丹语 | Dzongkha | རྫོང་ཁ |
ee | 埃维语 | Ewe | Eʋegbe |
el | 现代希腊语 | Greek | Ελληνικά |
en | 英语 | English | English |
eo | 世界语 | Esperanto | Esperanto |
es | 西班牙语 | Spanish | Español |
et | 爱沙尼亚语 | Estonian | eesti |
eu | 巴斯克语 | Basque | euskara |
fa | 波斯语 | Persian | فارسی |
ff | 富拉语 | Fula | Fulfulde |
fi | 芬兰语 | Finnish | suomi |
fj | 斐济语 | Fijian | Vakaviti |
fo | 法罗语 | Faroese | føroyskt |
fr | 法语 | French | Français |
fy | 弗里西亚语 | Western Frisian | Frysk |
ga | 爱尔兰语 | Irish | Gaeilge |
gd | 苏格兰盖尔语 | Scottish Gaelic | Gàidhlig |
gl | 加利西亚语 | Galician | galego |
gn | 瓜拉尼语 | Guarani | avañe'ẽ |
gu | 古吉拉特语 | Gujarati | ગુજરાતી |
gv | 马恩岛语 | Manx | Gaelg |
ha | 豪萨语 | Hausa | هَوُسَ |
he | 希伯来语 | Hebrew | עברית |
hi | 印地语 | Hindi | हिन्दी |
ho | 希里莫图语 | Hiri Motu | Hiri Motu |
hr | 克罗地亚语 | Croatian | Hrvatski |
ht | 海地克里奥尔语 | Haitian | Kreyòl ayisyen |
hu | 匈牙利语 | Hungarian | magyar |
hy | 亚美尼亚语 | Armenian | Հայերեն |
hz | 赫雷罗语 | Herero | Otjiherero |
ia | 因特语 | Interlingua | Interlingua |
id | 印尼语 | Indonesian | Bahasa Indonesia |
ie | 西方国际语 | Interlingue | Interlingue |
ig | 伊博语 | Igbo | Asụsụ Igbo |
ii | 四川彝语(诺苏语) | Nuosu | ꆈꌠ꒿ Nuosuhxop |
ik | 伊努皮克语 | Inupiaq | Iñupiaq |
io | 伊多语 | Ido | Ido |
is | 冰岛语 | Icelandic | Íslenska |
it | 意大利语 | Italian | Italiano |
iu | 因纽特语 | Inuktitut | ᐃᓄᒃᑎᑐᑦ |
ja | 日语 | Japanese | 日本語 |
jv | 爪哇语 | Javanese | basa Jawa |
ka | 格鲁吉亚语 | Georgian | ქართული |
kg | 刚果语 | Kongo | Kikongo |
ki | 基库尤语 | Kikuyu | Gĩkũyũ |
kj | 宽亚玛语 | Kwanyama | Kuanyama |
kk | 哈萨克语 | Kazakh | қазақ тілі |
kl | 格陵兰语 | Kalaallisut | kalaallisut |
km | 高棉语 | Khmer | ខេមរភាសា |
kn | 卡纳达语 | Kannada | ಕನ್ನಡ |
ko | 朝鲜语、韩语 | Korean | 한국어 |
kr | 卡努里语 | Kanuri | Kanuri |
ks | 克什米尔语 | Kashmiri | कश्मीरी |
ku | 库尔德语 | Kurdish | Kurdî |
kv | 科米语 | Komi | коми кыв |
kw | 康沃尔语 | Cornish | Kernewek |
ky | 吉尔吉斯语 | Kyrgyz | Кыргызча |
la | 拉丁语 | Latin | latine |
lb | 卢森堡语 | Luxembourgish | Lëtzebuergesch |
lg | 卢干达语 | Ganda | Luganda |
li | 林堡语 | Limburgish | Limburgs |
ln | 林加拉语 | Lingala | Lingála |
lo | 老挝语 | Lao | ພາສາ |
lt | 立陶宛语 | Lithuanian | lietuvių kalba |
lu | 卢巴语 | Luba-Katanga | Tshiluba |
lv | 拉脱维亚语 | Latvian | latviešu valoda |
mg | 马达加斯加语 | Malagasy | fiteny malagasy |
mh | 马绍尔语 | Marshallese | Kajin M̧ajeļ |
mi | 毛利语 | Māori | te reo Māori |
mk | 马其顿语 | Macedonian | македонски јазик |
ml | 马拉雅拉姆语 | Malayalam | മലയാളം |
mn | 蒙古语 | Mongolian | Монгол хэл |
mo | 摩尔达维亚语 | Moldovan | Лимба молдовеняскэ |
mr | 马拉地语 | Marathi | मराठी |
ms | 马来语 | Malay | Bahasa Malaysia |
mt | 马耳他语 | Maltese | Malti |
my | 缅甸语 | Burmese | ဗမာစာ |
na | 瑙鲁语 | Nauru | Ekakairũ Naoero |
nb | 书面挪威语 | Norwegian Bokmål | Norsk bokmål |
nd | 北恩德贝莱语 | Northern Ndebele | isiNdebele |
ne | 尼泊尔语 | Nepali | नेपाली |
ng | 恩敦加语 | Ndonga | Owambo |
nl | 荷兰语 | Dutch | Nederlands |
nn | 新挪威语 | Norwegian Nynorsk | Norsk nynorsk |
no | 挪威语 | Norwegian | Norsk |
nr | 南恩德贝莱语 | Southern Ndebele | isiNdebele |
nv | 纳瓦霍语 | Navajo | Diné bizaad |
ny | 尼扬贾语 | Chichewa | chiCheŵa |
oc | 奥克语 | Occitan | occitan |
oj | 奥杰布瓦语 | Ojibwe | ᐊᓂᔑᓈᐯᒧᐎᓐ |
om | 奥罗莫语 | Oromo | Afaan Oromoo |
or | 奥里亚语 | Oriya | ଓଡ଼ିଆ |
os | 奥塞梯语 | Ossetian | ирон æвзаг |
pa | 旁遮普语 | Panjabi | ਪੰਜਾਬੀ |
pi | 巴利语 | Pāli | पाऴि |
pl | 波兰语 | Polish | Polski |
ps | 普什图语 | Pashto | پښتو |
pt | 葡萄牙语 | Portuguese | Português |
qu | 克丘亚语 | Quechua | Runa Simi |
rm | 罗曼什语 | Romansh | rumantsch grischun |
rn | 基隆迪语 | Kirundi | Ikirundi |
ro | 罗马尼亚语 | Romanian | Română |
ru | 俄语 | Russian | Русский |
rw | 卢旺达语 | Kinyarwanda | Ikinyarwanda |
sa | 梵语 | Sanskrit | संस्कृतम् |
sc | 撒丁语 | Sardinian | sardu |
sd | 信德语 | Sindhi | सिन्धी |
se | 北萨米语 | Northern Sami | Davvisámegiella |
sg | 桑戈语 | Sango | yângâ tî sängö |
sh | 塞尔维亚-克罗地亚语 | Serbo-Croatian | Српскохрватски језик |
si | 僧伽罗语 | Sinhala | සිංහල |
sk | 斯洛伐克语 | Slovak | slovenčina |
sl | 斯洛文尼亚语 | Slovenian | slovenščina |
sm | 萨摩亚语 | - | - |
sn | 修纳语 | Shona | chiShona |
so | 索马里语 | Somali | Soomaaliga |
sq | 阿尔巴尼亚语 | Albanian | Shqip |
sr | 塞尔维亚语 | Serbian | српски језик |
ss | 斯威士语 | Swati | SiSwati |
st | 塞索托语 | Southern Sotho | Sesotho |
su | 巽他语 | Sundanese | Basa Sunda |
sv | 瑞典语 | Swedish | Svenska |
sw | 斯瓦希里语 | Swahili | Kiswahili |
ta | 泰米尔语 | Tamil | தமிழ் |
te | 泰卢固语 | Telugu | తెలుగు |
tg | 塔吉克语 | Tajik | тоҷикӣ |
th | 泰语 | Thai | ไทย |
ti | 提格雷尼亚语 | Tigrinya | ትግርኛ |
tk | 土库曼语 | Turkmen | Türkmen |
tl | 他加禄语 | Tagalog | Wikang Tagalog |
tn | 茨瓦纳语 | Tswana | Setswana |
to | 汤加语 | Tonga | faka Tonga |
tr | 土耳其语 | Turkish | Türkçe |
ts | 宗加语 | Tsonga | Xitsonga |
tt | 塔塔尔语 | Tatar | татар теле |
tw | 特威语 | Twi | Twi |
ty | 塔希提语 | Tahitian | Reo Tahiti |
ug | 维吾尔语 | Uyghur | ئۇيغۇرچە |
uk | 乌克兰语 | Ukrainian | Українська |
ur | 乌尔都语 | Urdu | اردو |
uz | 乌兹别克语 | Uzbek | Ўзбек |
ve | 文达语 | Venda | Tshivenḓa |
vi | 越南语 | Vietnamese | Tiếng Việt |
vo | 沃拉普克语 | Volapük | Volapük |
wa | 瓦隆语 | Walloon | walon |
wo | 沃洛夫语 | Wolof | Wollof |
xh | 科萨语 | Xhosa | isiXhosa |
yi | 依地语 | Yiddish | ייִדיש |
yo | 约鲁巴语 | Yoruba | Yorùbá |
za | 壮语 | Zhuang | Saɯ cueŋƅ |
zh | 汉语(中文) | Chinese | 中文 |
zu | 祖鲁语 | Zulu | isiZulu |
ISO 639-1 | ISO 639-2 | 名称 | 更改日期 | 更改类型 | 曾用代码 |
---|---|---|---|---|---|
io | ido | 伊多语 | 2002年1月15日 | 新增 | art |
wa | wln | 瓦隆语 | 2002年1月29日 | 新增 | roa |
li | lim | 林堡语 | 2002年8月2日 | 新增 | gem |
ii | iii | 四川省彝语(诺苏语) | 2002年10月14日 | 新增 | - |
an | arg | 阿拉贡语 | 2002年12月23日 | 新增 | roa |
ht | hat | 海地克里奥尔语 | 2003年2月26日 | 新增 | cpf |
自 RFC 3066 出版后,ISO 639-1 新增了以上语言
-包含最重要概念、函数、方法等的 JavaScript 备忘单。 初学者的完整快速参考。
JavaScript 是一种轻量级的解释型编程语言。
-// => Hello world!
console.log('Hello world!');
// => Hello QuickReference
@@ -57,31 +57,31 @@
// 将错误消息打印到 stderr
console.error(new Error('Oops!'));
-function potentiallyBuggyCode() {
debugger;
// 做可能有问题的东西来检查,逐步通过等。
}
debugger 语句调用任何可用的调试功能。
-let amount = 6;
let price = 4.99;
let home = 1e2;
let m = 0644; // 八进制数字 420
-let count;
console.log(count); // => undefined
count = 10;
console.log(count); // => 10
-const numberOfColumns = 4;
// TypeError: Assignment to constant...
numberOfColumns = 8;
-let x = null;
let name = "Tammy";
const found = false;
@@ -90,20 +90,20 @@
var a;
console.log(a); // => undefined
-let single = 'Wheres my bandit hat?';
let double = "Wheres my bandit hat?";
// => 21
console.log(single.length);
-5 + 5 = 10 // 加法 Addition
10 - 5 = 5 // 加法 Subtraction
5 * 10 = 50 // 乘法 Multiplication
10 / 5 = 2 // 除法 Division
10 % 5 = 0 // 取模 Modulo
-// 此行将表示注释
/*
多行配置
@@ -111,7 +111,7 @@
以下配置。
*/
-let number = 100;
// 两个语句都会加 10
number = number + 10;
@@ -119,14 +119,14 @@
console.log(number);
// => 120
-let age = 7;
// 字符串拼接
'Tommy is ' + age + ' years old.';
// 字符串插值
`Tommy is ${age} years old.`;
-var abc = "abcdefghijklmnopqrstuvwxyz";
var esc = 'I don\'t \n know'; // \n 换行
@@ -149,7 +149,7 @@
// 数字转为十六进制 (16)、八进制 (8) 或二进制 (2)
128.toString(16);
-var pi = 3.141;
pi.toFixed(0); // 返回 3
@@ -172,7 +172,7 @@
// 无穷
Number.POSITIVE_INFINITY
-const pi = Math.PI; // 3.141592653589793
Math.round(4.4); // = 4 - 数字四舍五入
Math.round(4.5); // = 5
@@ -199,7 +199,7 @@
// 随机整数,从 1
Math.floor(Math.random() * 5) + 1;
-// 像脚本代码一样执行字符串
eval();
@@ -226,21 +226,21 @@
// 解析一个字符串并返回一个整数
parseInt();
-true || false; // true
10 > 5 || 10 > 20; // true
false || false; // false
10 > 100 || 10 > 20; // false
-true && true; // true
1 > 2 && 2 > 1; // false
true && false; // false
4 === 4 && 3 > 1; // true
-1 > 3 // false
3 > 1 // true
250 >= 250 // true
@@ -248,32 +248,32 @@
1 === 2 // false
1 === '1' // false
-let lateToWork = true;
let oppositeValue = !lateToWork;
// => false
console.log(oppositeValue);
-null ?? 'I win'; // 'I win'
undefined ?? 'Me too'; // 'Me too'
false ?? 'I lose' // false
0 ?? 'I lose again' // 0
'' ?? 'Damn it' // ''
-const isMailSent = true;
if (isMailSent) {
console.log('Mail sent to recipient');
}
-var age = 1;
// => true
var status = (age >= 18) ? true : false;
-const size = 10;
if (size > 20) {
console.log('Medium');
@@ -284,7 +284,7 @@
}
// Print: Small
-0 == false // true
0 === false // false, 不同类型
1 == "1" // true, 自动类型转换
@@ -295,7 +295,7 @@
'0' === false // false
==
只检查值,===
检查值和类型。
const food = 'salad';
switch (food) {
@@ -307,7 +307,7 @@
console.log('请您用餐');
}
-const food = 'salad';
switch (food) {
@@ -319,8 +319,8 @@
console.log('请您用餐');
}
-// 定义函数:
function sum(num1, num2) {
return num1 + num2;
@@ -328,7 +328,7 @@
// 调用函数:
sum(3, 6); // 9
-// 命名函数
function rocketToMars() {
return 'BOOM!';
@@ -338,33 +338,33 @@
return 'BOOM!';
}
-const sum = (param1, param2) => {
return param1 + param2;
};
console.log(sum(2,5)); // => 7
-const printHello = () => {
console.log('hello');
};
printHello(); // => hello
-const checkWeight = weight => {
console.log(`Weight : ${weight}`);
};
checkWeight(25); // => Weight : 25
-const multiply = (a, b) => a * b;
// => 60
console.log(multiply(2, 30));
从 ES2015 开始提供箭头函数
-// 有 return
function sum(num1, num2) {
return num1 + num2;
@@ -374,7 +374,7 @@
num1 + num2;
}
-// 定义函数
function sum(num1, num2) {
return num1 + num2;
@@ -382,24 +382,24 @@
// 调用函数
sum(2, 4); // 6
-const dog = function() {
return 'Woof!';
}
-// 参数是 name
function sayHello(name) {
return `Hello, ${name}!`;
}
-function add(num1, num2) {
return num1 + num2;
}
-function myFunction() {
var pizzaName = "Margarita";
@@ -424,7 +424,7 @@
const x = 2; // Global scope
ES6 引入了两个重要的新 JavaScript 关键字:let 和 const。这两个关键字在 JavaScript 中提供了块作用域。
-const isLoggedIn = true;
if (isLoggedIn == true) {
const statusMessage = 'Logged in.';
@@ -433,7 +433,7 @@
// 未捕获的引用错误...
console.log(statusMessage);
-// 全局声明的变量
const color = 'blue';
function printColor() {
@@ -442,7 +442,7 @@
printColor(); // => blue
-let
vs var
let
vs var
for (let i = 0; i < 3; i++) {
// 这是“let”的最大范围
// i 可以访问 ✔️
@@ -456,7 +456,7 @@
// i 可以访问 ✔️
var
的范围是最近的函数块,而 let
的范围是最近的封闭块。
// 打印三次,不是我们的意思。
for (var i = 0; i < 3; i++) {
setTimeout(_ => console.log(i), 10);
@@ -469,8 +469,8 @@
}
变量使用 let
有自己的副本,变量有使用 var
的共享副本。
:- | :- |
---|---|
Array.from() | 类似数组对象创建一个新的 # |
Array.isArray() | 值是否是一个 Array # |
Array.of() | 创建一个新数组示例 # |
.at() | 返回值索引对应的元素 # |
.concat() | 合并两个或多个数组 # |
.copyWithin() | 浅复制替换某个位置 # |
.entries() | 新的 Array Iterator 对象 # |
.every() | 是否能通过回调函数的测试 # |
.fill() | 固定值填充一个数组中 # |
.filter() | 返回过滤后的数组 # |
.find() | 第一个元素的值 # |
.findIndex() | 第一个元素的索引 # |
.findLast() | 最后一个元素的值 # |
.findLastIndex() | 最后一个元素的索引 # |
.flat() | 扁平化嵌套数组 # |
.flatMap() | 与 flat 相同 # |
.forEach() | 升序循环执行 # |
.includes() | 是否包含一个指定的值 # |
.indexOf() | 找到给定元素的第一个索引 # |
.join() | 数组链接成一个字符串 # |
.keys() | 每个索引键 # |
.lastIndexOf() | 给定元素的最后一个索引 # |
.map() | 循环返回一个新数组 # |
.pop() | 删除 最后一个元素 # |
.push() | 元素添加 到数组的末尾 # |
.reduce() | 循环函数传递当前和上一个值 # |
.reduceRight() | 类似 reduce 从右往左循环 # |
.reverse() | 数组元素的位置颠倒 # |
.shift() | 删除 第一个元素 # |
.slice() | 提取 元素 # |
.some() | 至少有一个通过测试函数 # |
.sort() | 元素进行排序 # |
.splice() | 删除 或替换 或添加 元素 # |
.toLocaleString() | 字符串表示数组中的元素 # |
.toString() | 返回字符串 # |
.unshift() | 元素添加 到数组的开头 # |
.values() | 返回新的 ArrayIterator 对象 # |
const fruits = ["apple", "dew", "banana"];
// 不同的数据类型
const data = [1, 'chicken', false];
-const numbers = [1, 2, 3, 4];
numbers.length // 4
-// 访问数组元素
const myArray = [100, 200, 300];
console.log(myArray[0]); // 100
console.log(myArray[1]); // 200
-添加 | 删除 | 开始 | 结束 | |
---|---|---|---|---|
push | ✅ | ✅ | ||
pop | ✅ | ✅ | ||
unshift | ✅ | ✅ | ||
shift | ✅ | ✅ |
// 添加单个元素:
const cart = ['apple', 'orange'];
cart.push('pear');
@@ -697,28 +697,28 @@
numbers.push(3, 4, 5);
将项目添加到末尾并返回新的数组长度。
-const fruits = ["apple", "dew", "banana"];
const fruit = fruits.pop(); // 'banana'
console.log(fruits); // ["apple", "dew"]
从末尾删除一个项目并返回已删除的项目。
-const array1 = [1, 2, 3];
const firstElement = array1.shift();
console.log(array1); // 输出: Array [2, 3]
console.log(firstElement); // 输出: 1
从头删除一个项目并返回已删除的项目。
-const array = [1, 2, 3, 4, 5];
// 检查元素是否为偶数
const even = (element) => element % 2 === 0;
console.log(array.some(even));
// 预期输出: true
-const numbers = [3, 2, 1]
const newFirstNumber = 4
@@ -729,7 +729,7 @@
numbers.concat(newFirstNumber)
如果你想避免改变你的原始数组,你可以使用 concat。
-const months = ['Jan', 'March'];
months.splice(1, 0, 'Feb');
// 在索引 1 处插入
@@ -741,7 +741,7 @@
console.log(months);
// 预期输出: Array ["Jan", "Feb", "May"]
-let cats = ['Bob'];
// => ['Willy', 'Bob']
cats.unshift('Willy');
@@ -749,7 +749,7 @@
cats.unshift('Puff', 'George');
将项目添加到开头并返回新的数组长度。
-const words = ['js', 'java', 'golang'];
const result = words.filter(word => {
return word.length > 3
@@ -757,8 +757,8 @@
console.log(result);
// 预期输出: Array ["java", "golang"]
-while (condition) {
// 要执行的代码块
}
@@ -768,7 +768,7 @@
i++;
}
-const fruits = ["apple", "dew", "berry"];
for (let i = fruits.length - 1; i >= 0; i--) {
console.log(`${i}. ${fruits[i]}`);
@@ -777,7 +777,7 @@
// => 1. dew
// => 0. apple
-x = 0
i = 0
do {
@@ -787,26 +787,26 @@
} while (i < 5);
// => 0 1 3 6 10
-for (let i = 0; i < 4; i += 1) {
console.log(i);
};
// => 0, 1, 2, 3
-for (let i = 0; i < array.length; i++){
console.log(array[i]);
}
// => 数组中的每一项
-for (let i = 0; i < 99; i += 1) {
if (i > 5) break;
console.log(i)
}
// => 0 1 2 3 4 5
-for (i = 0; i < 10; i++) {
if (i === 3) {
continue;
@@ -814,14 +814,14 @@
text += "The number is " + i + "<br>";
}
-for (let i = 0; i < 2; i += 1) {
for (let j = 0; j < 3; j += 1) {
console.log(`${i}-${j}`);
}
}
-const fruits = ["apple", "orange", "banana"];
for (let index in fruits) {
console.log(index);
@@ -830,7 +830,7 @@
// => 1
// => 2
-var num = 0;
@@ -847,7 +847,7 @@
alert(num); // 95
从 alert(num)
的值可以看出,continue outPoint;
语句的作用是跳出当前循环,并跳转到 outPoint
(标签)下的 for
循环继续执行。
const fruits = ["apple", "orange", "banana"];
for (let fruit of fruits) {
console.log(fruit);
@@ -856,7 +856,7 @@
// => orange
// => banana
-async function* asyncGenerator() {
var i = 0;
@@ -875,7 +875,7 @@
// 1
// 2
-var i = 0;
for (;;) {
@@ -884,9 +884,9 @@
i++;
}
-let plusFive = (number) => {
return number + 5;
};
@@ -896,7 +896,7 @@
// 由于 f 具有函数值,因此可以调用它。
f(9); // 14
-const isEven = (n) => {
return n % 2 == 0;
}
@@ -908,35 +908,35 @@
printMsg(isEven, 4);
// => The number 4 is an even number: True.
-const numbers = [1, 2, 3, 4];
const sum = numbers.reduce((accumulator, curVal) => {
return accumulator + curVal;
});
console.log(sum); // 10
-const members = ["Taylor", "Donald", "Don", "Natasha", "Bobby"];
const announcements = members.map((member) => {
return member + " joined the contest.";
});
console.log(announcements);
-const numbers = [28, 77, 45, 99, 27];
numbers.forEach(number => {
console.log(number);
});
-const randomNumbers = [4, 11, 42, 14, 39];
const filteredArray = randomNumbers.filter(n => {
return n > 5;
});
-const apple = {
color: 'Green',
price: { bulk: '$3/kg', smallQty: '$4/kg' }
@@ -944,7 +944,7 @@
console.log(apple.color); // => Green
console.log(apple.price.bulk); // => $3/kg
-// 无效键名示例
const trainSchedule = {
// 由于单词之间的空格而无效。
@@ -955,13 +955,13 @@
+compartment: 'C'
}
-const classElection = {
date: 'January 12'
};
console.log(classElection.place); // undefined
-const student = {
name: 'Sheldon',
@@ -977,7 +977,7 @@
student = {}
// TypeError: TypeError:分配给常量变量。
-const person = {
name: 'Tom',
age: '22',
@@ -986,7 +986,7 @@
console.log(name); // 'Tom'
console.log(age); // '22'
-const person = {
firstName: "Matilda",
hobby: "knitting",
@@ -1000,7 +1000,7 @@
goal: "learning JavaScript"
} */
-const origNum = 8;
const origObj = {color: 'blue'};
const changeItUp = (num, obj) => {
@@ -1014,7 +1014,7 @@
// 通过引用,因此是可变的。
console.log(origObj.color);
-// 一个接受 'name','age' 和 'breed' 的工厂函数,
// 参数返回一个自定义的 dog 对象。
@@ -1029,12 +1029,12 @@
};
};
-const activity = 'Surfing';
const beach = { activity };
console.log(beach); // { activity: 'Surfing' }
-const cat = {
name: 'Pipey',
age: 8,
@@ -1044,7 +1044,7 @@
};
console.log(cat.whatName()); // => Pipey
-const engine = {
// 方法简写,有一个参数
start(adverb) {
@@ -1058,7 +1058,7 @@
engine.start('noisily');
engine.sputter();
-const myCat = {
_name: 'Dottie',
get name() {
@@ -1073,8 +1073,8 @@
// 赋值调用 setter
myCat.name = 'Yankee';
-class Dog {
constructor(name) {
@@ -1101,7 +1101,7 @@
// 调用静态方法
Dog.bark();
-class ClassStaticField {
static staticField = 'static field'
}
@@ -1109,7 +1109,7 @@
console.log(ClassStaticField.staticField)
// 预期输出值:"static field"
-class Song {
constructor() {
this.title;
@@ -1124,7 +1124,7 @@
const mySong = new Song();
mySong.play();
-// Parent class
class Media {
constructor(info) {
@@ -1145,7 +1145,7 @@
publishDate: 1975
});
-class Song {
constructor(title, artist) {
this.title = title;
@@ -1155,7 +1155,7 @@
const mySong = new Song('Bohemian Rhapsody', 'Queen');
console.log(mySong.title);
-class Song {
play() {
console.log('Playing!');
@@ -1166,9 +1166,9 @@
}
}
-// myMath.js
// 默认导出 Default export
export default function add(x,y){
@@ -1189,7 +1189,7 @@
multiply, duplicate
}
-// main.js
import add, { subtract, multiply, duplicate } from './myMath.js';
console.log(add(6, 2)); // 8
@@ -1199,7 +1199,7 @@
// index.html
<script type="module" src="main.js"></script>
-// myMath.js
function add(x,y){
return x + y
@@ -1221,7 +1221,7 @@
duplicate
}
-// main.js
const myMath = require('./myMath.js')
console.log(myMath.add(6, 2)); // 8
@@ -1229,8 +1229,8 @@
console.log(myMath.multiply(6, 2)); // 12
console.log(myMath.duplicate(5)) // 10
-创建 promises
new Promise((resolve, reject) => {
@@ -1241,30 +1241,30 @@
}
})
-promise
.then((result) => { ··· })
.catch((error) => { ··· })
-Promise.all(···)
Promise.race(···)
Promise.reject(···)
Promise.resolve(···)
-const executorFn = (resolve, reject) => {
resolve('Resolved!');
};
const promise = new Promise(executorFn);
-const loginAlert = () => {
console.log('Login');
};
setTimeout(loginAlert, 6000);
-const promise = new Promise((resolve, reject) => {
const res = true;
// 一个异步操作。
@@ -1280,7 +1280,7 @@
(err) => console.error(err)
);
-const promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Result');
@@ -1293,7 +1293,7 @@
console.error(err);
});
-const promise = new Promise(
(resolve, reject) => {
setTimeout(() => {
@@ -1309,7 +1309,7 @@
console.error(err);
});
-const promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
@@ -1326,7 +1326,7 @@
console.log(res[1]);
});
-const promise = new Promise(
resolve =>
setTimeout(() => resolve('dAlan'),100)
@@ -1343,7 +1343,7 @@
console.error(err)
});
-const promise = new Promise((resolve, reject) => {
setTimeout(() => {
@@ -1362,9 +1362,9 @@
// 将它们链接在一起
promise.then(twoStars).then(oneDot).then(print);
-function helloWorld() {
return new Promise(resolve => {
@@ -1389,7 +1389,7 @@
msg(); // Message: Hello World! <-- 2 秒后
msg1(); // Message: Hello World! <-- 2 秒后
-let pro1 = Promise.resolve(5);
let pro2 = 44;
let pro3 = new Promise(function(resolve, reject) {
@@ -1400,7 +1400,7 @@
});
// expected => Array [5, 44, "foo"]
-function helloWorld() {
return new Promise(resolve => {
setTimeout(() => {
@@ -1414,7 +1414,7 @@
}
msg(); // Message: Hello World! <-- 2 秒后
-// 数据不完整
let json = '{ "age": 30 }';
@@ -1425,7 +1425,7 @@
console.error( "Invalid JSON data!" );
}
-function helloWorld() {
return new Promise(resolve => {
setTimeout(() => {
@@ -1439,8 +1439,8 @@
}
msg(); // Message: Hello World! <-- 2 秒后
-const jsonObj = {
"name": "Rick",
"id": "11A",
@@ -1448,12 +1448,12 @@
};
另见:JSON 备忘单
-const xhr = new XMLHttpRequest();
xhr.open('GET', 'mysite.com/getjson');
XMLHttpRequest
是一个浏览器级别的 API,它使客户端能够通过 JavaScript 编写数据传输脚本,而不是 JavaScript 语言的一部分。
const req = new XMLHttpRequest();
req.responseType = 'json';
req.open('GET', '/getdata?id=65');
@@ -1462,7 +1462,7 @@
};
req.send();
-const data = { weight: '1.5 KG' };
const xhr = new XMLHttpRequest();
@@ -1481,7 +1481,7 @@
console.log(xhr.response);
}
-fetch(url, {
method: 'POST',
@@ -1499,14 +1499,14 @@
console.log(networkError.message)
})
-fetch('url-that-returns-JSON')
.then(response => response.json())
.then(jsonResponse => {
console.log(jsonResponse);
});
-fetch('url')
.then(response => {
console.log(response);
@@ -1514,7 +1514,7 @@
console.error(rejection.message);
});
-fetch('https://api-xxx.com/endpoint', {
method: 'POST',
body: JSON.stringify({id: "200"})
@@ -1529,7 +1529,7 @@
console.log(jsonResponse);
})
-const getSuggestions = async () => {
const wordQuery = inputField.value;
@@ -1558,8 +1558,6 @@ function anchorPoint() {
Array.from(document.querySelectorAll('.h2wrap-body .wrap')).forEach((elm) => elm.classList.remove('active'))
if (elm?.tagName === 'H3') {
elm?.parentElement?.parentElement?.classList.add('active');
- const box = elm?.parentElement?.parentElement;
- console.log('elm:2', box, document.querySelectorAll('.h2wrap-body .wrap'))
}
}
anchorPoint();
@@ -1570,7 +1568,6 @@ function updateAnchor(element) {
tocanchor.classList.remove('is-active-link');
});
const anchor = element || document.querySelector(`a.tocs-link[href='${decodeURIComponent(window.location.hash)}']`);
- console.log('anchor', anchor)
if (anchor) {
anchor.classList.add('is-active-link');
}
diff --git a/docs/jest.html b/docs/jest.html
index 74d9e83d..3eabf9d5 100644
--- a/docs/jest.html
+++ b/docs/jest.html
@@ -34,16 +34,16 @@
document.documentElement.setAttribute('data-color-mode', mode);
localStorage.setItem(LOCAL_NANE, mode);
}
-
Jest 是一款优雅、简洁的 JavaScript 测试框架,这里介绍了它的入门和 一些 API 的索引。
Jest v29 是一款优雅、简洁的 JavaScript 测试框架。
快照
轻松编写持续追踪大型对象的测试,并在测试旁或代码内显示实时快照。代码覆盖
无需其他操作,您仅需添加 --coverage
参数来生成代码覆盖率报告。describe('My work', () => {
test('works', () => {
@@ -74,7 +74,7 @@
})
})
-describe('My work', () => {
it('works', () => { // `it`是`test`的别名
@@ -82,7 +82,7 @@
})
})
-describe('makePoniesPink', () => {
beforeAll(() => {
@@ -103,14 +103,14 @@
})
})
-describe.only(···)
it.only(···)
// 别名: fit()
查看: test.only
-Flag | Description |
---|---|
--coverage | 查看测试覆盖率摘要 |
--detectOpenHandles | 查看未关闭端口的摘要 |
--runInBand | 一个接一个地运行所有测试 |
--bail,-b | 失败跳出测试 |
更多参数查看 Jest CLI Options
-describe.skip(···)
it.skip(···)
// 别名: xit()
查看: test.skip
-expect(value).not.toBe(value)
.toEqual(value)
@@ -155,33 +155,33 @@
expect(value).toThrow(error)
.toThrowErrorMatchingSnapshot()
-expect(value)
.toMatchSnapshot()
.toMatchInlineSnapshot()
-expect(value)
.toThrow(error)
.toThrowErrorMatchingSnapshot()
-expect(value)
.toBeInstanceOf(Class)
.toMatchObject(object)
.toHaveProperty(keyPath, value)
-expect(value)
.toContain(item)
.toContainEqual(item)
.toHaveLength(number)
-expect(value)
.toBeCloseTo(number, numDigits)
@@ -190,7 +190,7 @@
.toBeLessThan(number)
.toBeLessThanOrEqual(number)
-expect(value)
.toBeFalsy()
@@ -199,19 +199,19 @@
.toBeUndefined()
.toBeDefined()
-expect(value)
.toMatch(regexpOrString)
-test('当值为 NaN 时通过', () => {
expect(NaN).toBeNaN();
expect(1).not.toBeNaN();
});
-expect.extend(matchers)
expect.any(constructor)
@@ -219,8 +219,8 @@
expect.assertions(1)
-expect(42).toBe(42) // 严格相等 (===)
expect(42).not.toBe(3) // 严格相等 (!==)
expect([1, 2]).toEqual([1, 2]) // 深度相等
@@ -234,7 +234,7 @@
.not.toStrictEqual({ b: 2 })
-// 匹配 if 语句视为 true 的任何内容
// (not false、0、''、null、undefined、NaN)
expect('foo').toBeTruthy()
@@ -250,7 +250,7 @@
// 匹配真假
expect(true).toEqual(expect.any(Boolean))
-// 大于
expect(2).toBeGreaterThan(1)
// 大于或等于
@@ -264,7 +264,7 @@
// 原始值的传递类型
expect(NaN).toEqual(expect.any(Number))
-// 检查字符串是否与正则表达式匹配。
expect('long string').toMatch('str')
expect('string').toEqual(expect.any(String))
@@ -277,7 +277,7 @@
]
)
-expect([]).toEqual(expect.any(Array))
const exampleArray = [
'Alice', 'Bob', 'Eve'
@@ -290,7 +290,7 @@
expect([{ a: 1 }, { a: 2 }])
.toContainEqual({ a: 1 }) // 包含相等
-expect({ a:1 }).toHaveProperty('a')
expect({ a:1 }).toHaveProperty('a', 1)
expect({ a: {b:1} }).toHaveProperty('a.b')
@@ -306,7 +306,7 @@
expect.anything(),
])
-// const fn = jest.fn()
// const fn = jest.fn().mockName('Unicorn') -- 命名为 mock, Jest 22+
@@ -337,7 +337,7 @@
// fn.mock.calls[0][0] — 第一次调用的第一个参数
expect(fn.mock.calls[0][0]).toBe(2)
-toBeCalled
→ toHaveBeenCalled
toBeCalledWith
→ toHaveBeenCalledWith
lastReturnedWith
→ toHaveLastReturnedWith
nthReturnedWith
→ toHaveNthReturnedWith
// 检查对象是否是类的实例。
expect(new A()).toBeInstanceOf(A)
@@ -360,7 +360,7 @@
// 匹配除 null 或 undefined 之外的任何内容
expect('pizza').toEqual(expect.anything())
-// 这可确保某个值与最近的快照匹配。
expect(node).toMatchSnapshot()
@@ -372,7 +372,7 @@
// 确保值与最近的快照匹配。
expect(user).toMatchInlineSnapshot()
-test('resolve to lemon', () => {
// 验证在测试期间是否调用了一定数量的断言。
expect.assertions(1)
@@ -399,7 +399,7 @@
})
-// const fn = () => {
// throw new Error('Out of cheese!')
// }
@@ -422,12 +422,12 @@
// 测试函数在调用时是否抛出与最新快照匹配的错误。
expect(fn).toThrowErrorMatchingSnapshot()
-toThrowError
→ toThrow
在异步测试中指定一些预期的断言是一个很好的做法,所以如果你的断言根本没有被调用,测试将会失败。
test('async test', () => {
@@ -443,7 +443,7 @@
这将验证每个测试用例至少存在一个断言。 它还可以与更具体的 expect.assertions(3)
声明配合使用。
请参阅 Jest 文档中的 更多示例
test('async test', async () => {
expect.assertions(1)
@@ -451,7 +451,7 @@
expect(result).toBe(true)
})
-test('async test', (done) => {
expect.assertions(1)
@@ -470,7 +470,7 @@
})
将断言包装在 try/catch
块中,否则 Jest
将忽略失败
test('async test', () => {
expect.assertions(1)
@@ -480,8 +480,8 @@
})
从你的测试中 返回 一个 Promise
test('call the callback', () => {
const callback = jest.fn()
@@ -518,7 +518,7 @@
const callback = jest.fn(() => true)
-
您的模拟可以返回值:
const callback
@@ -549,7 +549,7 @@
// call 1: false
// call 2+: true
-jest.mock
方法模拟模块jest.mock
方法模拟模块// 原来的 lodash/memoize 应该存在
jest.mock(
'lodash/memoize',
@@ -563,7 +563,7 @@
)
注意:当使用 babel-jest
时,对 jest.mock
的调用将自动提升到代码块的顶部。 如果您想明确避免这种行为,请使用 jest.doMock
。
创建一个类似 __mocks__/lodash/memoize.js
的文件:
module.exports = (a) => a
@@ -571,7 +571,7 @@
jest.mock('lodash/memoize')
注意:当使用 babel-jest
时,对 jest.mock
的调用将自动提升到代码块的顶部。 如果您想明确避免这种行为,请使用 jest.doMock
。手动模拟文档
const getTitle = jest.fn(() => 'pizza')
const setTitle = jest.fn()
const location = {}
@@ -580,7 +580,7 @@
set: setTitle,
})
-const location = {}
const getTitle = jest
.spyOn(location, 'title', 'get')
@@ -589,7 +589,7 @@
.spyOn(location, 'title', 'set')
.mockImplementation(() => {})
-为使用本机计时器函数(setTimeout
、setInterval
、clearTimeout
、clearInterval
)的代码编写同步测试。
// 启用假计时器
@@ -623,7 +623,7 @@
对于特殊情况,请使用 jest.runOnlyPendingTimers()。
注意: 您应该在测试用例中调用 jest.useFakeTimers()
以使用其他假计时器方法。
-
const spy = jest.spyOn(console, 'log')
.mockImplementation(() => {})
@@ -639,7 +639,7 @@
expect(spy).toHaveBeenCalled()
spy.mockRestore()
-对于一个模拟
// 清除模拟使用日期
@@ -664,15 +664,15 @@
// 将所有模拟恢复到其原始值。
jest.restoreAllMocks()
-jest.mock('fs')
// 模拟模块
const fs = require('fs')
// 原始模块
const fs = require.requireActual('fs')
-test.each([
[1, 1, 2],
[1, 2, 3],
@@ -681,7 +681,7 @@
expect(a + b).toBe(expected)
})
-test.each`
a | b | expected
${1} | ${1} | ${2}
@@ -691,7 +691,7 @@
expect(a + b).toBe(expected)
})
-describe.each([
['mobile'], ['tablet'], ['desktop']
])('checkout flow on %s', (viewport) => {
@@ -701,19 +701,19 @@
})
describe.each() 文档、test.each() 文档
-describe.skip('makePoniesPink'...
tests.skip('make each pony pink'...
-describe.only('makePoniesPink'...
tests.only('make each pony pink'...
-const modulePath = '../module-to-test'
afterEach(() => {
jest.resetModules()
@@ -730,7 +730,7 @@
})
Node.js
和 Jest
会缓存你需要的模块。 要测试具有副作用的模块,您需要在测试之间重置模块注册表
这是理解和编写 JSON 格式配置文件的快速参考备忘单。
JSON 是一种基于文本的轻量级开放标准,专为人类可读的数据交换而设计。
.json
application/json
{
"name": "Jason",
"age": 39,
@@ -65,7 +65,7 @@
]
}
-类型 | 描述 |
---|---|
Number | 双精度浮点 |
String | 字符系列 |
Boolean | “true”或“false” |
Array | 有序的值序列 |
Value | 字符串、数字、布尔值、空值等 |
Object | 键/值对的无序集合 |
null | Null 或 Empty |
\" | 双引号 Double quote |
\\ | 反斜杠 Backslash |
\/ | 正斜杠 Forward slash |
\b | 退格 Backspace |
\f | 换页 Form feed |
\n | 换行 Newline |
\r | 回车 Carriage return |
\t | 标签 Tab |
\u | 后跟四个十六进制数字 |
{
"url": "https://quickref.me",
"msg" : "Hi,\n\"QuickRef.ME\"",
"intro": "Share quick reference and cheat sheet for developers."
}
-{ "foo": 'bar' }
Have to be delimited by double quotes
-类型 | 说明 |
---|---|
Integer | 数字 1-9、0 和正数或负数 |
Fraction | 0.3、3.9 等分数 |
Exponent | 指数,如 e、e+、e-、E、E+、E |
{
"positive" : 12,
"negative" : -1,
@@ -197,11 +197,11 @@
"zero" : 0
}
-{ "foo": 0xFF }
在JSON中,只能使用十进制文字
-{
"color": "Purple",
"id": "210",
@@ -214,11 +214,11 @@
}
用逗号分隔的多个键/值对
-[1, 2, 3, 4, 5]
以 [
开始并以 ]
结束
{
"children": [
{ "name": "Jimmy Smith", "age": 15 },
@@ -226,14 +226,14 @@
]
}
-{
"attributes": ["a1", "a2"],
"methods": ["getter", "setter"],
"empty_array": []
}
-{
"my_sequences": [
[1, 2, 3],
@@ -243,7 +243,7 @@
]
}
-{
"Mark McGwire": {
"hr": 65,
@@ -255,7 +255,7 @@
}
}
-{
"Jack": {
"id": 1,
@@ -268,8 +268,8 @@
}
}
-let myObject = {
"name": "Jason",
"last": "Doe",
@@ -310,7 +310,7 @@
myObject.name
"Jason" myObject["name"]
"Jason" myObject.age
39 myObject.other
undefined myObject[0]
undefined
-
let myObject = {
"ref": {
@@ -370,7 +370,7 @@
myObject.ref.age
2 myObject["ref"]["age"]
2 myObject.jdoe
["Jason", "Doe", 39 ...] myObject.jsmith[3]
"F" myObject[1]
undefined
-
let myArray = [
{
@@ -430,7 +430,7 @@
myArray[0]
{
"name": "Jason", ...}
myArray[1].name
"Tom" myArray[1][2]
42 myArray[3]
undefined myArray[3].gender
TypeError: Cannot read...
-
let myArray = [
"Jason",
"Doe",
@@ -463,7 +463,7 @@
myArray[1]
"Doe" myArray[5]
true myArray[6]
undefined
-
基于 Node.js 平台的下一代 web 开发框架,包含 Koa 的 API 参考列表和一些示例。
Koa 需要 node v7.6.0 或更高版本来支持ES2015、异步方法,你可以安装自己支持的 node
版本
const Koa = require('koa');
const app = new Koa();
@@ -94,7 +94,7 @@
});
app.listen(3000);
-:- | :- |
---|---|
app.env | 默认为 NODE_ENV 或 development |
app.keys | 签名 cookie 密钥数组 |
app.proxy | 何时信任真正的代理头字段 |
app.subdomainOffset | 要忽略的 .subdomains 的偏移量,默认为 2 |
app.proxyIpHeader | 代理 ip 头,默认为 X-Forwarded-For |
app.maxIpsCount | 从代理 ip 头读取的最大 ips 数,默认为 0 (表示无穷大) |
app.on('error', (err, ctx) => {
log.error('server error', err, ctx)
});
默认情况下 Koa
会将所有错误信息输出到 stderr
, 除非 app.silent
是 true
。当 err.status
是 404
或者 err.expose
时,默认错误处理程序也不会输出错误
app.use(async ctx => {
ctx; // 这是上下文 Context
ctx.request; // 这是 koa Request
ctx.response; // 这是 koa Response
});
-const Koa = require('koa');
const app = new Koa();
@@ -196,7 +196,7 @@
http.createServer(app.callback()).listen(3000);
https.createServer(app.callback()).listen(3001);
-ctx.throw(400);
ctx.throw(400, 'name required');
ctx.throw(400, 'name required', { user: user });
@@ -207,14 +207,14 @@
err.expose = true;
throw err;
-ctx.assert(
ctx.state.user,
401,
'User not found. Please login!'
);
-:- | :- |
---|---|
ctx.req | Node 的 request 对象 |
ctx.res | Node 的 response 对象 |
ctx.request | Koa 的 Request 对象 |
ctx.response | Koa 的 Response 对象 |
ctx.state | 推荐的命名空间,用于通过中间件传递信息到前端视图 |
ctx.app | 应用实例引用 |
ctx.app.emit | 发出由第一个参数定义的类型的事件 |
ctx.cookies.get(name, [options]) | 获得 cookie 中名为 name 的值 |
ctx.cookies.set(name, value, [options]) | 设置 cookie 中名为 name 的值 |
ctx.throw([status], [msg], [properties]) | 抛出包含 .status 属性的错误,默认为 500 |
ctx.assert(value, [status], [msg], [properties]) | 当 !value 时, Helper 方法抛出一个类似 .throw() 的错误 |
ctx.respond | 避免使用 Koa 的内置响应处理功能,您可以直接赋值 this.repond = false |
:- | :- |
---|---|
maxAge | 表示从Date开始的毫秒数 now() 到期。 |
expires | 一个 Date 对象,指示 cookie 的到期日期(默认情况下在会话结束时到期) |
path | 表示 cookie 路径的字符串(默认为/ ) |
domain | 表示 cookie 的域的字符串(无默认值) |
secure | 一个布尔值,指示 cookie 是否只通过HTTPS发送(HTTP默认为false,HTTPS默认为true)。阅读有关此选项的更多信息 |
httpOnly | 一个布尔值,指示cookie是否只通过HTTP(S)发送,而不可用于客户端 JavaScript(默认为true) |
sameSite | 一个布尔值或字符串,指示cookie是否为“同一站点”cookie(默认为false)。这可以设置为“strict”、“lax”、“none”或true(映射为“strect”) |
signed | 一个布尔值,指示是否对cookie进行签名(默认为false)。如果这是真的,还将发送另一个附加了.sig后缀的同名cookie,其中一个27字节的url安全base64 SHA1值表示cookie name=cookie值相对于第一个Keygrip键的哈希值。此签名密钥用于在下次收到cookie时检测篡改 |
overwrite | 一个布尔值,指示是否覆盖以前设置的同名 cookie (默认为false)。如果为true,则在设置此Cookie时,将从set-Cookie标头中筛选出在同一请求期间设置的具有相同名称的所有Cookie(无论路径或域如何) |
:- | :- |
---|---|
request.header | 请求头对象 |
request.header= | 设置请求头对象 |
request.headers | 请求头对象。等价于 request.header. |
request.headers= | 设置请求头对象。 等价于request.header=. |
request.method | 请求方法 |
request.method= | 设置请求方法, 在实现中间件时非常有用,比如 methodOverride() |
request.length | 以数字的形式返回 request 的内容长度(Content-Length),或者返回 undefined。 |
request.url | 获得请求url地址. |
request.url= | 设置请求地址,用于重写url地址时 |
request.originalUrl | 获取请求原始地址 |
request.origin | 获取URL原始地址, 包含 protocol 和 host |
request.href | 获取完整的请求URL, 包含 protocol, host 和 url |
request.path | 获取请求路径名 |
request.path= | 设置请求路径名并保留当前查询字符串 |
request.querystring | 获取查询参数字符串(url中?后面的部分),不包含? |
request.querystring= | 设置原始查询字符串 |
request.search | 获取查询参数字符串,包含? |
request.search= | 设置原始查询字符串 |
request.host | 获取 host (hostname:port)。 当 app.proxy 设置为 true 时,支持 X-Forwarded-Host |
request.hostname | 获取 hostname。当 app.proxy 设置为 true 时,支持 X-Forwarded-Host。 |
request.URL | 获取 WHATWG 解析的对象. |
request.type | 获取请求 Content-Type,不包含像 "charset" 这样的参数。 |
request.charset | 获取请求 charset,没有则返回 undefined |
request.query | 将查询参数字符串进行解析并以对象的形式返回,如果没有查询参数字字符串则返回一个空对象 |
request.query= | 根据给定的对象设置查询参数字符串 |
request.fresh | 检查请求缓存是否 "fresh"(内容没有发生变化) |
request.stale | 与 req.fresh 相反 |
request.protocol | 返回请求协议,"https" 或者 "http" |
request.secure | 简化版 this.protocol == "https",用来检查请求是否通过 TLS 发送 |
request.ip | 请求远程地址,当 app.proxy 设置为 true 时,支持 X-Forwarded-Host |
request.ips | 当 X-Forwarded-For 存在并且 app.proxy 有效,将会返回一个有序(从 upstream 到 downstream)ip 数组 |
request.subdomains | 以数组形式返回子域名 |
request.is(types...) | 检查请求所包含的 "Content-Type" 是否为给定的 type 值 |
request.accepts(types) | 检查给定的类型 types(s) 是否可被接受,当为 true 时返回最佳匹配,否则返回 false |
request.acceptsEncodings(encodings) | 检查 encodings 是否可以被接受,当为 true 时返回最佳匹配,否则返回 false |
request.acceptsCharsets(charsets) | 检查 charsets 是否可以被接受,如果为 true 则返回最佳匹配,否则返回 false |
request.acceptsLanguages(langs) | 检查 langs 是否可以被接受,如果为 true 则返回最佳匹配,否则返回 false |
request.idempotent | 检查请求是否为幂等(idempotent) |
request.socket | 返回请求的socket |
request.get(field) | 返回请求头 |
:- | :- |
---|---|
response.header | Response header 对象 |
response.headers | Response header 对象。等价于 response.header. |
response.socket | Request socket. |
response.status | 获取响应状态。 默认情况下,response.status设置为404,而不像node's res.statusCode默认为200。 |
response.status= | 通过数字设置响应状态 |
response.message | 获取响应状态消息。默认情况下, response.message关联response.status。 |
response.message= | 将响应状态消息设置为给定值。 |
response.length= | 将响应Content-Length设置为给定值。 |
response.length | 如果 Content-Length 作为数值存在,或者可以通过 ctx.body 来进行计算,则返回相应数值,否则返回 undefined。 |
response.body | 获取响应体。 |
response.body= | 设置响应体为如 string ,Buffer ,Stream ,Object|Array ,null |
response.get(field) | 获取 response header 中字段值,field 不区分大小写 |
response.set(field, value) | 设置 response header 字段 field 的值为 value |
response.append(field, value) | 添加额外的字段field 的值为 val |
response.set(fields) | 使用对象同时设置 response header 中多个字段的值 |
response.remove(field) | 移除 response header 中字段 filed |
response.type | 获取 response Content-Type,不包含像"charset"这样的参数 |
response.type= | 通过 mime 类型的字符串或者文件扩展名设置 response Content-Type |
response.is(types...) | 跟 ctx.request.is() 非常类似。用来检查响应类型是否是所提供的类型之一 |
response.redirect(url, [alt]) | 执行 [302] 重定向到对应 url |
response.attachment([filename]) | 设置 "attachment" 的 Content-Disposition,用于给客户端发送信号来提示下载 |
response.headerSent | 检查 response header 是否已经发送,用于在发生错误时检查客户端是否被通知。 |
response.lastModified | 如果存在 Last-Modified,则以 Date 的形式返回。 |
response.lastModified= | 以 UTC 格式设置 Last-Modified。您可以使用 Date 或 date 字符串来进行设置。 |
response.etag= | 设置 包含 "s 的 ETag |
response.vary(field) | 不同于field. |
response.flushHeaders() | 刷新任何设置的响应头,并开始响应体 |
以下访问器和别名与 Request 等价:
ctx.header
ctx.acceptsLanguages()
ctx.get()
以下访问器和别名与 Response 等价:
ctx.body
ctx.lastModified=
ctx.etag=
// freshness 检查需要状态 20x 或 304
ctx.status = 200;
ctx.set('ETag', '123');
@@ -689,7 +689,7 @@
// 获取新数据
ctx.body = await db.find('something');
-// Content-Type: text/html; charset=utf-8
ctx.is('html'); // => 'html'
ctx.is('text/html'); // => 'text/html'
@@ -704,7 +704,7 @@
ctx.is('html'); // => false
-// 接受: text/*, application/json
ctx.accepts('html');
// => "html"
@@ -715,7 +715,7 @@
ctx.accepts('application/json');
// => "application/json"
-// Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5
ctx.acceptsCharsets('utf-8', 'utf-7');
// => "utf-8"
@@ -724,14 +724,14 @@
// => "utf-8"
检查 charsets
是否可以被接受,如果为 true
则返回最佳匹配, 否则返回 false
ctx.set({
'Etag': '1234',
'Last-Modified': date
});
使用对象同时设置 response header 中多个字段的值
-const ct = ctx.type;
// => "image/png"
@@ -749,8 +749,6 @@ function anchorPoint() {
Array.from(document.querySelectorAll('.h2wrap-body .wrap')).forEach((elm) => elm.classList.remove('active'))
if (elm?.tagName === 'H3') {
elm?.parentElement?.parentElement?.classList.add('active');
- const box = elm?.parentElement?.parentElement;
- console.log('elm:2', box, document.querySelectorAll('.h2wrap-body .wrap'))
}
}
anchorPoint();
@@ -761,7 +759,6 @@ function updateAnchor(element) {
tocanchor.classList.remove('is-active-link');
});
const anchor = element || document.querySelector(`a.tocs-link[href='${decodeURIComponent(window.location.hash)}']`);
- console.log('anchor', anchor)
if (anchor) {
anchor.classList.add('is-active-link');
}
diff --git a/docs/lerna.html b/docs/lerna.html
index 87e4895b..a474fbca 100644
--- a/docs/lerna.html
+++ b/docs/lerna.html
@@ -34,15 +34,15 @@
document.documentElement.setAttribute('data-color-mode', mode);
localStorage.setItem(LOCAL_NANE, mode);
}
-本备忘单旨在快速理解 Lerna v6 所涉及的主要概念,显示了它的常用命令使用清单。
现代构建系统,用于管理和发布来自同一存储库的多个 JavaScript/TypeScript 包。
$ npx lerna@latest init
@@ -65,7 +65,7 @@
├── lerna.json
└── package.json
-它在 package.json
中依赖于它们,如下所示:
"dependencies": {
@@ -88,7 +88,7 @@
);
}
-{
"$schema": "node_modules/lerna/schemas/lerna-schema.json",
"useWorkspaces": true,
@@ -97,7 +97,7 @@
在 lerna.json
中配置 useWorkspaces
告诉 Lerna
将包链接过程委托给你的包管理器 (此功能由 npm、yarn 和 pnpm 支持)。
npx lerna run test --scope=header # 单个
多个任务运行
@@ -106,8 +106,8 @@忽略 header
,footer
其它包中运行任务运行
npx lerna run build --ignore=header,footer
-# 在所有包含它的包中运行 npm run my-script
$ lerna run <script> -- [..args]
$ lerna run test
@@ -165,7 +165,7 @@
:- :- --npm-client <client>
#必须是知道如何运行 npm 生命周期脚本的可执行文件,默认值是 npm
--stream
#立即从子进程流式输出,以原始包名称为前缀 --parallel
#类似于 --stream
但完全忽略并发和拓扑排序,立即在所有匹配的包中运行给定的命令或脚本,并带有前缀流输出 --no-bail
#默认情况下,如果任何脚本运行返回非零退出代码,lerna run
将退出并出现错误。传递 --no-bail
以禁用此行为 --no-prefix
#当输出为流式传输(--stream
或 --parallel
)时禁用包名称前缀。当将结果传送到其他进程(例如编辑器插件)时,此选项很有用 --profile
#分析脚本执行并生成性能配置文件 --profile-location <location>
#您可以为性能配置文件输出提供自定义位置。提供的路径将相对于当前工作目录进行解析。 useNx=false
#通过将 useNx
设置为 false
,您可以使用 lerna
中的遗留任务运行实现 (p-map
和 p-queue
),而不是使用由 Nx 提供支持的默认现代任务运行器实现。
-
# 发布自上次发布以来已更改的软件包
$ lerna publish
@@ -271,7 +271,7 @@
:- :- --canary
#使用此标志运行时,以更精细的方式(每次提交)发布包 --contents <dir>
#要发布的子目录。 必须适用于所有包,并且必须包含 package.json
文件 --dist-tag <tag>
#使用此标志运行时,将使用给定的 npm dist-tag
(默认为 latest
)发布到 npm
--git-head <sha>
#打包 tarball
时将显式 SHA
设置为清单上的 gitHead
,仅允许使用 from-package
位置 --graph-type <all|dependencies>
#设置在构建包图时使用哪种依赖项。默认值是依赖项,即仅包含包的 package.json
的依赖项部分中列出的包 --ignore-scripts
#传递时,此标志将在 lerna
发布期间禁用运行生命周期脚本 --ignore-prepublish
#传递时,此标志将禁用在 lerna
发布期间运行已弃用的预发布脚本 --legacy-auth
#发布需要身份验证的包时,您正在使用仅使用旧版 Base64
用户名:密码
的内部托管 NPM 注册表。这与 NPM 发布 _auth
标志相同 --no-git-reset
#默认情况下,lerna publish
确保对工作树的任何更改都已重置 --no-granular-pathspec
#默认情况下,lerna publish
将尝试(如果启用)git checkout
仅在发布过程中临时修改的叶包清单 --verify-access
#从历史上看,lerna
试图通过使用给定令牌执行一些抢占式 npm API
请求来快速解决授权/身份验证问题 --otp
#发布需要双重身份验证的包时,您可以使用 --otp
指定一次性密码 --preid
#与同名的 lerna
版本选项不同,该选项只适用于 --canary
版本计算 --pre-dist-tag <tag>
#与 --dist-tag
的工作方式相同,但仅适用于使用预发布版本发布的软件包 --registry <url>
#使用此标志运行时,转发的 npm
命令将为您的包使用指定的注册表 --tag-version-prefix
#此选项允许提供自定义前缀而不是默认前缀:v
--temp-tag
#传递时,此标志将更改默认发布过程,首先将所有更改的包发布到临时 dist-tag(lerna-temp)
,然后将新版本移动到 --dist-tag
配置的 dist-tag
(默认latest
) --yes
#使用此标志运行时,lerna publish
将跳过所有确认提示
-
:- | :- |
---|---|
--no-verify-access # | 旧的抢先访问验证现在默认关闭,因此不需要 --no-verify-access |
--skip-npm # | 直接调用 lerna version |
$ lerna version 1.0.1 # 明确的
$ lerna version patch # semver 关键字
@@ -470,7 +470,7 @@
:- :- --allow-branch <glob>
#与启用 lerna version
的 git
分支匹配的 glob
白名单 --amend
#使用此标志运行时,lerna version
将在当前提交上执行所有更改,而不是添加新的 --changelog-preset
#默认情况下,更改日志预设设置为 angular --conventional-commits
#使用常规提交规范来确定版本 bump 并生成 CHANGELOG.md 文件 --conventional-graduate
#将使用 *
对指定的包(逗号分隔)或所有包进行分级 --conventional-prerelease
#预发布版本发布指定的包 --create-release <type>
#根据更改的包创建正式的 GitHub
或 GitLab
版本 --exact
#在更新的包中精确指定更新的依赖项(没有标点符号),而不是与 semver 兼容(使用^
) --force-publish
#强制发布指定的包 --git-remote <name>
#把 git
更改推送到指定的远程位置,而不是origin
--ignore-changes
#检测更改的包时忽略与 glob
匹配的文件中的更改 --ignore-scripts
#禁用在 lerna version
期间运行的生命周期脚本 --include-merged-tags
#在检测到更改的包时包括来自合并分支的标签 --message <msg>
#此选项别名为 -m
以与 git commit
进行奇偶校验 --no-changelog
#使用常规提交时,不要生成任何 CHANGELOG.md 文件 --no-commit-hooks
#允许 git commit hooks
在提交版本更改时运行。通过 --no-commit-hooks
禁用此行为 --no-git-tag-version
#将提交对 package.json
文件的更改并标记发布。通过 --no-git-tag-version
禁用该行为 --no-granular-pathspec
#仅添加在版本控制过程中更改的叶包清单(可能还有变更日志)。这产生了 git add --packages/*/package.json
的等价物,但针对更改的内容量身定制 --no-private
#在选择版本、提交和标记版本时包含私有包。通过 --no-private
禁用此行为 --no-push
#将已提交和标记的更改推送到配置的 git remote
。通过 --no-push
禁用此行为 --preid
#使用此标志运行时,lerna 版本将使用指定的预发布标识符增加 premajor
、preminor
、prepatch
或 prerelease
semver bumps --sign-git-commit
#此选项类似于同名的 npm 版本选项 --sign-git-tag
#此选项类似于同名的 npm
版本选项 --force-git-tag
#此选项替换任何现有标记而不是失败 --tag-version-prefix
#此选项允许提供自定义前缀而不是默认前缀:v
--yes
#使用此标志运行时,lerna
版本将跳过所有确认提示
-
将本地包链接
在一起,并安装
其余的包依赖项
$ lerna bootstrap -- --production \
--no-optional
@@ -527,7 +527,7 @@
:- :- --hoist [glob]
#在 repo
根目录安装与 glob
匹配的外部依赖项,以便它们可用于所有包 --strict
#与提升 (hoist) 一起使用时,会在发出版本警告后抛出错误并停止引导 --nohoist [glob]
#不要在 repo
根目录安装与 glob
匹配的外部依赖项。这可用于选择不提升某些依赖项 --ignore
#当与 bootstrap
命令一起使用时,还可以在 lerna
中设置 --ignore
标志
-
:- | :- |
---|---|
--ignore-prepublish # | 跳过默认在引导程序包中运行的预发布生命周期脚本 |
--ignore-scripts # | 跳过通常在引导程序包中运行(准备等)的任何生命周期脚本 |
--registry <url> # | 指定 npm 包的仓库地址 |
--npm-client <client> # | 必须是知道如何安装 npm 包依赖项的可执行文件 |
--use-workspaces # | 启用与 Yarn Workspaces 的集成(从 yarn@0.27+ 开始可用) |
--no-ci # | 在 CI 环境中调用 npm ci 而不是 npm install |
--force-local # | 此标志会导致引导命令始终对本地依赖项进行符号链接,而不管匹配的版本范围如何 |
$ lerna info
lerna notice cli v6.0.0
@@ -585,7 +585,7 @@
npmPackages:
lerna: ^6.0.0 => 6.0.0
-$ lerna exec --scope my-component -- ls -la
$ lerna run --scope toolbar-* test
@@ -609,7 +609,7 @@
# 所有匹配 “package-util-*” 的包都将被忽略,除非它们是
# 依赖于名称与 “package-*” 匹配的包
-:- | :- |
---|---|
--scope <glob> # | 仅包括名称与给定 glob 匹配的包 |
--ignore <glob> # | 排除名称与给定 glob 匹配的包 |
--no-private # | 排除私有包 |
--since [ref] # | 仅包括自指定 ref 以来已更改的包 |
--exclude-dependents # | 使用 --since 运行命令时排除所有传递依赖项,覆盖默认的“changed”算法 |
--include-dependents # | 无论 --scope 、--ignore 或 --since 是什么,在运行命令时都包括所有传递依赖项 |
--include-dependencies # | 无论 --scope 、--ignore 或 --since # 是什么,在运行命令时都包括所有传递依赖项 |
--include-merged-tags # | 使用 --since 运行命令时包括来自合并分支的标签 |
列出本地程序包,也尊重所有可用的过滤选项
# 与 lerna list 相同,它本身类似于 ls 命令
lerna ls
@@ -661,7 +661,7 @@
# 相当于 lerna ls -la,显示所有包(包括私有包)
lerna la
-创建新的 Lerna 仓库或将现有仓库升级到当前版本 Lerna
lerna
不存在,请将其添加到 package.json
中的 devDependency
将依赖项添加到匹配的包
$ lerna add <package>[@version] \
@@ -864,28 +864,28 @@
# 在所有模块中安装 babel-core
$ lerna add babel-core
-比较自上次发布以来的所有包或单个包
$ lerna diff [package]
$ lerna diff
$ lerna diff package-name # 区分一个特定的包
类似于 lerna changed
,此命令运行 git diff
从所有包中删除 node_modules
目录
$ lerna clean
接受所有过滤选项。lerna clean
不会从根 node_modules
目录中删除模块,即使您启用了 --hoist
选项
运行设置基本缓存选项的向导
$ lerna add-caching
-更新配置文件以匹配当前安装的 lerna 版本
$ npm i lerna@latest
$ lerna repair
@@ -904,8 +904,6 @@ function anchorPoint() {
Array.from(document.querySelectorAll('.h2wrap-body .wrap')).forEach((elm) => elm.classList.remove('active'))
if (elm?.tagName === 'H3') {
elm?.parentElement?.parentElement?.classList.add('active');
- const box = elm?.parentElement?.parentElement;
- console.log('elm:2', box, document.querySelectorAll('.h2wrap-body .wrap'))
}
}
anchorPoint();
@@ -916,7 +914,6 @@ function updateAnchor(element) {
tocanchor.classList.remove('is-active-link');
});
const anchor = element || document.querySelector(`a.tocs-link[href='${decodeURIComponent(window.location.hash)}']`);
- console.log('anchor', anchor)
if (anchor) {
anchor.classList.add('is-active-link');
}
diff --git a/docs/lessjs.html b/docs/lessjs.html
index 101160df..18aaa1d4 100644
--- a/docs/lessjs.html
+++ b/docs/lessjs.html
@@ -34,13 +34,13 @@
document.documentElement.setAttribute('data-color-mode', mode);
localStorage.setItem(LOCAL_NANE, mode);
}
-
本备忘单旨在快速理解 Less 所涉及的主要概念,显示了它的常用方法使用清单。
@width: 10px;
@height: @width + 10px;
@@ -71,7 +71,7 @@
}
另见: 变量的更多信息
-.bordered {
border-top: dotted 1px black;
border-bottom: solid 2px black;
@@ -88,7 +88,7 @@
}
另见: 混合(Mixin)的更多信息
-#header {
color: black;
}
@@ -110,7 +110,7 @@
}
}
-.button {
color: blue;
&-ok {
@@ -132,7 +132,7 @@
color: green;
}
-.component {
width: 300px;
@@ -168,7 +168,7 @@
}
-算术运算符 +
、-
、*
、/
对任何数字、颜色或变量进行运算
@conversion-1: 5cm + 10mm; // 结果是 6cm
@@ -188,13 +188,13 @@
background-color: (#FFFFFF / 16);
// 结果是 #101010
-为了与 CSS
保持兼容,calc()
并不对数学表达式进行计算,但是在嵌套函数中会计算变量和数学公式的值
@var: 50vh/2;
width: calc(50% + (@var - 20px));
// 结果是 calc(50% + (25vh - 20px))
-@min768: ~"(min-width: 768px)";
.element {
@@ -219,7 +219,7 @@
}
在 Less 3.5+ 版本中,许多以前需要“引号转义”的情况就不再需要了
-@base: #f04615;
@width: 0.5;
@@ -231,7 +231,7 @@
}
Less 内置了多种函数用于转换颜色、处理字符串、算术运算等
-#bundle() {
.button {
display: block;
@@ -252,7 +252,7 @@
// 还可以书写为 #bundle > .button 形式
}
-#colors() {
primary: blue;
secondary: green;
@@ -270,7 +270,7 @@
}
另见:映射(Maps)
-@var: red;
#page {
@@ -291,7 +291,7 @@
}
另见:懒加载
-/* 一个块注释
* style comment! */
@var: red;
@@ -300,12 +300,12 @@
@var: white;
块注释和行注释都可以使用
-@import "library"; // library.less
@import "typo.css";
-nav ul {
&:extend(.inline);
@@ -324,8 +324,8 @@
color: red;
}
-@bg: black;
@bg-light: boolean(luma(@bg) > 50%);
@@ -340,7 +340,7 @@
color: white;
}
-replace("Hello, Mars?", "Mars\?", "Earth!");
replace("One + one = 4", "one", "2", "gi");
@@ -386,7 +386,7 @@
'This is a new string.';
bar-2;
-@list: "banana", "tomato", "potato", "peach";
n: length(@list);
@@ -394,7 +394,7 @@
n: 4;
返回值列表中的元素数
-@list: apple, pear, coconut, orange;
value: extract(@list, 3);
@@ -402,14 +402,14 @@
value: coconut;
返回列表中指定位置的值
-value: range(4);
// 输出 value: 1 2 3 4;
value: range(10px, 30px, 10);
// 输出 value: 10px 20px 30px;
生成跨越一系列值的列表
-@selectors: blue, green, red;
@@ -450,7 +450,7 @@
}
将规则集的评估绑定到列表的每个成员
-set-2() {
one: blue;
two: green;
@@ -470,7 +470,7 @@
three-3: red;
}
-range
和 each
创建一个 for
循环range
和 each
创建一个 for
循环each(range(4), {
.col-@{value} {
height: (@value * 50px);
@@ -491,7 +491,7 @@
height: 200px;
}
-:- | :- |
---|---|
ceil(2.4) (输出 3) | 向上舍入到下一个最大整数 # |
floor(2.6) (输出 2) | 向下舍入到下一个最小整数 # |
percentage(0.5) (输出 50%) | 将浮点数转换为百分比字符串 # |
round(1.67) (输出 2) | 应用舍入 # |
sqrt(25cm) (输出 5cm) | 计算数字的平方根。保持单位不变 # |
abs(25cm) (输出 25cm) | 计算数字的绝对值。 保持单位不变 # |
sin(1deg) (输出 0.01745240643728351) | 计算正弦函数 # |
asin(-0.8414709848078965) (输出 -1rad) | 计算反正弦(正弦的倒数)函数 # |
cos(1deg) (输出 0.9998476951563913) | 计算余弦函数 # |
acos(0.5403023058681398) (输出 1rad) | 计算反余弦(余弦的倒数)函数 # |
tan(1deg) (输出 0.017455064928217585) | 计算正切函数 # |
atan(-1.5574077246549023) (输出 -1rad) | 计算反正切(正切的倒数)函数 # |
pi() (输出 3.141592653589793) | π (pi) # |
pow(0cm, 0px) (输出 1cm) | 返回第一个参数的第二个参数次幂的值 # |
mod(11cm, 6px) (输出 5cm) | 返回第一个参数模数第二个参数的值 # |
min(5, 10) (输出 5) | 返回一个或多个值中的最小值 # |
max(5, 10) (输出 10) | 返回一个或多个值中的最大值 # |
这个快速参考备忘单提供了使用 lsof 命令的各种方法。
lsof 表示 L
is
t O
pen F
iles 用于查找哪个进程打开了哪些文件
$ lsof
$ sudo lsof -u root
-$ lsof -i :8080
$ lsof -i :80 -i :22
$ lsof -i TCP:22
@@ -54,38 +54,38 @@
$ lsof -i UDP
$ lsof -i @192.168.1.5
-$ lsof -c mysql
$ lsof -c java
$ lsof -c ssh
$ lsof -c nginx
$ lsof -c ssh -c httpd
-$ lsof -u www-data
$ lsof -u www-data -u ubuntu
$ lsof -i -u ^root # 特定用户除外
-$ lsof -i 4 # 仅 IPv4
$ lsof -i 6 # 仅 IPv6
-$ lsof -p 1753
$ lsof -p ^3 # 除了某些pid
-$ lsof /var/log/messages
$ lsof /etc/passwd
-$ lsof +D /var/log # 在目录内
-$ kill -9 `lsof -t -u apache`
$ kill -9 $(lsof -t -i :8080)
--a # 列出打开文件存在的进程;
-c<进程名> # 列出指定进程所打开的文件;
@@ -100,17 +100,17 @@
-h # 显示帮助信息;
-v # 显示版本信息
-lsof -p $pid
-lsof -i:9981 -P -t -sTCP:LISTEN
-lsof $filename
-$ lsof
command PID USER FD type DEVICE SIZE NODE NAME
@@ -127,7 +127,7 @@
migration 2 root rtd DIR 8,2 4096 2 /
migration 2 root txt unknown /proc/2/exe
-:- | :- |
---|---|
cwd | 表示当前工作目录,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改 |
txt | 该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序 |
lnn | 库引用 (AIX); |
er | FD 信息错误(参见名称栏) |
jld | jail 目录 (FreeBSD); |
ltx | 共享库文本(代码和数据) |
mxx | 十六进制内存映射类型编号xx |
m86 | DOS合并映射文件 |
mem | 内存映射文件 |
mmap | 内存映射设备 |
pd | 父目录 |
rtd | 根目录 |
tr | 内核跟踪文件 (OpenBSD) |
v86 | VP/ix 映射文件 |
0 | 表示标准输出 |
1 | 表示标准输入 |
2 | 表示标准错误 |
:- | :- |
---|---|
COMMAND | 进程的名称 |
PID | 进程标识符 |
PPID | 父进程标识符(需要指定-R参数) |
USER | 进程所有者 |
PGID | 进程所属组 |
FD | 文件描述符,应用程序通过它识别该文件 |
:- | :- |
---|---|
u | 表示该文件被打开并处于读取/写入模式 |
r | 表示该文件被打开并处于只读模式 |
w | 表示该文件被打开并处于写入模式 |
空格 | 表示该文件的状态模式为 unknow,且没有锁定 |
- | 表示该文件的状态模式为 unknow,且被锁定 |
一般在标准输出/输入/错误后还跟着文件状态模式
-:- | :- |
---|---|
N | 对于未知类型的Solaris NFS锁 |
r | 用于部分文件的读取锁定 |
R | 对整个文件进行读取锁定 |
w | 对文件的一部分进行写锁定(文件的部分写锁) |
W | 对整个文件进行写锁定(整个文件的写锁) |
u | 用于任何长度的读写锁 |
U | 对于未知类型的锁 |
x | 对于文件部分的SCO OpenServer Xenix锁 |
X | 对于整个文件的SCO OpenServer Xenix锁 |
space | 如果没有锁 |
在文件状态模式后面,还跟着相关的锁
-标识 | 说明 |
---|---|
DIR | 表示目录 |
CHR | 表示字符类型 |
BLK | 块设备类型 |
UNIX | UNIX 域套接字 |
FIFO | 先进先出 (FIFO) 队列 |
IPv4 | 网际协议 (IP) 套接字 |
DEVICE | 指定磁盘的名称 |
SIZE | 文件的大小 |
NODE | 索引节点(文件在磁盘上的标识) |
NAME | 打开文件的确切名称 |
REG | 常规文件 |
这是 Markdown 语法的快速参考备忘单。
# h1
## h2
### h3
@@ -49,21 +49,21 @@
##### h5
###### h6
-Header 1
========
Header 2
--------
-> 这是一个
> 块引用
>
> > 嵌套
> > 块引用
-* Item 1
* Item 2
@@ -82,13 +82,13 @@
- [ ] Checkbox off
- [x] Checkbox on
-
1. Item 1
2. Item 2
a. item 3a
b. item 3b
-[link](http://google.com)
[link][google]
@@ -96,12 +96,12 @@
<http://google.com>
-*斜体* _斜体_ **粗体** __粗体__
`内联代码` ~~删除~~
-连字符
---
@@ -112,13 +112,13 @@
下划线
___
-
在当前行的结尾加 2 个空格··
这行就会新起一行\
反斜杠也可以换行
尾部添加两个空格,或者添加 \
反斜杠
```javascript
console.log("This is a block code")
```
@@ -129,10 +129,10 @@
4 空格缩进做一个代码块
-`Inline code` 周围有反引号
-| 左栏 | 中间栏 | 右栏 |
| ----------| ------------ | --------- |
| 单元格 1 | 居中 | $1600 |
@@ -145,7 +145,7 @@
单元格 2 | 单元格 3 | $12
Markdown 表格生成器:tableconvert.com
-这是一个简单的脚注[^1]。
一个脚注也可以有多行[^2]。
@@ -159,23 +159,23 @@
推荐使用数字命名脚注,但文本更容易识别和链接。
脚注使用了不同的语法,使用 4 个空格作为新行。
-

-[](https://github.com/)
[](link_url)
-![替代文字][logo]
[logo]: /images/logo.png "Logo Title"
-字符 | 转义 | 描述 |
---|---|---|
\ | \\ | backslash 反斜杠 |
` | \` | backtick 反引号 |
* | \* | asterisk 星号 |
_ | \_ | underscore 下划线 |
{} | \{} | curly braces 花括号 |
[] | \[] | square brackets 方括号 |
() | \() | parentheses 圆括号 |
# | \# | hash mark 哈希标记 |
+ | \+ | plus sign 加号 |
- | \- | minus sign (hyphen) 减号(连字符) |
. | \. | dot 点 |
! | \! | exclamation mark 感叹号 |
目前只支持部分段内 HTML 元素效果,包括 <kdb>, <b>, <i>, <em>, <sup>, <sub>, <br>
-此备忘单列出了一些常见的 Web MIME 类型。 您可以查看包含所有已注册 MIME 类型的 IANA/MIME 媒体类型注册表。
扩展名 | MIME 类型(内容类型) | 文件种类 |
---|---|---|
.aac | audio/aac | AAC 音频 |
.abw | application/x-abiword | AbiWord 文档 |
.arc | application/x-freearc | 存档文档(嵌入多个文件) |
.avi | video/x-msvideo | AVI: 音频视频交错 |
.azw | application/vnd.amazon.ebook | 亚马逊 Kindle 电子书格式 |
.bin | application/octet-stream | 任何类型的二进制数据 |
.bmp | image/bmp | Windows OS/2 位图图形 |
.bz | application/x-bzip | BZip 存档 |
.bz2 | application/x-bzip2 | BZip2 存档 |
.csh | application/x-csh | C-Shell 脚本 |
.css | text/css | 级联样式表 (CSS) |
.csv | text/csv | 逗号分隔值 (CSV) |
.doc | application/msword | 微软 Word |
.docx | application/vnd.openxmlformats-officedocument.wordprocessingml.document | 微软 Word (OpenXML) |
.eot | application/vnd.ms-fontobject | MS 嵌入式 OpenType 字体 |
.epub | application/epub+zip | 电子出版物 (EPUB) |
.gz | application/gzip | GZip 压缩存档 |
.gif | image/gif | 图形交换格式 (GIF) |
.htm .html | text/html | 超文本标记语言 (HTML) |
.ico | image/vnd.microsoft.icon | 图标格式 |
.ics | text/calendar | iCalendar 格式 |
.jar | application/java-archive | Java 存档 (JAR) |
.jpeg .jpg | image/jpeg | JPEG 图像 |
.js | text/javascript | JavaScript |
.json | application/json | JSON格式 |
.jsonld | application/ld+json | JSON-LD 格式 |
.mid .midi | audio/midi audio/x-midi | 乐器数字接口 (MIDI) |
.mjs | text/javascript | JavaScript 模块 |
.mp3 | audio/mpeg | MP3 音频 |
.mpeg | video/mpeg | MPEG 视频 |
.mpkg | application/vnd.apple.installer+xml | Apple 安装程序包 |
.odp | application/vnd.oasis.opendocument.presentation | OpenDocument 演示文档 |
.ods | application/vnd.oasis.opendocument.spreadsheet | OpenDocument 电子表格文档 |
.odt | application/vnd.oasis.opendocument.text | OpenDocument 文本文档 |
.oga | audio/ogg | OGG 音频 |
.ogv | video/ogg | OGG 视频 |
.ogx | application/ogg | OGG |
.opus | audio/opus | Opus 音频 |
.otf | font/otf | OpenType 字体 |
.png | image/png | 便携式网络图形 |
application/pdf | Adobe 便携式文档格式 (PDF) | |
.php | application/php | 超文本预处理器(个人主页) |
.ppt | application/vnd.ms-powerpoint | 微软PowerPoint |
.pptx | application/vnd.openxmlformats-officedocument.presentationml.presentation | 微软 PowerPoint (OpenXML) |
.rar | application/vnd.rar | RAR 存档 |
.rtf | application/rtf | 富文本格式 (RTF) |
.sh | application/x-sh | Bourne shell 脚本 |
.svg | image/svg+xml | 可缩放矢量图形 (SVG) |
.swf | application/x-shockwave-flash | 小型 Web 格式 (SWF) 或 Adobe Flash 文档 |
.tar | application/x-tar | Tape 存档 (TAR) |
.tif .tiff | image/tiff | 标记图像文件格式 (TIFF) |
.ts | video/mp2t | MPEG 传输流 |
.ttf | font/ttf | TrueType 字体 |
.txt | text/plain | 文本,(通常为 ASCII 或 ISO 8859-n) |
.vsd | application/vnd.visio | 微软 Visio |
.wav | audio/wav | Waveform 音频格式 |
.weba | audio/webm | WEBM 音频 |
.webm | video/webm | WEBM视频 |
.webp | image/webp | WEBP图像 |
.woff | font/woff | Web 开放字体格式 (WOFF) |
.woff2 | font/woff2 | Web 开放字体格式 (WOFF) |
.xhtml | application/xhtml+xml | XHTML |
.xls | application/vnd.ms-excel | Microsoft Excel |
.xlsx | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | Microsoft Excel (OpenXML) |
.xml | application/xml 如果临时用户不可读(RFC 3023,第 3 节) text/xml,如果临时用户可读(RFC 3023,第 3 节) | XML |
.xul | application/vnd.mozilla.xul+xml | XUL |
.zip | application/zip | ZIP 档案 |
.3gp | video/3gpp audio/3gpp 如果它不包含视频 | 3GPP 音视频容器 |
.3g2 | video/3gpp2 audio/3gpp2 如果它不包含视频 | 3GPP2 音视频容器 |
.7z | application/x-7z-compressed | 7-zip 存档 |
.markdown .md | text/markdown | Markdown 文件 |
本备忘单旨在快速理解 MySQL 所涉及的主要概念,提供了最常用的SQL语句,供您参考。
MySQL 为关系型数据库(Relational Database Management System),一个关系型数据库由一个或数个表格组成,如下所示的一个表格
值(value)
行的具体信息,每个值与该列数据类型相同键(key)
用来识别某个特定的人/物的方法,有唯一性# 默认用户名<root>,-p 是密码,
# ⚠️参数后面不需要空格
mysql -h 127.0.0.1 -u <用户名> -p<密码>
@@ -70,9 +70,9 @@
mysql -h <host> -P <端口号> -u <user> -p [db_name]
mysql -h <host> -u <user> -p [db_name]
-:- | :- |
---|---|
CREATE DATABASE db ; | 创建 数据库 |
SHOW DATABASES; | 列出 数据库 |
USE db; | 切换 到数据库 |
CONNECT db ; | 切换 到数据库 |
DROP DATABASE db; | 删除 数据库 |
:- | :- |
---|---|
SHOW TABLES; | 列出当前数据库的表 |
SHOW FIELDS FROM t; | 表的列表字段 |
DESC t; | 显示表格结构 |
SHOW CREATE TABLE t; | 显示创建表sql |
TRUNCATE TABLE t; | 删除表中的所有数据 |
DROP TABLE t; | 删除表格 |
:- | :- |
---|---|
show processlist; | 列出进程 |
kill pid; | 杀死进程 |
# 显示当前mysql的version的各种信息
mysql> status;
# 显示当前mysql的version信息
@@ -165,11 +165,11 @@
# 查看 MySQL 端口号
mysql> show global variables like 'port';
-mysql> exit
退出 quit;
或 \q;
一样的效果
创建备份
mysqldump -u user -p db_name > db.sql
@@ -180,8 +180,8 @@
恢复备份
mysql -u user -p db_name < db.sql
-创建一个包含三列的新表
CREATE TABLE t (
id INT,
@@ -214,7 +214,7 @@
删除表中的所有数据
TRUNCATE TABLE t;
-
从表中查询列c1、c2中的数据
SELECT c1, c2 FROM t
@@ -249,7 +249,7 @@
GROUP BY c1
HAVING condition
-内部连接 t1 和 t2
SELECT c1, c2
@@ -316,7 +316,7 @@
SELECT c1, c2 FROM t
WHERE c1 IS [NOT] NULL
-
将c1和c2设置为主键
CREATE TABLE t(
c1 INT, c2 INT, c3 VARCHAR,
@@ -348,7 +348,7 @@
c2 VARCHAR NOT NULL
);
-在表格中插入一行
INSERT INTO t(column_list)
VALUES(value_list);
@@ -380,7 +380,7 @@
DELETE FROM t
WHERE condition;
-
创建由c1和c2组成的新视图
CREATE VIEW v(c1,c2)
@@ -411,14 +411,14 @@
删除视图
DROP VIEW view_name;
-
创建或修改触发器
CREATE OR MODIFY TRIGGER trigger_name
WHEN EVENT
ON table_name TRIGGER_TYPE
EXECUTE stored_procedure;
-:- | :- |
---|---|
BEFORE | 在事件发生前调用 |
AFTER | 事件发生后调用 |
:- | :- |
---|---|
INSERT | 为INSERT调用 |
UPDATE | 调用UPDATE |
DELETE | 调用DELETE |
:- | :- |
---|---|
FOR EACH ROW | - |
FOR EACH STATEMENT | - |
在t表的c1和c2上创建索引
CREATE INDEX idx_name
ON t(c1,c2);
@@ -491,8 +491,8 @@
删除索引
DROP INDEX idx_name;
-
- | - |
---|---|
CHAR | String (0 - 255) |
VARCHAR | String (0 - 255) |
TINYTEXT | String (0 - 255) |
TEXT | String (0 - 65535) |
BLOB | String (0 - 65535) |
MEDIUMTEXT | String (0 - 16777215) |
MEDIUMBLOB | String (0 - 16777215) |
LONGTEXT | String (0 - 4294967295) |
LONGBLOB | String (0 - 4294967295) |
ENUM | One of preset options |
SET | Selection of preset options |
Data Type | Format |
---|---|
DATE | yyyy-MM-dd |
TIME | hh:mm:ss |
DATETIME | yyyy-MM-dd hh:mm:ss |
TIMESTAMP | yyyy-MM-dd hh:mm:ss |
YEAR | yyyy |
- | - |
---|---|
TINYINT x | Integer (-128 to 127) |
SMALLINT x | Integer (-32768 to 32767) |
MEDIUMINT x | Integer (-8388608 to 8388607) |
INT x | Integer (-2147483648 to 2147483647) |
BIGINT x | Integer (-9223372036854775808 to 9223372036854775807) |
FLOAT | Decimal (precise to 23 digits) |
DOUBLE | Decimal (24 to 53 digits) |
DECIMAL | "DOUBLE" stored as string |
该备忘单提供了在 Linux 和 Unix 上使用 Netcat 的各种方法。
连接到位于任何地方的主机
$ nc [options] [host] [port]
@@ -50,7 +50,7 @@
监听传入连接
$ nc -lp port [host] [port]
-
选项 | 示例 | 说明 |
---|---|---|
-h | nc -h | 帮助 |
-z | nc -z 192.168.1.9 1-100 | 端口扫描主机或 IP 地址 |
-v | nc -zv 192.168.1.9 1-100 | 提供详细输出 |
-n | nc -zn 192.168.1.9 1-100 | 通过禁用 DNS 解析进行快速扫描 |
-l | nc -lp 8000 | TCP 侦听模式 (用于入站连接) |
-w | nc -w 180 192.168.1.9 8000 | 定义超时值 |
-k | nc -kl 8000 | 断线后继续收听 |
-u | nc -u 192.168.1.9 8000 | 使用 UDP 而不是 TCP |
-q | nc -q 1 192.168.1.9 8000 | 客户在 EOF 后熬夜 |
-4 | nc -4 -l 8000 | 仅限 IPv4 |
-6 | nc -6 -l 8000 | 仅限 IPv6 |
服务器 Server (192.168.1.9)
$ nc -lv 8000
@@ -126,8 +126,8 @@
客户端 Client
$ nc 192.168.1.9 8000
-
$ nc website.com 80
GET index.html HTTP/1.1
HEAD / HTTP/1.1
@@ -135,21 +135,21 @@
或者
echo "" | nc -zv -wl 192.168.1.1 801-805
-
扫描 21
到 25
之间的端口
$ nc -zvn 192.168.1.1 21-25
扫描端口 22
、3306
和 8080
$ nc -zvn 192.168.1.1 22 3306 8080
-$ nc -lp 8001 -c "nc 127.0.0.1 8000"
或者
$ nc -l 8001 | nc 127.0.0.1 8000
创建从一个本地端口到另一个本地端口的隧道
-服务器 Server (192.168.1.9)
$ nc -lv 8000 < file.txt
@@ -157,7 +157,7 @@
$ nc -nv 192.168.1.9 8000 > file.txt
假设您想将文件 file.txt
从服务器 A 传输到客户端 B。
服务器 Server (192.168.1.9)
$ nc -lv 8000 > file.txt
@@ -165,7 +165,7 @@
$ nc 192.168.1.9 8000 < file.txt
假设您想将文件 file.txt
从客户端 B
传输到服务器 A
服务器 Server (192.168.1.9)
$ tar -cvf – dir_name | nc -l 8000
@@ -173,7 +173,7 @@
$ nc -n 192.168.1.9 8000 | tar -xvf -
假设您想通过网络将目录从 A
传输到 B
服务器 Server (192.168.1.9)
$ nc -l 8000 | openssl enc -d -des3 -pass pass:password > file.txt
@@ -182,7 +182,7 @@
$ openssl enc -des3 -pass pass:password | nc 192.168.1.9 8000
在通过网络传输之前加密数据
-
服务器 Server (192.168.1.9)
$ dd if=/dev/sda | nc -l 8000
@@ -190,7 +190,7 @@
$ nc -n 192.168.1.9 8000 | dd of=/dev/sda
克隆 linux PC 非常简单。假设你的系统盘是 /dev/sda
-服务器 Server (192.168.1.9)
$ cat video.avi | nc -l 8000
@@ -198,7 +198,7 @@
$ nc 192.168.1.9 8000 | mplayer -vo x11 -cache 3000 -
使用 netcat 流式传输视频
-服务器 Server (192.168.1.9)
$ nc -lv 8000 -e /bin/bash
@@ -206,7 +206,7 @@
$ nc 192.168.1.9 8000
我们已经使用 telnet
和 ssh
使用远程 Shell
,但是如果它们没有安装并且我们没有安装它们的权限,那么我们也可以使用 netcat
创建远程 shell
服务器 Server (192.168.1.9)
$ nc -lv 8000
@@ -227,8 +227,6 @@ function anchorPoint() {
Array.from(document.querySelectorAll('.h2wrap-body .wrap')).forEach((elm) => elm.classList.remove('active'))
if (elm?.tagName === 'H3') {
elm?.parentElement?.parentElement?.classList.add('active');
- const box = elm?.parentElement?.parentElement;
- console.log('elm:2', box, document.querySelectorAll('.h2wrap-body .wrap'))
}
}
anchorPoint();
@@ -239,7 +237,6 @@ function updateAnchor(element) {
tocanchor.classList.remove('is-active-link');
});
const anchor = element || document.querySelector(`a.tocs-link[href='${decodeURIComponent(window.location.hash)}']`);
- console.log('anchor', anchor)
if (anchor) {
anchor.classList.add('is-active-link');
}
diff --git a/docs/netstat.html b/docs/netstat.html
index 4cfc0206..a9455ae1 100644
--- a/docs/netstat.html
+++ b/docs/netstat.html
@@ -34,7 +34,7 @@
document.documentElement.setAttribute('data-color-mode', mode);
localStorage.setItem(LOCAL_NANE, mode);
}
-此快速参考备忘单提供了各种使用 netstat 命令的方法
端口 80 上的所有连接
$ netstat -anp | grep :80
网络统计帮助
$ netstat -h
-选项 | 说明 |
---|---|
netstat -ltunp | 所有监听端口 |
netstat -ltn | 监听 TCP 端口 |
netstat -lun | 监听 UDP 端口 |
netstat -lx | 监听 Unix 端口 |
netstat -lt | 仅列出侦听 TCP 端口 |
netstat -lu | 仅列出侦听 UDP 端口 |
netstat -l | 列出所有监听条件 |
选项 | 说明 |
---|---|
netstat | 活动连接 |
netstat -a | 所有连接 |
netstat -at | 所有 TCP 连接 |
netstat -au | 所有 UDP 连接 |
netstat -ant | 显示没有反向 DNS 查找的 IP 地址 |
netstat -tnl | 监听 TCP 端口 |
netstat -unl | 监听 UDP 端口 |
选项 | 说明 |
---|---|
netstat -i | 显示网络接口 |
netstat -ie | 显示网络接口扩展信息 |
netstat -n | 仅显示 IP 地址 |
netstat -F | 尽可能显示 IP 地址的域名 |
选项 | 说明 |
---|---|
netstat -r | 显示路由表 |
netstat -rn | 显示路由表,不解析主机 |
选项 | 说明 |
---|---|
netstat -s | 显示统计信息 |
netstat -st | 显示 TCP 统计信息 |
netstat -su | 显示 UDP 统计信息 |
netstat -ltpe | 使用进程信息和扩展信息显示 TCP 的侦听连接 |
netstat -tp | 显示带有 PID 编号的服务名称 |
sudo netstat -nlpt | 列出进程名称/PID 和用户 ID |
netstat -nlptue | 所有带有 PID 和扩展信息的侦听端口 |
netstat -M | 显示伪装的连接 |
$ netstat --tcp --numeric
-$ netstat -atnp | grep ESTA
-$ watch -d -n0 "netstat -atnp | grep ESTA"
-$ netstat -anp | grep":"
插入端口
号(上图)代替冒号 :
$ sudo netstat -aple | grep ntp
你可以用http
、smtp
代替ntp
$ netstat -tn 2>/dev/null | grep :80 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head
-$ netstat -tn 2>/dev/null | grep ':80 ' | awk '{print $5}' |sed -e 's/::ffff://' | cut -f1 -d: | sort | uniq -c | sort -rn | head
-$ netstat -an |grep :80 |wc -l
-$ netstat -antu | grep :80 | grep -v LISTEN | awk '{print $5}'
-以下命令将输出服务器上正在发生和正在发生的活动 SYNC_REC
数量。数量应该很低(小于 5
)。如果该数字为两位数,则您可能正在遭受 DoS
攻击或被邮件轰炸。
$ netstat -n -p|grep SYN_REC | wc -l
-$ netstat -n -p | grep SYN_REC | awk '{print $5}' | awk -F: '{print $1}'
与上面的命令一样,该命令也列出了发送 SYN_REC
连接状态的节点的所有唯一 IP
地址
$ netstat -antu | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -n
@@ -302,16 +302,16 @@
$ netstat -antu | awk '$5 ~ /[0-9]:/{split($5, a, ":"); ips[a[1]]++} END {for (ip in ips) print ips[ip], ip | "sort -k1 -nr"}'
-$ netstat -plntu
-$ netstat -plnt
-$ netstat -an | grep 80 | wc -l
-$ netstat -pnut -w | column -t -s $'\t'
这个 nginx 快速参考备忘单显示了它的常用命和配置使用清单。
sudo systemctl status nginx # nginx当前状态
sudo systemctl reload nginx # 重新加载 nginx
@@ -54,11 +54,11 @@
nginx -s quit # 平滑关闭nginx
nginx -V # 查看nginx的安装状态,
-docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx
-location / {
proxy_pass http://127.0.0.1:3000;
@@ -66,7 +66,7 @@
proxy_set_header Host $host;
}
-变量 | 说明 |
---|---|
$args | 这个变量等于请求行中的参数,同 $query_string |
$remote_port | 客户端的端口 |
$content_length | 请求头中的 Content-length 字段 |
$remote_user | 已经经过 Auth Basic Module 验证的用户名 |
$content_type | 请求头中的 Content-Type 字段 |
$request_filename | 当前请求的文件路径,由 root 或alias指令与URI请求生成 |
$document_root | 当前请求在 root 指令中指定的值 |
$scheme | HTTP方法(如http,https) |
$host | 请求主机头字段,否则为服务器名称 |
$hostname | 主机名 |
$http_user_agent | 客户端agent 信息 |
$http_cookie | 客户端cookie 信息 |
$server_protocol | 请求使用的协议,通常是HTTP/1.0 或HTTP/1.1 |
$server_addr | 服务器地址,在完成一次系统调用后可以确定这个值 |
$server_name | 服务器名称 |
$server_port | 请求到达服务器的端口号 |
$limit_rate | 这个变量可以限制连接速率 |
$request_method | 客户端请求的动作,如 GET/POST |
$request_uri | 包含请求参数的原始URI,不包含主机名,如:/foo/bar.php?arg=baz |
$remote_addr | 客户端的IP地址 |
$uri | 不带请求参数的当前URI,$uri 不包含主机名,如 /foo/bar.html |
$document_uri | 与 $uri 相同 |
$nginx_version | nginx 版本 |
更多全局变量查看官方文档
-server {
listen 80; # 标准 HTTP 协议
listen 443 ssl; # 标准 HTTPS 协议
@@ -181,7 +181,7 @@
listen [::]:80 ipv6only=on;
}
-server {
# 监听 example.com
server_name example.com;
@@ -195,20 +195,20 @@
server_name "";
}
-upstream node_js {
server 0.0.0.0:3000;
server 0.0.0.0:4000;
server 127.155.142.421;
}
-upstream test {
server localhost:8080 weight=9;
server localhost:8081 weight=1;
}
-upstream test {
ip_hash;
server localhost:8080;
@@ -216,7 +216,7 @@
}
解决负载均衡 session
的问题
upstream backend {
fair;
server localhost:8080;
@@ -224,7 +224,7 @@
}
响应时间短的优先分配
-upstream backend {
hash $request_uri;
hash_method crc32;
@@ -274,7 +274,7 @@
}
按访问url的hash结果来分配请求
-upstream memcached_backend {
server 127.0.0.1:11211;
server 10.0.0.2:11211;
@@ -282,7 +282,7 @@
}
激活缓存以连接到上游服务器
-location /folder/ { # / 很重要!
proxy_pass http://127.0.0.1:3000/; # / 很重要!
@@ -292,9 +292,9 @@
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
-server {
listen 80;
server_name example.com;
@@ -306,7 +306,7 @@
}
}
-upstream node_js {
server 0.0.0.0:3000;
# 其中 0.0.0.0:3000 是绑定在
@@ -322,7 +322,7 @@
}
}
-upstream node_js {
server 0.0.0.0:3000;
}
@@ -343,7 +343,7 @@
}
适用于 Node.js、Streamlit、Jupyter 等
-server {
listen 80;
@@ -359,7 +359,7 @@
}
}
-大多数 SSL 选项取决于您的应用程序做什么或需要什么
server {
@@ -381,7 +381,7 @@
}
您可以使用 Let's Encrypt 轻松保护您的网站/应用程序。去 lets-encrypt 获取更多信息
-将 www.example.com 重定向到 example.com
server {
@@ -397,21 +397,21 @@
return 301 https://example.com$request_uri;
}
-server {
listen 80;
server_name yourdomain.com;
return 302 http://otherdomain.com;
}
-server {
listen 80;
server_name yourdomain.com;
return 301 https://$host$request_uri;
}
-:- | :- |
---|---|
permanent | 永久性重定向。日志中的状态码为 301 |
redirect | 临时重定向。日志中的状态码为 302 |
location / {
proxy_set_header X-Forwarded-For $remote_addr;
}
-# Upstreams
upstream backend {
@@ -464,7 +464,7 @@
}
-server {
server_name domain.tld;
@@ -492,7 +492,7 @@
}
-server {
#侦听的80端口
@@ -518,7 +518,7 @@
}
}
-server {
server_name old-site.com;
@@ -526,7 +526,7 @@
}
-server {
location = /oldpage.html {
@@ -535,14 +535,14 @@
}
-location /old-site {
rewrite ^/old-site/(.*) http://example.org/new-site/$1 permanent;
}
-upstream example {
ip_hash;
@@ -565,7 +565,7 @@
}
}
-允许浏览器基本上永久地缓存静态内容。 Nginx 将为您设置 Expires 和 Cache-Control 头信息
location /static {
@@ -579,7 +579,7 @@
expires -1;
}
-server {
listen 80;
@@ -597,7 +597,7 @@
}
}
-upstream test {
server 127.0.0.1:8080;
@@ -637,7 +637,7 @@
}
}
-server {
listen 80;
@@ -656,7 +656,7 @@
rewrite ^(.*) https://www.wangchujiang.com$1 permanent;
}
-upstream server-api {
# api 代理服务地址
@@ -694,7 +694,7 @@
}
}
-可以放到 http
, server
, location
, limit_except
语句块
include blockip.conf;
@@ -715,7 +715,7 @@
allow 1.1.1.2;
deny all;
-server {
listen 80;
@@ -725,7 +725,7 @@
server_tokens off;
}
-location ^~/api/upload {
rewrite ^/(.*)$ /wfs/v1/upload break;
@@ -733,7 +733,7 @@
}
将地址 /api/upload
替换为 /wfs/v1/upload
location / {
if ($http_user_agent ~* "python|curl|java|wget|httpclient|okhttp") {
@@ -743,7 +743,7 @@
# ...
}
-location ~* \.(gif|jpg|png|swf|flv)$ {
root html;
@@ -756,7 +756,7 @@
}
}
-location /img/ {
alias /var/www/image/;
@@ -769,7 +769,7 @@
# 访问 /img/ 目录下的文件时,
# 会去 /var/www/image/img/ 目录下找文件
-通用备份和归档文件
location ~* "\.(old|orig|original|php#|php~|php_bak|save|swo|aspx?|tpl|sh|bash|bak?|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rdf)$" {
@@ -788,7 +788,7 @@
deny all;
}
-location ~ \/public\/(css|js|img)\/.*\.(js|css|gif|jpg|jpeg|png|bmp|swf) {
valid_referers none blocked *.jslite.io;
@@ -797,19 +797,19 @@
}
}
-location ~* "(base64_encode)(.*)(\()" {
deny all;
}
-location ~* "(eval\()" {
deny all;
}
-gzip on;
gzip_buffers 16 8k;
@@ -827,7 +827,7 @@
image/x-icon;
gzip_disable "msie6";
-add_header X-Robots-Tag "noindex";
@@ -835,7 +835,7 @@
return 200 "User-agent: *\nDisallow: /\n";
}
-这个 npm 快速参考备忘单显示了它的常用命令使用清单。
命令 | 描述 |
---|---|
npm i | npm install 的别名 |
npm install | 安装 package.json 中的所有内容 |
npm install --production | 安装 package.json 中的所有内容,除了 devDependecies |
npm install lodash | 安装一个包 |
npm install --save-dev lodash | 安装为 devDependency |
npm install --save-exact lodash | 准确安装 |
npm install @scope/package-name | 安装一个作用域的公共包 |
npm install <package_name>@<tag> | 使用 dist-tags 安装包 |
npm install -g <package_name> | 全局安装包 |
npm uninstall <package_name> | 卸载包 |
--save
是 npm@5 的默认值。 以前,使用不带 --save
的 npm install
不会更新 package.json。
命令 | 描述 |
---|---|
npm i sax | NPM 包 |
npm i sax@latest | 指定标签“最新” |
npm i sax@3.0.0 | 指定版本 3.0.0 |
npm i sax@">=1 <2.0" | 指定版本范围 |
npm i @org/sax | 范围内的 NPM 包 |
npm i user/repo | GitHub |
npm i user/repo#master | GitHub |
npm i github:user/repo | GitHub |
npm i gitlab:user/repo | GitLab |
npm i /path/to/repo | 绝对路径 |
npm i ./archive.tgz | 压缩包 |
npm i https://site.com/archive.tgz | 通过 HTTP 压缩包 |
命令 | 描述 |
---|---|
npm list | 列出此软件中所有依赖项的已安装版本 |
npm list -g --depth 0 | 列出所有全局安装包的安装版本 |
npm view | 列出此软件中所有依赖项的最新版本 |
npm outdated | 仅列出此软件中已过时的依赖项 |
命令 | 描述 |
---|---|
npm version <version> | 要更改 package.json 中的版本号 |
npm update | 更新生产包 |
npm update --dev | 更新开发包 |
npm update -g | 更新全局包 |
npm update lodash | 更新 lodash 包 |
将某人添加为所有者
npm owner add USERNAME PACKAGENAME
@@ -232,7 +232,7 @@
检查过时的包
npm outdated [PACKAGE]
-
将公共包设为私有
npm access restricted <package-name>
@@ -242,7 +242,7 @@
授予私有包访问权限
npm owner add <user> <your-package-name>
-npm owner add <their-username> <package-name>
# 新维护者接受邀请
npm owner rm <your-username> <package-name>
@@ -250,20 +250,20 @@
写入启用了双因素身份验证
npm owner add <their-username> <package-name> --otp=123456
-
npm unpublish <package-name> -f
# 取消指定版本
npm unpublish <package-name>@<version>
注意:如果您取消发布整个包,则必须在 24 小时后才能发布该包的任何新版本。
-npm publish
# 第一次需要指定公开参数
npm publish --access public
发布公开包,到 npmjs.org
-:- | :- |
---|---|
/path/to/project/.npmrc | 每个项目的配置文件 |
~/.npmrc | 每个用户的配置文件 |
$PREFIX/etc/npmrc | 全局配置文件 |
/path/to/npm/npmrc | npm 内置配置文件 |
# last modified: 01 Jan 2016
; Set a new registry for a scoped package
@myscope:registry=https://registry.npmmirror.com
注释使用 #
, ;
放置到一行的开头。.npmrc
文件由指定此注释语法的 npm/ini
解析
.npmignore
.npmignore
将下面内容存放到 .npmignore
文件中,放置在项目的根目录中。
.git
.svn
@@ -309,7 +309,7 @@
!logs/.gitkeep
.npmignore
文件就像 .gitignore
一样工作。它不能覆盖 package.json#files
字段。
# 临时使用
$ npm install -g <package-name> --registry=https://registry.npmmirror.com
@@ -327,13 +327,13 @@
npm config set registry https://registry.npmmirror.com
请参阅:npmmirror 中国镜像站
-
ELECTRON_MIRROR="https://npmmirror.com/mirrors/electron/"
ELECTRON_BUILDER_BINARIES_MIRROR=https://npmmirror.com/mirrors/electron-builder-binaries/
; ELECTRON_CUSTOM_DIR="{{ version }}"
-//registry.npmjs.org/:_authToken=MYTOKEN
; 将适用于 @myorg 和 @another
//somewhere.com/:_authToken=MYTOKEN
@@ -342,7 +342,7 @@
; 将适用于 @another
//somewhere.com/another/:_authToken=MYTOKEN2
-这个快速参考备忘清单,显示了关于 package.json 文件中所需内容的全部内容。
本快速参考备忘清单是您需要了解的关于 package.json 文件中所需内容的全部内容。 它必须是实际的 JSON,而不仅仅是 JavaScript 对象字面量。
name
name
{
"name": "my-awesome-package"
}
@@ -59,13 +59,13 @@
名称中不得包含大写字母
必须仅使用URL安全字符
-
version
version
{
"version": "1.0.0"
}
包的当前版本,严格遵循 Semantic Versioning 2.0.0 语义化版本规范。
-Node.js
核心模块相同的名字。js
或者 node
单词。如果没有 name
和version
字段,您的包将无法安装
name
包name
包yarn add [包名]
# or
@@ -88,14 +88,14 @@
这是您的 包
的名称。 它在URL中使用,作为参数命令行,以及 node_modules
中的目录名。
description
description
{
"description": "我的包的概要简短描述"
}
帮助使用者了解包的功能的字符串,包管理器也会把这个字符串作为搜索关键词。
-license
license
所有包都应该指定许可证,以便让用户了解他们是在什么授权下使用此包,以及此包还有哪些附加限制。
{
@@ -106,14 +106,14 @@
}
鼓励使用开源 (OSI-approved) 许可证,除非你有特别的原因不用它。 如果你开发的包是你工作的一部分,最好和公司讨论后再做决定。
-SEE LICENSE IN <文件名>
字符串指向你的包里顶级目录的一个 <文件名>。UNLICENSED
字符串。keywords
keywords
{
"keywords": [
"short", "relevant", "keywords"
@@ -121,15 +121,15 @@
}
一个字符串数组,当在包管理器里搜索包时很有用。
-各种指向项目文档、issues 上报,以及代码托管网站的链接字段。
-homepage
homepage
{
"homepage": "https://your-package.org"
}
是包的项目主页或者文档首页。
-repository
repository
{
"repository": {
@@ -142,14 +142,14 @@
}
包的实际代码所在的位置。
-bugs
bugs
{
"bugs": "https://github.com/user/repo/issues"
}
问题反馈系统的 URL,或者是 email 地址之类的链接。用户通过该途径向你反馈问题。
-author
author
项目的维护者。
{
"author": {
@@ -161,7 +161,7 @@
}
作者信息,一个人。
-contributors
contributors
{
"contributors": [
@@ -175,9 +175,9 @@
}
贡献者信息,可能很多人。
-指定包含在项目中的文件,以及项目的入口文件。
-files
files
{
"files": [
"filename.js",
@@ -187,20 +187,20 @@
}
项目包含的文件,可以是单独的文件、整个文件夹,或者通配符匹配到的文件。
-main
main
{
"main": "filename.js"
}
项目的入口文件。
-man
man
{
"man": "./man/doc.1",
"man": ["./man/doc.1", "./man/doc.2"]
}
项目的入口文件。
-directories
directories
{
"directories": {
"lib": "path/to/lib/",
@@ -212,7 +212,7 @@
}
当你的包安装时,你可以指定确切的位置来放二进制文件、man pages、文档、例子等。
-bin
bin
{
"bin": "bin.js",
"bin": {
@@ -222,15 +222,15 @@
}
随着项目一起被安装的可执行文件。
-types
types
这是一个只在 TypeScript 中生效的字段,如果您的包有一个 main.js
文件,您还需要在 package.json
文件中指明主声明文件。 将 types
属性设置为指向 bundled
的声明文件。 例如:
{
"types": "./lib/main.d.ts",
}
如果您的主声明文件名为 index.d.ts
并且位于包的根目录(index.js
旁边),则不需要标记 types
属性,建议这样做。
esnext
esnext
完整的提案在这里。 简短说明:
另请参阅:通过 npm 交付未编译的源代码
-module
browser
browser
"browser": {
"module-a": "./shims/module-a.js",
"./server/only.js": "./shims/client-only.js"
}
字段由模块作者提供,作为 JavaScript
包或组件工具的提示,用于打包模块以供客户端使用。 提案就在这里。
包里还可以包含一些可执行脚本或者其他配置信息。
-scripts
scripts
{
"scripts": {
"build-project": "node build-project.js"
@@ -275,7 +275,7 @@
有一些特殊的脚本名称。 如果定义了 preinstall
脚本,它会在包安装前被调用。 出于兼容性考虑,install
、postinstall
和 prepublish
脚本会在包完成安装后被调用。
start
脚本的默认值为 node server.js
。
参考文档:npm docs
-
scripts
scripts
对于以下脚本,npm
支持 package.json
文件的 scripts
默认命令字段:
preshrinkwrap
, shrinkwrap
, postshrinkwrap
: 由 npm shrinkwrap
命令运行。参考文档:npm docs.
-config
config
{
"config": {
"port": "8080"
@@ -314,9 +314,9 @@
}
配置中的键作为环境变量公开给脚本(scripts)。
-你的包很可能依赖其他包。你可以在你的 package.json
文件里指定那些依赖。
dependencies
dependencies
这些是你的包的开发版和发布版都需要的依赖。
{
@@ -341,7 +341,7 @@
你可以指定一个确切的版本、一个最小的版本 (比如 >=
) 或者一个版本范围 (比如 >= ... <
)。 包也可以指向本地的一个目录文件夹。
参考文档:npm docs.
{
"name": "my-workspaces-powered-project",
@@ -365,7 +365,7 @@
┆ ╰┈┈ package.json
参考文档:workspaces
-devDependencies
devDependencies
{
"devDependencies": {
"package-2": "^0.4.2"
@@ -373,7 +373,7 @@
}
这些是只在你的包开发期间需要,但是生产环境不会被安装的包。
-overrides
overrides
{
"overrides": {
"foo": "1.0.0"
@@ -381,7 +381,7 @@
}
对依赖项的依赖项进行特定更改,例如用已知的安全问题替换依赖项的版本
-peerDependencies
peerDependencies
{
"peerDependencies": {
"package-3": "^2.7.18"
@@ -389,7 +389,7 @@
}
平行依赖允许你说明你的包和其他包版本的兼容性。添加可选设置以消除丢失的对等依赖性警告,#6671 。
-optionalDependencies
optionalDependencies
{
"optionalDependencies": {
"package-5": "^1.6.1"
@@ -397,7 +397,7 @@
}
可选依赖可以用于你的包,但不是必需的。如果可选包没有找到,安装还可以继续。
-bundledDependencies
bundledDependencies
{
"bundledDependencies": [
"package-4"
@@ -405,7 +405,7 @@
}
打包依赖是发布你的包时将会一起打包的一个包名数组。
-peerDependenciesMeta
peerDependenciesMeta
{
"peerDependenciesMeta": {
"node-sass": {
@@ -421,9 +421,9 @@
}
它允许对等依赖项标记为可选
-你可以提供和你的包关联的系统级的信息,比如操作系统兼容性之类。
-engines
os
os
{
"os": ["darwin", "linux"],
"os": ["!win32"]
}
此选项指定你的包的操作系统兼容性,它会检查 process.platform
。
cpu
cpu
{
"cpu": ["x64", "ia32"],
"cpu": ["!arm", "!mips"]
}
使用这个选项指定你的包将只能在某些 CPU 体系架构上运行,这会检查 process.arch
。
private
private
{
"private": true
}
如果你不想你的包发布到包管理器(npm 或者 私有包管理),设置为 true
。
publishConfig
publishConfig
这些配置值将在你的包发布时使用。比如,你可以给包打标签。
{
@@ -468,15 +468,15 @@
这是一组将在发布时使用的配置值。 如果要设置标记,注册表或访问权限,则特别方便,以便确保给定的包未标记为 latest
,发布到全局公共 registry
或默认情况下,作用域模块(@scoped)是私有的。
可以覆盖任何配置值,但只有 tag
,registry
和 access
可能对于发布而言很重要,npm-config。
flat
flat
如果你的包只允许给定依赖的一个版本,你想强制和命令行上 yarn install --flat 相同的行为,把这个值设为 true
。
{
"flat": true
}
请注意,如果你的 package.json
包含 "flat": true
并且其它包依赖你的包 (比如你在构建一个库,而不是应用), 其它那些包也需要在它们的 package.json
加上 "flat": true
,或者在命令行上用 yarn install --flat
安装。
resolutions
resolutions
{
"resolutions": {
@@ -488,7 +488,7 @@
允许您覆盖特定嵌套依赖项的版本。 有关完整规范,请参见选择性版本解析 RFC。
注意,yarn install --flat
命令将会自动在 package.json
文件里加入 resolutions
字段。
这是您可以在 Quick Reference 备忘单上使用的样式参考,快速参与贡献!
简单的将仓库克隆下来本地调试页面展示。
-git clone git@github.com:jaywcjlove/reference.git
-npm i # 安装依赖
npm run build # 编译输出 HTML
npm run start # 监听 md 文件编译输出 HTML
HTML 存放在仓库根目录下的 dist
目录中,将 dist/index.html
静态页面在浏览器中打开预览。
在备忘清单采用 HTML 注释语法
,标识网站布局和一些样式,目的是为了在 GitHub
中也是正常毫无瑕疵的预览 Markdown
。
### 卡片标题
<!--rehype:wrap-class=col-span-2-->
@@ -66,29 +66,29 @@
使用 col-span-2
类标识,卡片占 2
列位置
<!--rehype:
开始,-->
结束,包裹参数内容<!--rehype:
+ key=value
+ &
+ key=value
+ -->
标识开始
+ 参数
+ 分隔符(&)
+ 参数
+ 标识结束
### H2 部分
<!--rehype:body-class=cols-2-->
### H3 部分
<!--rehype:wrap-class=row-span-2-->
-### 标题
<!--rehype:wrap-class=row-span-3&style=color:red;-->
-类 | 说明 |
---|---|
body-style | 包裹所有卡片外壳 的样式 |
body-class | 用于卡片栏布局,添加类 名 |
wrap-style | 卡片栏添加 CSS 样式 |
wrap-class | 用于卡片占位,添加类 名 |
_我是红色_<!--rehype:style=color: red;-->
**加粗红色**<!--rehype:style=color: red;-->
上面添加注释样式,文字 我是红色 文字变红
了
**加粗变大红色**
<!--rehype:style=color: red;font-size: 18px-->
上面添加注释样式,文字 加粗变大红色 变红
并且大
了
\```js
function () {}
\```
<!--rehype:className=wrap-text -->
如果代码块内容太长,使用强制换行类解决
-| Key | value |
| ---- | ---- |
| `键` | 值 |
<!--rehype:className=show-header-->
注释配置添加 show-header
类,放置在表格下面,表头将被展示出来。
import React from "react";
import "./Student.css";
@@ -153,22 +153,22 @@
```jsx {1,4-5}
代码行高亮可以和代码行号一起使用。
-
添加注释配置 <!--rehype:tooltips-->
添加一个 Tooltips 提示。
### H3 部分(卡片)背景颜色
<!--rehype:wrap-style=background: #00c69357;-->
-### 红色标题
<!--rehype:style=background:#e91e63;-->
在 H3 标题下面添加样式标注 <!--rehype:style=background:#e91e63;-->
Key | value |
---|---|
快捷键 | 说明 |
快捷键 | 说明 |
列表添加 <!--rehype:className=shortcuts-->
样式类,展示快捷键样式。
export const Student = <div>学生</div>;
const school = <div>学校</div>;
@@ -197,7 +197,7 @@
```jsx showLineNumbers
标记语言后面添加 showLineNumbers
标识
:- | - |
---|---|
shortcuts | 快捷键样式 |
wrap-text | 超出换行 |
show-header | 展示表头 |
style-none | 隐藏 <ul> 列表样式 |
style-list | <table> 单元格行展示 |
:- | - |
---|---|
<yel> | |
<pur> | |
<code> 或 `` | 绿 色 |
<del> 或 ~~删除~~ |
隐藏卡片标题,在 H3 标题下面添加注释样式
@@ -265,14 +265,17 @@
<!--rehype:style=display:none;&wrap-style=padding-top: 0;-->
- ```html preview
- 这里是你的 HTML 代码
+ <b>这里是你的 HTML 代码</b>
\```
+这里是你的 HTML 代码 +
上面的 markdown
代码在 meta
位置添加 preview
标识,HTML 代码将被执行预览
H2 部分
---
@@ -325,19 +328,19 @@
类 说明 cols-1
1
栏卡片布局cols-2
2
栏卡片布局cols-3
3
栏卡片布局cols-4
4
栏卡片布局cols-5
5
栏卡片布局cols-{1~6}
1~6
栏卡片布局
-
### H3 部分
<!--rehype:wrap-style=grid-row: span 2/span 2;-->
放在 ### H3 部分
下面的注释配置,与 <!--rehype:wrap-class=row-span-2-->
相同,设置 2 行占位布局。
## H2 部分
<!--rehype:body-style=grid-template-columns: repeat(2,minmax(0,1fr));-->
放在 ## H2 部分
下面的注释配置,与 <!--rehype:body-class=cols-2-->
相同,设置 2 栏布局。
### 卡片 1 (H3 部分)
<!--rehype:wrap-class=row-span-2-->
### 卡片 2 (H3 部分)
@@ -387,7 +390,7 @@
类 说明 col-span-2
2
列占位col-span-3
3
列占位col-span-4
4
列占位col-span-5
5
列占位row-span-2
2
行占位row-span-3
3
行占位row-span-4
4
行占位row-span-5
5
行占位
-
╭┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╮
┆ H3 Title 1 ┆
╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╯
@@ -405,7 +408,7 @@
### Title 4
第一标题添加 col-span-3
占位类
╭┈┈┈╮ ╭┈┈┈╮ ╭┈┈┈╮
┆ 1 ┆ ┆ 2 ┆ ┆ 3 ┆
┆ ┆ ╰┈┈┈╯ ╰┈┈┈╯
@@ -422,7 +425,7 @@
### Title 5
在 Title 1
标题添加 row-span-2
占位类
╭┈┈┈╮ ╭┈┈┈╮ ╭┈┈┈╮
┆ 1 ┆ ┆ 2 ┆ ┆ 3 ┆
╰┈┈┈╯ ┆ ┆ ╰┈┈┈╯
@@ -439,7 +442,7 @@
### Title 5
在 Title 2
标题添加 row-span-2
占位类
╭┈┈┈╮ ╭┈┈┈╮ ╭┈┈┈╮
┆ 1 ┆ ┆ 2 ┆ ┆ 3 ┆
╰┈┈┈╯ ╰┈┈┈╯ ┆ ┆
@@ -456,7 +459,7 @@
### Title 5
在 Title 3
标题添加 row-span-2
占位类
╭┈┈┈╮ ╭┈┈┈╮ ╭┈┈┈╮
┆ 1 ┆ ┆ 2 ┆ ┆ 3 ┆
╰┈┈┈╯ ╰┈┈┈╯ ╰┈┈┈╯
@@ -473,7 +476,7 @@
<!--rehype:wrap-class=col-span-2-->
在 Title 5
标题添加 col-span-2
占位类
╭┈┈┈╮ ╭┈┈┈┈┈┈┈┈┈╮
┆ 1 ┆ ┆ 2 ┆
╰┈┈┈╯ ╰┈┈┈┈┈┈┈┈┈╯
@@ -490,7 +493,7 @@
### Title 5
在 Title 2
标题添加 col-span-2
占位类
╭┈┈┈╮ ╭┈┈┈╮ ╭┈┈┈╮
┆ 1 ┆ ┆ 2 ┆ ┆ 3 ┆
╰┈┈┈╯ ╰┈┈┈╯ ╰┈┈┈╯
@@ -507,7 +510,7 @@
### Title 5
在 Title 4
标题添加 col-span-2
占位类
╭┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╮
┆ H3 Title 1 ┆
╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╯
@@ -527,7 +530,7 @@
### Title 5
在 H2 部分
标题添加 cols-4
,和 Title 1
添加 col-span-4
合并栏
╭┈┈┈┈┈┈┈┈┈╮ ╭┈┈┈╮
┆ 1 ┆ ┆ 2 ┆
@@ -549,9 +552,9 @@
### Title 6
在 Title 1
标题添加 col-span-2
和 row-span-2
占位类,使用 空格
间隔。
:- | :- |
---|---|
%m/%d/%Y | 06/05/2013 |
%A, %B %e, %Y | Sunday, June 5, 2013 |
%b %e %a | Jun 5 Sun |
:- | :- |
---|---|
%H:%M | 23:05 |
%I:%M %p | 11:05 PM |
标题为 H4
的基本表格。
:- | :- |
---|---|
V | Vector |
P | Pencil |
T | Text |
L | Line |
R | Rectangle |
O | Oval |
U | Rounded |
Prefix | Example | What |
---|---|---|
// | //hr[@class='edge'] | Anywhere |
./ | ./a | Relative |
/ | /html/body/div | Root |
<!--rehype:className=show-header-->
:- | :- |
---|---|
visualEffectState.inactive | 后台应一直显示为非激活状态。 |
titleBarStyle string (win/mac) | 窗口标题栏样式。默认值 (default) |
titleBarStyle.default | 分别返回 mac 或者 win 的标准标题栏 |
<!--rehype:className=style-list-->
:- | :- |
---|---|
visualEffectState.inactive | 后台应一直显示为非激活状态。 |
titleBarStyle string (win/mac) | 窗口标题栏样式。默认值 (default) |
titleBarStyle.default | 分别返回 mac 或者 win 的标准标题栏 |
<!--rehype:className=style-list-arrow-->
:- | :- |
---|---|
visualEffectState.inactive | 后台应一直显示为非激活状态。 |
titleBarStyle string (win/mac) | 窗口标题栏样式。默认值 (default) |
titleBarStyle.default | 分别返回 mac 或者 win 的标准标题栏 |
<!--rehype:className=auto-wrap-->
<!--rehype:className=cols-4-->
<!--rehype:className=style-timeline-->
<!--rehype:className=cols-3 style-none-->
<!--rehype:className=style-round-->
<!--rehype:className=style-arrow-->
...
-...
-...
-...
-...
-...
<!--rehype:wrap-class=row-span-2-->
...
<!--rehype:wrap-class=col-span-2-->
...
<!--rehype:style=background:#e91e63;-->
...
<!--rehype:style=background:#d7a100;-->
...
-每个部分可以有以下子项:
-每个盒子(卡片)都是一个 H3
部分。 盒子将包含 H3
自身内的所有东西。
这是一个包含段落的基本部分。
-注释配置:
`<!--rehype:wrap-style=background: #1b5064;-->`
@@ -884,8 +887,6 @@ function anchorPoint() {
Array.from(document.querySelectorAll('.h2wrap-body .wrap')).forEach((elm) => elm.classList.remove('active'))
if (elm?.tagName === 'H3') {
elm?.parentElement?.parentElement?.classList.add('active');
- const box = elm?.parentElement?.parentElement;
- console.log('elm:2', box, document.querySelectorAll('.h2wrap-body .wrap'))
}
}
anchorPoint();
@@ -896,7 +897,6 @@ function updateAnchor(element) {
tocanchor.classList.remove('is-active-link');
});
const anchor = element || document.querySelector(`a.tocs-link[href='${decodeURIComponent(window.location.hash)}']`);
- console.log('anchor', anchor)
if (anchor) {
anchor.classList.add('is-active-link');
}
diff --git a/docs/react.html b/docs/react.html
index 9f245b62..0804a698 100644
--- a/docs/react.html
+++ b/docs/react.html
@@ -34,7 +34,7 @@
document.documentElement.setAttribute('data-color-mode', mode);
localStorage.setItem(LOCAL_NANE, mode);
}
-
适合初学者的综合 React 备忘清单。
React 是一个用于构建用户界面的 JavaScript 库。
import React, {Component} from 'react'
import ReactDOM from 'react-dom'
@@ -79,7 +79,7 @@
import World, { Hello } from './hello.js';
使用 import
导入 Hello
组件,在示例中使用。
import React from "react";
import "./Student.css";
@@ -95,7 +95,7 @@
<div style={divStyle}></div>
);
-<Student name="Julie" age={23}
pro={true} />
@@ -114,7 +114,7 @@
}
class
组件使用 this.props
访问传递给组件的属性。
function Example() {
return (
@@ -151,7 +151,7 @@
{this.props.children}
children
作为子组件的的属性传递。
-
函数中的 State,Hook 是 React 16.8 的新增特性
import { useState } from 'react';
@@ -172,7 +172,7 @@
使用 setState
更新状态,下面是函数组件读取状态
<p>您点击了 {count} 次</p>
-
import React from 'react';
class Student extends React.Component {
@@ -201,7 +201,7 @@
使用 setState
更新状态,class
组件中不能使用 hooks 。下面是 class
组件读取状态
<p>您点击了{this.state.count}次</p>
-
const elm = ['one', 'two', 'three'];
function Student() {
return (
@@ -214,7 +214,7 @@
}
key
值在兄弟节点之间必须唯一
export default function Hello() {
function handleClick(event) {
event.preventDefault();
@@ -228,7 +228,7 @@
);
}
-function addNumbers(x1, x2) {
return x1 + x2;
}
@@ -239,7 +239,7 @@
</div>
);
-import { useState } from 'react'
import Avatar from './Avatar';
import Profile from './Profile';
@@ -254,7 +254,7 @@
);
}
-React 并没有创建一个新的 div
。它只是把子元素渲染到 domNode
中。domNode
是一个可以在任何位置的有效 DOM 节点。
render() {
return ReactDOM.createPortal(
@@ -264,7 +264,7 @@
}
提供了一种将子节点渲染到存在于父组件以外的 DOM 节点的优秀的方案
-import { Fragment } from 'react'
import Avatar from './Avatar';
@@ -286,20 +286,20 @@
);
-render() {
return 'Look ma, no spans!';
}
您可以只返回一个字符串。查看: Fragments & strings
-const Student = () => [
<li key="A">First item</li>,
<li key="B">Second item</li>
];
不要忘记 key
!查看: Fragments & strings
const FancyButton = React.forwardRef(
(props, ref) => (
<button ref={ref} className="btn">
@@ -308,7 +308,7 @@
)
);
-// 你可以直接获取 DOM button 的 ref:
const ref = React.createRef();
@@ -316,7 +316,7 @@
点击我
</FancyButton>;
-import {Component,createRef} from 'react'
class MyComponent extends Component {
@@ -331,7 +331,7 @@
}
提示:Refs 适用于类组件,但不适用于函数组件(除非您使用 useRef hook,请参阅hooks)
-function CustomTextInput(props) {
// 这里必须声明 $input,这样 ref 才可以引用它
const $input = useRef(null);
@@ -349,7 +349,7 @@
);
}
-测量一个 React 应用多久渲染一次以及渲染一次的 代价
<Profiler id="Navigation" onRender={callback}>
@@ -397,7 +397,7 @@
:- :- id(string)
发生提交的 Profiler
树的 id
onRender(function)
组件树任何组件 “提交” 一个更新的时候调用这个函数
-
:- | :- |
---|---|
phase: "mount" | "update" | 判断是由 props /state /hooks 改变 或 “第一次装载” 引起的重渲染 |
actualDuration: number | 本次更新在渲染 Profiler 和它的子代上花费的时间 |
baseDuration: number | 在 Profiler 树中最近一次每一个组件 render 的持续时间 |
startTime: number | 本次更新中 React 开始渲染的时间戳 |
commitTime: number | 本次更新中 React commit 阶段结束的时间戳 |
interactions: Set | 当更新被制定时,“interactions” 的集合会被追踪 |
class CustomButton extends React.Component {
// ...
@@ -442,11 +442,11 @@
color: 'blue'
};
-<CustomButton /> ;
不传值 props.color
将自动设置为 blue
class Hello extends Component {
constructor (props) {
@@ -460,20 +460,20 @@
state = { visible: true }
}
-function CustomButton(props) {
const { color = 'blue' } = props;
return <div>{color}</div>
}
-function CustomButton() {
const [color, setColor]=useState('blue')
return <div>{color}</div>
}
-JSX
仅仅只是 React.createElement(component, props, ...children)
函数的语法糖
<MyButton color="blue" shadowSize={2}>
@@ -496,7 +496,7 @@
{className: 'sidebar'}
)
-const Menu = ({ children }) => (
<div className="menu">{children}<div>
);
@@ -510,7 +510,7 @@
<Menu.Item>菜单二</Menu.Item>
<Menu>
-let element = <h1>Hello, world!</h1>;
let emptyHeading = <h1 />;
@@ -522,7 +522,7 @@
root.render(element);
参考:渲染元素
-const avatarUrl = "img/picture.jpg"
const element = <img src={avatarUrl} />;
@@ -533,7 +533,7 @@
);
注意:类属性 className
let name = '张三';
let element = <h1>Hello, {name}</h1>;
@@ -546,7 +546,7 @@
</h1>
);
-const divStyle = {
color: 'blue',
backgroundImage: 'url(' + imgUrl + ')',
@@ -555,7 +555,7 @@
return <div style={divStyle}>组件</div>;
}
-const markup = {__html: '我 · 你' };
const MyComponent = () => (
@@ -563,7 +563,7 @@
);
dangerouslySetInnerHTML
是 React 为浏览器 DOM 提供 innerHTML
的替换方案。
const MyComponent = () => (
<div>
<input type="radio" id="ab" name="v">
@@ -572,22 +572,22 @@
);
for
在 JS
中是保留字,JSX 元素使用了 htmlFor
代替
非受控组件的属性,设置组件第一次挂载时的 value
<textarea defaultValue="Hello" />
<input>
、<select>
和 <textarea>
支持 value 属性
非受控组件的属性,设置组件是否被选中
<input type="radio" defaultChecked />
类型为 checkbox
或 radio
时,组件支持 checked 属性
import React from "react";
@@ -609,10 +609,10 @@
}
注意:组件必须总是返回一些东西。
-<Greeting firstName="三" lastName="张" />
-export default function Weather(props) {
const isLoggedIn = props.isLoggedIn;
return (
@@ -625,7 +625,7 @@
{isShow && <div>内容</div>}
-
<Dropdown>
下拉列表
<Menu>
@@ -636,7 +636,7 @@
</Dropdown>
组件名称以大驼峰式命名。
-function Greeting(props) {
let button;
if (props.isLoggedIn) {
@@ -647,7 +647,7 @@
return <div>{button}</div>;
}
-function Student() {
const [count, setCount] = useState(0);
return (
@@ -657,8 +657,8 @@
);
}
-import React from 'react';
@@ -674,16 +674,16 @@
}
注意:每个组件都需要一个根元素,更多说明。
-class Welcome extends React.Component {
render() {
return <h1>{this.props.name}</h1>;
}
}
-:- | - |
---|---|
this.forceUpdate() | 强制重新渲染 |
this.setState({ ... }) | 更新状态 |
this.setState(state =>{ ... }) | 更新状态 |
:- | - |
---|---|
defaultProps | 默认 props |
displayName | 显示组件名称(用于调试) |
:- | - |
---|---|
this.props | 组件接受参数 |
this.state | 组件内状态 |
import React, {PureComponent} from 'react'
class MessageBox extends PureComponent {
···
}
-import React, { Component } from 'react';
// 高阶组件 with
const with = data => WrappedComponent => {
@@ -774,7 +774,7 @@
const MyComp = with('Hello')(LowComponent)
-function FancyBorder(props) {
return (
<div className={'Fancy'+props.color}>
@@ -795,7 +795,7 @@
);
}
-function SplitPane(props) {
return (
<div className="SplitPane">
@@ -819,7 +819,7 @@
}
给组件 SplitPane
传递 left
和 right
两个组件参数
import React from 'react';
import UserAvatar from "./UserAvatar";
@@ -833,7 +833,7 @@
}
注意:假设 UserAvatar
在 UserAvatar.js
中声明
const Menu = ({ children }) => (
<div className="menu">{children}<div>
);
@@ -862,10 +862,10 @@
<Menu.Item>菜单二</Menu.Item>
<Menu>
-function Counter({ initialCount }) {
const [count, setCount] = useState(initialCount);
@@ -971,7 +971,7 @@
);
}
-function TextInputWithFocusButton() {
const $input = useRef(null);
const onButtonClick = () => {
@@ -988,7 +988,7 @@
}
current
指向已挂载到 DOM 上的文本输入元素
function FancyInput(props, ref) {
const inputRef = useRef();
useImperativeHandle(ref, () => ({
@@ -1004,7 +1004,7 @@
<FancyInput ref={inputRef} />
inputRef.current.focus()
-
useEffect(() => {
const subs = props.source.subscribe();
return () => {
@@ -1012,7 +1012,7 @@
};
}, [props.source]);
-const memoizedCallback = useCallback(
() => {
doSomething(a, b);
@@ -1020,7 +1020,7 @@
[a, b],
);
-const memoizedValue = useMemo(
() => {
return computeExpensiveValue(a, b)
@@ -1028,7 +1028,7 @@
[a, b]
);
-function Checkbox() {
const id = useId();
return (
@@ -1042,7 +1042,7 @@
};
用于生成跨服务端和客户端稳定的唯一 ID
的同时避免 hydration
不匹配
function useFriendStatus(friendID) {
const [
isOnline, setIsOnline
@@ -1058,7 +1058,7 @@
不推荐你向每个自定义 Hook
添加 debug
值
useEffect(
() => {
// componentDidMount
@@ -1072,9 +1072,9 @@
);
这是一个类似 class
组件中 componentDidMount
& componentWillUnmount
两个生命周期函数的写法。
方法 | 描述 |
---|---|
constructor (props) | 渲染前 # |
static getDerivedStateFromProps() | 调用 render 方法之前调用 # |
render() | class 组件中唯一必须实现的方法 # |
componentDidMount() | 在组件挂载后(插入 DOM 树中)立即调用 # |
UNSAFE_componentWillMount() | 在挂载之前被调用,建议使用 constructor() # |
在 constructor()
上设置初始状态。在 componentDidMount()
上添加 DOM 事件处理程序、计时器(等),然后在 componentWillUnmount()
上删除它们。
方法 | 描述 |
---|---|
componentWillUnmount() | 在组件卸载及销毁之前直接调用 # |
方法 | 描述 |
---|---|
static getDerivedStateFromProps(props, state) | 调用 render 之前调用,在初始挂载及后续更新时都会被调用 # |
shouldComponentUpdate(nextProps, nextState) | 如果返回 false ,则跳过 render() # |
render() | 在不修改组件 state 的情况下,每次调用时都返回相同的结果 # |
getSnapshotBeforeUpdate() | 在发生更改之前从 DOM 中捕获一些信息(例如,滚动位置) # |
componentDidUpdate() | 这里使用 setState() ,但记得比较 props 。首次渲染不会执行此方法 # |
class Welcome extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
-constructor(props) {
super(props);
// 不要在这里调用 this.setState()
@@ -1213,7 +1213,7 @@
this.handleClick = this.handleClick.bind(this);
}
-class ErrorBoundary extends React.Component {
constructor(props) {
@@ -1236,7 +1236,7 @@
}
}
-componentDidUpdate(prevProps) {
// 典型用法(不要忘记比较 props):
if (this.props.uid !== prevProps.uid) {
@@ -1244,7 +1244,7 @@
}
}
-getSnapshotBeforeUpdate(prevProps, prevState) {
// 我们是否在 list 中添加新的 items ?
// 捕获滚动位置以便我们稍后调整滚动位置。
@@ -1255,8 +1255,8 @@
return null;
}
-import PropTypes from 'prop-types'
@@ -1279,7 +1279,7 @@
:- | - |
---|---|
any | 任意类型 |
(props, propName, 组件名称)=>{} | 自定义验证器 |
:- | - |
---|---|
string | 字符串 |
number | 数组 |
func | 函数 |
bool | 布尔值 |
symbol | - |
:- | - |
---|---|
oneOf(any) | 枚举类型 |
oneOfType([type]) | 几种类型中的任意一个类型 |
:- | - |
---|---|
array | 数组 |
arrayOf | 数组由某一类型的元素组成 |
:- | - |
---|---|
object | 对象 |
objectOf | 对象由某一类型的值组成 |
instanceOf(...) | 类的实例 |
shape | 对象由特定的类型值组成 |
exact | 有额外属性警告 |
:- | - |
---|---|
element | React 元素 |
elementType | React 元素类型(即 MyComponent ) |
node | DOM 节点 |
:- | - |
---|---|
(···).isRequired | 必需的 |
MyComponent.propTypes = {
email: PropTypes.string,
seats: PropTypes.number,
@@ -1429,7 +1429,7 @@
}
你可以将属性声明为 JS 原生类型,默认都是可选的。
-MyComponent.propTypes = {
// 确保这个 prop 没有被提供时,会打印警告信息
requiredFunc: PropTypes.func.isRequired,
@@ -1439,7 +1439,7 @@
}
你可以在任何 PropTypes
属性后面加上 isRequired
。
MyComponent.propTypes = {
// 只能是特定的值,枚举类型。
optionalEnum: PropTypes.oneOf([
@@ -1453,7 +1453,7 @@
]),
}
-MyComponent.propTypes = {
// 任何可被渲染的元素
// (包括数字、字符串、元素或数组)
@@ -1467,7 +1467,7 @@
elementType: PropTypes.elementType,
}
-MyComponent.propTypes = {
// 可以指定一个对象由某一类型的值组成
objectOf: PropTypes.objectOf(
@@ -1485,7 +1485,7 @@
}),
}
-MyComponent.propTypes = {
custom: (props, propName, compName) => {
if (!/matchm/.test(props[propName])) {
@@ -1501,7 +1501,7 @@
}
请不要使用 console.warn
或抛出异常,因为这在 oneOfType
中不会起作用。
arrayOf
或 objectOf
验证器arrayOf
或 objectOf
验证器MyComponent.propTypes = {
arrayProp: PropTypes.arrayOf((propValue, key, componentName, location, propFullName) => {
@@ -1516,19 +1516,19 @@
}
propValue
是数组或对象本身,key
是他们当前的键。
MyComponent.propTypes = {
arr: PropTypes.arrayOf(PropTypes.number),
};
可以指定一个数组由某一类型的元素组成
-MyComponent.propTypes = {
message: PropTypes.instanceOf(Message),
};
声明 message
为类的实例
正则表达式 (regex) 的快速参考,包括符号、范围、分组、断言和一些示例模式,以帮助您入门。
这是开始使用正则表达式(Regex)的快速备忘单。
范例 | 说明 |
---|---|
[abc] | 单个字符:a 、b 或 c |
[^abc] | 一个字符,除了:a 、b 或 c |
[a-z] | 范围内的字符:a-z |
[^a-z] | 不在范围内的字符:a-z |
[0-9] | 范围内的数字:0-9 |
[a-zA-Z] | 范围内的字符:a-z 或 A-Z |
[a-zA-Z0-9] | 范围内的字符:a-z 、A-Z 或 0-9 |
范例 | 说明 |
---|---|
a? | 零个或一个a |
a* | 零个或多个 a |
a+ | 一个或多个a |
[0-9]+ | 0-9 中的一个或多个 |
a{3} | 正好 3 个 a |
a{3,} | 3个或更多的a |
a{3,6} | a 的 3 到 6 之间 |
a* | 贪心量词 |
a*? | 惰性量词 |
a*+ | 占有量词 |
使用 \
转义这些特殊字符
范例 | 说明 |
---|---|
. | 任何单个字符 |
\s | 任何空白字符 |
\S | 任何非空白字符 |
\d | 任何数字,与 [0-9] 相同 |
\D | 任何非数字,与 [^0-9] 相同 |
\w | 任何单词字符 |
\W | 任何非单词字符 |
\X | 任何 Unicode 序列,包括换行符 |
\C | 匹配一个数据单元 |
\R | Unicode 换行符 |
\v | 垂直空白字符 |
\V | \v 的否定 - 除了换行符和垂直制表符之外的任何内容 |
\h | 水平空白字符 |
\H | \h 的否定 |
\K | 重置匹配 |
\n | 匹配第 n 个子模式 |
\pX | Unicode 属性 X |
\p{...} | Unicode 属性或脚本类别 |
\PX | \pX 的否定 |
\P{...} | \p 的否定 |
\Q...\E | 引用;视为文字 |
\k<name> | 匹配子模式name |
\k'name' | 匹配子模式name |
\k{name} | 匹配子模式name |
\gn | 匹配第 n 个子模式 |
\g{n} | 匹配第 n 个子模式 |
\g<n> | 递归第 n 个捕获组 |
\g'n' | 递归第 n 个捕获组。 |
\g{-n} | 匹配第 n 个相对前一个子模式 |
\g<+n> | 递归第 n 个相对即将到来的子模式 |
\g'+n' | 匹配第 n 个相对即将到来的子模式 |
\g'letter' | 递归命名捕获组 字母 |
\g{letter} | 匹配先前命名的捕获组 字母 |
\g<letter> | 递归命名捕获组 字母 |
\xYY | 十六进制字符 YY |
\x{YYYY} | 十六进制字符 YYYY |
\ddd | 八进制字符ddd |
\cY | 控制字符 Y |
[\b] | 退格字符 |
\ | 使任何字符文字 |
范例 | 说明 |
---|---|
\G | 比赛开始 |
^ | 字符串的开始 |
$ | 字符串结束 |
\A | 字符串的开始 |
\Z | 字符串结束 |
\z | 字符串的绝对结尾 |
\b | 一个词的边界 |
\B | 非单词边界 |
范例 | 说明 |
---|---|
\0 | 完整的比赛内容 |
\1 | 捕获组 1 中的内容 |
$1 | 捕获组 1 中的内容 |
${foo} | 捕获组 foo 中的内容 |
\x20 | 十六进制替换值 |
\x{06fa} | 十六进制替换值 |
\t | 标签 |
\r | 回车 |
\n | 新队 |
\f | 换页 |
\U | 大写转换 |
\L | 小写转换 |
\E | 终止任何转换 |
范例 | 说明 |
---|---|
(...) | 捕获所有封闭的东西 |
(a|b) | 匹配 a 或 b |
(?:...) | 匹配随附的所有内容 |
(?>...) | 原子组(非捕获) |
(?|...) | 重复的子模式组号 |
(?#...) | 注解 |
(?'name'...) | 命名捕获组 |
(?<name>...) | 命名捕获组 |
(?P<name>...) | 命名捕获组 |
(?imsxXU) | 内联修饰符 |
(?(DEFINE)...) | 在使用它们之前预定义模式 |
:- | - |
---|---|
(?(1)yes|no) | 条件语句 |
(?(R)yes|no) | 条件语句 |
(?(R#)yes|no) | 递归条件语句 |
(?(R&name)yes|no) | 条件语句 |
(?(?=...)yes|no) | 有条件的前瞻 |
(?(?<=...)yes|no) | 有条件的往后看 |
:- | - |
---|---|
(?R) | 递归整个模式 |
(?1) | 递归第一个子模式 |
(?+1) | 递归第一个相对子模式 |
(?&name) | 递归子模式name |
(?P=name) | 匹配子模式name |
(?P>name) | 递归子模式name |
:- | - |
---|---|
g | 全部 |
m | 多行 |
i | 不区分大小写 |
x | 忽略空格 |
s | 单线 |
u | 统一码 |
X | 扩展 |
U | 不贪心 |
A | 锚 |
J | 重复的组名 |
d | 结果包含捕获组子字符串开始和结束的索引 |
:- | - |
---|---|
(?=...) | 正先行断言 |
(?!...) | 负先行断言 |
(?<=...) | 正后发断言 |
(?<!...) | 负后发断言 |
?= | 正先行断言-存在 |
?! | 负先行断言-排除 |
?<= | 正后发断言-存在 |
?<! | 负后发断言-排除 |
零宽度断言 允许您在主模式之前(向后看)或之后(lookahead)匹配一个组,而不会将其包含在结果中。
-字符类 | 如同 | 意义 |
---|---|---|
[[:alnum:]] | [0-9A-Za-z] | 字母和数字 |
[[:alpha:]] | [A-Za-z] | 字母 |
[[:ascii:]] | [\x00-\x7F] | ASCII 码 0-127 |
[[:blank:]] | [\t ] | 仅空格或制表符 |
[[:cntrl:]] | [\x00-\x1F\x7F] | 控制字符 |
[[:digit:]] | [0-9] | 十进制数字 |
[[:graph:]] | [[:alnum:][:punct:]] | 可见字符(不是空格) |
[[:lower:]] | [a-z] | 小写字母 |
[[:print:]] | [ -~] == [ [:graph:]] | 可见字符 |
[[:punct:]] | [!"#$%&’()*+,-./:;<=>?@[]^_`{|}~] | 可见标点符号 |
[[:space:]] | [\t\n\v\f\r ] | 空白 |
[[:upper:]] | [A-Z] | 大写字母 |
[[:word:]] | [0-9A-Za-z_] | 单词字符 |
[[:xdigit:]] | [0-9A-Fa-f] | 十六进制数字 |
[[:<:]] | [\b(?=\w)] | 词的开头 |
[[:>:]] | [\b(?<=\w)] | 词尾 |
:- | - |
---|---|
(*ACCEPT) | 控制动词 |
(*FAIL) | 控制动词 |
(*MARK:NAME) | 控制动词 |
(*COMMIT) | 控制动词 |
(*PRUNE) | 控制动词 |
(*SKIP) | 控制动词 |
(*THEN) | 控制动词 |
(*UTF) | 图案修饰符 |
(*UTF8) | 图案修饰符 |
(*UTF16) | 图案修饰符 |
(*UTF32) | 图案修饰符 |
(*UCP) | 图案修饰符 |
(*CR) | 换行修饰符 |
(*LF) | 换行修饰符 |
(*CRLF) | 换行修饰符 |
(*ANYCRLF) | 换行修饰符 |
(*ANY) | 换行修饰符 |
\R | 换行修饰符 |
(*BSR_ANYCRLF) | 换行修饰符 |
(*BSR_UNICODE) | 换行修饰符 |
(*LIMIT_MATCH=x) | 正则表达式引擎修饰符 |
(*LIMIT_RECURSION=d) | 正则表达式引擎修饰符 |
(*NO_AUTO_POSSESS) | 正则表达式引擎修饰符 |
(*NO_START_OPT) | 正则表达式引擎修饰符 |
范例 | 说明 |
---|---|
ring | 匹配 |
. | 匹配 |
h.o | 匹配 |
ring\? | 匹配 |
\(quiet\) | 匹配 |
c:\\windows | 匹配 |
使用 \
搜索这些特殊字符:
[ \ ^ $ . | ? * + ( ) { }
范例 | 说明 |
---|---|
\w | “单词”字符 (字母、数字或下划线) |
\d | 数字 |
\s | 空格 (空格、制表符、vtab、换行符) |
\W, \D, or \S | 不是单词、数字或空格 |
[\D\S] | 表示不是数字或空格,两者都匹配 |
[^\d\s] | 禁止数字和空格 |
范例 | 说明 |
---|---|
colou?r | 匹配 |
[BW]ill[ieamy's]* | 匹配 |
[a-zA-Z]+ | 匹配 1 个或多个字母 |
\d{3}-\d{2}-\d{4} | 匹配 SSN |
[a-z]\w{1,7} | 匹配 UW NetID |
范例 | 说明 |
---|---|
cat|dog | 匹配 |
id|identity | 匹配 |
identity|id | 匹配 |
当替代品重叠时,命令从长到短
-范例 | 说明 |
---|---|
[aeiou] | 匹配任何元音 |
[^aeiou] | 匹配一个非元音 |
r[iau]ng | 匹配 |
gr[ae]y | 匹配 |
[a-zA-Z0-9] | 匹配任何字母或数字 |
在 [ ]
中总是转义 . \ ]
有时是 ^ - .
范例 | 说明 |
---|---|
* + {n,} greedy | 尽可能匹配 |
<.+> | 在 |
*? +? {n,}? lazy | 尽可能少匹配 |
<.+?> | 在 < |
范例 | 说明 |
---|---|
\b | “单词”边缘(非“单词”字符旁边) |
\bring | 单词以“ring”开头,例如 |
ring\b | 单词以“ring”结尾,例如 |
\b9\b | 匹配单个数字 |
\b[a-zA-Z]{6}\b | 匹配 6 个字母的单词 |
\B | 不是字边 |
\Bring\B | 匹配 |
^\d*$ | 整个字符串必须是数字 |
^[a-zA-Z]{4,20}$ | 字符串必须有 4-20 个字母 |
^[A-Z] | 字符串必须以大写字母开头 |
[\.!?"')]$ | 字符串必须以终端标点结尾 |
范例 | 说明 |
---|---|
(?i) [a-z]*(?-i) | 忽略大小写开/关 |
(?s) .*(?-s) | 匹配多行(导致 . 匹配换行符) |
(?m) ^.*;$(?-m) | |
(?x) | #free-spacing 模式,此 EOL 注释被忽略 |
(?-x) | 自由空间模式关闭 |
/regex/ismx | 修改整个字符串的模式 |
如果组后匹配失败,解析器会尝试每个替代方案。
可能导致灾难性的回溯。
范例 | 说明 |
---|---|
(to) (be) or not \1 \2 | 匹配 |
([^\s])\1{2} | 匹配非空格,然后再相同两次 |
\b(\w+)\s+\1\b | 匹配双字 |
范例 | 说明 |
---|---|
on(?:click|load) | 快于:on(click|load) |
尽可能使用非捕获或原子组
-"id" 匹配,但 \b
在原子组之后失败,
解析器不会回溯到组以重试“身份”
如果替代品重叠,请从长到短命令。
-范例 | 说明 |
---|---|
(?= ) | 向前看,如果你能提前找到 |
(?! ) | 向前看,如果你找不到前面 |
(?<= ) | 向后看,如果你能找到后面 |
(?<! ) | 向后看,如果你找不到后面 |
\b\w+?(?=ing\b) | 匹配 |
\b(?!\w+ing\b)\w+\b | 不以“ing”结尾的单词 |
(?<=\bpre).*?\b | 匹配 pre |
\b\w{3}(?<!pre)\w*?\b | 不以“pre”开头的词 |
\b\w+(?<!ing)\b | 匹配不以“ing”结尾的单词 |
匹配 Mr.
或 Ms.
如果单词 her
稍后在字符串中
M(?(?=.*?\bher\b)s|r)\.
需要环顾 IF
条件
表达式 | 匹配示例 |
---|---|
the | The fat cat sat on the mat. |
The | The fat cat sat on the mat. |
由字母t
开始,接着是h
,再接着是e
.
.
表达式 | 匹配示例 |
---|---|
.ar | The car par ked in the gar age. |
表达式.ar
匹配一个任意字符后面跟着是a
和r
的字符串
表达式 | 匹配示例 |
---|---|
.ar | The car par ked in the gar age. |
ar[.] | A garage is a good place to park a car . |
方括号的句号就表示句号。表达式 ar[.]
匹配 ar.
字符串
表达式 | 匹配示例 |
---|---|
[^c]ar | The car par ked in the gar age. |
表达式 [^c]ar
匹配一个后面跟着 ar
的除了c
的任意字符。
*
号*
号表达式 | 匹配示例 |
---|---|
[a-z]* | The car parked in the garage #21. |
\s*cat\s* | The fat cat sat on the concat enation. |
表达式 [a-z]*
匹配一个行中所有以小写字母开头的字符串。
+
号+
号表达式 | 匹配示例 |
---|---|
c.+t | The fat cat sat on the mat . |
表达式 c.+t
匹配以首字母c开头以t结尾,中间跟着至少一个字符的字符串。
?
号?
号表达式 | 匹配示例 |
---|---|
[T]he | The car is parked in the garage. |
[T]?he | The car is parked in the garage. |
表达式 [T]?he
匹配字符串 he
和 The
。
{}
号{}
号表达式 | 匹配示例 |
---|---|
[0-9]{2,3} | The number was 9.999 7 but we rounded it off to 10 .0. |
[0-9]{2,} | The number was 9.9997 but we rounded it off to 10 .0. |
[0-9]{3} | The number was 9.999 7 but we rounded it off to 10.0. |
(...)
特征标群(...)
特征标群表达式 | 匹配示例 |
---|---|
(c|g|p)ar | The car is par ked in the gar age. |
表达式 (c|g|p)ar
匹配 car
或 gar
或 par
。 注意 \
是在 Markdown 中为了不破坏表格转义 |
。
|
或运算符|
或运算符表达式 | 匹配示例 |
---|---|
(T|t)he|car | The car is parked in the garage. |
表达式 (T|t)he|car
匹配 (T|t)he
或 car
表达式 | 匹配示例 |
---|---|
(f|c|m)at\.? | The fat cat sat on the mat. |
如果想要匹配句子中的 .
则要写成 \.
以下这个例子 \.?
是选择性匹配.
匹配指定开头或结尾的字符串就要使用到锚点。
-^
号 (符串的开头)^
号 (符串的开头)表达式 | 匹配示例 |
---|---|
(T|t)he | The car is parked in the garage. |
^(T|t)he | The car is parked in the garage. |
$
号 (否是最后一个)$
号 (否是最后一个)表达式 | 匹配示例 |
---|---|
(at\.) | The fat cat. sat. on the mat. |
(at\.)$ | The fat cat. sat. on the mat. |
简写 | 描述 |
---|---|
. | 除换行符外的所有字符 |
\w | 匹配所有字母数字 等同于 [a-zA-Z0-9_] |
\W | 匹配所有非字母数字,即符号 等同于: [^\w] |
\d | 匹配数字: [0-9] |
\D | 匹配非数字: [^\d] |
\s | 匹配所有空格字符 等同于: [\t\n\f\r\p{Z}] |
\S | 匹配所有非空格字符: [^\s] |
\f | 匹配一个换页符 |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\t | 匹配一个制表符 |
\v | 匹配一个垂直制表符 |
\p | 匹配 CR/LF(等同于 \r\n )用来匹配 DOS 行终止符 |
正则表达式提供一些常用的字符集简写。
-?=...
正先行断言?=...
正先行断言表达式 | 匹配示例 |
---|---|
(T|t)he(?=\sfat) | The fat cat sat on the mat. |
The
和 the
后面紧跟着 (空格)fat
。
?!...
负先行断言?!...
负先行断言表达式 | 匹配示例 |
---|---|
(T|t)he(?!\sfat) | The fat cat sat on the mat. |
匹配 The
和 the
,且其后不跟着 (空格)fat
。
?<= ...
正后发断言?<= ...
正后发断言表达式 | 匹配示例 |
---|---|
(?<=(T|t)he\s)(fat|mat) | The fat cat sat on the mat . |
匹配 fat
和 mat
,且其前跟着 The
或 the
。
?<!...
负后发断言?<!...
负后发断言表达式 | 匹配示例 |
---|---|
(?<!(T|t)he\s)(cat) | The cat sat on cat . |
匹配 cat
,且其前不跟着 The
或 the
。
表达式 | 匹配示例 |
---|---|
The | The fat cat sat on the mat. |
/The/gi | The fat cat sat on the mat . |
修饰语 i
用于忽略大小写,g
表示全局搜索。
表达式 | 匹配示例 |
---|---|
/.(at)/ | The fat cat sat on the mat. |
/.(at)/g | The fat cat sat on the mat . |
表达式 /.(at)/g
表示搜索 任意字符(除了换行)+ at
,并返回全部结果。
表达式 | 匹配示例 |
---|---|
/.at(.)?$/ | The fat cat sat on the mat . |
/.at(.)?$/gm | The fat cat sat on the mat . |
表达式 | 匹配示例 |
---|---|
/(.*at)/ | The fat cat sat on the mat . |
/(.*?at)/ | The fat cat sat on the mat. |
导入正则表达式模块
import re
->>> sentence = 'This is a sample string'
>>> bool(re.search(r'this', sentence, flags=re.I))
True
>>> bool(re.search(r'xyz', sentence))
False
->>> re.findall(r'\bs?pare?\b', 'par spar apparent spare part pare')
['par', 'spar', 'spare', 'pare']
>>> re.findall(r'\b0*[1-9]\d{2,}\b', '0501 035 154 12 26 98234')
['0501', '154', '98234']
->>> m_iter = re.finditer(r'[0-9]+', '45 349 651 593 4 204')
>>> [m[0] for m in m_iter if int(m[0]) < 350]
['45', '349', '4', '204']
->>> re.split(r'\d+', 'Sample123string42with777numbers')
['Sample', 'string', 'with', 'numbers']
->>> ip_lines = "catapults\nconcatenate\ncat"
>>> print(re.sub(r'^', r'* ', ip_lines, flags=re.M))
* catapults
* concatenate
* cat
->>> pet = re.compile(r'dog')
>>> type(pet)
<class '_sre.SRE_Pattern'>
@@ -1795,7 +1795,7 @@
>>> bool(pet.search('A cat crossed their path'))
False
-函数 | 说明 |
---|---|
re.findall | 返回包含所有匹配项的列表 |
re.finditer | 返回一个可迭代的匹配对象(每个匹配一个) |
re.search | 如果字符串中的任何位置存在匹配项,则返回 Match 对象 |
re.split | 返回一个列表,其中字符串在每次匹配时被拆分 |
re.sub | 用字符串替换一个或多个匹配项 |
re.compile | 编译正则表达式模式供以后使用 |
re.escape | 返回所有非字母数字反斜杠的字符串 |
:- | - | - |
---|---|---|
re.I | re.IGNORECASE | 忽略大小写 |
re.M | re.MULTILINE | 多行 |
re.L | re.LOCALE | 使 \w 、\b 、\s locale 依赖 |
re.S | re.DOTALL | 点匹配所有 (包括换行符) |
re.U | re.UNICODE | 使 \w 、\b 、\d 、\s unicode 依赖 |
re.X | re.VERBOSE | 可读风格 |
:- | :- |
---|---|
dotAll | 是否使用了 s 修饰符 |
flags | 返回标志的字符串 |
global | 是否使用了 g (全部)修饰符 |
hasIndices | 是否使用了 d 修饰符 |
ignoreCase | 匹配文本的时候是否忽略大小写 i |
multiline | 是否进行多行搜索 m |
lastIndex | 该索引表示从哪里开始下一个匹配 |
source | 正则表达式的文本 |
sticky | 搜索是否是 sticky |
unicode | Unicode 功能是否开启 |
:- | :- |
---|---|
match() | 获取匹配结果 |
matchAll() | 所有匹配项 |
replace() | 替换所有符合正则模式的匹配项 |
search() | 搜索以取得匹配正则模式的项 |
split() | 切割字符串返回字符串数组 |
compile() | (重新)编译正则表达式 |
exec() | 指定字符串中执行一个搜索匹配 |
test() | 正则表达式与指定的字符串是否匹配 |
toString() | 返回该正则表达式的字符串 |
let textA = 'I like APPles very much';
let textB = 'I like APPles';
let regex = /apples$/i
@@ -1985,7 +1985,7 @@
console.log(regex.test(textA)); // false
console.log(regex.test(textB)); // true
-let text = 'I like APPles very much';
let regexA = /apples/;
let regexB = /apples/i;
@@ -1993,7 +1993,7 @@
console.log(text.search(regexA)); // -1
console.log(text.search(regexB)); // 7
-let text = 'Do you like apples?';
let regex= /apples/;
// Output: apples
@@ -2001,14 +2001,14 @@
// Output: Do you like apples?
console.log(regex.exec(text).input);
-let text = 'Here are apples and apPleS';
let regex = /apples/gi;
// Output: [ "apples", "apPleS" ]
console.log(text.match(regex));
-let text = 'This 593 string will be brok294en at places where d1gits are.';
let regex = /\d+/g
@@ -2016,7 +2016,7 @@
// Output: [ "This ", " string will be brok", "en at places where d", "gits are." ]
console.log(text.split(regex))
-let regex = /t(e)(st(\d?))/g;
let text = 'test1test2';
let array = [...text.matchAll(regex)];
@@ -2025,7 +2025,7 @@
// Output: ["test2", "e", "st2", "2"]
console.log(array[1]);
-let text = 'Do you like aPPles?';
let regex = /apples/i
@@ -2033,20 +2033,20 @@
let result = text.replace(regex, 'mangoes');
console.log(result);
-/d/s.dotAll; // => true
/d/g.global; // => true
/d/ig.flags; // => "gi"
/d/d.hasIndices; // => true
/d/i.ignoreCase; // => true
-let s = "Please yes\nmake my day!";
s.match(/yes[^]*day/);
// 返回 'yes\nmake my day'
-let regex = /apples/gi;
let text = 'Here are apples and apPleS';
@@ -2054,8 +2054,8 @@
// 返回: Here are mangoes and mangoes
-:- | - |
---|---|
preg_match() | 执行正则表达式匹配 |
preg_match_all() | 执行全局正则表达式匹配 |
preg_replace_callback() | 使用回调执行正则表达式搜索和替换 |
preg_replace() | 执行正则表达式搜索和替换 |
preg_split() | 按正则表达式模式拆分字符串 |
preg_grep() | 返回与模式匹配的数组条目 |
$str = "Visit Microsoft!";
$regex = "/microsoft/i";
@@ -2099,13 +2099,13 @@
echo preg_replace($regex, "QuickRef", $str);
-$str = "Visit QuickRef";
$regex = "#quickref#i";
// Output: 1
echo preg_match($regex, $str);
-$regex = "/[a-zA-Z]+ (\d+)/";
$input_str = "June 24, August 13, and December 30";
@@ -2120,37 +2120,37 @@
print_r($matches_out[1]);
}
-$arr = ["Jane", "jane", "Joan", "JANE"];
$regex = "/Jane/";
// Output: Jane
echo preg_grep($regex, $arr);
-$str = "Jane\tKate\nLucy Marion";
$regex = "@\s@";
// Output: Array("Jane", "Kate", "Lucy", "Marion")
print_r(preg_split($regex, $str));
-Pattern p = Pattern.compile(".s", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("aS");
boolean s1 = m.matches();
System.out.println(s1); // Outputs: true
-boolean s2 = Pattern.compile("[0-9]+").matcher("123").matches();
System.out.println(s2); // Outputs: true
-boolean s3 = Pattern.matches(".s", "XXXX");
System.out.println(s3); // Outputs: false
-:- | - |
---|---|
CANON_EQ | 规范等价 |
CASE_INSENSITIVE | 不区分大小写的匹配 |
COMMENTS | 允许空格和注释 |
DOTALL | 圆点模式 |
MULTILINE | 多行模式 |
UNICODE_CASE | Unicode 感知大小写折叠 |
UNIX_LINES | Unix 行模式 |
还有更多方法...
-替换句子:
String regex = "[A-Z\n]{5}$";
@@ -2234,9 +2234,9 @@
// Outputs: [sells, seashells, Seashore]
System.out.println(matches);
-函数名称 | 说明 |
---|---|
REGEXP | 字符串是否匹配正则表达式 |
REGEXP_INSTR() | 匹配正则表达式的子字符串的起始索引 (注意:仅限 MySQL 8.0+) |
REGEXP_LIKE() | 字符串是否匹配正则表达式 (注意:仅 MySQL 8.0+) |
REGEXP_REPLACE() | 替换匹配正则表达式的子字符串 (注意:仅限 MySQL 8.0+) |
REGEXP_SUBSTR() | 返回匹配正则表达式的子字符串 (注意:仅 MySQL 8.0+) |
expr REGEXP pat
-mysql> SELECT 'abc' REGEXP '^[a-d]';
1
mysql> SELECT name FROM cities WHERE name REGEXP '^A';
@@ -2279,28 +2279,28 @@
mysql> SELECT 'a' REGEXP 'A', 'a' REGEXP BINARY 'A';
1 0
-REGEXP_REPLACE(expr, pat, repl[, pos[, occurrence[, match_type]]])
-mysql> SELECT REGEXP_REPLACE('a b c', 'b', 'X');
a X c
mysql> SELECT REGEXP_REPLACE('abc ghi', '[a-z]+', 'X', 1, 2);
abc X
-REGEXP_SUBSTR(expr, pat[, pos[, occurrence[, match_type]]])
-mysql> SELECT REGEXP_SUBSTR('abc def ghi', '[a-z]+');
abc
mysql> SELECT REGEXP_SUBSTR('abc def ghi', '[a-z]+', 1, 3);
ghi
-REGEXP_LIKE(expr, pat[, match_type])
-mysql> SELECT regexp_like('aba', 'b+')
1
mysql> SELECT regexp_like('aba', 'b{2}')
@@ -2312,10 +2312,10 @@
mysql> SELECT regexp_like('a\nb\nc', '^b$', 'm');
1
-REGEXP_INSTR(expr, pat[, pos[, occurrence[, return_option[, match_type]]]])
-mysql> SELECT regexp_instr('aa aaa aaaa', 'a{3}');
2
mysql> SELECT regexp_instr('abba', 'b{2}', 2);
@@ -2325,7 +2325,7 @@
mysql> SELECT regexp_instr('abbabba', 'b{2}', 1, 3, 1);
7
-此备忘清单列出了流行手机、平板电脑、笔记本电脑和手表的屏幕尺寸、可视窗口尺寸和 CSS 媒体查询
设备 | 屏幕尺寸 | 解析度 | 可视窗口 | 密度 | 设备密度 | 比率 | 系统 |
---|---|---|---|---|---|---|---|
Apple iPhone 11 (2019) | 6.1 inch | 828 x 1792 px | 414 x 896 px | 326 ppi | 163 ppi | 2 xhdpi | iOS 13.0 |
Apple iPhone 11 Pro (2019) | 5.8 inch | 1125 x 2436 px | 375 x 812 px | 458 ppi | 153 ppi | 3 xxhdpi | iOS 13.0 |
Apple iPhone 11 Pro Max (2019) | 6.5 inch | 1242 x 2688 px | 414 x 896 px | 458 ppi | 153 ppi | 3 xxhdpi | iOS 13.0 |
Apple iPhone 12 (2020) | 6.1 inch | 1170 x 2532 px | 390 x 844 px | 460 ppi | 153 ppi | 3 xxhdpi | iOS 14.1 |
Apple iPhone 12 Pro (2020) | 6.1 inch | 1170 x 2532 px | 390 x 844 px | 460 ppi | 153 ppi | 3 xxhdpi | iOS 14.1 |
Apple iPhone 12 Pro Max (2020) | 6.7 inch | 1284 x 2778 px | 428 x 926 px | 458 ppi | 153 ppi | 3 xxhdpi | iOS 14.1 |
Apple iPhone 12 mini (2020) | 5.4 inch | 1080 x 2340 px | 360 x 780 px | 476 ppi | 159 ppi | 3 xxhdpi | iOS 14.1 |
Apple iPhone 5 | 4 inch | 640 x 1136 px | 320 x 568 px | 326 ppi | 163 ppi | 2.0 xhdpi | iOS 6 |
Apple iPhone 5c | 4 inch | 640 x 1136 px | 320 x 568 px | 326 ppi | 163 ppi | 2.0 xhdpi | iOS 7 |
Apple iPhone 5s | 4 inch | 640 x 1136 px | 320 x 568 px | 326 ppi | 163 ppi | 2.0 xhdpi | iOS 7 |
Apple iPhone 6 | 4.7 inch | 750 x 1334 px | 375 x 667 px | 326 ppi | 163 ppi | 2.0 xhdpi | iOS 8 |
Apple iPhone 6s | 4.7 inch | 750 x 1334 px | 375 x 667 px | 326 ppi | 163 ppi | 2.0 xhdpi | iOS 9 |
Apple iPhone 6s Plus | 5.5 inch | 1080 x 1920 px | 414 x 736 px | 401 ppi | 134 ppi | 3.0 xxhdpi | iOS 9 |
Apple iPhone 7 | 4.7 inch | 750 x 1334 px | 375 x 667 px | 326 ppi | 163 ppi | 2.0 xhdpi | iOS 10.0.1 |
Apple iPhone 7 Plus | 5.5 inch | 1080 x 1920 px | 414 x 736 px | 401 ppi | 134 ppi | 3.0 xxhdpi | iOS 10.0.1 |
Apple iPhone 8 | 4.7 inch | 750 x 1334 px | 375 x 667 px | 326 ppi | 163 ppi | 2.0 xhdpi | iOS 11 |
Apple iPhone 8 Plus | 5.5 inch | 1080 x 1920 px | 414 x 736 px | 401 ppi | 134 ppi | 3.0 xxhdpi | iOS 11 |
Apple iPhone SE | 4.0 inch | 640 x 1136 px | 320 x 568 px | 326 ppi | 163 ppi | 2 xhdpi | iOS 9.3.2 |
Apple iPhone SE (2020) | 4.7 inch | 750 x 1334 px | 375 x 667 px | 326 ppi | 163 ppi | 2 xhdpi | iOS 13.0 |
Apple iPhone X | 5.8 inch | 1125 x 2436 px | 375 x 812 px | 458 ppi | 153 ppi | 3.0 xxhdpi | iOS 11.1.1 |
Apple iPhone XR | 6.1 inch | 828 x 1792 px | 414 x 896 px | 326 ppi | 163 ppi | 2.0 xhdpi | iOS 12 |
Apple iPhone XS | 5.8 inch | 1125 x 2436 px | 375 x 812 px | 458 ppi | 153 ppi | 3.0 xxhdpi | iOS 12 |
Apple iPhone XS Max | 6.5 inch | 1242 x 2688 px | 414 x 896 px | 458 ppi | 153 ppi | 3.0 xxhdpi | iOS 12 |
Google Pixel | 5.0 inch | 1080 x 1920 px | 412 x 732 px | 441 ppi | 168 ppi | 2.625 xxhdpi | Android 7.1 |
Google Pixel | 5.0 inch | 1080 x 1920 px | 411 x 731 px | 441 ppi | 168 ppi | 2.6 xxhdpi | Android 7.1 |
Google Pixel 2 | 5.0 inch | 1080 x 1920 px | 412 x 732 px | 441 ppi | 168 ppi | 2.625 xxhdpi | Android 8.0 |
Google Pixel 2 XL | 6.0 inch | 1440 x 2880 px | 538 ppi | 154 ppi | 3.5 xxxhdpi | Android 8.0 | |
Google Pixel 3 (2018) | 5.5 inch | 1080 x 2160 px | 393 x 786 px | 443 ppi | 161 ppi | 2.75 xxhdpi | Android 9.0 |
Google Pixel 3 XL (2018) | 6.3 inch | 1440 x 2960 px | 412 x 846 px | 523 ppi | 149 ppi | 3.5 xxxhdpi | Android 9.0 |
Google Pixel 3a (2019) | 5.6 inch | 1080 x 2220 px | 393 x 808 px | 441 ppi | 160 ppi | 2.75 xxhdpi | Android 9.0 |
Google Pixel 3a XL (2019) | 6 inch | 1080 x 2160 px | 412 x 823 px | 402 ppi | 153 ppi | 2.625 xxhdpi | Android 9.0 |
Google Pixel 4 (2019) | 5.7 inch | 1080 x 2280 px | 393 x 830 px | 444 ppi | 161 ppi | 2.75 xxhdpi | Android 10.0 |
Google Pixel 4 XL (2019) | 6.3 inch | 1440 x 3040 px | 412 x 869 px | 537 ppi | 153 ppi | 3.5 xxxhdpi | Android 10 |
Google Pixel 4a (2020) | 5.81 inch | 1080 x 2340 px | 393 x 851 px | 443 ppi | 161 ppi | 2.75 xxhdpi | Android 10.0 |
Google Pixel 5 (2020) | 6 inch | 1080 x 2340 px | 393 x 851 px | 432 ppi | 157 ppi | 2.75 xxhdpi | Android 11.0 |
Google Pixel XL | 5.5 inch | 1440 x 2560 px | 534 ppi | 153 ppi | 3.5 xxxhdpi | Android 7.1 | |
HTC Desire 10 Lifestyle | 5.5 inch | 720 x 1280 px | 360 x 640 px | 267 ppi | 134 ppi | 2.0 xhdpi | Android 6.0 |
HTC Desire 628 | 5.0 inch | 720 x 1280 px | 360 x 640 px | 294 ppi | 147 ppi | 2.0 xhdpi | Android 5.1 |
Honor 6X (2016) | 5.5 inch | 1080 x 1920 px | 360 x 640 px | 403 ppi | 134 ppi | 3 xxhdpi | Android 6.0 |
Honor 7X (2017) | 5.93 inch | 1080 x 2160 px | 360 x 720 px | 407 ppi | 136 ppi | 3 xxhdpi | Android 7.0 |
Honor 8X (2018) | 6.5 inch | 1080 x 2340 px | 360 x 780 px | 397 ppi | 132 ppi | 3 xxhdpi | Android 8.1 |
Honor 9X (2019) | 6.59 inch | 1080 x 2340 px | 360 x 780 px | 391 ppi | 130 ppi | 3 xxhdpi | Android 9.0 |
Huawei Mate 10 Lite (2017) | 5.9 inch | 1080 x 2160 px | 360 x 720 px | 409 ppi | 136 ppi | 3 xxhdpi | Android 7.0 |
Huawei Mate 20 Lite (2018) | 6.3 inch | 1080 x 2340 px | 360 x 780 px | 409 ppi | 136 ppi | 3 xxhdpi | Android 8.1 |
Huawei Mate 20 Pro (2018) | 6.39 inch | 1440 x 3120 px | 360 x 780 px | 538 ppi | 135 ppi | 4 xxxhdpi | Android 9.0 |
Huawei Mate 30 (2019) | 6.62 inch | 1080 x 2340 px | 360 x 780 px | 389 ppi | 130 ppi | 3 xxhdpi | Android 10.0 |
Huawei Mate 30 Pro (2019) | 6.53 inch | 1176 x 2400 px | 392 x 800 px | 409 ppi | 136 ppi | 3 xxhdpi | Android 10.0 |
Huawei Nova 7i (2020) | 6.4 inch | 1080 x 2310 px | 360 x 770 px | 398 ppi | 133 ppi | 3 xxhdpi | Android 10.0 |
Huawei Y9 Prime (2019) | 6.59 inch | 1080 x 2340 px | 360 x 780 px | 391 ppi | 130 ppi | 3 xxhdpi | Android 9.0 |
Huawei Y9s (2019) | 6.59 inch | 1080 x 2340 px | 360 x 780 px | 391 ppi | 130 ppi | 3 xxhdpi | Android 9.0 |
LG G5 | 5.3 inch | 1440 x 2560 px | 360 x 640 px | 554 ppi | 139 ppi | 4.0 xxxhdpi | Android 6.0.1 |
Motorola Moto E5 Plus | 6.0 inch | 720 x 1440 px | 268 ppi | 134 ppi | 2.0 xhdpi | Android 8.0 | |
OnePlus 6 | 6.28 inch | 1080 x 2280 px | 412 x 869 px | 402 ppi | 153 ppi | 2.625 xxhdpi | Android 8.1 |
OnePlus 6T | 6.41 inch | 1080 x 2340 px | 412 x 892 px | 402 ppi | 153 ppi | 2.625 xxhdpi | Android 9.0 |
OnePlus 7 | 6.41 inch | 1080 x 2340 px | 412 x 892 px | 402 ppi | 153 ppi | 2.625 xxhdpi | Android 9.0 |
OnePlus 7 Pro | 6.67 inch | 1440 x 3120 px | 412 x 892 px | 516 ppi | 147 ppi | 3.5 xxxhdpi | Android 9.0 |
OnePlus 7T (2019) | 6.55 inch | 1080 x 2400 px | 412 x 914 px | 402 ppi | 153 ppi | 2.625 xxhdpi | Android 10.0 |
OnePlus 8 (2020) | 6.55 inch | 1080 x 2400 px | 412 x 915 px | 402 ppi | 153 ppi | 2.625 xxhdpi | Android 10.0 |
OnePlus 8 Pro (2020) | 6.78 inch | 1440 x 3168 px | 412 x 906 px | 513 ppi | 147 ppi | 3.5 xxxhdpi | Android 10.0 |
OnePlus 8T (2020) | 6.55 inch | 1080 x 2400 px | 412 x 914 px | 402 ppi | 153 ppi | 2.625 xxhdpi | Android 11.0 |
OnePlus Nord (2020) | 6.44 inch | 1080 x 2400 px | 412 x 915 px | 408 ppi | 155 ppi | 2.625 xxhdpi | Android 10.0 |
Redmi Note 9 Pro (2020) | 6.67 inch | 1080 x 2400 px | 393 x 873 px | 395 ppi | 144 ppi | 2.75 xxhdpi | Android 10.0 |
Samsung A50 (2019) | 6.4 inch | 1080 x 2340 px | 412 x 892 px | 403 ppi | 154 ppi | 2.625 xxhdpi | Android 9.0 |
Samsung Galaxy A30 (2019) | 6.4 inch | 1080 x 2340 px | 412 x 892 px | 403 ppi | 154 ppi | 2.625 xxhdpi | Android 9.0 |
Samsung Galaxy A50s (2019) | 6.4 inch | 1080 x 2340 px | 412 x 892 px | 403 ppi | 154 ppi | 2.625 xxhdpi | Android 9.0 |
Samsung Galaxy A51 (2019) | 6.5 inch | 1080 x 2400 px | 412 x 914 px | 405 ppi | 154 ppi | 2.625 xxhdpi | Android 10.0 |
Samsung Galaxy A6s | 6.0 inch | 1080 x 2160 px | 360 x 720 px | 402 ppi | 134 ppi | 3.0 xxhdpi | Android 8.0 |
Samsung Galaxy A70s (2019) | 6.7 inch | 1080 x 2400 px | 412 x 914 px | 393 ppi | 150 ppi | 2.625 xxhdpi | Android 9.0 |
Samsung Galaxy A71 (2020) | 6.7 inch | 1080 x 2400 px | 412 x 914 px | 393 ppi | 150 ppi | 2.625 xxhdpi | Android 10.0 |
Samsung Galaxy Fold (2019) | 7.3 inch | 1536 x 2152 px | 768 x 1076 px | 362 ppi | 181 ppi | 2 xhdpi | Android 9.0 |
Samsung Galaxy J4 | 5.5 inch | 720 x 1280 px | 134 ppi | 2 xhdpi | Android 8.0 | ||
Samsung Galaxy J5 | 5.0 inch | 720 x 1280 px | 294 ppi | 2 xhdpi | Android 5.1 | ||
Samsung Galaxy J5 Prime | 5.0 inch | 720 x 1280 px | 294 ppi | 147 ppi | 2 xhdpi | Android 6.0.1 | |
Samsung Galaxy J6 | 5.6 inch | 720 x 1480 px | 293 ppi | 147 ppi | 2 xhdpi | Android 8.0 | |
Samsung Galaxy J7 | 5.5 inch | 720 x 1280 px | 360 x 640 px | 267 ppi | 134 ppi | 2.0 xhdpi | Android 6.0.1 |
Samsung Galaxy J7 Prime | 5.5 inch | 1080 x 1920 px | 360 x 640 px | 401 ppi | 134 ppi | 3.0 xxhdpi | Android 6.0.1 |
Samsung Galaxy J7 Prime2 (2018) | 5.5 inch | 1080 x 1920 px | 412 x 732 px | 401 ppi | 153 ppi | 2.625 xxhdpi | Android 7.0 |
Samsung Galaxy J7 Pro | 5.5 inch | 1080 x 1920 px | 401 ppi | 134 ppi | 3 xxhdpi | Android 7.0 | |
Samsung Galaxy J8 | 6.0 inch | 720 x 1480 px | 274 ppi | 137 ppi | 2 xhdpi | Android 8.0 | |
Samsung Galaxy Note20 (2020) | 6.7 inch | 1080 x 2400 px | 412 x 915 px | 393 ppi | 150 ppi | 2.625 xxhdpi | Android 10.0 |
Samsung Galaxy Note20 Ultra (2020) | 6.9 inch | 1440 x 3088 px | 412 x 883 px | 496 ppi | 142 ppi | 3.5 xxxhdpi | Android 10.0 |
Samsung Galaxy Note8 | 6.3 inch | 1440 x 2960 px | 521 ppi | 149 ppi | 3.5 xxxhdpi | Android 7.1.1 | |
Samsung Galaxy On8 | 5.5 inch | 1080 x 1920 px | 360 x 640 px | 401 ppi | 134 ppi | 3.0 xxhdpi | Android 6.0.1 |
Samsung Galaxy S10 | 6.1 inch | 1440 x 3040 px | 360 x 760 px | 550 ppi | 138 ppi | 4 xxxhdpi | Android 9.0 |
Samsung Galaxy S10 Lite (2020) | 6.7 inch | 1080 x 2400 px | 412 x 914 px | 394 ppi | 150 ppi | 2.625 xxhdpi | Android 10.0 |
Samsung Galaxy S10+ | 6.4 inch | 1440 x 3040 px | 412 x 869 px | 522 ppi | 149 ppi | 3.5 xxxhdpi | Android 9.0 |
Samsung Galaxy S20 (2020) | 6.4 inch | 1440 x 3200 px | 360 x 800 px | 563 ppi | 141 ppi | 4 xxxhdpi | Android 10.0 |
Samsung Galaxy S20 FE (2020) | 6.5 inch | 1080 x 2400 px | 412 x 914 px | 407 ppi | 155 ppi | 2.625 xxhdpi | Android 10.0 |
Samsung Galaxy S20 Ultra (2020) | 6.9 inch | 1440 x 3200 px | 412 x 915 px | 511 ppi | 146 ppi | 3.5 xxxhdpi | Android 10.0 |
Samsung Galaxy S20+ (2020) | 6.7 inch | 1440 x 3200 px | 384 x 854 px | 525 ppi | 140 ppi | 3.75 xxxhdpi | Android 10.0 |
Samsung Galaxy S21 Ultra (2021) | 6.8 inch | 1440 x 3200 px | 384 x 854 px | 515 ppi | 137 ppi | 3.75 xxxhdpi | Android 11.0 |
Samsung Galaxy S8 | 5.8 inch | 1440 x 2960 px | 360 x 740 px | 570 ppi | 142 ppi | 4.0 xxxhdpi | Android 7.0 |
Samsung Galaxy S8+ | 6.2 inch | 1440 x 2960 px | 529 ppi | 132 ppi | 4.0 xxxhdpi | Android 7.0 | |
Samsung Galaxy S9 | 5.8 inch | 1440 x 2960 px | 360 x 740 px | 570 ppi | 142 ppi | 4.0 xxxhdpi | Android 8.0 |
Samsung Galaxy S9+ | 6.2 inch | 1440 x 2960 px | 529 ppi | 151 ppi | 4 xxxhdpi | Android 8.0 | |
Samsung Galaxy Z Flip (2020) | 6.7 inch | 1080 x 2636 px | 412 x 1004 px | 425 ppi | 162 ppi | 2.625 xxhdpi | Android 10.0 |
Samsung Galaxy Z Fold2 (2020) | 7.6 inch | 1768 x 2208 px | 884 x 1104 px | 373 ppi | 187 ppi | 2 xhdpi | Android 10.0 |
Samsung Note10 (2019) | 6.3 inch | 1080 x 2280 px | 412 x 869 px | 401 ppi | 153 ppi | 2.625 xxhdpi | Android 9.0 |
Samsung Note10+ (2019) | 6.8 inch | 1440 x 3040 px | 412 x 869 px | 498 ppi | 142 ppi | 3.5 xxxhdpi | Android 9.0 |
Samsung S6 | 5.1 inch | 1440 x 2560 px | 360 x 640 px | 577 ppi | 144 ppi | 4.0 xxxhdpi | Android 5.0.2 |
Samsung S6 edge | 5.1 inch | 1440 x 2560 px | 360 x 640 px | 577 ppi | 144 ppi | 4.0 xxxhdpi | Android 5.0.2 |
Samsung S7 | 5.1 inch | 1440 x 2560 px | 360 x 640 px | 577 ppi | 144 ppi | 4.0 xxxhdpi | Android 6.0 |
Samsung S7 edge | 5.5 inch | 1440 x 2560 px | 360 x 640 px | 534 ppi | 153 ppi | 4.0 xxxhdpi | Android 6.0 |
Sony Xperia X | 5 inch | 1080 x 1920 px | 360 x 640 px | 441 ppi | 147 ppi | 3.0 xxhdpi | Android 6.0.1 |
Sony Xperia XZ | 5.2 inch | 1080 x 1920 px | 360 x 640 px | 424 ppi | 141 ppi | 3.0 xxhdpi | Android 6.0.1 |
Xiaomi Redmi Note 7 (2019) | 6.3 inch | 1080 x 2340 px | 393 x 851 px | 409 ppi | 149 ppi | 2.75 xxhdpi | Android 9.0 |
Xiaomi Redmi Note 8 (2019) | 6.3 inch | 1080 x 2340 px | 393 x 851 px | 409 ppi | 149 ppi | 2.75 xxhdpi | Android 9.0 |
Xiaomi Redmi Note 8 Pro (2019) | 6.53 inch | 1080 x 2340 px | 393 x 851 px | 395 ppi | 144 ppi | 2.75 xxhdpi | Android 9.0 |
设备 | 屏幕尺寸 | 解析度 | 可视窗口 | 密度 | 设备密度 | 比率 | 系统 |
---|---|---|---|---|---|---|---|
Apple iPad 10.2" (2019) | 10.2 inch | 1620 x 2160 px | 810 x 1080 px | 264 ppi | 132 ppi | 2 xhdpi | iPadOS 13.1.2 |
Apple iPad 10.2" (2020) | 10.2 inch | 1620 x 2160 px | 810 x 1080 px | 264 ppi | 132 ppi | 2 xhdpi | iPadOS 14 |
Apple iPad Air | 9.7 inch | 1536 x 2048 px | 768 x 1024 px | 264 ppi | 132 ppi | 2.0 xhdpi | iOS 7 |
Apple iPad Air 10.5" (2019) | 10.5 inch | 1668 x 2224 px | 834 x 1112 px | 264 ppi | 132 ppi | 2 xhdpi | iPadOS 13.1.2 |
Apple iPad Air 10.9" (2020) | 10.9 inch | 1640 x 2360 px | 820 x 1180 px | 264 ppi | 132 ppi | 2 xhdpi | iPadOS 14 |
Apple iPad Air 2 | 9.7 inch | 1536 x 2048 px | 768 x 1024 px | 264 ppi | 132 ppi | 2.0 xhdpi | iOS 8.1 |
Apple iPad Mini 7.9" (2019) | 7.9 inch | 1536 x 2048 px | 768 x 1024 px | 324 ppi | 162 ppi | 2 xhdpi | iPadOS 13.1.2 |
Apple iPad Pro | 12.9 inch | 2048 x 2732 px | 1024 x 1366 px | 264 ppi | 132 ppi | 2.0 xhdpi | iOS 9 |
Apple iPad Pro 10.5 (2017) | 10.5 inch | 1668 x 2224 px | 834 x 1112 px | 264 ppi | 132 ppi | 2.0 xhdpi | iOS 11 |
Apple iPad Pro 11" (2018) | 11 inch | 1668 x 2388 px | 834 x 1194 px | 264 ppi | 132 ppi | 2 xhdpi | iPadOS 13.1.2 |
Apple iPad Pro 11" (2020) | 11 inch | 1668 x 2388 px | 834 x 1194 px | 264 ppi | 132 ppi | 2 xhdpi | iPadOS 13.4 |
Apple iPad Pro 12.9" (2018) | 12.9 inch | 2048 x 2732 px | 1024 x 1366 px | 264 ppi | 132 ppi | 2 xhdpi | iPadOS 13.1.2 |
Apple iPad Pro 12.9" (2020) | 12.9 inch | 2048 x 2732 px | 1024 x 1366 px | 264 ppi | 132 ppi | 2 xhdpi | iPadOS 13.4 |
Apple iPad Pro 9.7 | 9.7 inch | 1536 x 2048 px | 768 x 1024 px | 264 ppi | 132 ppi | 2.0 xhdpi | iOS 9.3.2 |
Apple iPad Pro 9.7 (2017) | 9.7 inch | 1536 x 2048 px | 768 x 1024 px | 264 ppi | 132 ppi | 2.0 xhdpi | iOS 10.3 |
Apple iPad mini 3 | 7.9 inch | 1536 x 2048 px | 768 x 1024 px | 324 ppi | 132 ppi | 2.0 xhdpi | iOS 9 |
Apple iPad mini 4 | 7.9 inch | 1536 x 2048 px | 768 x 1024 px | 324 ppi | 162 ppi | 2.0 xhdpi | iOS 8.1 |
Google Pixel C (2015) | 10.2 inch | 2560x1800 px | 1280 x 900 px | 308 ppi | 154 ppi | 2 xhdpi | Android 6.0.1 |
设备 | 屏幕尺寸 | 解析度 | 可视窗口 | 密度 | 设备密度 | 比率 | 系统 |
---|---|---|---|---|---|---|---|
MacBook 2015 12" | 12 inch | 2304 x 1440 px | 1280 x 800 px | 226 ppi | 113 ppi | 2.0 xhdpi | macOS Sierra |
MacBook 2016 12" | 12 inch | 2304 x 1440 px | 1280 x 800 px | 226 ppi | 113 ppi | 2.0 xhdpi | macOS Sierra |
MacBook 2017 12" | 12 inch | 2304 x 1440 px | 1280 x 800 px | 226 ppi | 113 ppi | 2.0 xhdpi | macOS Sierra |
MacBook Air 2014 11" | 11.6 inch | 1366 x 768 px | 1366 x 768 px | 135 ppi | 135 ppi | 1.0 mdpi | OS X Mavericks |
MacBook Air 2014 13" | 13.3 inch | 1440 x 900 px | 1440 x 900 px | 128 ppi | 128 ppi | 1.0 mdpi | OS X Mavericks |
MacBook Air 2015 11" | 11.6 inch | 1366 x 768 px | 1366 x 768 px | 135 ppi | 135 ppi | 1.0 mdpi | OS X El Capitan |
MacBook Air 2015 13" | 13.3 inch | 1440 x 900 px | 1440 x 900 px | 128 ppi | 128 ppi | 1.0 mdpi | macOS Sierra |
MacBook Air 2017 13" | 13.3 inch | 1440 x 900 px | 1440 x 900 px | 128 ppi | 128 ppi | 1.0 mdpi | macOS Mojave |
MacBook Air 2018 13" | 13.3 inch | 2560 x 1600 px | 1280 x 800 px | 227 ppi | 113 ppi | 2.0 xhdpi | macOS Mojave |
MacBook Air 2020 13" | 13.3 inch | 2560 x 1600 px | 1280 x 800 px | 227 ppi | 114 ppi | 2 xhdpi | macOS Catalina |
MacBook Pro 13" 2018 | 13.3 inch | 2560 x 1600 px | 1280 x 800 px | 227 ppi | 113 ppi | 2.0 xhdpi | macOS Mojave |
MacBook Pro 15" 2018 | 15.4 inch | 2880 x 1800 px | 1440 x 900 px | 220 ppi | 112 ppi | 2.0 xhdpi | macOS Mojave |
MacBook Pro 16" 2019 | 16 inch | 3072 x 1920 px | 1536 x 960 px | 226 ppi | 113 ppi | 2.0 xhdpi | macOS Catalina |
MacBook Pro 2014 13" | 13.4 inch | 2560 x 1600 px | 1280 x 800 px | 227 ppi | 113 ppi | 2.0 xhdpi | macOS Sierra |
MacBook Pro 2014 15" | 15.4 inch | 2880 x 1800 px | 1440 x 900 px | 220 ppi | 112 ppi | 2.0 xhdpi | macOS Sierra |
MacBook Pro 2015 13" | 13.4 inch | 2560 x 1600 px | 1280 x 800 px | 227 ppi | 113 ppi | 2.0 xhdpi | macOS Sierra |
MacBook Pro 2015 15" | 15.4 inch | 2880 x 1800 px | 1440 x 900 px | 220 ppi | 112 ppi | 2.0 xhdpi | macOS Sierra |
MacBook Pro 2016 13" | 13.4 inch | 2560 x 1600 px | 1280 x 800 px | 227 ppi | 113 ppi | 2.0 xhdpi | macOS Sierra |
MacBook Pro 2016 15" | 15.4 inch | 2880 x 1800 px | 1440 x 900 px | 220 ppi | 112 ppi | 2.0 xhdpi | macOS Sierra |
MacBook Pro 2017 13" | 13.4 inch | 2560 x 1600 px | 1280 x 800 px | 227 ppi | 113 ppi | 2.0 xhdpi | macOS Sierra |
MacBook Pro 2017 15" | 15.4 inch | 2880 x 1800 px | 1440 x 900 px | 220 ppi | 112 ppi | 2.0 xhdpi | macOS Sierra |
设备 | 屏幕尺寸 | 解析度 | 可视窗口 | 密度 | 设备密度 | 比率 | 系统 |
---|---|---|---|---|---|---|---|
Apple Watch SE (40mm) (2020) | 1.57 inch | 394 x 324 px | 197 x 162 px | 326 ppi | 163 ppi | 2 xhdpi | watchOS 7.0 |
Apple Watch SE (44mm) (2020) | 1.78 inch | 448 x 368 px | 224 x 184 px | 326 ppi | 163 ppi | 2 xhdpi | watchOS 7.0 |
Apple Watch Series 3 (38mm) | 1.5 inch | 340 x 272 px | 170 x 136 px | 290 ppi | 145 ppi | 2 xhdpi | watchOS 4.0 |
Apple Watch Series 3 (42mm) | 1.65 inch | 390 x 312 px | 195 x 156 px | 303 ppi | 152 ppi | 2 xhdpi | watchOS 4.0 |
Apple Watch Series 4 (40mm) | 1.57 inch | 394 x 324 px | 197 x 162 px | 326 ppi | 163 ppi | 2 xhdpi | watchOS 5.0 |
Apple Watch Series 4 (44mm) | 1.78 inch | 448 x 368 px | 224 x 184 px | 326 ppi | 163 ppi | 2 xhdpi | watchOS 5.0 |
Apple Watch Series 5 (40mm) (2019) | 1.57 inch | 394 x 324 px | 197 x 162 px | 326 ppi | 163 ppi | 2 xhdpi | watchOS 6.0 |
Apple Watch Series 5 (44mm) (2019) | 1.78 inch | 448 x 368 px | 224 x 184 px | 326 ppi | 163 ppi | 2 xhdpi | watchOS 6.0 |
Apple Watch Series 6 (40mm) (2020) | 1.57 inch | 394 x 324 px | 197 x 162 px | 326 ppi | 163 ppi | 2 xhdpi | watchOS 7.0 |
Apple Watch Series 6 (44mm) (2020) | 1.78 inch | 448 x 368 px | 224 x 184 px | 326 ppi | 163 ppi | 2 xhdpi | watchOS 7.0 |
Asus Zenwatch 2 (2015) | 1.63 inch | 320 x 320 px | 213 x 213 px | 278 ppi | 185 ppi | 1.5 hdpi | |
Asus Zenwatch 3 (2016) | 1.39 inch | 400 x 400 px | 267 x 267 px | 287 ppi | 191 ppi | 1.5 hdpi | Android Wear OS 2.1 |
Asus Zenwatch 3 (2016) | 1.39 inch | 400 x 400 px | 267 x 267 px | 287 ppi | 191 ppi | 1.5 hdpi | Android Wear OS 2.1 |
Huawei Watch GT (2018) | 1.39 inch | 454 x 454 px | 227 x 227 px | 326 ppi | 163 ppi | 2 xhdpi | |
Huawei Watch Magic (2018) | 1.2 inch | 390 x 390 px | 195 x 195 px | 326 ppi | 163 ppi | 2 xhdpi | |
LG G Watch R (2015) | 1.3 inch | 320 x 320 px | 213 x 213 px | 245 ppi | 163 ppi | 1.5 hdpi | Android Wear OS 1.0 |
LG Watch Sport (2017) | 1.38 inch | 480 x 480 px | 240 x 240 px | 348 ppi | 174 ppi | 2 xhdpi | Android Wear 2.0 |
LG Watch Urbane 2nd Edition (2016) | 1.38 inch | 480 x 480 px | 240 x 240 px | 348 ppi | 174 ppi | 2 xhdpi | Android Wear 2.0 |
LG Watch W7 (2018) | 1.2 inch | 360 x 360 px | 240 x 240 px | 300 ppi | 200 ppi | 1.5 hdpi | Android Wear OS 2.0 |
Samsung Galaxy Watch (2018) | 1.3 inch | 360 x 360 px | 240 x 240 px | 278 ppi | 185 ppi | 1.5 hdpi | Tizen-based wearable OS 4.0 |
标准 | 纵横比 | 可视窗口 | 百万像素 | Steam(%) | Stat Counter(%) |
---|---|---|---|---|---|
nHD | 16:9 | 640 x 360 px | 0.230 | N/A | 0.47 |
SVGA | 4:3 | 800 x 600 px | 0.480 | N/A | 0.76 |
XGA | 4:3 | 1024 x 768 px | 0.786 | 0.38 | 2.78 |
WXGA | 16:9 | 1280 x 720 px | 0.922 | 0.36 | 4.82 |
WXGA | 16:10 | 1280 x 800 px | 1.024 | 0.61 | 3.08 |
SXGA | 5:4 | 1280 x 1024 px | 1.311 | 1.24 | 2.47 |
HD | ≈16:9 | 1360 x 768 px | 1.044 | 1.55 | 1.38 |
HD | ≈16:9 | 1366 x 768 px | 1.049 | 10.22 | 23.26 |
WXGA+ | 16:10 | 1440 x 900 px | 1.296 | 3.12 | 6.98 |
N/A | 16:9 | 1536 x 864 px | 1.327 | N/A | 8.5 |
HD+ | 16:9 | 1600 x 900 px | 1.440 | 2.59 | 4.14 |
WSXGA+ | 16:10 | 1680 x 1050 px | 1.764 | 1.97 | 2.23 |
FHD | 16:9 | 1920 x 1080 px | 2.074 | 64.81 | 20.41 |
WUXGA | 16:10 | 1920 x 1200 px | 2.304 | 0.81 | 0.93 |
QWXGA | 16:9 | 2048 x 1152 px | 2.359 | N/A | 0.51 |
QXGA | 4:3 | 2048 x 1536 px | 3.145 | - | - |
UWFHD | ≈21:9 | 2560 x 1080 px | 2.765 | 1.13 | N/A |
QHD | 16:9 | 2560 x 1440 px | 3.686 | 6.23 | 2.15 |
WQXGA | 16:10 | 2560 x 1600 px | 4.096 | <0.58 | <2.4 |
UWQHD | ≈21:9 | 3440 x 1440 px | 4.954 | 0.87 | N/A |
4K UHD | 16:9 | 3840 x 2160 px | 8.294 | 2.12 | N/A |
Other | - | - | - | 2.00 | 15.09 |
解析度 | 像素 |
---|---|
540p / qHD | 960×540px |
720p / HD | 1280×720px |
1080p / Full HD / FHD | 19201080px |
2K | 2048×1080px |
1440p / QHD / QuadHD / WQHD | 2560×1440px |
2160p / UHD | 3840×2160px |
4K | 4096×2160px |
5K | 5120×2880px |
8K / 8K UHD | 7680×4320px |
解析度名称 | 设备 |
---|---|
8K (8K UHD) | TVs |
“Cinema” 4K (4K) | 投影仪 |
UHD (4K, Ultra HD, Ultra-High Definition) | TVs , 监视器, 智能手机 |
2K (none) | 投影仪 |
WUXGA (Widescreen Ultra Extended Graphics Array) | 监视器, 投影仪 |
1080p (Full HD, FHD, HD, High Definition) | TVs , 监视器, 智能手机 |
720p (HD, High Definition) TVs , 智能手机 |
这是一份快速参考备忘单,列出了 SASS 最有用的功能。
$defaultLinkColor: #46EAC2;
a {
color: $defaultLinkColor;
}
-$wk: -webkit-;
.rounded-box {
#{$wk}border-radius: 4px;
}
-/*
这是多行注释
块注释
@@ -76,7 +76,7 @@
*/
// 这是一条单行注释
-.button {
···
}
@@ -84,7 +84,7 @@
@extend .button;
}
-nav {
ul {
@@ -109,7 +109,7 @@
display: block;
}
-// _base.scss
$font-stack: Helvetica, sans-serif;
@@ -130,7 +130,7 @@
color: white;
}
-@mixin heading-font {
font-family: sans-serif;
font-weight: bold;
@@ -140,7 +140,7 @@
}
查看: 混合(Mixins)
-@import './other_sass_file';
@import '/code', 'lists';
// 纯 CSS @imports
@@ -148,8 +148,8 @@
@import url(theme);
.sass
或 .sass
扩展名是可选的。
@mixin font-size($n) {
font-size: $n * 1.2em;
}
@@ -159,7 +159,7 @@
@include font-size(2);
}
-@mixin pad($n: 10px) {
padding: $n;
}
@@ -169,7 +169,7 @@
@include pad(15px);
}
-$default-padding: 10px;
@mixin pad($n: $default-padding) {
padding: $n;
@@ -178,17 +178,17 @@
@include pad(15px);
}
-rgb(100, 120, 140)
rgba(100, 120, 140, .5)
rgba($color, .5)
-mix($a, $b, 10%) // 10% a, 90% b
-darken($color, 5%)
lighten($color, 5%)
@@ -204,15 +204,15 @@
fade-out($color, .5) // aka transparentize()
rgba($color, .5) // sets alpha to .5
-hue($color) // 0deg..360deg
saturation($color) // 0%..100%
lightness($color) // 0%..100%
alpha($color) // 0..1 (aka opacity())
-@debug rgb(204, 102, 153); // #c69
@debug rgba(107, 113, 127, 0.8); // rgba(107, 113, 127, 0.8)
@debug hsl(228, 7%, 86%); // #dadbdf
@debug hsla(20, 20%, 85%, 0.7); // rgb(225, 215, 210, 0.7)
-// 固定金额变动
adjust-color($color, $blue: 5)
adjust-color($color, $lightness: -30%) // darken(_, 30%)
@@ -272,8 +272,8 @@
change-color($color, $blue: 250)
支持的: $red
, $green
, $blue
, $hue
, $saturation
, $lightness
, $alpha
unquote('hello')
quote(bold); // "bold"
@@ -287,7 +287,7 @@
str-slice(hello, 2, 5)
str-insert("abcd", "X", 1) // "Xabcd"
-floor(4.2) // 4
ceil(4.2) // 5
@@ -303,15 +303,15 @@
percentage(.5) // 50%
random(3) // 0..3
-
unit(3em) // 'em'
unitless(100px) // false
-unit(3em) // 'em'
unitless(100px) // false
-// 检查 $red
variable-exists(red)
// 检查@mixin red-text
@@ -331,9 +331,9 @@
selector-replace(...)
selector-unify(...)
-meta.feature-exists($feature)
feature-exists($feature) //=> boolean
@@ -348,7 +348,7 @@
// Content!
}
-$base-color: #036;
@for $i from 1 through 3 {
@@ -403,7 +403,7 @@
background-color: #0059b3;
}
-$sizes: 40px, 50px;
@each $size in $sizes {
@@ -424,7 +424,7 @@
height: 50px;
}
-$icons: ("eye": "\f112", "start": "\f12e");
@each $name, $glyph in $icons {
@@ -447,7 +447,7 @@
content: "";
}
-@use "sass:math";
@@ -469,8 +469,8 @@
font-size: 12.36094px;
}
-@mixin avatar($size, $circle: false) {
width: $size;
@@ -500,25 +500,25 @@
border-radius: 50px;
}
-.#{$klass} { ... } // Class
call($function-name) // Functions
@media #{$tablet}
font: #{$size}/#{$line-height}
url("#{$background}.jpg")
-$list: (a b c);
nth($list, 1) // starts with 1
length($list)
@each $item in $list { ... }
-$map: (key1: value1, key2: value2, key3: value3);
map-get($map, key1)
-这是 screen 命令的快速参考指南备忘单。
$ screen
3. 重新附加屏幕会话
$ screen -r <name/pid>
-选项 | 示例 | 说明 |
---|---|---|
-S | screen -S debug | 使用会话名称启动新会话 |
-ls | screen -ls | 列出正在运行的会话/屏幕 |
-x | screen -x | 附加到正在运行的会话 |
-r | screen -r debug | 使用名称附加到正在运行的会话 |
-R | screen -R debug | 附加到会话 (如果它不存在将创建) |
-d | screen -d -m wget xxxx.com/large.file | 分离模式下的开始屏幕 |
-X | screen -X -S debug kill | 终止正在运行的会话 |
Command | Description |
---|---|
screen -S <name> | 使用会话名称开始新的屏幕会话 |
screen -ls | 列出正在运行的会话/屏幕 |
screen -x | 附加到正在运行的会话 |
screen -r <name> | 使用名称附加到正在运行的会话 |
screen -dRR | “终极附加” |
Command | Description |
---|---|
Ctrl-A C | 创建新窗口 |
Ctrl-A Ctrl-A | 更改为上次访问的活动窗口 |
Ctrl-A 0...9 | 按编号切换到窗口 |
Ctrl-A ' <0...9 or title> | 按编号或名称更改为窗口 |
Ctrl-A N or Ctrl-A <space> | 切换到列表中的下一个窗口 |
Ctrl-A P or Ctrl-A <backspace> | 切换到列表中的上一个窗口 |
Ctrl-A " | 查看窗口列表 |
Ctrl-A W | 显示窗口栏 |
Ctrl-A K | 杀死当前窗口 (不推荐) |
Ctrl-A \ | 杀死所有窗口 (不推荐) |
Ctrl-A A | 重命名当前窗口 |
Command | Description |
---|---|
Ctrl-A D | 分离 |
Ctrl-A D D | 分离和注销 (快速退出) |
Ctrl-A : | 退出所有会话 |
Ctrl-A C-\ | 强制退出屏幕 (不推荐) |
Command | Description |
---|---|
Ctrl-A ? | 查看帮助 (列出键绑定) |
Command | Description |
---|---|
Ctrl-A C-l | 重绘窗口 |
Ctrl-A [ | 复制模式 |
Ctrl-A ESC | 复制模式 |
Ctrl-A ] | 粘贴 |
Ctrl-A M | 活动监控窗口 |
Ctrl-A _ | 静音监控窗口 |
Ctrl-A Ctrl-V | 输入二合字母 (非 ASCII 字符) |
Ctrl-A X | 锁定(密码保护)显示 |
Ctrl-A : | 输入屏幕命令 |
Ctrl-A H | 在屏幕会话中启用日志记录 |
Command | Description |
---|---|
Ctrl-A S | 水平分割显示 |
Ctrl-A V | 垂直分割显示 |
Ctrl-A | | 垂直拆分显示 |
Ctrl-A TAB | 跳转到下一个显示区域 |
Ctrl-A X | 删除当前区域 |
Ctrl-A Q | 删除除当前区域之外的所有区域 |
Command | Description |
---|---|
Ctrl-a esc | 进入滚动模式 |
Ctrl-u | 向上滑动 |
Ctrl-d | 向下滚动 |
esc esc | 退出滚动模式 |
SSH 并附加在一行中
$ ssh -t user@host screen -x <name/pid>
@@ -368,8 +368,6 @@ function anchorPoint() {
Array.from(document.querySelectorAll('.h2wrap-body .wrap')).forEach((elm) => elm.classList.remove('active'))
if (elm?.tagName === 'H3') {
elm?.parentElement?.parentElement?.classList.add('active');
- const box = elm?.parentElement?.parentElement;
- console.log('elm:2', box, document.querySelectorAll('.h2wrap-body .wrap'))
}
}
anchorPoint();
@@ -380,7 +378,6 @@ function updateAnchor(element) {
tocanchor.classList.remove('is-active-link');
});
const anchor = element || document.querySelector(`a.tocs-link[href='${decodeURIComponent(window.location.hash)}']`);
- console.log('anchor', anchor)
if (anchor) {
anchor.classList.add('is-active-link');
}
diff --git a/docs/sed.html b/docs/sed.html
index 96755f88..256d0ece 100644
--- a/docs/sed.html
+++ b/docs/sed.html
@@ -34,15 +34,15 @@
document.documentElement.setAttribute('data-color-mode', mode);
localStorage.setItem(LOCAL_NANE, mode);
}
-Sed 是一个流编辑器,此 Sed 备忘清单包含 Sed 命令和一些常见的 Sed 技巧。
语法
$ sed [options] command [input-file]
@@ -51,7 +51,7 @@
$ echo '123abc' | sed 's/[0-9]+//g'
-参数 | 示例 | 描述 |
---|---|---|
-i | sed -ibak 's/On/Off/' php.ini | 直接备份和修改输入文件 |
-E | sed -E 's/[0-9]+//g' input-file | 使用扩展正则表达式 |
-n | sed -n '3 p' config.conf | 禁止默认图案空间打印 |
-f | sed -f script.sed config.conf | 执行 sed 脚本文件 |
-e | sed -e 'command1' -e 'command2' input-file | 执行多个 sed 命令 |
$ echo "hello world" | sed -e 's/h/H/g' -e 's/w/W/g'
Hello World
使用 -e
执行多个 sed 命令
$ echo 's/h/H/g' >> hello.sed
$ echo 's/w/W/g' >> hello.sed
$ echo "hello world" | sed -f hello.sed
Hello World
使用 -f
执行 sed 脚本文件
$ sed 's/old/new/g' file.txt
$ sed 's/old/new/g' file.txt > new.txt
$ sed 's/old/new/g' -i file.txt
$ sed 's/old/new/g' -i.backup file.txt
-Command | Example | Description |
---|---|---|
p | sed -n '1,4 p' input.txt | Print lines 1-4 |
p | sed -n -e '1,4 p' -e '6,7 p' input.txt | Print lines 1-4 and 6-7 |
d | sed '1,4 d' input.txt | Print lines except 1-4 |
w | sed -n '1,4 w output.txt' input.txt | Write pattern space to file |
a | sed '2 a new-line' input.txt | Append line after |
i | sed '2 i new-line' input.txt | Insert line before |
Command | Description |
---|---|
n | 打印模式空间,空模式空间,读取下一行 |
x | 用保持空间交换模式空间 |
h | 复制模式空间以保持空间 |
H | 追加模式空间以保持空间 |
g | 将保持空间复制到模式空间 |
G | 将保持空间附加到模式空间 |
$ sed 's/old/new/[flags]' [input-file]
Flag | Description |
---|---|
g | 全球替代 |
1,2... | 替换第 n 次出现 |
p | 仅打印替换的行 |
w | 仅将替换的行写入文件 |
I | 搜索时忽略大小写 |
e | 在命令行中替换并执行 |
Command | Description |
---|---|
b label | 分支到标签(用于循环) |
t label | 仅在成功替换时分支到标签(用于循环) |
:label | b 和 t 命令的标签(用于循环) |
N | 将下一行追加到模式空间 |
P | 多行打印第一行 |
D | 删除多行中的第一行 |
Flag | Description |
---|---|
/ | ^ @ ! # | 替换分隔符可以是任何字符 |
& | 获取匹配的模式 |
( ) \1 \2 \3 | 使用 ( 和 ) 进行分组。使用 \1 、\2 替换来引用组 |
替换所有出现的字符串
$ sed 's/old/new/g' file.txt
@@ -308,7 +308,7 @@
删除评论。 即使是那些在行尾的
$ sed 's/#.*$//' file.txt
-
搜索字符串并仅打印匹配的行
$ sed -n '/hello/p' file.txt
@@ -318,7 +318,7 @@
搜索字符串,但仅输出不匹配的行
$ sed -n '/hello/!p' file.txt
-在第 2 行之后追加一行
$ sed '2a Text after line 2' file.txt
@@ -328,7 +328,7 @@
从第 3 行开始,每 3 行后追加一行
$ sed '3~3a Some text' file.txt
-文件的数字行(简单的左对齐)
$ sed = file.txt | sed 'N;s/\n/\t/'
@@ -342,14 +342,14 @@
计算行数(模拟“wc -l”)
$ sed -n '$='
-
在第 5 行之前插入文本
$ sed '5i line number five' file.txt
在包含“hello”的每一行之前插入“示例:”
$ sed '/hello/i Example: ' file.txt
-删除文件中的第 5-7 行
$ sed '5,7d' file.txt
@@ -368,7 +368,7 @@
删除以“#”开头的行
$ sed '/^#/d' file.txt
-双倍行距
$ sed G
@@ -390,7 +390,7 @@
在匹配“正则表达式”的行周围插入一个空行
$ sed '/regex/{x;p;x;G;}'
-这个 semver 语义化版本快速参考备忘清单。
Semver 是一种语义版本控制规范。
- | - |
---|---|
主版本号(MAJOR) | 当你做了不兼容的 API 修改 |
次版本号(MINOR) | 当你做了向下兼容的功能性新增 |
修订号(PATCH) | 当你做了向下兼容的问题修正 |
1.2.3
=1.2.3
>1.2.3
@@ -79,7 +79,7 @@
>=1.2.3
请注意,后缀版本(1.2.3-rc1
)不匹配。
范围 | 描述 | Notes |
---|---|---|
~1.2.3 | 是 >=1.2.3 <1.3.0 | |
^1.2.3 | 是 >=1.2.3 <2.0.0 | |
^0.2.3 | 是 >=0.2.3 <0.3.0 | (0.x.x 是特殊的) |
^0.0.1 | 是 =0.0.1 | (0.0.x 是特殊的) |
^1.2 | 是 >=1.2.0 <2.0.0 | (像 ^1.2.0) |
~1.2 | 是 >=1.2.0 <1.3.0 | (像 ~1.2.0) |
^1 | 是 >=1.0.0 <2.0.0 | |
~1 | 相同的 | |
1.x | 相同的 | |
1.* | 相同的 | |
1 | 相同的 | |
* | 任何版本 | |
x | 相同的 |
范围 | 描述 |
---|---|
1.2.3 - 2.3.4 | 是 >=1.2.3 <=2.3.4 |
范围 | 描述 |
---|---|