带你走马观花,细看新版变化。

注意:原文发表于2018-04-18,随着框架不断演进,部分内容可能已不适用。

大约是一年之前,我们首次在 Svelte 的 issue 跟踪器上讨论过 v2 版本,现在是时候进行一些重大变更了。

我们的座右铭是“循序渐进,破旧立新”。

……好吧,我错了,看来我要改过自新了。

这篇博文阐述了新版本的变化,都变了哪些地方、为什么要变以及应对的策略。

长话短说,先看梗概

我们会不厌其详地描述每一个变更细项,如果你还是遇到了困难,请在我们气氛友好的 Discord 聊天室 中寻求帮助。

  • 从 npm 安装 Svelte v2

  • svelte-upgrade 升级你的模板

  • 删除对 component.observe 方法的调用,或者从 svelte-extras 中添加 observe 方法

  • 将对 component.get('foo') 的调用重写为 component.get().foo

  • 从你的自定义事件处理程序中返回 destroy,而不是 teardown

  • 确保没有将值是数字类型的字符串作为 props 传递给组件

最新的模板语法

最明显的变化是:我们对模板语法做了一些改进。

我们经常听到的反馈是,“哎呀,又是Mustache”或者“哎呀,这不Handlebars嘛”。

在 Web 开发的较早时期,许多开发者使用基于字符串的模板系统,但他们似乎对模板深痛恶绝。

由于 Svelte 也采用了这种 {{表达式}} 的语法,因此许多人以为我们也在某种程度上有那些相同的局限性,比如奇怪的作用域规则,或者无法随意使用 JavaScript 表达式。

提示:如果你需要显示一个 '{' 字符,那么它可以简单地用 '{' 来表示。

除此以外,JSX 证明了使用双大括号其实大可不必。

所以我们使得模板更加的 …… 怎么说呢,

Svelte 采用单个大括号括起表达式。

应该说结果似乎看起来更轻松了,打字时也更愉快了:

<h1>Hello {name}!</h1>

当然也还有一些其他的更新的。

好消息是你不需要手动去一个一个地改,只需要在代码库上运行 svelte-upgrade 就行:

npx svelte-upgrade v2 src

这假定 src 目录下的任何 .html 文件都是一个小组件。

源目录和目标目录均可以任君自由指定,例如,你可以使用 npx svelte-upgrade v2 routes 更新 Sapper 应用。

要查看完整的变更列表,请移尊步到 svelte-upgrade 的 README 文档

计算属性

人们经常对 Svelte 感到困惑的一件事情是计算属性的工作方式。

回顾一下,如果你有这么一个组件……

export  default  {
computed: {
d: (a, b, c) => a = b + c
}
};

……Svelte 首先检查函数的参数,以便计算出 d 所依赖的参数是什么,然后它会自动编写好代码,在这些值发生改变时,通过将新值注入到函数中,从而更新 d

很酷吧!

因为它允许你从组件的输入中获取复杂的值,而不必担心何时需要重新计算它们,但这用法也怪里怪气的。

JavaScript 语法不支持这么写。

在 v2,我们用解构来代替:

export  default  {
computed: {
d: ({ a, b, c }) => a = b + c
}
};

Svelte 编译器仍然可以知道 d 依赖哪个值,但不再注入值,而是将整个组件状态对象丢给每个计算的属性中。

友情提示:你同样不需要手动进行此更改,只需要对组件运行 svelte-upgrade,如上所示。

IE11,不好意思,好自为之

Svelte v1 生成的是 ES5 的代码,这样你就不会被迫使用转译器。

但现在都 2018 年了,几乎所有浏览器都支持现代 JavaScript。如果能抛弃 ES5 的束缚,我们就可以生成更精简的代码。

不过你如果还需要友好地支持 IE11,你还是可以用 Babel 或者 Bublé 之类的转译器的。

新的生命周期 Hook

除了 oncreateondestroy 外,Svelte v2 还添加了两个生命周期函数来响应状态更改:

export default {
onstate({ changed, current, previous }) {
// 在 oncreate 之前以及状态变更时触发
},
onupdate({ changed, current, previous }) {
// 在 oncreate 之后触发, 并且状态变更后更新了 DOM 时触发
}
};

你还可以通过编写代码的方式监听这些事件:

component.on('state',  ({ changed, current, previous })  => {
// ...
});

component.observe

使用新的生命周期函数,我们不再需要 component.observe(...) 方法:

// 之前
export default {
oncreate() {
this.observe('foo', foo => {
console.log(`foo is now ${foo}`);
});
}
}; // 之后
export default {
onstate({ changed, current }) {
if (changed.foo) {
console.log(`foo is now ${current.foo}`);
}
}
};

这可以减少 Svelte 生成的代码量,并为你提供了更大的灵活性。

例如,现在可以十分容易在几个属性中的任何一个发生变更时响应这些动作,比方说在不释放观察者的情况下进行重绘 canvas。

不过如果你实在喜欢使用 component.observe(...),你可以通过 svelte-extras 来支持这玩意。

import { observe } from 'svelte-extras';

export default {
methods: { observe }
};

component.get

这个方法不再接收可选的 key 参数 —— 相反,它总数返回整个 state 对象:

// 之前
const foo = this.get('foo');
const bar = this.get('bar'); // 之后
const { foo, bar } = this.get();

初时,这种改变可能看起来很烦人,但这是正确的方向:

除了其他特殊情况外,将来我们会更充分地探索这个方面,它可能会在类型系统中发挥更好的作用。

event_handler.destroy

如果你的应用程序具有自定义的事件处理器,那么它必须返回一个带有 destroy 方法,而不是 teardown 方法。这样事件处理器就和组件的 API 对齐了。

不再严格要求类型

以前,传递给组件的数字类型的值会被视为纯数字:

<Counter  start='1'  />

这可能会导致一些意外行为。现在已经被更改了。

如果你需要传递数字的字面量,可以直接用表达式:

<Counter  start={1}  />

编译器方面的变更

在大多数情况下,你是永远不需要直接和编译器打交道的,因此编译器方面你其实不需要什么对策的。

不管怎么说,值得注意的是:编译器的 API 也是有变更的。

现在编译器将返回 jscssaststats,而不是有一大堆属性的对象:

const { js, css, ast, stats }  = svelte.compile(source, options);

jscss 都是 {code, map} 对象,其中 code 是代码字符串,map 代表 sourcemap。

ast 是组件的抽象语法树,并且 stats 对象包含有关组件的元数据以及编译信息。

以前是有一个 svelte.validate 方法来检查你的组件是否有效的。

不过它已经被删掉了,如果你只需检查组件,而不实际对其进行编译的话,那么仅仅传递一个 generate: false 选项即可。

我的应用还有问题要寻求帮助

希望以上的内容已经覆盖了所有可能的问题,并且更新对你来说,应该比较轻松从容的。

如果你发现错误或者本文未尽事项,请进入 Discord 聊天室 里头转转看,或者在 issue 跟踪器 反馈给我们。

< The End >

Svelte v2 已经过时了!的更多相关文章

  1. 如何搭建自己的SPRING INITIALIZR server

    这两天在慕课学Spring boot ,用idea通过spring initializr新建项目 即使用代理连不上.无奈. 参考了 GitHub - spring-io/initializr: A w ...

  2. Apache Nutch v2.3 发布,Java实现的网络爬虫

    http://www.oschina.net/news/59287/apache-nutch-2-3 Apache Nutch v2.3已经发布了,建议所有使用2.X系列的用户和开发人员升级到这个版本 ...

  3. 知道创宇研发技能表v2.2

    知道创宇研发技能表v2.2 2014/3/9 发布 by @知道创宇(www.knownsec.com) @余弦 & 行之 知道创宇是国内Geek十足且普遍被认为特别有前途的互联网安全公司, ...

  4. 【转】知道创宇研发技能表v2.1

    转自:http://blog.knownsec.com/Knownsec_RD_Checklist/v2.1.html# 知道创宇研发技能表v2.1 创建时间:2012/12/1 2013/4/26 ...

  5. [wp8游戏] cocos2d-x v2.2 + VS2013 环境搭建

    [wp8游戏] cocos2d-x v2.2 + VS2013 环境搭建 by:唐小崇 http://www.cnblogs.com/tangchong 从cocos2d-x v2.1.4 以来,co ...

  6. java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error: check logs for details

    Caused by: java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Except ...

  7. Cloud Foundry v2 部署及入门运维

    之前写过一个Guide for Cloud Foundry New Teamer.不过似乎已经有些过时,那会实验室主要是针对的CF v1进行的研究,现在已经全面进入V2时代了.所以更新一下关于Clou ...

  8. Mono For Android中完美使用百度地图SDK(v2.1.2&v2.1.3)(转)

    在Xamarin Mono For Android的开发中,如果要使用第三方的jar,就必须进行绑定.通过创建Java Bindings Library项目来自动生成C#到java的代码映射代码,最终 ...

  9. normalize.css v2.1.2 翻译

    /*! normalize.css v2.1.2 | MIT License | git.io/normalize */ /* /*! 我就是自己看看,然后翻译下下,让大家看看 */ /* ===== ...

随机推荐

  1. yum.repos.d中的变量($releasever与$basearch)

    今天打算更新一下centos的repo源,把原先国外的repo地址换成国内的,速度快一些.主要替换的文件是/etc/yum.repos.d/Centos-Base.repo .替换的时候,不知道大家有 ...

  2. 这次一定要记住opencv和cv2是什么及其基础用法

    opencv是一个基于BSD许可发行(也就是俗称的开源)的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS上.由一系列 C 函数和少量 C++ 类构成的它轻量且高 ...

  3. Spring(IOC、AOP和事务)

    目录 Spring介绍 Spring IOC 传统代码对象管理的弊端 实现过程 bean标签属性介绍 对象创建方式 工厂bean bean的作用域 SpringBean的生命周期*** 依赖注入 注解 ...

  4. linux中在某个目录下多个文件中搜索关键字

    有四种方法: find 文件目录 -name '*.*' -exec grep 'xxx' {} + -n 或是 find 文件目录 -name '*.*' | xargs grep 'xxx' -n ...

  5. 【uva 10048】Audiophobia(图论--Floyd算法)

    题意:有一个N点M边的无向带权图,边权表示路径上的噪声值.有Q个询问,输出 x,y 两点间的最大噪声值最小的路径的该值.(N≤100,M≤1000,Q≤10000) 解法:N值小,且问多对点之间的路径 ...

  6. python+fiddler 抓取抖音数据包并下载抖音视频

    这个我们要下载视频,那么肯定首先去找抖音视频的url地址,那么这个地址肯定在json格式的数据包中,所以我们就去专门查看json格式数据包 这个怎么找我就不用了,直接看结果吧 你找json包,可以选大 ...

  7. 牛客小白月赛30 B.最好的宝石 (线段树)

    题意:RT. 题解:很明显的线段树维护区间最大值操作,但是我们同时还要维护最大值的个数,我们在build或者modify操作完子树然后push_up的时候,我们先从两个儿子取max更新父节点的最大值, ...

  8. C# 之 async / await

    直接看一个例子 private async void button1_Click(object sender, EventArgs e) { var t = Task.Run(() => { T ...

  9. 力扣992.K个不同整数的子数组-C语言实现

    题目 原题链接 给定一个正整数数组 A,如果 A 的某个子数组中不同整数的个数恰好为 K,则称 A 的这个连续.不一定独立的子数组为好子数组. (例如,[1,2,3,1,2] 中有 3 个不同的整数: ...

  10. 2.使用Helm构建ElasticSearch集群

    作者 微信:tangy8080 电子邮箱:914661180@qq.com 更新时间:2019-05-24 16:08:53 星期五 欢迎您订阅和分享我的订阅号,订阅号内会不定期分享一些我自己学习过程 ...