# 部署与运维 ## 实现方式 nginx 自带 **njs**(`ngx_http_js_module`),`/md/` 与 `/book/` 下的请求全部交给它处理: ```nginx location / { js_content mdview.handler; # 目录 -> 首页;.md -> 渲染页;其他 -> 内部转发给静态 } ``` - **首页**:读目录项(目录优先,文件按修改时间倒序)生成卡片页; 若目录下有 `README.md`,同时渲染成正文 - **文档页**:原始 markdown 以 JSON 字符串嵌入页面,交给浏览器里的 marked.js 渲染 - 磁盘上不落任何转换产物,改完文件刷新即生效 ## 路径规则 | 请求 | 结果 | | --- | --- | | `/` | 301 → `/md/` | | `/md/` | 首页(卡片列表 + README 正文) | | `/md/xxx.md` | 渲染后的文档(`?raw=1` 看源文件) | | `/md/docs/` | 子目录同样出首页 | | `/md/图片.png` | njs 内部转发到 `/__static/`,原样静态返回 | | `/book/` | 阅读记录直达入口,等价于 `/md/阅读记录/` | | `/book/文学/xxx.md` | 阅读记录下的文档,链接与面包屑都留在 `/book/` 下 | `__static/` 标记为 `internal`,外部直接访问是 404。 入口由 `mdview.js` 顶部的 `MOUNTS` 定义:`prefix` 是对外前缀,`root` 是对应的磁盘目录, 再加一个入口只需往数组里追加一项,并在 `nginx.conf` 加同名的 `location = /前缀` 301 即可。 ## 首页怎么改好看 - 样式:`/app/mdview/assets/style.css`(hero 渐变、卡片网格、角标配色都在里面;顶部 `:root` 与 `html[data-theme]` 是四套主题的主题变量) - 主题:`/app/mdview/assets/theme.js`(顶栏下拉切换,选择存 localStorage,首次访问跟随系统深色偏好;新增主题=在 style.css 加一组变量 + 在 theme.js 的 `THEMES` 与 `mdview.js` 的 `themePicker()` 各加一项) - 结构:`/app/mdview/mdview.js` 的 `indexPage()` - 交互:`/app/mdview/assets/render.js`(筛选框、目录生成、外链新窗口、全屏阅读) - 阅读模式:顶栏「全屏」按钮(`#focusBtn`)切到 `body.focus-mode`,隐藏左右栏、正文限宽 880px;全屏下右下角「目录」按钮(`#tocFab`)可拉出右侧标题大纲浮层,按 Esc 退出;开关状态记在 localStorage 的 `mdview.focus` 改完 `systemctl reload nginx`,静态资源刷新浏览器即可。 ## 换端口 / 换前缀 - 端口:改 `/etc/nginx/nginx.conf` 里的 `listen 80` - 前缀:改 `mdview.js` 里的 `MOUNTS`(默认 `/md`,另带 `/book`)和 `nginx.conf` 里对应的 location ## 离线可用 marked.min.js、render.js、theme.js、style.css 都在 `/app/mdview/assets` 下由 nginx 直接 `alias` 出去, 不依赖任何 CDN,断网环境也能渲染。 ## 运行方式(主机直跑,不用容器) | 项 | 位置 | | --- | --- | | 主配置 | `/etc/nginx/nginx.conf` | | 文档目录 | `/app/markdown`(`mdview.js` 里的 `ROOT`) | | 渲染资源 | `/app/mdview/assets` → `/_md/` | | njs 脚本 | `/app/mdview/mdview.js`(`js_import` 直接引用,改完 reload 生效) | | 服务 | `systemctl enable --now nginx` |