# 2021-12 问题记录

# 一、@nuxtjs/device 无法判断设备是 iPad

问题: 在较新的 iPad (iPad9) 上面,使用 @nuxtjs/device 提供的 $device.isDesktop,返回 true

原因: iPad 默认开启了桌面模式,即会修改 userAgent ,来获取桌面版的网页。

// 默认
console.log(navigator.userAgent);
// Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Safari/605.1.15

// 关闭桌面模式
console.log(navigator.userAgent);
// Mozilla/5.0 (iPad; CPU OS 15_0_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Mobile/15E148 Safari/604.1
1
2
3
4
5
6
7

解决:

  1. 关闭桌面模式

设置路径:设置 > Safari浏览器 > 请求桌面网站

iPad 设置

  1. 修改判断方式
function isMobile() {
  try {
    document.createEvent("TouchEvent"); return true;
  } catch(e) {
    return false; 
  }
}
1
2
3
4
5
6
7

参考 (opens new window)

# 二、Electron 打包 umi 项目,打开空白

问题: dev 环境使用 url 正常显示,打包后页面空白

// dev
mainWindow.loadURL('http://localhost:8000/');

// prod
mainWindow.loadFile(path.resolve(__dirname, '../renderer', 'index.html'));
1
2
3
4
5

原因: history 模式只能部署到 web 服务器使用,默认是 history

解决: 路由使用 hash 模式

// .umirc.ts
export default {
  history: { type: 'hash' },
}
1
2
3
4

# 三、npm ci 和 npm install

# 简介

npm ci 和 npm install 都是用来安装依赖的。npm ci 是用于自动化环境,如测试平台,持续集成和部署。通过跳过某些面向用户的功能,它可以比常规的 npm 安装快得多。它也比常规安装更严格,它可以帮助捕获由大多数 npm 用户的增量安装的本地环境引起的错误或不一致。

因为平时 install 的时候,如果 package.json 里面的版本有 ^ 符号,每次 install 的包版本可能会不一样。

^ 的匹配规则是:>= 当前版本,且保持从左至右的第一个非零版本。举例说明:

"^1.2.3": 大于等于 1.2.3 且小于 2.0.0版本 "^0.3.4": 大于等于 0.3.4 且小于 0.4.0版本 "^0.0.6": 大于等于 0.0.6 且小于 0.0.7版本

如果使用 install 命令,则可能遇到开发和测试、发布时,包版本有一些不同。

# 区别

  • 使用 npm ci 时,项目中必须有 package-lock.json 或 npm-shrinkwrap.json;
  • 当 package-lock.json 中的依赖与 package.json 不一致时,npm ci 会退出,不会修改 package-lock.json;
  • npm ci 只可以一次性的安装整个项目依赖,但无法添加单个依赖项;
  • npm ci 安装包之前,会删除掉 node_modules 文件夹,因此他不需要去校验已下载文件版本与控制版本的关系,也不用校验是否存在最新版本的库,所以理论上下载的速度更快。

yarn 似乎不存在这个问题。对应命令:yarn install --frozen-lockfile

# 四、bash 报错:unexpected EOF while looking for matching `"

有一个 git 脚本:

#!/bin/sh
git filter-branch --env-filter '
# git filter-repo --env-filter '

OLD_EMAIL="old-email@qq.com"
CORRECT_NAME="Rem486"
CORRECT_EMAIL="rem486x@qq.com"

if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

执行的时候报错:

# ./x.sh: line 20: unexpected EOF while looking for matching `''
# ./x.sh: line 21: syntax error: unexpected end of file
1
2

错误信息指出脚本 20 行缺少一个 ',但是检查脚本,前后两个 ' 确实是成对出现的。

问题出在第三行,注释了一句。其中有一个 ',已经被识别了。去掉就正常了。

上次更新: 3/29/2022, 2:38:23 PM