了解一下Svelte JavaScript框架

110 阅读7分钟

了解一下Svelte JavaScript框架的情况

Svelte在服务器端工作,将你的应用程序编译成优化的JavaScript。让我们来快速浏览一下这个快速、反应式的组件框架。

随着2021年接近一半的时间,JavaScript的黄金时代仍在继续。当前章节中最令人兴奋的角色之一是Svelte框架。本文为你介绍了创建Svelte项目和使用一些简单的UI元素的基本知识。

与目前以React、Angular和Vue为代表的群体思维截然不同的是,Svelte在服务器端工作,将你的应用程序编译成优化的JavaScript。这意味着,Svelte需要一个构建管道的设置。

虽然建立一个构建管道可能看起来是额外的工作,但事实上,在React、Angular或Vue中,所有真正的开发都需要某种形式的构建管道(如create-react-app或Webpack配置)。另外,设置Svelte环境可以快速获得热部署开发模式等功能。

Svelte设置

让我们直接进入,建立一个简单的构建环境。你将会使用npxdegit来创建一个启动模板。使用清单1中的步骤。

清单1.初始模板

npx degit sveltejs/template infoworld-svelte
cd infoworld-svelte
npm install
npm run dev

在这一点上,启动程序将在localhost:5000运行;在你的浏览器中检查它。在你的代码编辑器或IDE中打开/infoworld-svelte文件夹。在/src目录下有两个感兴趣的源文件。App.svelte和main.js。这两个文件共同定义了你在浏览器中看到的内容。

注意:所有的代码都可以在这个 repo 中找到。

如果你使用Visual Studio Code,有一些有用的(免费)Svelte扩展,提供语法高亮和自动完成。

要找到它们,请到左边的扩展工具中,在搜索栏中输入 "ext:svelte"。

main.js是该应用程序的主要入口点。如清单2所示,它在第一行导入了App.svelte

清单2.main.js

import App from './App.svelte';
const app = new App({
            target: document.body,
            props: {
                        name: 'world',
            }
});

export default app

清单2显示了一些关于Svelte如何工作的有趣内容。从App.svelte 中导出的数据已被转化为一个对象,并通过new App({...}) 的调用将其实例化。

App 对象被配置了几个参数。这些参数用于为Svelte对象的参数提供值。target param是一个内置的属性,Svelte用它来告诉应用程序的根在哪里(类似于ReactDOM.render 的第二个参数)。

现在看看 App.svelte.这有Svelte中的组件语法的肉,它结合了JavaScript、标记和CSS的三个元素,分别是scriptmainstyle 标签。这些内容与main.js中的实例化所提供的参数一起被组合在一起, into a component. Note that the `main` tag could be any valid HTML tag.

请注意,Svelte使用的变量标记与其他框架的语法相同:<h1>Hello {name}!</h1> 。还请注意,这个变量的值是由main.js中的params提供的,它在脚本部分被导出:export let name; 。这也可以直接在脚本中完成。为了理解我的意思,把这一行改成let name = "InfoWorld"; ,完全取消了导出。重点是,通过main.js对App 对象进行参数化并没有什么神奇的地方,也不需要。它只是一个支持的功能,用于组织事情。

由于你是在开发模式下运行的,这个变化将立即得到反映。浏览器现在将显示新的问候语:"Hello InfoWorld!"

构建复杂的UI有许多必要的功能。其中最重要的是迭代器和对象处理。让我们通过添加清单3中的代码来看一看。

清单3.遍历一个对象的数组

<script>
            let quotes = [                        {author:"Emerson", quote:"To be great is to be misunderstood."},                        {author:"James", quote:"The art of being wise is the art of knowing what to overlook."},                        {author:"Thoreau", quote:"That government is best which governs least."}            ];
</script>
<main>
  <ul>
                        {#each quotes as { quote, author }, i}
                                    <li>{i} - {quote}</li>               
                        {/each}
  </ul>
</main>

基本的语法是{#each} 标签。它被用来引用变量quotes 。然后,这个数组变量的元素(通过分解)和一个迭代器计数器i ,被暴露给标签的内部。然后用与其他变量相同的标记语法来引用这些暴露的变量。如果你熟悉另一个框架,我想你会同意这里的语法是非常简洁的。

[InfoWorld上还有:调整React UI性能的10个技巧] 。

Svelte中的事件处理

添加像onClick 这样的处理程序也同样简单。你可以在列表项中添加一个,如清单4所示。

清单4.添加一个onClick处理程序

<script>
...
function click(){           alert("ok"); }
...
</script>
<main>
...
<li on:click="{click}">{i} - {quote}</li>           
...
</main>

事件处理的语法是不言自明的。你也可以通过包装处理程序函数来向处理程序传递参数,像这样。

<li on:click="{() => click(author)}">{i} - {quote}</li>

这可以被处理程序函数使用。

function click(author){ alert("hello from " + author); }

Svelte组件和输入

现在来感受一下组件系统,以及输入元素的双向绑定。你正在添加一个新的组件,该组件将创建报价,添加到列表中。首先,创建一个名为/src/AddQuote.svelte的新文件并粘贴清单5的内容。

清单5.AddQuote组件(事件调度和输入绑定)

<script>
  import { createEventDispatcher } from 'svelte';
  const dispatch = createEventDispatcher(); // create dispatcher
  let author = "";
  let quote = "";
  function onAdd(author, quote){
    dispatch('quote', { // use dispatcher
                                    author: author, quote: quote
                        });
  }
</script>

<main>
  <div class="add-quote">
    <h2>New Quote</h2>
    <div>Author: <input bind:value={author} placeholder="Author"></div>
    <div>Quote: <input bind:value={quote} placeholder="Quote"></div>
    <button on:click={()=>{onAdd(author, quote)}}>Add It!</button>
  </div>
</main>

组件事件

这里引入了几个新的概念。首先是组件事件。这些是组件可以引发的事件,就像DOM事件一样被其他组件处理。基本的过程是从Svelte中导入createEventDispatcher ,然后用它来创建一个调度器函数。这个调度器函数被调用并传递给事件的名称('quote' )和事件的内容(在这个例子中,是新的报价信息)。

然后这个事件由我们的App 组件处理,我们一会儿就会看到。

输入绑定

绑定HTML输入,又称双向绑定,也很简单。你可以在清单5的main 元素中看到这一点。注意输入元素上的bind:value 属性。这些属性引用了输入将被绑定的变量--本例中是作者和报价变量。

然后,你使用一个带有onClick 处理程序的按钮元素来引发onAdd 函数中的调度事件。

捕捉Svelte中的自定义事件

回到App.svelte文件中,你可以使用清单6中的AddQuote 组件。

清单6.使用AddQuote组件

<script>
...
            function onAddQuote(event){
                        quotes = [...quotes, {author:event.detail.author, quote:event.detail.quote}];
            }
</script>
...
<main>
...
<AddQuote on:quote={onAddQuote}></AddQuote>
...
</main>

清单6显示了在标记中,你如何使用on:quote 来监听自定义报价事件,并将其发送到处理函数onAddQuote ,该函数定义在脚本部分。这个函数被交给事件,其中包含我们在AddQuote 中发送的事件对象,在event.detail 成员中。

从这里开始,更新quotes 数组中的数据以反映新的项目就是一个简单的问题。但是请注意,你必须用赋值来更新数组,否则Svelte不会注意到这个变化。换句话说,仅仅使用Array.push 是不会触发更新的。(这与其他反应式框架类似)。

在Svelte中获取API

作为一个快速的额外奖励,让我们看看我们如何快速地为这个应用程序添加一个远程API获取。清单7显示了如何在App.svelte中添加一个API获取。

清单7.使用REST API (App.svelte)

<script>
...
            async function addRandom(){
                        const res = await fetch("https://api.quotable.io/random");
                        const json = await res.json();
                        quotes = [...quotes, {author:json.author, quote:json.content}];
            }
</script>
...
<main>
...
<button on:click={addRandom}>Add Random Quote</button>
...
</main>

清单7添加了一个调用asyncaddRandom 函数的按钮。这个函数简单地调用远程报价API,然后用新的报价更新报价数组。很简单!

以上是对Svelte的一些关键功能的旋风式参观。该框架还有很多功能,它现在已经可以胜任构建企业界面的任务。

Svelte在市场上也取得了快速发展。它的使用率在三巨头(React、Angular和Vue)之后排名第四,但在开发者满意度方面排名第一,兴趣方面排名第一