Skip to main content

· 5 min read

常用git命令

# 丢弃所有未暂存的文件
git checkout -- .

# 丢弃所有暂存的文件
git reset --hard

向github添加ssh

  1. 生成 SSH 密钥对
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  1. 将 SSH 密钥添加到 SSH 代理
eval "$(ssh-agent -s)"
ssh-add -K ~/.ssh/id_rsa
  1. 将 SSH 公钥添加到 GitHub 账户

  2. 测试 SSH 连接

ssh -T git@github.com

设置别名

// git status
git config --global alias.st status

// git pull
git config --global alias.pl pull

// git push
git config --global alias.sh push

package-lock.json应不应该上传到代码仓库

package-lock.json 文件应该上传到代码仓库。这个文件锁定了项目依赖的确切版本,这样当其他开发者或者 CI/CD 系统克隆并安装项目时,会得到与你完全相同的依赖版本。

上传 package-lock.json 的好处:

  • 一致性: 它确保每个开发者和每个部署都使用相同版本的依赖,减少了“在我机器上运行得很好”问题。

  • 性能: 由于所有版本都已确定,npm 可以更有效地重用缓存,减少了需要解析的依赖树。

  • 安全性: 锁定依赖的版本可以更容易地进行安全审核,并快速应对安全漏洞。

  • 审计和追踪: 有了 package-lock.json,你可以更容易地审计项目依赖,并查明哪个版本在什么时候由谁添加。

然而,也有一些特定情况可能不需要这么做:

  • 库项目: 如果你正在开发一个被其他项目依赖的库(而不是一个最终用户应用),有些人选择不上传 package-lock.json,因为这个锁文件不会对依赖这个库的项目产生影响。

  • 多种环境: 如果项目需要在多种不同的环境中运行,并且依赖项可能因此而有所不同,那么 package-lock.json 可能会引入问题。

  • 团队协作问题: 在某些团队工作流中,package-lock.json 可能会频繁地引发合并冲突。这通常是工作流管理不当的结果,但解决这个问题的一个暂时方法是不上传 package-lock.json。

git rebase

用来合并多个分支或者深层次代码冲突修复。很好用但是使用起来比较复杂的一个命令。

查看当前仓库远程连接

git remote -v

以为国内使用https连接github经常失败,所以将httpsurl改为ssh

  1. 打开终端,并进入到你的 Git 仓库的本地目录。运行以下命令以切换到 SSH:
git remote set-url origin YOUR_SSH_URL_HERE
  1. 验证更改
git remote -v

代码仓库配置ssh

  1. 检查现有的 SSH 密钥
ls -al ~/.ssh
  1. 生成新的 SSH 密钥
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  1. 将 SSH 密钥添加到 ssh-agent
eval "$(ssh-agent -s)"

# 然后添加你的 SSH 密钥到 ssh-agent:

ssh-add ~/.ssh/id_rsa
  1. 将公钥添加到 Git 账户

Linux/macOS: cat ~/.ssh/id_rsa.pub

复制公钥内容(以 ssh-rsa ... 开头,以你的电子邮件地址结束)。

然后,进入你的 Git 仓库托管服务(如 GitHub、GitLab 等),找到添加 SSH 密钥的选项,并粘贴你的公钥。

  1. 测试 SSH 连接
ssh -T git@github.com

你应该会看到一个确认消息,表明 SSH 已成功配置。

· 4 min read

本指南旨在引导您使用 GitHub Actions 和 GitHub Pages,高效地为前端项目实现自动化部署。自动化部署不仅可以提高开发效率,还能确保代码质量。

TODO

github action 连接服务器,进行 docker 部署。

前提条件

  1. 一个 GitHub 账号。
  2. 基本的 Docker 知识。3.一个已上传至 GitHub 的 Node.js 项目

一、GitHub Actions:持续集成与部署工具

GitHub Actions 是一个用于持续集成和持续部署(CI/CD)的自动化工具。其基于 YML 文件进行配置,并能轻松集成至任何 GitHub 项目。

示例配置代码

.github/workflows/docker-build.yml
name: Docker Build and Push

on:
push:
branches:
- master # Or the branch name you want

jobs:
build:
runs-on: ubuntu-latest

steps:
- name: Checkout Code
uses: actions/checkout@v2

- name: Setup Node.js environment
uses: actions/setup-node@v2
with:
node-version: '16'

- name: Cache Node.js modules
uses: actions/cache@v2
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-

- name: Install Dependencies
run: npm install

- name: Build Project
run: npm run build

- name: Login to Docker Hub
run: echo "${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}" | docker login -u "${{ secrets.DOCKER_HUB_USERNAME }}" --password-stdin

- name: Build Docker Image
run: docker build --platform linux/amd64 -t ${{ secrets.DOCKER_HUB_USERNAME }}/yiwen-blog-website:latest .

# githubpages
- name: Push to Docker Hub
run: docker push ${{ secrets.DOCKER_HUB_USERNAME }}/yiwen-blog-website:latest

- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} # 使用 GitHub Token 授权
publish_dir: ./build # 指定要部署的静态文件目录
publish_branch: gh-pages # 指定要发布的分支

步骤解释:

  1. Checkout 代码 - 从 GitHub 仓库中拉取代码。
  2. 设置 Node.js 环境 - 为项目构建和测试设置 Node.js 环境。
  3. 缓存 Node.js 模块 - 加速后续的构建过程。
  4. 安装依赖 - 使用 npm install 安装项目依赖。
  5. 项目打包 - 使用 npm run build 打包项目。
  6. 登录 Docker Hub - 使用提供的密钥登录 Docker Hub。
  7. 构建并推送 Docker 镜像 - 创建 Docker 镜像并推送到 Docker Hub。
  8. 部署到 GitHub Pages - 将构建的静态文件部署到 GitHub Pages。

二、GitHub Pages —— 静态网站托管

GitHub Pages 允许您直接从 GitHub 仓库托管静态网站。结合 GitHub Actions,静态网站的部署可以完全自动化。

示例代码

 - name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} # 使用 GitHub Token 授权
publish_dir: ./build # 指定要部署的静态文件目录
publish_branch: gh-pages # 指定要发布的分支

设置步骤:

  1. 在 GitHub 仓库设置中,启用 GitHub Pages。
  2. 选择一个用于部署的分支和路径。
  3. 使用 peaceiris/actions-gh-pages@v3 来部署。确保部署分支和配置分支相同。

故障排查

  1. 查看构建日志:在 Actions 选项卡下,可以查看构建日志以定位问题。
  2. 检查密钥和权限:确保提供的 GitHub 和 Docker Hub 的密钥是有效的,并具有适当的权限。

总结

通过 GitHub Actions 和 GitHub Pages,我们能够轻松实现前端项目的自动化部署。这不仅提高了工作效率,也有助于维护代码质量。无论您是独立开发者还是团队成员,这样的自动化设置都将大大有益。

· One min read

背景

为进一步闭环github体系开发,镜像上传逐步向githubpackages倾斜。 但是在向githubpackages上传镜像时遇到一个较为糟糕的问题,就是按照目前现有教程是无法上传成功的。

报错

Using default tag: latest
The push refers to repository [ghcr.io/c-scale-community/hello-world]
e07ee1baac5f: Preparing
unauthorized: unauthenticated: User cannot be authenticated with the token provided.

修复

参考文档

解决方案: 无法显式在每次推送镜像到githubPackages时输入令牌,官方推荐将令牌暴露在某个局部变量中,在使用时引用即可。

export CR_PAT=YOUR_TOKEN

然后使用echo $CR_PAT | docker login ghcr.io -u USERNAME --password-stdin即可解决问题。

· 3 min read

在服务器使用过程中我们会经常发现各类问题,但是这类问题都有一个公共问题,就是很多时候没法正常访问github资源或者google资源,从而导致部署卡壳。那么如何处理此类问题就显得尤为重要,在这里我介绍一种我使用的clash + centos的解决方案。

clash下载

tip

安装 clash-linux-amd64-latest.gz

谷歌云盘下载

安装

# 解压压缩文件,会生成一个没有 .gz 的同名文件
gzip -d clash-linux-amd64-latest.gz

# (可选项)修改程序文件名
mv clash-linux-amd64-latest.gz clash

# 添加运行权限
chmod +x clash

# 先运行服务
# 在运行钱请将自己的 config.yaml 复制到 /root/.config/clash 下面
# 如果有Country.mmdb报错 那可能需要 wget -O Country.mmdb https://www.sub-speeder.com/client-download/Country.mmdb 解决
./clash

//添加守护进程
cp clash /usr/local/bin

// 添加配置
vim /etc/systemd/system/clash.service

# start
[Unit]
Description=Clash daemon, A rule-based proxy in Go.
After=network.target

[Service]
Type=simple
Restart=always
ExecStart=/usr/local/bin/clash -d /root/.config/clash

[Install]
WantedBy=multi-user.target
# end

# 系统启动时运行
systemctl enable clash

# 立即运行 clash 服务
systemctl start clash

# 查看 clash 服务运行状态
systemctl status clash

# 查看运行日志
journalctl -xe

# 使用时临时修改
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890

# 测试
curl https://www.google.com

魔法使用完毕

docker中使用代理

docker hub在国内使用的时候会有几率出现链接超时问题,这时需要给docker设置代理来解决这个问题。

Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

解决方案

https://stackoverflow.com/questions/48056365/error-get-https-registry-1-docker-io-v2-net-http-request-canceled-while-b

https://docs.docker.com/engine/daemon/proxy/

从两者来看需要手动设置代理

  1. 创建或者编辑/etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
  1. 重启
sudo systemctl daemon-reload                            
sudo systemctl restart docker

· One min read

安装oh-my-zsh

  1. 安装
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
  1. 编辑~/.zshrc
vim ~/.zshrc  # 或使用你喜欢的其他文本编辑器
  1. 主题配置
ZSH_THEME="robbyrussell"  # 默认主题
  1. 保存配置
source ~/.zshrc

使用 zsh-autosuggestions

  1. 下载
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
  1. 打开~/.zshrc
plugins=(git zsh-autosuggestions)
  1. 保存
source ~/.zshrc

使用 zsh-syntax-highlighting

文档

  1. 下载
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
  1. 打开~/.zshrc
plugins=( [plugins...] zsh-syntax-highlighting)

· 3 min read

介绍

Medium是一个在线发布平台,于2012年由Twitter的共同创始人Evan Williams创建。它被设计为一个简洁的博客平台,旨在鼓励用户撰写和分享各种长度的文章。

背景

2024年4月12日晚上,我在看一篇介绍rn新架构和旧架构的文章,我刚开始觉得写的还行,后面越看越吃惊,因为个人感觉真的写的让人通俗易懂,很多耳熟能详但是很少有文章写到这种程度,于是我选择medium作为我的一个阅读板块,并抽时间进行学习和阅读。

入坑文章

  • 旧架构
    • 旧架构依赖于bridge和json异步消息队列的方式传递数据
    • 因为是异步消息队列,所以js端和native互相不可知,导致维护两颗虚拟树,有巨大内存损耗
    • bridge是单线程,导致如果异步消息队列中数据量过大时候会白屏
    • 因为是异步消息队列,在list中滑动会有白屏现象,因为数据异步同步
    • 因为是异步消息队列,所以native侧在app启动时候需要加载全部模块,因为native和js完全不透明
- 新架构 - 使用c++的jsi作为抽象层,模拟web浏览器中js直接调用c++底层逻辑 - js和native都为互操作层,数据实时传输 - 无需维护两颗虚拟树并异步同步,减少内存损耗 - 因为js和native直接调用操作,所以应用可以懒加载所需模块 - jsi提供了接口规范和类型安全,提高代码质量和减少了app崩溃率

· 3 min read

root和alias区别

root

当使用 root 时,请求的完整 URI(从 location 部分开始)会被直接附加到 root 指令指定的路径上。这意味着 root + location + 请求的相对 URI = 文件系统上的绝对路径。

location /images/ {
root /data;
}

请求 /images/pic.jpg 对应的文件路径就是 /data/images/pic.jpg。

alias

使用 alias 时,location 中定义的路径会被 alias 指定的路径替换。

location /images/ {
alias /data/photos/;
}

请求 /images/pic.jpg 对应的文件路径就是 /data/photos/pic.jpg。

nginx示例

# 设置工作进程的数量。
worker_processes 1;

# 设置每个工作进程的最大连接数。
events {
worker_connections 1024;
}

# HTTP 配置块。
http {
# 包含 MIME 类型定义。
include mime.types;
# 默认 MIME 类型。
default_type application/octet-stream;

# 开启高效文件传输模式。
sendfile on;

# 设置 keep-alive 超时时间。
keepalive_timeout 65;

# 文件服务
upstream fileserver {
server 127.0.0.1:9000 weight=10;
}

server {
listen 8090;
server_name file.51xuecheng.cn;
#charset koi8-r;
ssi on;
ssi_silent_errors on;

location /video {
proxy_pass http://fileserver
}

location /mediafiles {
proxy_pass http://fileserver
}

}

# 配置 HTTP 服务器。
server {
# 设置监听的端口和服务器名称。
listen 8090;
server_name localhost www.51xuecheng.cn;
#charset koi8-r;
ssi on;
ssi_silent_errors on;

# 配置对根 URL 的请求。
location / {
# 设置目录别名。
alias /Users/yw.hao/Downloads/xc-ui-pc-static-portal/;
# 设置默认索引文件。
index index.html index.htm;
}

# 配置静态资源(img)。
location /static/img/ {
alias /Users/yw.hao/Downloads/xc-ui-pc-static-portal/img/;
}

# 配置静态资源(css)。
location /static/css/ {
alias /Users/yw.hao/Downloads/xc-ui-pc-static-portal/css/;
}

# 配置静态资源(js)。
location /static/js/ {
alias /Users/yw.hao/Downloads/xc-ui-pc-static-portal/js/;
}

# 配置静态资源(plugins)并设置 CORS 头部。
location /static/plugins/ {
alias /Users/yw.hao/Downloads/xc-ui-pc-static-portal/plugins/;
add_header Access-Control-Allow-Origin http://ucenter.51xuecheng.cn;
add_header Access-Control-Allow-Credentials true;
add_header Access-Control-Allow-Methods GET;
}

# 配置插件资源。
location /plugins/ {
alias /Users/yw.hao/Downloads/xc-ui-pc-static-portal/plugins/;
}

# 配置错误页面。
error_page 500 502 503 504 /50x.html;

# 重定向到错误页面。
location = /50x.html {
root html;
}
}

# 包括其他服务器配置。
include servers/*;
}

· 2 min read

在本地进行项目开发的时候,想要对网络请求进行抓包是无可厚非的,但是web开发有浏览器可以抓包,而移动端只能用抓包工具抓。

在这里推荐使用proxyman抓包。

原因

使用proxyman的外部代理,我可以做到一遍进行外网访问,还能同时进行抓包,这种场景对在ios模拟器开发app至关重要,因为并不是所有app都有网络基建。

外部代理设置

不要选择自动代理,开启自动代理就会把流量直接放出去,没有任何作用,做不到代理效果。

选择http/https/socks,分别代理到对应的要代理的端口。

感想

这个问题困扰我很久了,如何一边代理,一边在谷歌查略资料,而不是只能抓包或者只能翻墙。。。

· One min read

今天晚上尝试对一个新创建的rn@0.74.0 android app打release包时发现,打完包后的体积是50mb,我心里咯噔了一下。这也太离谱了把,什么都没有做就50mb了。

0.74.0

danger

今天在学习android集成rn的时候无意发现,初始化一个0.74.0项目,直接打release包,体积竟然是50mb。我的天那~~

0.72.5

20240428

此事已提issues,issues链接

20240428

此事被rn团队成员恢复,android包体积并没有变大,在文件夹中体积变大原因是因为android后续格式无压缩,导致看清来体积较大。

issues解答