复制静态文件

配置哪些文件和目录按原样复制。

静态文件是指那些不需要处理的文件,例如图片、PDF、 视频或音频。因此,最好(也更快)使用 copy() 方法将这些文件直接复制到 dest 目录:

// 将 "img" 目录复制到 _site/img
site.copy("img");

// 将文件复制到 _site/favicon.ico
site.copy("favicon.ico");

路径是相对于您站点的源目录(在 src 中配置)而言的, 文件和目录将按原样复制,并保持相同的目录结构。使用第二个参数可以更改输出目录:

// 将 "img" 目录复制到 _site/images
site.copy("img", "images");

// 将 "static-files/favicons/favicon.ico" 复制到 _site/favicon.ico
site.copy("static-files/favicons/favicon.ico", "favicon.ico");

// 将 "assets" 目录的内容复制到站点的根目录
site.copy("assets", ".");

Note

不能复制 src 目录之外的文件。例如, 不允许使用 site.copy("../folder");。这有几个原因:

  • 这会使监听器更加复杂,因为它必须监听不同的 文件夹。
  • 这是不安全的,因为它会读取当前目录之外的文件。
  • 这可能会破坏构建,因为 src 文件夹可以随时更改 (deno task build --src=other-folder),这可能会更改此文件夹的解析。

忽略的文件

请注意,在 忽略文件 中解释的忽略设置在复制静态文件时也会应用, 包括以 _. 开头的文件。 例如:

// 忽略一个子文件夹
site.ignore("/files/pictures/");

// 复制 /files/ 文件夹。
// 请注意,除了所有以 . 和 _ 开头的文件外,/files/pictures/ 文件夹也会被忽略
site.copy("/files/");

如果您需要复制以 ._ 开头的文件,则必须显式配置它:

// 复制一个以下划线开头的文件
site.copy("_headers");

按文件扩展名复制

选择文件的另一种方法是通过扩展名。使用一个包含您要复制的文件扩展名的数组:

// 复制所有图像文件
site.copy([".jpg", ".gif", ".png"]);

这将复制所有扩展名为 .jpg.gif.png 的文件,并保留原始文件结构。 例如,文件 /img/pictures/image.jpg 将被复制到 _site/img/pictures/image.jpg 位置。

自定义目标路径

为了更精细地调整文件目标路径,您可以在第二个参数中提供一个函数,该函数接受原始文件路径,并且必须返回目标路径:

// 复制 static 目录中的所有文件,但确保它们是小写
site.copy("static", (file) => file.toLowerCase());

// 复制 /img/ 目录中的所有图像
site.copy([".jpg", ".gif", ".png"], (file) => "/img" + file);

Warning

复制的文件不会被处理,即使它们具有已知的扩展名,如 .md.vto 等。

复制剩余文件

有时不可能预先知道所有必须复制的文件,因为它们可能存储在任何文件夹中,或者可能具有任何扩展名。 例如,假设您有一个包含文章的网站,每篇文章都存储在自己的文件夹中,该文件夹可以包含任何扩展名的静态文件:

|_ articles/
    |_ article-1/
    |   |_ index.md
    |   |_ picture.jpg
    |   |_ document.pdf
    |   |_ foo32.gif
    |_ article-2/
        |_ index.md
        |_ journey.mp4
        |_ download.zip

我们不能使用 site.copy("articles"),因为 index.md 文件在这些文件夹中,并且不会被处理(它们将被视为静态文件)。 我们可以使用 site.copy([".jpg", ".pdf", ".gif", ".mp4", ".zip"]) 按扩展名选择文件,但是每次将具有新扩展名的文件上传到我们的站点时,我们都必须记住更新 _config 文件。

对于这些用例,可以使用 copyRemainingFiles() 函数,它基本上表示:当您找到一个文件并且不知道如何处理它时,复制它。 要设置此行为,只需将以下行添加到您的 _config 文件中:

site.copyRemainingFiles();

可以在第一个参数中包含一个函数来过滤必须复制的文件。例如,如果我们只想复制 /articles/ 文件夹中剩余的文件:

site.copyRemainingFiles(
  (path: string) => path.startsWith("/articles/"),
);

如果过滤器返回一个字符串而不是布尔值,它将用于重命名文件。例如,假设我们想要确保所有文件都小写:

site.copyRemainingFiles(
  (path: string) => path.startsWith("/articles/") ? path.toLowerCase() : false,
);