Svelte
简介
Svelte 是一个构建 web 应用程序的工具。
Svelte 与诸如 React 和 Vue 等 JavaScript 框架类似,都怀揣着一颗让构建交互式用户界面变得更容易的心。
但是有一个关键的区别:Svelte 在构建/编译阶段将你的应用程序转换为理想的 JavaScript 应用,而不是在运行阶段解释应用程序的代码。这意味着你不需要为框架所消耗的性能付出成本,并且在应用程序首次加载时没有额外损失。
你可以使用 Svelte 构建整个应用程序,也可以逐步将其融合到现有的代码中。你还可以将组件作为独立的包(package)交付到任何地方,并且不会有传统框架所带来的额外开销
构建
npx degit sveltejs/template <my_project_name>
cd <my_project_name>
npm install
组件
在 Svelte 中,应用程序由一个或多个 组件(components) 构成。组件是一个可重用的、自包含的代码块,它将 HTML、CSS 和 JavaScript 代码封装在一起并写入 .svelte
后缀名的文件中。
<script>
let name = 'world';
</script>
<h1>Hello {name.toUpperCase()}!</h1>
动态属性
就像可以使用花括号控制文本一样,也可以使用花括号控制元素属性。
<script>
let src = 'tutorial/image.gif';
let name = 'Rick Astley';
</script>
<img {src} alt="{name} dances.">
名称和值相同的属性并不少见,比如 src={src}
。Svelte 为这些情况提供了一个方便的速记法:
<img {src} alt="A man dances.">
CSS 样式
就像在 HTML 中一样,你可以向组件添加一个 <style>
标签。
重要的是,这些 CSS 样式规则 的作用域被限定在当前组件中。您不会意外地更改应用程序中其他地方的 <p>
元素的样式。
// Nested.svelte
<style>
p {
color: purple;
font-family: 'Comic Sans MS', cursive;
font-size: 2em;
}
</style>
<p>This is a paragraph.</p>
嵌套组件
将整个应用程序放在一个组件中是不切实际的。相反,我们可以从其他文件导入组件并包含它们,就好像我们包含 HTML 元素一样。
<script>
import Nested from './Nested.svelte';
</script>
<style>
p {
color: purple;
font-family: 'Comic Sans MS', cursive;
font-size: 2em;
}
</style>
<p>This is a paragraph.</p>
<Nested/>
注意,尽管 Nested.svelte
有一个 <p>
元素,但 App.svelte
中的样式是不会溢出的(也就是不会影响 Nested.svelte
中的 <p>
元素)。
还需要注意的是,组件名称 Nested
的首字母大写。采用此约定是为了使我们能够区分用户自定义的组件和一般的 HTML 标签。
HTML 标签
通常,字符串以纯文本形式插入,这意味着像 <
和 >
这样的字符没有特殊的含义。
但有时需要将 HTML 直接绘制到组件中。
在 Svelte 中,你可以使用特殊标记 {@html ...}
实现:
<script>
let string = `this string contains some <strong>HTML!!!</strong>`;
</script>
<p>{@html string}</p>
在将表达式的输出插入到 DOM 之前,Svelte 不会对
{@html ...}
内的表达式的输出做任何清理的。换言之,如果使用此功能,则必须手动转义来自不信任源的 HTML 代码,否则会使用户面临 XSS 攻击的风险。
创建一个应用程序
首先,你需要将 Svelte 与构建工具集成起来。官方提供了针对 Rollup 和 webpack 的插件:
另外还有很多是 社区维护的插件。
然后,一旦您的项目设置好了,使用 Svelte 组件就很容易了。编译器将每个组件转换为常规的 JavaScript 类 - 接下来只需导入它并用 new
实例化即可:
import App from './App.svelte';
const app = new App({
target: document.body,
props: {
// we'll learn about props later
answer: 42
}
});
然后,如果需要,你可以使用 组件 API 与 app
进行交互。