文档目录
静态资源管理

简介

本技术文档聚焦 DouPHP 主题目录下的静态资源管理,覆盖 images、js、css、fonts 等资源的组织方式、命名规范、模块化策略、版本控制与缓存机制,以及压缩与合并等性能优化手段。文档以默认主题 theme/default 为基准,结合模板引擎与主题服务,给出可落地的实践建议。

项目结构

默认主题的静态资源按类型分目录存放:

  • css:样式文件(基础样式、组件样式、页面样式)
  • js:脚本文件(公共库、业务逻辑、第三方插件)
  • images:图片资源(图标、背景图、产品图等)
  • fonts:字体资源(按需引入与加载优化)
  • inc:模板片段与公共资源片段
  • *.dwt:页面模板,负责引用上述资源
graph TB
A["主题根目录<br/>theme/default"] --> B["css<br/>样式"]
A --> C["js<br/>脚本"]
A --> D["images<br/>图片"]
A --> E["fonts<br/>字体"]
A --> F["inc<br/>模板片段"]
A --> G["*.dwt<br/>页面模板"]
G --> B
G --> C
G --> D
G --> E

章节来源

  • theme/default/index.dwt:1-50
  • theme/default/product.dwt:1-147

核心组件

  • 模板引擎渲染:DouView 负责模板解析、编译与缓存,确保模板中资源路径稳定且可被正确解析。
  • 主题服务:ThemeService 负责主题元数据解析、启用/删除主题、同步支持模块等操作,影响主题资源加载范围。
  • 资源版本化:ManifestCacheGeneration 提供 lang_js / routes_js 的 URL 世代管理,配合内容指纹实现强缓存与失效控制。

章节来源

  • core/web/template/DouView.php:1-318
  • admin/service/theme/ThemeService.php:1-304
  • core/web/manifest/ManifestCacheGeneration.php:1-89

架构总览

前端请求由控制器路由到模板,模板通过相对路径引用主题内的 css/js/images/fonts;模板引擎在运行时将模板编译为 PHP 并输出 HTML;主题服务在后台管理主题切换与元信息;资源版本化通过查询参数或文件名哈希控制浏览器缓存。

sequenceDiagram
participant U as "用户浏览器"
participant T as "模板引擎(DouView)"
participant S as "主题服务(ThemeService)"
participant V as "视图资源(css/js/images/fonts)"
U->>T : 请求页面
T->>V : 解析并引用资源路径
T-->>U : 返回HTML
Note over T,V : 模板中通过相对路径引用主题资源
U->>S : 后台主题管理操作
S-->>U : 更新主题配置/清理缓存

图表来源

  • core/web/template/DouView.php:158-216
  • admin/service/theme/ThemeService.php:143-167

详细组件分析

图片资源组织与命名规范

  • 目录划分建议:
    • icons:图标类小图(png/gif/svg),统一使用语义化名称,如 icon_add_minus.gif、icon_search.png。
    • backgrounds:背景大图,建议使用 jpg/png,命名体现用途,如 bg_header.jpg。
    • products:产品主图与缩略图,命名包含产品标识与尺寸,如 product_123_main.png、product_123_thumb.png。
    • plugins:第三方插件图片,独立子目录便于维护。
  • 命名原则:
    • 全小写英文+下划线,避免中文与空格。
    • 语义清晰,前缀区分类型(icon、bg、product_)。
    • 尺寸信息可选后缀(_w120_h80)。
  • 存储策略:
    • 图标优先使用 SVG 或雪碧图,减少请求数。
    • 产品图采用多尺寸生成,按需加载缩略图与大图。
    • 背景图根据分辨率提供不同密度版本(@2x)。

章节来源

  • theme/default/images/*

JavaScript 模块化组织

  • 分层原则:
    • 公共脚本:第三方库(jquery.min.js、bootstrap.min.js、swiper.min.js)、通用工具(dou.js、dou.form.js、captcha.js)。
    • 业务脚本:按功能域拆分(product.js、order.js、money.js、chat.js 等)。
    • 插件脚本:特定交互(slide.show.js、video.min.js、lightbox 相关)。
  • 引入顺序:
    • 先引入基础库,再引入业务脚本,最后引入页面级脚本。
    • 使用 defer 或异步加载非关键脚本,提升首屏性能。
  • 命名与职责:
    • 文件名反映功能域,避免全局污染。
    • 每个脚本封装独立模块,通过事件或 API 通信。

章节来源

  • theme/default/js/*
  • theme/default/index.dwt:43-47
  • theme/default/product.dwt:139-144

CSS 样式管理架构

  • 层次结构:
    • 基础样式:common.css、style.css、bootstrap.min.css,定义全局重置、排版、布局。
    • 组件样式:各功能模块样式(product.css、order.css、money.css 等),复用性强。
    • 页面样式:index.css、content.css 等,针对具体页面微调。
  • 引入顺序:
    • 先基础后组件,最后页面样式,避免覆盖冲突。
    • 第三方 UI 库(bootstrap-icons.css、swiper.min.css)放在最前。
  • 命名规范:
    • 使用 BEM 或类似约定,保证类名可读性与可维护性。
    • 组件样式集中管理,避免散落在页面样式中。

章节来源

  • theme/default/css/*
  • theme/default/index.dwt:13-18
  • theme/default/product.dwt:13-18

字体资源引入与管理

  • 引入方式:
    • 通过 @font-face 在 CSS 中声明自定义字体,或使用系统字体栈。
    • 第三方图标字体(如 bootstrap-icons.css)通过样式表引入。
  • 加载优化:
    • 使用 font-display: swap 提升首屏体验。
    • 仅加载必要字重与字符集,减少体积。
    • 对自定义字体进行预加载(preload)以提升渲染速度。

章节来源

  • theme/default/css/bootstrap-icons.css

模板与资源引用流程

模板通过相对路径引用主题资源,模板引擎负责解析与输出。以下序列图展示首页与产品页的资源加载流程。

sequenceDiagram
participant B as "浏览器"
participant M as "模板(index.dwt/product.dwt)"
participant E as "模板引擎(DouView)"
participant R as "资源(css/js/images)"
B->>M : 请求页面
M->>E : 渲染模板
E->>R : 加载 css/bootstrap.min.css
E->>R : 加载 css/common.css
E->>R : 加载 js/jquery.min.js
E->>R : 加载 js/dou.js
E-->>B : 返回完整HTML

图表来源

  • theme/default/index.dwt:13-47
  • theme/default/product.dwt:13-144
  • core/web/template/DouView.php:158-216

依赖关系分析

  • 模板依赖主题资源:*.dwt 引用 css/js/images/fonts。
  • 模板引擎依赖资源路径解析:DouView 负责模板编译与资源定位。
  • 主题服务依赖文件系统:ThemeService 读取主题目录与样式头注释。
  • 版本化依赖缓存世代:ManifestCacheGeneration 提供 URL 版本参数。
graph LR
DWT["*.dwt"] --> CSS["css/*"]
DWT --> JS["js/*"]
DWT --> IMG["images/*"]
DWT --> FONTS["fonts/*"]
DWT --> VIEW["DouView"]
THEME["ThemeService"] --> FS["文件系统(theme/)"]
VIEW --> CACHE["编译缓存"]
MANIFEST["ManifestCacheGeneration"] --> URL["URL版本参数"]

图表来源

  • core/web/template/DouView.php:158-216
  • admin/service/theme/ThemeService.php:268-302
  • core/web/manifest/ManifestCacheGeneration.php:64-78

章节来源

  • core/web/template/DouView.php:158-216
  • admin/service/theme/ThemeService.php:268-302
  • core/web/manifest/ManifestCacheGeneration.php:64-78

性能与优化

  • 图片优化:
    • 使用现代格式(WebP/AVIF),并提供回退格式。
    • 按需生成多尺寸缩略图,减少传输体积。
    • 启用懒加载与响应式图片(srcset)。
  • JS/CSS 优化:
    • 压缩与混淆(minify),移除无用代码。
    • 合并关键资源,减少请求数。
    • 使用 CDN 分发静态资源,提升全球访问速度。
  • 缓存策略:
    • 浏览器缓存:为静态资源设置长期缓存(Cache-Control: max-age=31536000, immutable)。
    • 版本控制:通过 URL 查询参数或文件名哈希(content hash)实现强缓存失效。
    • 服务端缓存:利用 ETag/Last-Modified 协商缓存。
  • 构建流水线:
    • 自动化压缩、合并、版本化,部署时生成 manifest 文件。
    • 模板中引用带版本的资源 URL,确保缓存命中与及时更新。

故障排查指南

  • 模板无法找到资源:
    • 检查模板中的资源路径是否正确,是否使用了相对路径。
    • 确认主题目录结构与命名规范一致。
  • 主题切换后样式错乱:
    • 清理模板编译缓存,确保新主题资源生效。
    • 检查主题元数据解析是否正常。
  • 资源缓存未更新:
    • 检查 URL 版本参数是否正确递增。
    • 确认服务器端缓存策略与客户端缓存策略一致。

章节来源

  • core/web/template/DouView.php:205-216
  • admin/service/theme/ThemeService.php:166-167
  • core/web/manifest/ManifestCacheGeneration.php:64-78

结论

DouPHP 的主题静态资源管理以清晰的目录结构、规范的命名约定、模块化的脚本与样式组织为基础,结合模板引擎与主题服务实现灵活的资源加载与主题切换。通过版本化与缓存策略,可有效提升性能与用户体验。建议在生产环境中引入构建流水线,自动化完成压缩、合并与版本化,进一步提升资源加载效率。

附录

  • 推荐工具链:
    • 图片:ImageOptim、TinyPNG、Sharp
    • JS/CSS:Webpack、Rollup、Vite、PostCSS
    • CDN:阿里云 OSS、腾讯云 COS、Cloudflare
  • 最佳实践清单:
    • 所有静态资源纳入版本控制,变更需提交记录。
    • 使用语义化命名,避免硬编码路径。
    • 定期审计冗余资源,清理未使用文件。
    • 监控资源加载性能,持续优化。
添加日期:2026-10-05