提交0.1.0版本
- 完成了书签的基本功能和插件
This commit is contained in:
217
README.md
217
README.md
@@ -23,152 +23,131 @@
|
|||||||
|
|
||||||
## 发布(NAS / SSH / x86 Linux)
|
## 发布(NAS / SSH / x86 Linux)
|
||||||
|
|
||||||
以下步骤适用于你描述的环境:x86 Linux NAS + SSH 部署,已安装 Node.js 24 与 pm2。
|
本节记录**当前已部署的真实配置**(供 AI 直接执行/更新使用)。
|
||||||
|
|
||||||
### 0) 本地已执行的命令(在本机开发环境)
|
### ✅ 当前部署清单(必须保持一致)
|
||||||
|
|
||||||
- 路径:仓库根目录
|
**部署目录**
|
||||||
- 已执行:
|
- 代码根目录:`/home/xxl/Code/bookmark`
|
||||||
- `npm install`
|
|
||||||
- `npm run build`
|
|
||||||
|
|
||||||
这会生成下列产物:
|
**域名与端口**
|
||||||
|
- 前端 Web:`http://mark.cloud-xl.top:9527`
|
||||||
|
- 后端 API 代理:`http://mark.cloud-xl.top:9526`(转发到后端 3001)
|
||||||
|
|
||||||
|
**后端运行方式**
|
||||||
|
- systemd:`browser-bookmark-server.service`
|
||||||
|
- 后端监听端口:`SERVER_PORT=3001`(由 `.env` 提供)
|
||||||
|
|
||||||
|
**前端运行方式**
|
||||||
|
- Docker 容器:`nginx`
|
||||||
|
- 端口映射:`9527 -> 80`
|
||||||
|
- Web 根目录(容器内):`/usr/share/nginx/html`
|
||||||
|
- 挂载来源:`/home/xxl/Code/bookmark/apps/web/dist`
|
||||||
|
|
||||||
|
**API 代理方式**
|
||||||
|
- Docker 容器:`nginx-api`
|
||||||
|
- 端口映射:`9526 -> 80`
|
||||||
|
- 代理目标:`http://host.docker.internal:3001`
|
||||||
|
- 配置文件:`/home/xxl/Code/bookmark/deploy/nginx/mark.cloud-xl.top.api.conf`
|
||||||
|
|
||||||
|
**扩展包**
|
||||||
|
- 构建输出:`/home/xxl/Code/bookmark/apps/extension/dist`
|
||||||
|
- 打包文件:`/home/xxl/Code/bookmark/apps/extension/extension-dist.zip`
|
||||||
|
- 下载地址:`http://mark.cloud-xl.top:9527/extension-dist.zip`
|
||||||
|
|
||||||
|
**防火墙放行(iptables)**
|
||||||
|
- 已放行:`9526`、`9527`
|
||||||
|
|
||||||
|
### 1) 初次部署/重建(在服务器执行)
|
||||||
|
|
||||||
|
**路径:`/home/xxl/Code/bookmark`**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
说明:
|
||||||
- Web 构建产物:`apps/web/dist/`
|
- Web 构建产物:`apps/web/dist/`
|
||||||
- 扩展构建产物:`apps/extension/dist/`
|
- 扩展构建产物:`apps/extension/dist/`
|
||||||
- 后端为 Node 直接运行源代码(`apps/server/src/`)
|
- 后端运行仍是 `apps/server/src/`
|
||||||
|
|
||||||
### 1) 服务器目录建议(NAS)
|
### 2) 数据库初始化
|
||||||
|
|
||||||
建议在 NAS 上建立如下目录结构(可按需调整):
|
|
||||||
|
|
||||||
```
|
|
||||||
/opt/browser-bookmark/
|
|
||||||
├── server/ # 后端源码与依赖
|
|
||||||
├── web/ # Web 静态站点
|
|
||||||
└── extension/ # 扩展构建产物(用于打包/发布或本地加载)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2) 通过 SSH 上传文件
|
|
||||||
|
|
||||||
以下是需要上传的内容与目标路径:
|
|
||||||
|
|
||||||
1. 后端(运行源码)
|
|
||||||
- 本地:`apps/server/`
|
|
||||||
- 服务器:`/opt/browser-bookmark/server/`
|
|
||||||
|
|
||||||
2. Web 前端(静态产物)
|
|
||||||
- 本地:`apps/web/dist/`
|
|
||||||
- 服务器:`/opt/browser-bookmark/web/`
|
|
||||||
|
|
||||||
3. 扩展产物(打包或本地加载)
|
|
||||||
- 本地:`apps/extension/dist/`
|
|
||||||
- 服务器:`/opt/browser-bookmark/extension/`
|
|
||||||
|
|
||||||
4. 部署配置文件
|
|
||||||
- 本地:`deploy/`
|
|
||||||
- 服务器:`/opt/browser-bookmark/deploy/`
|
|
||||||
|
|
||||||
你可以使用 `scp` 或 `rsync`(示例命令需替换服务器地址与用户名):
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 后端源码
|
cd /home/xxl/Code/bookmark
|
||||||
rsync -avz ./apps/server/ user@YOUR_NAS:/opt/browser-bookmark/server/
|
npm -w apps/server run db:migrate
|
||||||
|
|
||||||
# Web 构建产物
|
|
||||||
rsync -avz ./apps/web/dist/ user@YOUR_NAS:/opt/browser-bookmark/web/
|
|
||||||
|
|
||||||
# 扩展构建产物
|
|
||||||
rsync -avz ./apps/extension/dist/ user@YOUR_NAS:/opt/browser-bookmark/extension/
|
|
||||||
|
|
||||||
# 部署配置
|
|
||||||
rsync -avz ./deploy/ user@YOUR_NAS:/opt/browser-bookmark/deploy/
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3) 服务器端安装依赖
|
### 3) systemd 启动后端(并开机自启)
|
||||||
|
|
||||||
登录到 NAS:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ssh user@YOUR_NAS
|
sudo cp /home/xxl/Code/bookmark/deploy/systemd/browser-bookmark-server.service /etc/systemd/system/browser-bookmark-server.service
|
||||||
```
|
|
||||||
|
|
||||||
在服务器的后端目录安装依赖:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /opt/browser-bookmark/server
|
|
||||||
npm install --omit=dev
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4) 配置环境变量
|
|
||||||
|
|
||||||
在服务器 `server` 目录准备 `.env`:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /opt/browser-bookmark/server
|
|
||||||
cp .env.example .env
|
|
||||||
```
|
|
||||||
|
|
||||||
根据你的数据库与密钥填写 `.env`。
|
|
||||||
|
|
||||||
### 5) 初始化数据库(首次部署必做)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /opt/browser-bookmark/server
|
|
||||||
npm run db:migrate
|
|
||||||
```
|
|
||||||
|
|
||||||
### 6) 使用 systemd 启动后端
|
|
||||||
|
|
||||||
本仓库已生成 systemd 服务文件:`deploy/systemd/browser-bookmark-server.service`。
|
|
||||||
|
|
||||||
将其复制到服务器并启用:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo cp /opt/browser-bookmark/deploy/systemd/browser-bookmark-server.service /etc/systemd/system/browser-bookmark-server.service
|
|
||||||
sudo systemctl daemon-reload
|
sudo systemctl daemon-reload
|
||||||
sudo systemctl enable browser-bookmark-server
|
sudo systemctl enable browser-bookmark-server
|
||||||
sudo systemctl start browser-bookmark-server
|
sudo systemctl start browser-bookmark-server
|
||||||
```
|
```
|
||||||
|
|
||||||
查看服务状态:
|
### 4) 前端 Docker Nginx(9527)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo systemctl status browser-bookmark-server
|
sudo docker stop nginx || true
|
||||||
|
sudo docker rm nginx || true
|
||||||
|
sudo docker run -d --name nginx -p 9527:80 \
|
||||||
|
-v /home/xxl/Code/bookmark/deploy/nginx/mark.cloud-xl.top.conf:/etc/nginx/conf.d/default.conf:ro \
|
||||||
|
-v /home/xxl/Code/bookmark/apps/web/dist:/usr/share/nginx/html:ro \
|
||||||
|
nginx:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
### 7) 配置 Nginx(端口 6666)
|
### 5) API 代理 Docker Nginx(9526)
|
||||||
|
|
||||||
本仓库已生成 Nginx 配置文件:`deploy/nginx/mark.cloud-xl.top.conf`。
|
|
||||||
|
|
||||||
将其复制到服务器并启用:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo cp /opt/browser-bookmark/deploy/nginx/mark.cloud-xl.top.conf /etc/nginx/conf.d/mark.cloud-xl.top.conf
|
sudo docker stop nginx-api || true
|
||||||
sudo nginx -t
|
sudo docker rm nginx-api || true
|
||||||
sudo systemctl reload nginx
|
sudo docker run -d --name nginx-api -p 9526:80 \
|
||||||
|
--add-host=host.docker.internal:host-gateway \
|
||||||
|
-v /home/xxl/Code/bookmark/deploy/nginx/mark.cloud-xl.top.api.conf:/etc/nginx/conf.d/default.conf:ro \
|
||||||
|
nginx:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
该配置将 `mark.cloud-xl.top:6666` 指向 `/opt/browser-bookmark/web/`。
|
### 6) 防火墙放行
|
||||||
|
|
||||||
### 8) 扩展发布/加载
|
|
||||||
|
|
||||||
扩展产物位于服务器:`/opt/browser-bookmark/extension/`。
|
|
||||||
|
|
||||||
- 如需本地加载:将该目录下载到你的桌面浏览器,用“加载已解压扩展”指向该目录。
|
|
||||||
- 如需打包发布到商店:以该目录为基础打包(按平台要求)。
|
|
||||||
|
|
||||||
### 9) 验证与排查
|
|
||||||
|
|
||||||
- 后端日志:
|
|
||||||
```bash
|
```bash
|
||||||
sudo journalctl -u browser-bookmark-server -f
|
sudo iptables -I UG_INPUT 1 -p tcp --dport 9527 -j ACCEPT
|
||||||
|
sudo iptables -I UG_INPUT 1 -p tcp --dport 9526 -j ACCEPT
|
||||||
```
|
```
|
||||||
- Web 是否可访问(浏览器访问你的域名/端口)。
|
|
||||||
- 扩展是否能正常登录与同步。
|
|
||||||
|
|
||||||
### 10) 版本更新流程(建议)
|
### 7) 生成并发布扩展包
|
||||||
|
|
||||||
1. 本地执行:`npm install` 与 `npm run build`
|
```bash
|
||||||
2. 重新上传:`apps/server/`、`apps/web/dist/`、`apps/extension/dist/`
|
cd /home/xxl/Code/bookmark/apps/extension/dist
|
||||||
3. 服务器端:`npm install --omit=dev`(如依赖变更)
|
zip -r ../extension-dist.zip .
|
||||||
4. 重启服务:`sudo systemctl restart browser-bookmark-server`
|
cp /home/xxl/Code/bookmark/apps/extension/extension-dist.zip /home/xxl/Code/bookmark/apps/web/dist/extension-dist.zip
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8) 验证清单(服务器内)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -s http://127.0.0.1:9527 | head -n 5
|
||||||
|
curl -s http://127.0.0.1:9526/health
|
||||||
|
curl -I http://127.0.0.1:9527/extension-dist.zip
|
||||||
|
```
|
||||||
|
|
||||||
|
### 9) 更新流程(以后改代码时)
|
||||||
|
|
||||||
|
> 每次修改后都按以下顺序更新,保证线上一致。
|
||||||
|
|
||||||
|
1) **构建**(服务器或本地)
|
||||||
|
- `npm install`
|
||||||
|
- `npm run build`
|
||||||
|
2) **更新 Web 访问后端端口**
|
||||||
|
- 修改 `apps/web/.env.production` 中的 `VITE_SERVER_BASE_URL`,保持为 `http://mark.cloud-xl.top:9526`
|
||||||
|
- 重新执行 `npm -w apps/web run build`
|
||||||
|
3) **重启后端**
|
||||||
|
- `sudo systemctl restart browser-bookmark-server`
|
||||||
|
4) **更新扩展包**
|
||||||
|
- 重新执行「生成并发布扩展包」步骤
|
||||||
|
5) **若修改 Nginx 配置**
|
||||||
|
- 重新创建容器(见第 4/5 步)
|
||||||
|
6) **验证**
|
||||||
|
- 按第 8 步执行检查
|
||||||
|
|||||||
BIN
apps/extension/extension-dist.zip
Normal file
BIN
apps/extension/extension-dist.zip
Normal file
Binary file not shown.
@@ -11,7 +11,7 @@
|
|||||||
"lint": "eslint ."
|
"lint": "eslint ."
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@browser-bookmark/shared": "0.1.0",
|
"@browser-bookmark/shared": "file:../../packages/shared",
|
||||||
"vue-router": "^4.5.1",
|
"vue-router": "^4.5.1",
|
||||||
"vue": "^3.5.24"
|
"vue": "^3.5.24"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
"db:reset": "node src/resetDb.js"
|
"db:reset": "node src/resetDb.js"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@browser-bookmark/shared": "0.1.0",
|
"@browser-bookmark/shared": "file:../../packages/shared",
|
||||||
"@fastify/cors": "^11.2.0",
|
"@fastify/cors": "^11.2.0",
|
||||||
"@fastify/jwt": "^10.0.0",
|
"@fastify/jwt": "^10.0.0",
|
||||||
"@fastify/multipart": "^9.3.0",
|
"@fastify/multipart": "^9.3.0",
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
"lint": "eslint ."
|
"lint": "eslint ."
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@browser-bookmark/shared": "0.1.0",
|
"@browser-bookmark/shared": "file:../../packages/shared",
|
||||||
"sortablejs": "^1.15.6",
|
"sortablejs": "^1.15.6",
|
||||||
"vue": "^3.5.24",
|
"vue": "^3.5.24",
|
||||||
"vue-router": "^4.5.1"
|
"vue-router": "^4.5.1"
|
||||||
|
|||||||
13
deploy/nginx/mark.cloud-xl.top.api.conf
Normal file
13
deploy/nginx/mark.cloud-xl.top.api.conf
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name mark.cloud-xl.top;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://host.docker.internal:3001;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
server {
|
server {
|
||||||
listen 6666;
|
listen 80;
|
||||||
server_name mark.cloud-xl.top;
|
server_name mark.cloud-xl.top;
|
||||||
|
|
||||||
root /opt/browser-bookmark/web;
|
root /usr/share/nginx/html;
|
||||||
index index.html;
|
index index.html;
|
||||||
|
|
||||||
location / {
|
location / {
|
||||||
|
|||||||
@@ -4,9 +4,9 @@ After=network.target
|
|||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
WorkingDirectory=/opt/browser-bookmark/server
|
WorkingDirectory=/home/xxl/Code/bookmark/apps/server
|
||||||
EnvironmentFile=/opt/browser-bookmark/server/.env
|
EnvironmentFile=/home/xxl/Code/bookmark/.env
|
||||||
ExecStart=/usr/bin/node src/index.js
|
ExecStart=/usr/bin/env node src/index.js
|
||||||
Restart=always
|
Restart=always
|
||||||
RestartSec=5
|
RestartSec=5
|
||||||
User=root
|
User=root
|
||||||
|
|||||||
12
package-lock.json
generated
12
package-lock.json
generated
@@ -19,7 +19,7 @@
|
|||||||
"apps/extension": {
|
"apps/extension": {
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@browser-bookmark/shared": "0.1.0",
|
"@browser-bookmark/shared": "file:../../packages/shared",
|
||||||
"vue": "^3.5.24",
|
"vue": "^3.5.24",
|
||||||
"vue-router": "^4.5.1"
|
"vue-router": "^4.5.1"
|
||||||
},
|
},
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
"name": "@browser-bookmark/server",
|
"name": "@browser-bookmark/server",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@browser-bookmark/shared": "0.1.0",
|
"@browser-bookmark/shared": "file:../../packages/shared",
|
||||||
"@fastify/cors": "^11.2.0",
|
"@fastify/cors": "^11.2.0",
|
||||||
"@fastify/jwt": "^10.0.0",
|
"@fastify/jwt": "^10.0.0",
|
||||||
"@fastify/multipart": "^9.3.0",
|
"@fastify/multipart": "^9.3.0",
|
||||||
@@ -54,7 +54,7 @@
|
|||||||
"apps/web": {
|
"apps/web": {
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@browser-bookmark/shared": "0.1.0",
|
"@browser-bookmark/shared": "file:../../packages/shared",
|
||||||
"sortablejs": "^1.15.6",
|
"sortablejs": "^1.15.6",
|
||||||
"vue": "^3.5.24",
|
"vue": "^3.5.24",
|
||||||
"vue-router": "^4.5.1"
|
"vue-router": "^4.5.1"
|
||||||
@@ -1517,7 +1517,6 @@
|
|||||||
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
|
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"bin": {
|
"bin": {
|
||||||
"acorn": "bin/acorn"
|
"acorn": "bin/acorn"
|
||||||
},
|
},
|
||||||
@@ -2124,7 +2123,6 @@
|
|||||||
"integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==",
|
"integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@eslint-community/eslint-utils": "^4.8.0",
|
"@eslint-community/eslint-utils": "^4.8.0",
|
||||||
"@eslint-community/regexpp": "^4.12.1",
|
"@eslint-community/regexpp": "^4.12.1",
|
||||||
@@ -3218,7 +3216,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/pg/-/pg-8.17.1.tgz",
|
"resolved": "https://registry.npmjs.org/pg/-/pg-8.17.1.tgz",
|
||||||
"integrity": "sha512-EIR+jXdYNSMOrpRp7g6WgQr7SaZNZfS7IzZIO0oTNEeibq956JxeD15t3Jk3zZH0KH8DmOIx38qJfQenoE8bXQ==",
|
"integrity": "sha512-EIR+jXdYNSMOrpRp7g6WgQr7SaZNZfS7IzZIO0oTNEeibq956JxeD15t3Jk3zZH0KH8DmOIx38qJfQenoE8bXQ==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"pg-connection-string": "^2.10.0",
|
"pg-connection-string": "^2.10.0",
|
||||||
"pg-pool": "^3.11.0",
|
"pg-pool": "^3.11.0",
|
||||||
@@ -3315,7 +3312,6 @@
|
|||||||
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
|
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=12"
|
"node": ">=12"
|
||||||
},
|
},
|
||||||
@@ -3907,7 +3903,6 @@
|
|||||||
"integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==",
|
"integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"esbuild": "^0.27.0",
|
"esbuild": "^0.27.0",
|
||||||
"fdir": "^6.5.0",
|
"fdir": "^6.5.0",
|
||||||
@@ -3982,7 +3977,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/vue/-/vue-3.5.26.tgz",
|
"resolved": "https://registry.npmjs.org/vue/-/vue-3.5.26.tgz",
|
||||||
"integrity": "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==",
|
"integrity": "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@vue/compiler-dom": "3.5.26",
|
"@vue/compiler-dom": "3.5.26",
|
||||||
"@vue/compiler-sfc": "3.5.26",
|
"@vue/compiler-sfc": "3.5.26",
|
||||||
|
|||||||
Reference in New Issue
Block a user