Logo
Overview

npm 图床(不需要本地部署)

不在本地部署 npm 图床通过 cdn 加速 html、jpg 等资源

2023年4月1日
2 min read

本篇意在建立一个上传到 GitHub repo 自动发布 package 到 npm 空间的 npm 图床

前言

本篇为 picture-bed-using-freecdn 脚本的教程之一。脚本意在提高静态博客的 cdn 稳定性。

picture-bed-using-freecdn

脚本的另一篇使用教程在这里 [使用 freecdn-js 提高 hexo 博客的 cdn 稳定性]

建立用于储存图片等静态资源的 npm 图床

可以放置 js、css、图片(最好带上 hash)等不经常变动的资源。

准备工作

Note

准备工作网上有很多教程,这里不重复造轮子。请搜索“npm 图床”

需要:

  • npm 账号,创建一个 token
  • GitHub 账号:创建一个 repo,并在 repo 的 setting 创建一个名为 NPM_TOKEN 的 secrets,值为上面的 token
添加 NPM_TOKEN
添加 NPM_TOKEN

创建 package.json

该文件指定了要上传的图床的名字和图床版本(不需要事先在 npm 空间创建一个空的 package);其中名字不能和现有的 package 重复,所以写的尽量长。

{
"name": "",
"version": "1.0.0",
"description": "DO STUFF",
"author": "XDF"
}

看好名称写就行,version 尽量和我一样就行。

创建 GitHub action

GitHub action 可以在你把文件 push 或者 release 到 repo 时自动执行自定义命令,这里我们让他自动把我们 push 的图片发布到 npm 空间,使资源能通过 npm cdn 访问。

在 reop 的上方点击 Action,然后点击 new workflow,之后点击 set up a workflow yourself ,名字随便(我这里是 npm-publish.yml),之后填入以下信息:

name: npm-publish
on:
push:
branches:
- master
permissions:
contents: write
jobs:
publish-npm:
runs-on: ubuntu-latest
# Clone 仓库
steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: master
# 安装 Node.js
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '20.x'
registry-url: https://registry.npmjs.org/
# 发布 NPM 包
- name: Publish Package
run: |
git config --global user.email "zzy4on9@outlook.com"
git config --global user.name "user_name"
npm version patch
npm publish
env:
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
- name: Push
run: |
git push

其中的 master 要换成你 branch(分支)的名字。NPM_TOKEN 就是最开始在 secrets 填写的 token,因此名字要对应上。emailuser_name 可以随便写。

上传图片

使用图床工具或者手动上传到 GitHub repo 就能自动发布到 npm 空间,可以看到 npm 包的版本 version 变化了(npm 不支持覆盖发布,所以版本一定会变化),同时 .json 文件里面的版本也变化了,这得益于 GitHub action。

这里推荐一个图床工具吧,只用于 GitHub 的,比较轻量,使用浏览器就行。

PicX 图床工具官方文档

使用图片

提供几个国内能用的 npm cdn

https://npm.onmicrosoft.cn/,
https://jsd.onmicrosoft.cn/npm/,
https://cdn.jsdelivr.net/npm/,
https://unpkg.com/

使用格式为:

https://{cdn}/{npm_name}@{version}/path/to/resource.ext

例如

https://unpkg.com/html-hosting-for-xp@1.0.1/%E5%9C%A8python%E4%B8%AD%E8%BF%90%E8%A1%8Cbash%EF%BC%88windows%EF%BC%89.html
https://jsd.onmicrosoft.cn/npm/p-hosting-for-xp@1.0.15/20230525/logo%20(2).ln5ua8psy9s.webp
Tip

freecdn-js 可以把资源的响应头中的 mime 改成 text/html(而不是原来的 text/plain),从而能够让浏览器渲染网页。我写的脚本支持自动把用于写作博客.md 文件转换为对应的 html cdn 列表。见前言

建立用于储存 html 静态资源的 npm 图床

同样图床可以储存 html 文件。我是在本地编译好博客然后发布到 GitHub repo 的,因而在 push 之后依然可以在 action 中把 html 发布到 npm 空间。

{
"name": "",
"version": "1.0.0",
"description": "DO STUFF",
"author": "XDF"
"files": [
"*.html"
]
}

这里的 package.json 多了一个 fileskey,表示只发布 html 文件到 npm 空间。files 是一个列表(array),和.gitignore 文件的写作规则一样。

这里的 action 中的 .yml 文件和储存图片的 repo 的 .yml 一样,但是要删去 npm version patch 这行。

npm version patch 的作用是更新 version,在本地发布 html 之前(hexo d),在命令行输入 npm version patch 就能更新本地的 package.json 中的 version(换而言之,在更新 version 之前,本地的 package.json.yml 内容和 目录 要和 GitHub repo 的一致,然后 push 更新了 version 之后的 .json 之后,让 action 自动部署,发布 html 到 npm 空间)

Warning

如果用我的命令行上传博客会多次 push 本地文件,但是只在 push html 之前会更新 version,那么之后的 push 会因为没有更新 version 而 action 部署失败,但是事实上没有什么影响

脚本的使用

脚本链接见前言。如果你要使用 npm 空间,要在 config.py 中写上你的 npm 包名,用于查询最新的 version。

Warning
同样需要注意替换你的 branch
Terminal window
f:
cd f:/blog #博客根目录
hexo clean && hexo g
cd f:/blog/package_json #储存package.json和.yml的文件夹(注意.yml路径!!)
npm version patch
cd f:/blog
gulp
# 上传之前确保./public存在package.json和.yml(注意.yml路径!!)
xcopy .\package_json .\public /e/h
hexo d
cd f:/blog/.deploy_git
python ../import_to_db_with_hexo_blog.py
python ../import_to_db_with_urls_txt.py
freecdn find --save
freecdn manifest --merge ../pic.conf
freecdn manifest --merge ../custom.conf -o manifest-full.txt #用于生成外置的freecdn-manifest.txt
freecdn js --make --cdn "https://cdn.jsdmirror.com/gh/user/repo@main/freecdn-internal/ver/freecdn-main.min.js unpkg jsdelivr elemecdn " #此命令为配置cdn链接用于加速.min.js文件,详细请查看freecdn项目的GitHub
git add --all
git commit -m "update"
git push origin main #如果需要添加origin地址,请自行添加。
python ../generate_external_manifest_file.py
git add --all
git commit -m "update"
git push origin main #如果“is_refresh_tag”为 “True”需要上传多次
python ../refresh_cdn_cache.py #可能没用