Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124


Astro 7.1 版本现已发布!本次更新旨在赋予您更多控制权:新增的标志可让您并排运行多个开发服务器,而函数--ignore-lock则可让您根据实际部署网站的方式定制分页 URL 。此外,它还新增了用于更细粒度脚本和样式策略的 CSP 指令、降低大型内容集合内存占用的选项,以及一种实验性的内容分块存储方式。formatpaginate()
了解本次版本更新内容:
要升级现有项目,请使用自动化@astrojs/upgradeCLI 工具。或者,也可以手动升级,方法是运行包管理器的升级命令:
Astro CSP 现在内置支持以下指令,让您可以更好地控制资源:
这些资源是相应资源的专门版本script-src,style-src它们将使您能够解决以前无法解决的问题。
例如,现在您可以将内联样式视为不安全,而无需牺牲外部 CSS 文件的安全性:
要了解有关新配置和 API 的更多信息,请参阅运行时文档和配置文档。
由生成的页面分页 URLpaginate()并不总是与网站的实际部署方式相匹配。例如,如果您构建静态.html文件(例如 `/etc/html` build: { format: 'file' })并将其部署到没有 URL 重写规则的主机,则它返回的next` prev/ etc first/ lasthtml` URL 是类似 `/etc/html/html` 这样的干净路径/blog/2,这些路径并不对应于磁盘上的任何文件。
format现在,您可以通过新增的函数完全控制这些 URL paginate()。该函数接收每个生成的 URL 字符串,并允许您根据需要对其进行任何转换,例如添加冒号.html。
src/pages/pokemon.astro
---
export async function getStaticPaths({ paginate }) {
// Load your data with fetch(), getCollection(), etc.
const response = await fetch(`https://pokeapi.co/api/v2/pokemon?limit=150`);
const result = await response.json();
const allPokemon = result.results;
// Return a paginated collection of paths for all items
return paginate(allPokemon, {
pageSize: 10,
format: (url) => `${url}.html`
});
}
const { page } = Astro.props;
---有时,您可能需要第二个开发服务器,但又不想关闭当前正在运行的服务器。例如,您正在调试某些问题,希望临时启动一个启用详细日志记录的实例,同时保持现有开发服务器(及其状态)完全不变。
Astro 7 引入了锁定文件,以防止 AI 编码代理意外地为同一个项目启动多个开发服务器。但这样做的一个副作用是,astro dev即使您是故意启动的,如果另一个实例已经处于活动状态,运行该实例也会出错。
Astro 7.1 恢复了这种工作流程,并新增了一个--ignore-lock标志,可以跳过 lockfile 检查,因此您可以为同一个项目启动任意数量的开发服务器:
该实例--ignore-lock独立于其他实例运行,这意味着其他astro dev stop实例astro dev status不会astro dev logs感知到它的存在。它适用于像这样的情况:您只需要一个快速搭建的临时备用服务器,而不是需要长期管理的服务器。
加载glob()器会在同步内容集合后立即渲染 Markdown 条目,并将渲染后的 HTML 缓存起来,这样下次构建时就无需再次执行此操作。对于大多数网站来说,这非常划算:同步操作会稍微增加一些开销,但重建速度很快。
随着集合规模的扩大,或者渲染产生的输出内容超过其源 Markdown 内容,这种交易的成本就会增加。在同步过程中,将所有渲染后的 HTML 缓存到内存中会增加开销。
现在您可以选择不让特定集合立即渲染deferRender:
src/content.config.ts
import { defineCollection } from 'astro:content';
import { glob } from 'astro/loaders';
const docs = defineCollection({
loader: glob({ pattern: '**/*.md', base: 'src/content/docs', deferRender: true }),
});使用此方法deferRender: true,条目会在同步期间存储,而无需渲染。渲染会在页面实际需要时按需进行,就像.mdx文件一直以来的工作方式一样。虽然这样会放弃跨构建缓存已渲染的 HTML,但对于大型、占用大量内存的集合来说,这是为了在同步期间降低内存使用量而做出的值得的权衡。
现在,自定义日志记录器可以与其他您可能使用的 API(例如字体或会话)保持一致的配置。传递 URL 允许您在运行时覆盖配置或使用 Vite 的内置功能:
astro.config.mjs
import { defineConfig } from "astro/config"
export default defineConfig({
logger: {
entrypoint: new URL("./src/custom-logger.js", import.meta.url)
}
})此外,您还可以使用AstroRuntimeLogger. 这是一种很有用的类型,可以在使用运行时 Astro 日志记录器的文件中使用:
src/utils/requestHandler.ts
import type { AstroRuntimeLogger } from "astro";
export function handleRequest(req: Request, astroLogger: AstroRuntimeLogger) {
astroLogger.info("Incoming request");
}历史上,内容集合会将数据保存到一个名为 `.json` 的单个反序列化文件中.astro/data-store.json。然而,对于拥有大型内容集合的用户来说,这可能会成为一个问题,因为有些平台会对文件大小进行限制。
Astro 现在有一个名为“分块”的实验性标志experimental.collectionStorage,允许您将数据分成多个文件:
astro.config.mjs
import { defineConfig } from "astro/config"
export default defineConfig({
experimental: {
collectionStorage: "chunked"
}
})选中此选项后"chunked",Astro 会将内容收集数据每 10Mb 分割一次。