You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过includeCss引入Vite生成的带动态哈希的CSS文件?

利用Vite的manifest.json解决TypoScript中CSS哈希路径变化的问题

当然可以,这正是Vite生成manifest.json的核心用途之一——通过映射原始文件名和带哈希的构建产物,实现动态获取最新的资源路径,无需手动修改TypoScript配置。下面是具体的实现步骤:

1. 确认Vite的manifest配置正确

确保你的vite.config.js中已开启manifest生成,并正确配置入口文件和输出目录:

export default defineConfig({
  build: {
    manifest: true, // 必须开启manifest生成
    outDir: 'public/assets', // 产物输出目录,根据你的项目结构调整
    rollupOptions: {
      input: {
        main: './src/main.scss', // 你的SCSS入口文件路径
      },
    },
  },
});

执行vite build后,会在outDir目录下生成manifest.json,文件内容类似:

{
  "main.scss": {
    "file": "assets/main.abc123.css",
    "src": "main.scss"
  }
}

这个文件记录了原始入口文件和带哈希的最终CSS文件的映射关系。

2. 在TypoScript中动态读取manifest.json

TypoScript本身无法直接解析JSON,所以需要借助PHP用户函数来读取manifest.json并获取对应路径:

步骤2.1 编写PHP用户函数

在你的TYPO3扩展中创建一个用户函数类(比如Vendor\YourExtension\UserFunctions\ViteAsset.php):

<?php
namespace Vendor\YourExtension\UserFunctions;

use TYPO3\CMS\Core\Core\Environment;

class ViteAsset
{
    public function getAssetFile($content, $conf)
    {
        // 定位manifest.json的路径
        $manifestPath = Environment::getPublicPath() . '/assets/manifest.json';
        
        // 开发环境或manifest不存在时,返回默认文件名作为降级
        if (!file_exists($manifestPath)) {
            return 'main.css';
        }

        // 解析manifest并返回带哈希的文件名
        $manifest = json_decode(file_get_contents($manifestPath), true);
        return $manifest[$content]['file'] ?? 'main.css';
    }
}

步骤2.2 在TypoScript中引用该函数

修改setup.typoscript,通过用户函数动态获取CSS路径:

// 定义获取Vite资源路径的用户函数
lib.getViteAssetFile = USER
lib.getViteAssetFile.userFunc = Vendor\YourExtension\UserFunctions\ViteAsset->getAssetFile

// 引入CSS,动态替换哈希路径
page.includeCSS.main = {$siteUrl}assets/{f:cObject(typoscriptObjectPath=lib.getViteAssetFile, data=main.scss)}

其中{$siteUrl}是你在常量中配置的站点根URL(比如https://your-domain.com/)。

3. 区分开发/生产环境(可选)

开发环境下Vite使用热更新服务器,无需依赖manifest.json,可以通过TypoScript的条件判断切换路径:

// 生产环境:使用manifest获取哈希路径
[applicationContext == "Production"]
    page.includeCSS.main = {$siteUrl}assets/{f:cObject(typoscriptObjectPath=lib.getViteAssetFile, data=main.scss)}
[global]

// 开发环境:直接指向Vite dev服务器的入口文件
[applicationContext == "Development"]
    page.includeCSS.main = {$viteDevUrl}/src/main.scss
[global]

在constants.typoscript中配置Vite开发服务器地址:

viteDevUrl = http://localhost:5173

这样每次Vite构建后,manifest.json会自动更新哈希路径,TypoScript会动态读取最新的路径,完全不需要手动修改配置。

内容的提问来源于stack exchange,提问作者GameOverflow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:42:41