v0.16 - Gleam编译到JavaScript

2021-06-17 22:29:54

Gleam是Erlang虚拟机的一种安全且可扩展的语言,DIDAS的v0.16.0 v0.16.0发布到JavaScript的释放闪光!

没有SomeCliché的例子,引入了写前端Web代码的新方法是什么?

这是一系列互动小部件,您可能已经看到了无数次数,以及他们的闪光源代码和它编译的JavaScript。

为了简洁的利益,我们在这些示例中跳过错误处理,并且userather yseraths的javascript函数的定义它们导入。在真实的闪光程序中,我们希望这些JavaScript绑定在内部的库中生活,但这些示例应该足够了给你一种味道,闪闪发光可以用javascript做。

pub fn main(){让输入= query_selector(" [data-hello-input]")vistray = query_selector(" [data-hello-display]")让sync = fn(){ver text = get(from:输入,属性:"值")集(" innertext" on:显示,to:text)}设置(&#34 ; OnInput",开关:输入,to:sync)}外部类型元素意外fn query_selector(String) - >元素="" " document.querySelector"外部fn get(from:元素,属性:字符串) - >字符串="" " reflect.get"外部fn set(上:元素,属性:字符串,to:nement) - > BOOL ="" " reflect.set和#34;

"使用严格" ;导出函数main(){让输入= query_selector(" [data-hello-inpect]");让display = query_selector(" [data-hello-display]");让Sync =()=> {让文本= get(输入,"值");返回集(显示," innertext",文本); };返回集(输入," OnInput",同步); }函数query_selector(arg0){return文档。 QuerySelector(arg0)}函数get(from,属性){return反映。获取(来自,属性)}函数集(开,属性,to){return反映。设置(on,property,to)}

pub fn main(){让increment = query_selector(" [data-counter-uplentment]")让递减= query_selector(" [数据 - 反递减]")显示= query_selector(" [数据计数器显示]")vet = fn(diff){set(" innertext" on:display,to:get_value(显示)+ diff )}设置(" onclick" on:inclentment,to:fn(){add(1)})集(" onclick" on:diglement,to:fn(){添加(-1)})} fn get_value(元素){元素|>得到(财产:" innertext")|> parse_int}外部类型元素ElementExternal FN Query_Selector(String) - >元素="" " document.querySelector"外部fn get(from:元素,属性:字符串) - >字符串="" " reflect.get"外部fn set(上:元素,属性:字符串,to:nement) - > BOOL ="" "反射.set"外部fn parse_int(string) - > int ="" " Parseint"

"使用严格" ;导出函数main(){让increment = query_selector(" [data-counter-utriment]");让递减= query_selector(" [数据计数器递减]");假设显示= query_selector(" [数据计数器显示]");让add =(diff)=> {返程集(显示," innertext",get_value(显示)+ diff); };设置(递增," onclick",()=> {return添加(1);});返回集(递减," onclick",()=> {return添加( - 1);}); }函数get_value(元素){return parse_int(get(元素," innertext")); }函数query_selector(arg0){return文档。 QuerySelector(arg0)}函数get(from,属性){return反映。获取(来自,属性)}函数集(开,属性,to){return反映。设置(on,property,to)}函数parse_int(arg0){return parseint(arg0)}

const url =" https://dog.ceo/api/breeds/image/random" pub fn main(){el按钮= query_selector(" [数据 - 狗 - 按钮]&#34 ;)让img = query_selector(" [data-dogs-img]")new_dog(img)集(开:按钮,属性:" onclick",to:fn(){ new_dog(img)})} fn new_dog(img){fetch(url)|>然后(get_json_body)|>然后(FN(JSON){SET(ON:IMG,属性:" SRC":GET(JSON,"消息"))解析_PROMISE(nil)})}外部类型元素意外键入responstexternal类型jsonexternal类型承诺(value)外部fn query_selector(String) - >元素="" " document.queryselector"外部fn get(from:json,property:string) - > json ="" " reflect.get"外部fn set(上:元素,属性:字符串,to:nement) - > BOOL ="" " reflect.set.set"外部fn fn fetch(string) - >承诺(响应)="" " fetch"外部fn get_json_body(响应) - >承诺(JSON)="" " response.prototype.json.call"外部fn那么(承诺(a),fn(a) - > promise(b)) - >承诺(b)="" " promise.prototype.then.call"外部fn解析_promise(值) - >承诺(价值)="" " promise.resolve"

"使用严格" ; const url =" https://dog.ceo/api/breeds/image/random" ;导出函数main(){el按钮= query_selector(" [data-dogs-button]");让img = query_selector(" [data-dogs-img]"); new_dog(img);返回集(按钮," onclick",()=> {return new_dog(img);}); }函数new_dog(img){return然后(然后(获取(url),get_json_body),(json)=> {set(img," src",get(json,"消息"));返回解析_promise(未定义);},); }函数query_selector(arg0){return文档。 QuerySelector(arg0)}函数get(from,属性){return反映。获取(来自,属性)}函数集(开,属性,to){return反映。设置(on,property,to)} function fetch(arg0){return globalthis。获取(arg0)}函数get_json_body(arg0){return响应。原型 。杰森。呼叫(arg0)}函数(arg0,arg1){return promise。原型 。然后 。呼叫(arg0,arg1)}函数解析_promise(arg0){return promise。解决(arg0)}

Erlang虚拟机是逃避服务器的长期运行服务,但在此空间之外,它可能并不总是成为作业的最佳工具。所有平台都不支持,以及编译量大,启动时间和安装方案等因素可能是一个问题。

JavaScript是世界上最广泛使用和广泛支持的语言之一。它可以用于网站前端,桌面应用程序,命令的Linopplications,Mobile Phones应用程序,在IOT设备上,在云无服务器平台上以及更多。

虽然JavaScript缺乏Erlang虚拟机的多核和分发计算能力,但它确实具有强大的并发功能AndRespected Single Threaded性能,因此感谢高度优化的运行仪器谷象的V8引擎,它在NodeJS和Chrome Web浏览器中使用。

通过编译到JavaScript以及Erlang闪光可用于最大限度的问题空间和域,并可以通过更广泛的人员访问。在GLEAM中编写后端Web API的团队现在可以选择WRitetheir网站前端以闪光,共享在平台之间的分享代码,并享受友好且基于生产类型的基于闪光的闪光应用程序堆栈。

就个人而言,我很高兴使用无服务器函数平台来运行Gliam代码,并在浏览器中创造有趣的小处理样式Skinnesthat。

与Erlang Compiler硬化一样,这款新的JavaScript后端输出人类和漂亮的印刷源代码。它现在包含在编译器中不需要安装任何额外的组件来使用它。

而不是尝试在针对JavaScript时复制Erlang演员模型Gleam Usesthe标准的并发模型的子集。虽然某些人可能会令人失望,但这意味着没有添加额外的runtimecode。这使捆绑尺寸小,使其在闪光扫描中编写的代码被称为正常的语言,例如JavaScript和CypeScript。

JavaScript后端支持几乎所有的闪光语言,但是仍有仍然实现的AFEW功能,最值得注意的是,剩余功能的位字符串语法将在以下版本中添加。

在编译到Erlang时,我们通常使用Erlang的rebar3构建工具或elixir'smix构建工具。使用JavaScript我们尚未构建工具集成,并且instead必须使用较低级别的闪光编译包--target = javascriptcommand行API。该API可以由NPM预处理脚本,Amakefile或更复杂的集成调用,与Parcel Orwebpack等工具。

目前正在进行一台GLEEM构建工具,其中一个将适合与Erlang和JavaScript留下,并处理来自十六进制包管理器的分辨率和编译。

在JavaScript代码中,必须使用promise.prototype.then或await关键字手动插入javascript代码点,或者使用Whea语言异议,并通过编译器自动处理。

普遍的承诺类型和javascript中同步和异步功能之间的分裂可能比慵懒和使用更难以学习和使用,作为Erlang,没有这样的区别。虽然目前没有Firmplans,但我想探索使用Gleam编译器的静态分析来自动将等待语句插入生成的javascript代码。

如果这证明是成功的,并且有用我们可以交换基于威胁的闪电代码:

PUB FN MAIN() - > promise(int){async_function()|> promise.then(fn(x){let y = sync_function()async_function()|> promise.then(fn(z){proside.resolve(x + y + z)})})})})

PUB FN MAIN() - > int {设定x = async_function()让y = sync_function()let z = async_function()x + y + z}

这也将解决JavaScript的承诺类型自动变形承诺(promise(value))中的问题(价值),这使得在不向Gleam的类型系统中添加特例而不添加特殊情况,这使得它可以不受欢迎。

有关如何安装最新版本的Gleam的说明,请访问本网站的入门页面。

安装后,此格式JavaScript模板可以在JavaScript上撰写并运行Gloweam代码。

闪闪发光的赞助是我的主要收入来源。 如果您想支持闪光,请考虑赞助GLEAM或要求您的计算机播放闪光。 每一个捐款都有所作为,无论如何,谢谢你的帮助。 Gleam编译器的JavaScript后端最初由Peter Saxton创建,非常感谢他。 Ialso想感谢Andy Thompson,她对javascript编译的其他功能语言的了解一直非常宝贵的手段。 通过赞助和为项目的所有人的支持来实现闪光。谢谢所有人!