【Svelte】当Svelte在项目在调试模式下的中的使用在js级别的差异和细化后的体积差异

简介: 【Svelte】当Svelte在项目在调试模式下的中的使用在js级别的差异和细化后的体积差异

@[toc]

js级别的差异

主要来自两个方面:hook系统(不考虑类)和ecma-ast差异hook系统。
钩子系统的api更多地用于纯函数组件注入状态和生命周期。在这两个方面,Svelte提供的解决方案是不同的。
由于预运行编译,Svelte编译器扫描所有与UI相关的状态并注入黑魔法,使得状态的使用与变量声明和赋值一样简单。
基本上,开发人员不需要太在意所谓的副作用;因此,一些钩子接口在Svelte框架上是冗余的。然而,考虑到大量的钩子接口,我们选择了内置的svelte钩子来简化转换过程中的转换逻辑。SVelte钩子是一组基于SVelte的钩子接口,通过对react钩子进行基准测试来实现,这些钩子在使用中基本相同。

<script>
    import Nested from './Nested.svelte';
</script>

<style>
    p {
        color: purple;
        font-family: 'Comic Sans MS', cursive;
        font-size: 2em;
    }
</style>

<p>These styles...</p>
<Nested/>

ecma ast差异

ecma ast difference babel提供的解析是基于estree的,但同时一些类型也在此基础上进行了改进。有关具体差异,请参阅此处的babel解析器[1]。细化的数据类型有助于我们进行转换推断,因此我们没有使用babel来提供estree插件,并且在转换之后,ast再次被平滑。
CSS转换比上述两部分的转换简单得多。React样式是标准css,Svelte样式也是标准css。但是,它将增加一定的编译能力。可以理解,它是标准css的超集,可以直接使用。然而,为了平滑jsx和Svelte html在自定义组件的类选择器中的差异,我们仍然在编译阶段进行了一些转换,这里不再展开。

<script>
    let count = 0;

    function handleClick() {
        count += 1;
    }
</script>

<button on:click={handleClick}>
    Clicked {count} {count === 1 ? 'time' : 'times'}
</button>

细化后的体积差异

<script>
    import { quintOut } from 'svelte/easing';
    import { fade, draw, fly } from 'svelte/transition';
    import { expand } from './custom-transitions.js';
    import { inner, outer } from './shape.js';

    let visible = true;
</script>

<style>
    svg {
        width: 100%;
        height: 100%;
    }

    path {
        fill: white;
        opacity: 1;
    }

    label {
        position: absolute;
        top: 1em;
        left: 1em;
    }

    .centered {
        font-size: 20vw;
        position: absolute;
        left: 50%;
        top: 50%;
        transform: translate(-50%,-50%);
        font-family: 'Overpass';
        letter-spacing: 0.12em;
        color: #676778;
        font-weight: 400;
    }

    .centered span {
        will-change: filter;
    }
</style>

{#if visible}
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 103 124">
        <g out:fade="{{duration: 200}}" opacity=0.2>
            <path
                in:expand="{{duration: 400, delay: 1000, easing: quintOut}}"
                style="stroke: #ff3e00; fill: #ff3e00; stroke-width: 50;"
                d={outer}
            />
            <path
                in:draw="{{duration: 1000}}"
                style="stroke:#ff3e00; stroke-width: 1.5"
                d={inner}
            />
        </g>
    </svg>

    <div class="centered" out:fly="{{y: -20, duration: 800}}">
        {#each 'SVELTE' as char, i}
            <span
                in:fade="{{delay: 1000 + i * 150, duration: 800}}"
            >{char}</span>
        {/each}
    </div>
{/if}

<label>
    <input type="checkbox" bind:checked={visible}>
    toggle me
</label>

<link href="https://fonts.googleapis.com/css?family=Overpass:100,400" rel="stylesheet">

不可能100%准确地将运行时jsx编译成静态html,弱类型语言的变量跟踪不可靠,非本地逻辑控制语法不能在编译器中逐一枚举;
目前,在转换工作中仍然存在许多与编译相关的问题,但这些问题可以通过一些插件来补充并逐步改进。大型项目包装量的现状不容乐观。
Svelte可以通过预运行编译按需打包整个框架来有效地减少包容量,但编译产品本身没有优势。页面的UI交互越复杂,编译产品就越大。
此外,对框架的依赖程度越高,整体包装量的优势就会消失;此外,我们的转换器为编译增加了一定的复杂性,以平滑差异,因此仍有很大的空间来优化编译产品的数量。没有性能,没有前端。我们仍然缺乏关于性能的数据,但我们也从一些第三方文章中了解到,Svelte的整体性能并不是瓶颈。
理论上,通过编译实现数据驱动的DOM是简单而有效的。理论上,脱离虚拟DOM也会提高内存性能;但是,我们将单独查看性能。预运行编译的思想不仅适用于框架,也适用于组件,这也会带来很多好处。

调试模式

它可以与{@debug…}一起使用以替换控制台。log(…)。每当指定变量的值发生变化时,它都会记录这些变量的值。如果打开devtools,代码执行将在{@debug…}语句的位置暂停。
它接受单个变量名:

<script>
    let user = {
        firstname: 'Ada',
        lastname: 'Lovelace'
    };
</script>

{@debug user}

<h1>Hello {user.firstname}!</h1>

on:事件名

可以使用的修改器有:
PreventDefault:调用事件。preventDefault()在程序运行之前
StopPropagation:调用事件StopProparation()以防止事件到达下一个标记
被动:提高了触摸/滚轮事件的滚动性能(Svelte将在适当的情况下自动添加)
capture:表示其程序是在捕获阶段触发的,而不是通过冒泡
一次:程序运行一次后删除自身
可以连接修饰符,例如:单击|once|capture={…}。
如果未为使用的on:命令事件指定特定值,则意味着组件将负责转发事件,这意味着组件的用户可以监听事件。

<form on:submit|preventDefault={handleSubmit}>
</form>

<svelte:options>

<svelte:options>标记为组件提供编译器选项。有关详细信息,请参阅。选项包括:
Immutable={true}-从不使用变量数据,因此编译器可以很容易地检查等式以确定值是否已更改。
不可变={false}-默认选项。Svelte在处理可变对象值更改时趋于保守。
Accessors={true}-向组件的属性添加getter和setter。
访问器={false}-默认值。
命名空间=“…”-让组件使用命名空间。最常见的是“svg”。
Tag=“…”-将此组件编译为自定义标记时使用的名称。

<svelte:options tag="my-custom-element"/>

此onMount函数用作回调,在组件安装到DOM后立即执行。它必须在组件初始化期间调用(但不一定在组件内部;可以从外部模块调用)。
OnMount不在内部运行。

<script>
    import { onMount } from 'svelte';

    onMount(() => {
        const interval = setInterval(() => {
            console.log('beep');
        }, 1000);

        return () => clearInterval(interval);
    });
</script>

setContext

使用指定的键将任何上下文对象与当前组件相关联。然后,通过getContext函数将上下文应用于组件的子级(包括带有槽的内容)。与生命周期函数一样,它必须在组件初始化期间调用。

<script>
    import { setContext } from 'svelte';

    setContext('answer', 42);
</script>
相关文章
|
18天前
|
存储 安全 JavaScript
云计算浪潮中的网络安全之舵探索Node.js中的异步编程模式
【8月更文挑战第27天】在数字化时代的风帆下,云计算如同一片广阔的海洋,承载着企业与个人的数据梦想。然而,这片海洋并非总是风平浪静。随着网络攻击的波涛汹涌,如何确保航行的安全成为了每一个船员必须面对的挑战。本文将探索云计算环境下的网络安全策略,从云服务的本质出发,深入信息安全的核心,揭示如何在云海中找到安全的灯塔。
|
17天前
|
JSON 前端开发 JavaScript
|
2天前
|
JavaScript 前端开发 UED
让 HTML 向 Vue.js 华丽转身:如何把 `wangEditor` 仿腾讯文档项目整合进 Vue.js
让 HTML 向 Vue.js 华丽转身:如何把 `wangEditor` 仿腾讯文档项目整合进 Vue.js
|
21天前
|
JavaScript
Vue项目打包后都产生了哪些JS请求?
【8月更文挑战第19天】Vue项目打包后都产生了哪些JS请求?
56 0
Vue项目打包后都产生了哪些JS请求?
|
22天前
|
存储 前端开发 JavaScript
Web前端的奇幻之旅:探索JS数据类型的奥秘与差异
【8月更文挑战第23天】JavaScript是一种动态类型语言,提供多种内置数据类型支持信息的存储与操作。这些类型对Web前端开发者至关重要,直接影响代码性能与可读性。JavaScript数据类型主要分为两大类:原始数据类型(如Undefined、Null、Boolean等)与引用数据类型(如Object、Array等)。原始类型直接存储值,而引用类型存储指向数据的引用。原始类型不可变且存储在栈中,访问更快;引用类型则存储在堆中,可通过其引用进行修改。理解这些差异有助于编写高效、可维护的代码。
28 0
|
23天前
|
设计模式 JavaScript 前端开发
Vue.js 组件设计模式:在前端热潮中找到归属感,打造可复用组件库,开启高效开发之旅!
【8月更文挑战第22天】Vue.js 以其高效构建单页应用著称,更可通过精良的组件设计打造可复用组件库。组件应职责单一、边界清晰,如一个显示文本并触发事件的按钮组件,通过 props 传递标签文本,利用插槽增强灵活性,允许父组件注入动态内容。结合 CSS 预处理器管理和封装独立模块,配以详尽文档,有效提升开发效率及代码可维护性。合理设计模式下,组件库既灵活又强大,持续实践可优化项目工作流。
35 1
|
14天前
|
JavaScript 前端开发 Oracle
|
15天前
|
JavaScript 前端开发 API
解锁前端开发新境界:Vue.js携手Webpack,打造高效构建流程,你的项目值得拥有!
【8月更文挑战第30天】随着前端技术的发展,模块化与组件化趋势愈发显著。Vue.js 以其简洁的 API 和灵活的组件系统,深受开发者喜爱;Webpack 则凭借强大的模块打包能力成为前端工程化的基石。两者结合,不仅简化了组件编写与引用,还通过模块热替换、代码分割等功能大幅提升开发效率。本文将通过具体示例,展示如何利用 Vue.js 和 Webpack 构建高效、有序的前端开发环境。从安装配置到实际应用,逐步解析这一组合的优势所在。
34 0
|
20天前
|
JavaScript Windows
【Azure 应用服务】用App Service部署运行 Vue.js 编写的项目,应该怎么部署运行呢?
【Azure 应用服务】用App Service部署运行 Vue.js 编写的项目,应该怎么部署运行呢?
|
23天前
|
JavaScript 前端开发 安全
TypeScript:解锁JavaScript的超级英雄模式!类型系统如何化身守护神,拯救你的代码免于崩溃与混乱,戏剧性变革开发体验!
【8月更文挑战第22天】TypeScript作为JavaScript的超集,引入了强大的类型系统,提升了编程的安全性和效率。本文通过案例展示TypeScript如何增强JavaScript:1) 显式类型声明确保函数参数与返回值的准确性;2) 接口和类加强类型检查,保证对象结构符合预期;3) 泛型编程提高代码复用性和灵活性。这些特性共同推动了前端开发的标准化和规模化。
44 0