复制静态文件
配置哪些文件和目录按原样复制。
静态文件是指那些不需要处理的文件,例如图片、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,
);