【发布时间】:2020-02-18 11:14:35
【问题描述】:
我有一条动态路线:
routes/artwork/[slug].svelte.
npm run dev 一切正常。
但是当我npm run export 时,那些动态的 slug 路线就不见了。我在__sapper__/export 中没有看到它们,当我上传到 Netlify 时,这些页面也丢失了。
有什么线索可以解决这个问题吗?我错过了什么明显的东西吗?
【问题讨论】:
我有一条动态路线:
routes/artwork/[slug].svelte.
npm run dev 一切正常。
但是当我npm run export 时,那些动态的 slug 路线就不见了。我在__sapper__/export 中没有看到它们,当我上传到 Netlify 时,这些页面也丢失了。
有什么线索可以解决这个问题吗?我错过了什么明显的东西吗?
【问题讨论】:
sapper export 的工作原理是构建您的应用程序,运行它,然后访问 / 并递归访问它找到的每个内部链接。因此,必须可以通过主页上的链接访问/artwork/foo 和/artwork/bar 等(例如,通过routes/artwork/index.svelte 页面,该页面将映射到/artwork)。
【讨论】:
routes/artwork/index.svelte 只是routes/artwork/[slug].svelte。这不可能吗?
Feed 组件,然后该组件具有指向artwork/{slug} 的链接。所以我在想export 会为那些动态链接抓取那些页面(显然它们存在),但是如果我需要在我的主页上直接链接到/artwork?再次感谢。
<a hidden href="artwork">Artwork</a> 也可以正常工作)
TransitionWrapper 组件,它有一个{#if show},它是false 开始并在装载时翻转为true。这是为了在首次加载页面时允许淡入淡出过渡。我将不得不解决这个问题,但只是为了确认export 确实按照我最初使用Feed 组件中的链接的方式工作。再次感谢您抽出宝贵时间,Rich,我是 Svelte 的忠实信徒!
artwork 页面。艺术品页面不使用TransitionWrapper(这无关紧要,因为它无论如何都被隐藏了)。我所有的动态链接都是用npm export生成的
为Rich Harris's answer添加额外的上下文:
如果在动态路由之前爬错了类似的路由URL,则不会尝试生成动态路由。
主页链接使用"/events/slug" 而不是href="events/slug",开发站点将在主页链接上正确提供404,并在活动页面上提供动态slug。但是,在构建时,根本不会生成 slug。
【讨论】:
正如collardeau 所提到的,在我的情况下,问题是我将页面组件包装在一个TransitionWrapper 组件中,该组件具有{#if show},即false 启动并在装载时翻转为true。一个简单的解决方法是使用true 启动它,然后在安装时翻转它两次:
// TransitionWrapper.svelte
...
let show = true;
onMount(() => {
show = false;
show = true;
});
...
由于代码在 onMount 内部执行,根据我运行的测试,它可以正常工作
【讨论】:
万一有人遇到这个问题。上面的解决方案并没有真正帮助导致 我有很多嵌套路由,您无法使用 --entries 方法指定这些路由。
但是有效的是在我的routes 文件夹中创建一个404.svelte 文件,然后将其添加到我的package.json
"export": "sapper export --legacy --entry \"/ /404\"",
"postexport": "mv __sapper__/export/404/index.html __sapper__/export/404.html",
这个解决方案的来源来自这个github issue
【讨论】: