使用svteit开发一个服务端渲染(SSR)项目

上篇简单介绍了sapper和sveltekit的发展,目前sveltekit还只是Beta版本,有很多不确定因素存在,有可能会有大的变更,所以还不推荐在生产环境中使用,不过在个人项目和小项目中可以大胆尝试。

今天我们就正式使用sveltekit开发一个web项目。

第一步:创建项目

mkdir my-app

cd my-app

npm init svelte@next

npm install

npm run dev

这样就可以创建一个简陋的项目了,不过和我们真实需求还有些差距,既然是使用sveltekit,那么最重要的原因是其支持服务端渲染了。这就需要从服务端获取数据,接下来就实现这样的需求。

第二步:路由
和sapper一样,sveltekit也是基于文件系统的的路由器,这就需要我们来合理的组织目录结构。路由的核心目录是src/routes,当然,这个也是可配置的,按照自己的需求修改svelte.config.cjs,参考文档:https://kit.svelte.dev/docs#configuration

我们以一个博客系统为例,在scr/routes下创建blog目录,光有目录还不行,如果想要访问/blog路由,还需要创建index.svelte文件,内容如下:

<script context="module">
    /**
	 * @type {import('@sveltejs/kit').Load}
	 */
	export async function load({ page, fetch, session, context }) {
		return fetch(`blog.json`)// index.json.js = blog.json或blog/blog.json
			.then((r) => r.json())
			.then((posts) => {
				console.log(posts);
				return {
					props: {
						posts
					}
				};
			});
	}
</script>

<script>
	export let posts;
</script>

<svelte:head>
	<title>Blog</title>
</svelte:head>

<h1>Recent posts</h1>

<ul>
	{#each posts as post}
		<!-- we're using the non-standard `rel=prefetch` attribute to
				tell Sapper to load the data for the page as soon as
				the user hovers over the link or taps it, instead of
				waiting for the 'click' event -->
		<li><a rel="prefetch" href="blog/{post.slug}">{post.title}</a></li>
	{/each}
</ul>

<style lang="less">
	ul {
		margin: 0 0 1em 0;
		line-height: 1.5;
	}
</style>

index.svelte中load函数是一个关键函数,它接收四个参数:

  • page
  • fetch
  • session
  • contenxt

page

page是一个对象,包含{ host, path, params, query },用户获取请求参数。

fetch

fetch是用于服务端,客户端发送请求。

session

session是用户会话,用于从服务端传递与当前请求相关的数据。

context

上下文从布局组件传递到子布局和页面组件。为了根$layout.svelte组件,它等于{},但如果该组件的加载函数返回一个具有上下文属性的对象,则该对象将可供后续加载函数使用。

有输入,也有输出,load函数输出以下数据:

status

http状态码,如果返回错误,则必须是4xx或5xx。重定向是3xx,默认是200。

error

如果在加载过程中出错,则返回一个错误对象或描述错误的字符串以及4xx或5xx状态代码。

redirect

如果该页应该重定向(因为该页已被弃用,或者用户需要登录,或者其他原因),则返回一个字符串,其中包含应重定向到的位置以及3xx状态码。

maxage

要使页面被缓存,请返回一个数字,该数字描述页面的最大使用时间(以秒为单位)。如果在呈现页面时涉及到用户数据(通过会话,或者因为在加载函数中进行了认证获取),则生成的缓存头将包括private,否则将包括public,以便cdn可以缓存它。

这只适用于页面组件,而不适用于布局组件。

props

如果load函数返回一个props对象,则在呈现时props将传递给组件。

context

这将与任何现有上下文合并,并传递给后续布局和页面组件的加载函数。
这只适用于布局组件,而不适用于页面组件。

index.svelte中请求了一个url:blog.json,所以需要创建index.json.js,此处可能稍微难以理解,主要你理解了blog目录和index.svelte文件的关系也就解释的通了。

// index.json.js
import db from '$lib/database';

export function get() {
	return {
		body: db.list()
	};
}
//src/lib/database.js
import posts from './posts';

const lookup = new Map();
posts.forEach(post => {
    lookup.set(post.slug, JSON.stringify(post));
});

export default {

    get(slug) {
        return lookup.get(slug);
    },

    has(slug) {
        return lookup.has(slug);
    },

    list() {
        const contents = JSON.stringify(posts.map(post => {
            return {
                title: post.title,
                slug: post.slug
            };
        }));
        return contents;
    },
}

// src/lib/posts.js
const posts = [
	{
		title: 'What is Sapper?',
		slug: 'what-is-sapper',
		html: `
			<p>First, you have to know what <a href='https://svelte.dev'>Svelte</a> is. Svelte is a UI framework with a bold new idea: rather than providing a library that you write code with (like React or Vue, for example), it's a compiler that turns your components into highly optimized vanilla JavaScript. If you haven't already read the <a href='https://svelte.dev/blog/frameworks-without-the-framework'>introductory blog post</a>, you should!</p>

			<p>Sapper is a Next.js-style framework (<a href='blog/how-is-sapper-different-from-next'>more on that here</a>) built around Svelte. It makes it embarrassingly easy to create extremely high performance web apps. Out of the box, you get:</p>

			<ul>
				<li>Code-splitting, dynamic imports and hot module replacement, powered by webpack</li>
				<li>Server-side rendering (SSR) with client-side hydration</li>
				<li>Service worker for offline support, and all the PWA bells and whistles</li>
				<li>The nicest development experience you've ever had, or your money back</li>
			</ul>

			<p>It's implemented as Express middleware. Everything is set up and waiting for you to get started, but you keep complete control over the server, service worker, webpack config and everything else, so it's as flexible as you need it to be.</p>
		`
	}
];

posts.forEach(post => {
	post.html = post.html.replace(/^\t{3}/gm, '');
});

export default posts;

最终src目录是这样:

src
├─lib
│      database.js
│      posts.js
│
└─routes
    │  $error.svelte
    │  $layout.svelte
    │  about.svelte
    │  index.svelte
    │
    └─blog
            index.json.js
            index.svelte
            [slug].json.js
            [slug].svelte

以上就完成了一个可以从数据库中获取数据并通过服务端渲染的web项目。

完整项目:https://gitee.com/hpgt/sveltekit-app

原文:https://www.yuedun.wang/blogdetail/606d512c54277a10496a38ae

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 服务端渲染(Server Side Rendering,简称 SSR)是一种将应用程序的 HTML 和 CSS 部分渲染到服务器端,再将渲染结果发送给客户端的技术。这样做的目的是为了提高首屏加载速度,并且在某些情况下改善 SEO。 传统的客户端渲染(Client Side Rendering,简称 CSR)技术中,客户端接收到的是一段空白的 HTML 文档,再通过 JavaScript 来动态渲染页面。这种方式对于用户体验来说不够优秀,因为首屏加载需要等待 JavaScript 执行完成。 服务端渲染的技术能够解决这个问题,因为客户端接收到的是一个完整的 HTML 文档,能够立即呈现。用户在操作页面时,再通过 JavaScript 来完成剩余的渲染和交互。 服务端渲染并不适用于所有场景,在选择是否使用 SSR 时需要考虑到应用程序的特定要求和需求。但对于需要提高首屏加载速度和改善 SEO 的应用程序来说,服务端渲染一个不错的选择。 ### 回答2: 服务端渲染(Server-Side Rendering,简称SSR)是指在服务端动态生成页面内容,然后将渲染好的页面传输给浏览器进行展示的一种网页渲染技术。 传统的客户端渲染,即前端渲染,是指将数据请求发送给服务端,然后由浏览器的JavaScript代码异步获取数据,再将数据和模板进行渲染生成页面。这种渲染方式可以实现灵活的交互效果,但也存在一些问题,如首屏加载较慢、对搜索引擎的SEO不友好等。 而SSR则是在服务端生成完整的HTML页面,然后将渲染好的页面返回给浏览器展示。它的主要优点有: 1. 更快的首屏加载速度:由于服务端渲染页面时已经生成完整的HTML,用户在打开网页时能够立即看到内容,提高了页面的加载速度和用户体验。 2. 更好的SEO:由于搜索引擎爬虫主要是获取HTML内容进行分析,使用SSR能够保证搜索引擎能够正确的读取页面的内容,提高网站的搜索引擎排名。 3. 更好的可访问性:由于服务端渲染生成的页面已经包含了完整的内容和结构,相对于客户端渲染,能够更好地支持辅助功能和设备兼容性。 尽管SSR在首屏加载和SEO方面具有很大的优势,但也存在一些限制和挑战。比如对于复杂的交互和动态内容的处理较为复杂,需要更多的服务器负载和带宽资源。此外,SSR还需要考虑页面的缓存策略和更新机制,以保证渲染的页面始终能够与最新的数据保持同步。 总之,服务端渲染(SSR)是一种能够提高网页加载速度、改善SEO和可访问性的网页渲染技术。尽管它也有一些限制和挑战,但在某些场景下,特别是对于需要快速首屏加载和SEO友好的网站来说,SSR是一种值得采用的渲染方式。 ### 回答3: 服务端渲染(Server-Side Rendering,简称SSR)是指在服务器端进行网页内容的渲染,生成完整的HTML页面后再发送给客户端的一种网页渲染方式。相对于传统的客户端渲染(Client-Side Rendering,简称CSR),SSR具有以下特点: 1. SEO友好:由于搜索引擎爬虫只能解析HTML页面,传统的CSR渲染会导致搜索引擎无法获取到完整的页面内容。而使用SSR时,服务器端渲染出的HTML页面包含了完整的内容,有利于SEO优化和搜索引擎收录。 2. 更快的首次加载速度:在CSR中,页面初始化的过程需要先下载基础的HTML结构和JavaScript代码,然后再通过JavaScript请求并渲染数据,这个过程会产生较长的白屏时间。而SSR在服务器端就生成了完整的HTML页面,用户首次访问时可以直接加载这个HTML,减少首次加载时间。 3. 更好的用户体验:因为SSR在服务器端就渲染了完整的HTML页面,用户可以更快地看到网页的基本内容,提升了用户体验。而在CSR中,由于需要等待JavaScript的下载和执行,用户可能会出现闪动的页面或者突然出现的内容,造成用户体验不佳。 4. 兼容性好:由于SSR在服务器端渲染,不依赖于浏览器的特定功能或版本,对于不支持JavaScript或禁用JavaScript的浏览器仍然可以渲染出完整的页面。 5. 服务器压力较大:相对于CSR,SSR需要在服务器端进行页面渲染,因此对服务器的压力较大,特别是当网站的流量较大时。服务器需要消耗更多的计算资源和内存来渲染页面并返回给客户端。 总结来说,服务端渲染SSR)通过在服务器端生成完整的HTML页面,提供了更好的SEO友好性、首次加载速度和用户体验,但增加了服务器的压力。它适用于对SEO要求较高、首次加载速度重要的网站。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值