Remotion LabRemotion Lab
常見問題絕對路徑

絕對路徑

關於在 Remotion 專案中使用絕對路徑引用資源的常見問題,說明為何應避免絕對路徑以及正確的資源引用方式。

絕對路徑

可以在 Remotion 中使用絕對路徑引用資源嗎?

不建議使用絕對路徑。 Remotion 使用 staticFile() 函式來引用 public/ 目錄中的資源,這是跨環境(本地開發、Lambda 渲染、Docker 等)都能正常運作的正確方式。

為什麼不應該使用絕對路徑?

使用如 /Users/yourname/project/public/video.mp4 這樣的絕對路徑有以下問題:

  1. 跨環境不相容:本地機器上的路徑在 Lambda、Docker 或 CI/CD 環境中完全無效
  2. 跨作業系統問題:Windows、macOS、Linux 的路徑格式不同
  3. 跨開發者問題:不同開發者的本地路徑不同,導致程式碼無法共享
  4. 安全性問題:暴露檔案系統結構可能帶來安全隱患

如何正確引用靜態資源?

將資源放置在 public/ 目錄中,並使用 staticFile() 函式引用:

import { staticFile } from "remotion";
 
// 正確方式
const videoSrc = staticFile("my-video.mp4");
const imageSrc = staticFile("images/logo.png");
const audioSrc = staticFile("audio/background.mp3");

staticFile() 會自動根據當前執行環境(本地、Lambda、Docker)解析正確的路徑。

public/ 目錄的結構是什麼?

my-remotion-project/
├── public/
│   ├── video.mp4
│   ├── audio/
│   │   └── background.mp3
│   └── images/
│       └── logo.png
├── src/
│   └── MyComposition.tsx
└── remotion.config.ts

staticFile("audio/background.mp3") 會對應到 public/audio/background.mp3

如果資源不在 public/ 目錄中,我應該怎麼辦?

有幾個選項:

選項一:移動資源到 public/ 目錄(推薦)

這是最簡單、最可靠的方式。

選項二:在 Webpack 設定中添加額外的資源目錄

// remotion.config.ts
import { Config } from "@remotion/cli/config";
 
Config.overrideWebpackConfig((currentConfiguration) => {
  return {
    ...currentConfiguration,
    // 自訂設定
  };
});

選項三:使用遠端 URL

如果資源托管在遠端(如 S3、CDN),直接使用 HTTPS URL 即可,不需要 staticFile()

使用動態路徑時怎麼辦?

動態路徑(由 Props 傳入的檔案名稱)同樣應透過 staticFile() 處理:

interface MyComponentProps {
  backgroundImage: string;
}
 
export const MyComponent: React.FC<MyComponentProps> = ({ backgroundImage }) => {
  return (
    <img src={staticFile(backgroundImage)} />
  );
};

呼叫時傳入相對於 public/ 的路徑:

inputProps: {
  backgroundImage: "backgrounds/sunset.jpg"
}

Lambda 渲染時如何處理資源?

在 Lambda 渲染時,你的 public/ 目錄中的資源會被 Webpack 打包進 bundle,並部署到 S3。staticFile() 函式在 Lambda 環境中會自動解析成 S3 上的 URL。

因此,只要使用 staticFile(),不需要任何額外設定即可在 Lambda 環境中正確引用資源。

如何確認資源路徑是否正確?

在 Remotion Studio 的開發模式下,如果資源無法載入,瀏覽器的開發者工具(F12)中的 Network 標籤會顯示 404 錯誤,幫助你確認路徑是否正確。

你也可以直接在瀏覽器中訪問 http://localhost:3000/public/your-asset.mp4(在 Remotion Studio 執行時)來確認資源是否可存取。

importstaticFile() 有什麼區別?

  • import:適合在 Webpack 打包時就已知的靜態資源(圖片、字型等),Webpack 會處理版本雜湊和最佳化
  • staticFile():適合在執行時動態決定路徑的資源,或大型媒體檔案(影片、音訊)

對於影片和音訊檔案,強烈建議使用 staticFile(),因為這些檔案通常較大,不適合由 Webpack 處理。

相關資源