Svelte调试模式js级别差异和细化后的体积差异详解

目录
  • js级别的差异
  • ecma ast差异
  • 细化后的体积差异
  • 调试模式
  • on:事件名
  • svelte:options
  • setContext

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="external nofollow"  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>

以上就是Svelte调试模式js级别差异和细化后的体积差异详解的详细内容,更多关于Svelte调试模式js级别差异的资料请关注我们其它相关文章!

(0)

相关推荐

  • JS判断元素是否在可视区域技巧详解

    目录 前言 实现方式 offsetTop.scrollTop 注意 getBoundingClientRect 前言 在日常开发中,我们经常需要判断目标元素是否在视窗之内或者和视窗的距离小于一个值(例如 100 px),从而实现一些常用的功能,例如: 图片的懒加载 列表的无限滚动 计算广告元素的曝光情况 可点击链接的预加载 实现方式 判断一个元素是否在可视区域,我们常用的有offsetTop.scrollTop和getBoundingClientRect offsetTop.scrollTop

  • 一看就懂的JavaScript适配器模式图解及使用示例

    目录 引言 总结 引言 适配器模式是用来解决两个软件实体之间不兼容的问题的设计模式. 举个两实体不匹配例子: 假如这两块要契合在一起,怎么办? 对喽,咱们先给A实体造个适配器,如下: 再把A实体往右推一下: 通过适配器,咱们就把A实体和B实体结合到了一起了. 完美,再看适配器在代码中的例子. 场景为:有个实体A,需要将实体A传入实体B中,实体B返回其name对应的数据,包含名称.地址和年龄. // 实体A var instanceA = [{ name: '张三', address: '北京',

  • JavaScript基础之Array forEach使用示例

    目录 前言 尝试一下 forEach实现 对象模仿数组 forEach跳出循环体? 前言 forEach() 方法对数组的每个元素执行一次给定的函数. 回调函数中传递三个参数: 第一个参数,就是当前正在遍历的元素 第二个参数,就是当前正在遍历的元素的索引 第三个参数,就是正在遍历的数组 尝试一下 var list = ["云层上的光", "初心", "栾树"]; list.forEach(function(item, index, array){

  • JavaScript开发简单易懂的Svelte实现原理详解

    目录 Demo1 create_fragment SvelteComponent 可以改变状态的Demo Svelte问世很久了,一直想写一篇好懂的原理分析文章,拖了这么久终于写了. Demo1 首先来看编译时,考虑如下App组件代码: <h1>{count}</h1> <script> let count = 0; </script> 这段代码经由编译器编译后产生如下代码,包括三部分: create_fragment方法 count的声明语句 class

  • JavaScript面试数组index和对象key问题详解

    目录 面试题一: 1.数组赋值 2.数组取值 面试题二: 1.对象赋值 2.对象取值 总结 面试题一: var arr = [1, 2, 3, 4] 复制代码 问:arr[1] = ?; arr['1'] = ? 答:arr[1] = 2; arr['1'] = 2 这里可以再分为两个问题: 1.数组赋值 var arr = [1, 2, 3, 4] arr[1] = 10; // 数字场景 arr['10'] = 1; // 字符串场景 arr['a'] = 1; // 字符串场景 arr[t

  • 拆开JavaScript迭代器模式内部黑盒子

    目录 一.内部迭代器 二.外部迭代器 总结: 一.内部迭代器 迭代器模式,指的是提供一种方法顺序访问一个聚合对象或者数组中的各种元素,而又不暴露该对象的内部表示. 内部迭代器是自动的,将回调函数传入迭代器进行执行,访问到每一个元素都会执行传入迭代器中的回调函数. 模拟内部迭代器如下: // 定义数组原型上的mapFn内部迭代器 Array.prototype.mapFn = function (callback) { let arr = this; let newArr = [] for (le

  • Svelte调试模式js级别差异和细化后的体积差异详解

    目录 js级别的差异 ecma ast差异 细化后的体积差异 调试模式 on:事件名 svelte:options setContext js级别的差异 主要来自两个方面:hook系统(不考虑类)和ecma-ast差异hook系统. 钩子系统的api更多地用于纯函数组件注入状态和生命周期.在这两个方面,Svelte提供的解决方案是不同的. 由于预运行编译,Svelte编译器扫描所有与UI相关的状态并注入黑魔法,使得状态的使用与变量声明和赋值一样简单. 基本上,开发人员不需要太在意所谓的副作用:因

  • vue.js的状态管理vuex中store的使用详解

    一.状态管理(vuex)简介 vuex是专为vue.js应用程序开发的状态管理模式.它采用集中存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.vuex也集成刀vue的官方调试工具devtools extension,提供了诸如零配置的time-travel调试.状态快照导入导出等高级调试功能. 二.状态管理核心 状态管理有5个核心,分别是state.getter.mutation.action以及module.分别简单的介绍一下它们: 1.state state为

  • webpack将js打包后的map文件详解

    类似于这样的map文件 由webpack自动生成 参数: devtool: '#eval-source-map',//映射js到原文件 由于打包后的js调试不方面,所以应用此,自动映射报错到原文件 还是很有用的 同样的css设置如下 { test: /\.css$/, loader: 'style-loader!css-loader?sourceMap' } 以上这篇webpack将js打包后的map文件详解是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们. 您可能感兴

  • JS实现获取GIF总帧数的方法详解

    目录 前言 写在前面 思路分析 什么是Gif 组成结构 解析原理 数据块分析 Header Block Logical Screen Descriptor Global Color Table Graphics Control Extension Image Descriptor Image Data 实现代码 测试用例 插件地址 前言 有一个Gif图片,我们想要获取它的总帧数,超过一定帧数的图片告知用户不可上传,在服务端有很多现成的库可以使用,这种做法不是很友好,前端需要先将gif上传至服务端

  • vue+three.js实现炫酷的3D登陆页面示例详解

    目录 前言: Three.js的基础知识 关于场景 关于光源 关于相机(重要) 关于渲染器 完善效果 创建一个左上角的地球 使地球自转 创建星星 使星星运动 创建云以及运动轨迹 使云运动 完成three.js有关效果 结语 前言: 大家好,我是xx传媒严导(xx这两个字请自行脑补) . 该篇文章用到的主要技术:vue3.three.js 我们先看看成品效果: 高清大图预览(会有些慢): 座机小图预览: 废话不多说,直接进入正题 Three.js的基础知识 想象一下,在一个虚拟的3D世界中都需要什

  • JS前端中的设计模式和使用场景示例详解

    目录 引言 策略模式 1.绩效考核 2.表单验证 策略模式的优缺点: 代理模式 1.图片懒加载: 2.缓存代理 总结 引言 相信大家在日常学习和工作中都多多少少听说/了解/使用过 设计模式,我们都知道,使用恰当的设计模式可以优化我们的代码,那你是否知道对于前端开发哪些 设计模式 是日常工作经常用到或者必须掌握的呢?本文我将带大家一起学习下前端常见的设计模式以及它们的 使用场景!!! 本文主讲: 策略模式 代理模式 适合人群: 前端人员 设计模式小白/想知道如何在项目中使用设计模式 策略模式 策略

  • JS技巧多状态页面中的mock方案详解

    目录 引言 技术选型 业务逻辑改造 Eruda 插件 Mock 数据整理 引言 我们有时候会遇到一个业务页面存在很多个状态,甚至子状态,比如订单详情就是其中的典型,涉及从订单创建到订单结束,以及售后等流程.维护起来每个状态对应一份数据,虽然我们 QA 提供了数据构造平台,但构造一份对应状态的数据还是需要花费不少时间,而且串行流程一旦出错的话只能重新来一遍. 后期维护阶段也不容易构造对应状态的数据,导致排查页面问题比较耗时. 另外一个问题就是从头熟悉业务的话成本比较高,如果有一个直观的页面能够看到

  • JS处理数据四舍五入(tofixed与round的区别详解)

    1 .tofixed方法 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字.例如将数据Num保留2位小数,则表示为:toFixed(Num):但是其四舍五入的规则与数学中的规则不同,使用的是银行家舍入规则,银行家舍入:所谓银行家舍入法,其实质是一种四舍六入五取偶(又称四舍六入五留双)法.具体规则如下: 简单来说就是:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一. 显然这种规则不符合我们平常在数据中处理的方式.为了解决这样的问题,可以自定义

  • JS中的Replace()传入函数时的用法详解

    replace方法的语法是:stringObj.replace(rgExp, replaceText) 其中stringObj是字符串(string),reExp可以是正则表达式对象(RegExp)也可以是字符串(string),replaceText是替代查找到的字符串.. 废话不多说了,直接给大家贴代码了,具体代码如下所示: <script> var str = "a1ba2b"; var reg = /a.b/g; str = str.replace(reg,func

  • JS实现简单的选择题测评系统代码思路详解(demo)

    包含内容:JS封装表单,JS校验表单 说是测评系统,感觉只能算是一个小小的Demo,很水,,没有数据库库,,仅使用JS做简单的选择题测评系统 -------------------------------------------------------------------------------- 一.设计思路 表单封装: [1]由于采用JS封装提交所以,不需要form标签 [2]放置多个input标签,作为输入项 [3]编写JS获取输入项,并通过get方式提交到另一个页面 校验表单(显示结

随机推荐