范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

使用WebAssembly和Go编写前端Web框架

  JavaScript 前端框架无疑有助于突破以前在浏览器上下文中可能实现的界限。越来越复杂的应用程序已经出现在 React、Angular 和 VueJS 之类的基础之上,仅举几例,而且有一个众所周知的笑话是关于新的前端框架似乎每天都会出现。
  然而,这种发展速度对于世界各地的开发者来说是一个非常好的消息。对于每一个新框架,我们都发现了更好的处理状态的方法,或者使用影子 DOM 之类的东西有效地渲染。
  然而,最新的趋势似乎是朝着用户户 JavaScript 用另外的语言编写这些框架并将它们编译到 WebAssembly 中。多亏了Lin Clark 之类的人 ,我们开始看到 JavaScript 和 WebAssembly 通信方式的重大改进,而且随着 WebAssembly 开始在我们的生活中变得更加突出,我们无疑会看到更多重大的改进。介绍
  因此,在本教程中,我认为构建一个非常简单的前端框架的基础是一个好主意,该框架用 Go 编写,可编译成 WebAssembly。至少,这将包括以下功能:功能注册组件超级简单的路由
  我现在警告你,尽管这些将非常简单,而且离生产准备还差得很远。如果这篇文章有点受欢迎,我希望能继续推进它,并尝试构建一些满足半体面前端框架要求的东西。
  Github:这个项目的完整源代码可以在这里找到: elliotforbes/go-webassembly-framework。如果您愿意为该项目做出贡献,请随意,我很乐意收到任何拉取请求!初始点
  好吧,让我们深入了解我们选择的编辑器并开始编码!我们要做的第一件事是创建一个非常简单的index.html作为前端框架的入口点:               Go wasm                            

Oak WebAssembly Framework

  你会注意到它们js在顶部导入了2 各种文件,这些文件允许我们执行我们完成的 WebAssembly 二进制文件。其中第一行大约 414 行,为了保持本教程的可读性,我建议您从这里下载:https : //github.com/elliotforbes/go-webassembly-framework/blob/master/examples/博客/静态/wasm_exec.js   第二个是我们的entrypoint.js文件。这将获取并运行lib.wasm 我们将很快构建的。// static/entrypoint.js const go = new Go(); WebAssembly.instantiateStreaming(fetch("lib.wasm"), go.importObject).then( result => { go.run(result.instance); } );   最后,既然我们已经解决了这个问题,我们就可以开始研究一些 Go 代码了!创建一个名为的新文件main.go,该文件将包含我们 Oak Web 框架的入口点!// main.go package main func main() { println("Oak Framework Initialized") }   这很简单。我们创建了一个非常简单的 Go 程序,Oak Framework Initialized当我们打开我们的 web 应用程序时应该会打印出来。为了验证一切正常,我们需要使用以下命令编译它:$ GOOS=js GOARCH=wasm go build -o lib.wasm main.go   我们应该构建我们的 Go 代码并输出我们在lib.wasm文件中引用的entrypoint.js文件。   太棒了,如果一切正常,那么我们就可以在浏览器中试用了!我们可以像这样使用一个非常简单的文件服务器:// server.go package main import ( "flag" "log" "net/http" ) var ( listen = flag.String("listen", ":8080", "listen address") dir = flag.String("dir", ".", "directory to serve") ) func main() { flag.Parse() log.Printf("listening on %q...", *listen) log.Fatal(http.ListenAndServe(*listen, http.FileServer(http.Dir(*dir)))) }   然后,您可以通过键入来服务您的应用程序,go run server.go并且您应该能够从http://localhost:8080.功能注册   好的,所以我们已经有了一个相当基本的打印语句,但是从总体上看,我不认为它可以作为一个 Web 框架。   让我们看看如何在 Go 中构建函数并注册这些函数,以便我们可以在index.html. 我们将创建一个新的实用程序函数,它将接受string作为我们函数名称的 a 以及它将映射到的 Go 函数。   将以下内容添加到现有main.go文件中:// main.go import "syscall/js" // RegisterFunction func RegisterFunction(funcName string, myfunc func(i []js.Value)) { js.Global().Set(funcName, js.NewCallback(myfunc)) }   所以,这就是事情开始变得更有用的地方。我们的框架现在允许我们注册函数,以便框架的用户可以开始创建他们自己的功能。   使用我们框架的其他项目可以开始注册他们自己的函数,这些函数随后可以在他们自己的前端应用程序中使用。组件   所以,我想接下来我们需要考虑添加到我们的框架中的是组件的概念。基本上,我希望能够components/ 在使用它的项目中定义一个目录,并且在该目录中,我希望能够像一个home.go组件一样构建一个包含我主页所需的所有代码的组件。   那么,我们该怎么做呢?   好吧,React 倾向于提供具有功能的类,这些功能render()返回 HTML/JSX/您希望为所述组件呈现的任何代码。让我们窃取它并在我们自己的组件中使用它。   我本质上希望能够在使用这个框架的项目中做这样的事情:package components type HomeComponent struct{} var Home HomeComponent func (h HomeComponent) Render() string { return "

Home Component

" }   因此,在我的components包中,我定义了HomeComponent一个Render()返回 HTML的 方法。   为了将组件添加到我们的框架中,我们将保持简单,只需定义一个interface我们随后定义的任何组件都必须遵守的。components/comopnent.go在我们的 Oak 框架中创建一个名为的新文件:// components/component.go package component type Component interface { Render() string }   如果我们想为各种组件添加新功能会发生什么?好吧,这使我们能够做到这一点。我们可以oak.RegisterFunction在init组件的函数中使用调用来注册我们想要在组件中使用的任何函数!package components import ( "syscall/js" "github.com/elliotforbes/go-webassembly-framework" ) type AboutComponent struct{} var About AboutComponent func init() { oak.RegisterFunction("coolFunc", CoolFunc) } func CoolFunc(i []js.Value) { println("does stuff") } func (a AboutComponent) Render() string { return `

About Component Actually Works

` }   当我们将它与路由器结合使用时,我们应该能够看到我们HTML正在呈现到我们的页面,并且我们应该能够单击调用的那个按钮, coolFunc()它将does stuff在我们的浏览器控制台中打印出来!   太棒了,让我们看看我们现在如何构建一个简单的路由器。构建路由器   好的,所以我们已经了解了components在我们的 Web 框架内的概念。我们差不多完成了吧?   不完全是,接下来我们可能需要的是一种在不同组件之间导航的方法。大多数框架似乎都有一个特殊的属性 id,它们绑定到并在其中渲染所有组件,因此我们将在 Oak 中采取相同的策略。   让我们router/router.go在我们的橡木框架中创建一个文件,这样我们就可以开始破解了。   在此范围内,我们希望将string路径映射到组件,我们不会进行任何 URL 检查,我们现在将所有内容都保存在内存中以保持简单:// router/router.go package router import ( "syscall/js" "github.com/elliotforbes/go-webassembly-framework/component" ) type Router struct { Routes map[string]component.Component } var router Router func init() { router.Routes = make(map[string]component.Component) }   因此,在此范围内,我们创建了一个新Router结构,其中包含Routes 字符串到我们在上一节中定义的组件的映射。   在我们的框架中,路由不是一个强制性的概念,我们希望用户选择他们希望何时初始化一个新的路由器。因此,让我们创建一个新函数,该Link函数将注册一个函数并将我们地图中的第一个路由绑定到我们的html 标签:// router/router.go // ... func NewRouter() { js.Global().Set("Link", js.NewCallback(Link)) js.Global().Get("document").Call("getElementById", "view").Set("innerHTML", "") } func RegisterRoute(path string, component component.Component) { router.Routes[path] = component } func Link(i []js.Value) { println("Link Hit") comp := router.Routes[i[0].String()] html := comp.Render() js.Global().Get("document").Call("getElementById", "view").Set("innerHTML", html) }   您应该注意到,我们创建了一个RegisterRoute函数,允许我们将 a 注册path到给定的组件。   Link从某种意义上说,我们的函数也很酷,它允许我们在项目中的各种组件之间导航。我们可以指定非常简单的元素来允许我们导航到注册路径,如下所示:   太棒了,所以我们现在已经启动并运行了一个非常简单的路由器,如果我们想在一个简单的应用程序中使用它,我们可以这样做:// my-project/main.go package main import ( "github.com/elliotforbes/go-webassembly-framework" "github.com/elliotforbes/go-webassembly-framework/examples/blog/components" "github.com/elliotforbes/go-webassembly-framework/router" ) func main() { // Starts the Oak framework oak.Start() // Starts our Router router.NewRouter() router.RegisterRoute("home", components.Home) router.RegisterRoute("about", components.About) // keeps our app running done := make(chan struct{}, 0) <-done } 一个完整的例子   将所有这些放在一起,我们可以开始构建具有组件和路由功能的非常简单的 Web 应用程序。如果您想查看几个有关其工作原理的示例,请查看官方 repo 中的示例: elliotforbes/go-webassembly-framework/examples未来的挑战   这个框架中的代码绝不是生产就绪的,但我希望这篇文章能引发关于我们如何开始在 Go 中构建更多的生产就绪框架的良好讨论。   如果不出意外,它开始了确定仍然需要做些什么才能使其成为 React/Angular/VueJS 之类的可行替代方案的旅程,所有这些都是显着提高开发人员生产力的非凡框架。   我希望这篇文章能激励你们中的一些人开始研究如何在这个非常简单的起点上进行改进。结论   如果您喜欢本教程,请随时将其分享给您的朋友或任何您喜欢的地方,它真的对网站有帮助,并直接支持我写更多!

这4件家电没必要买太贵的,能满足基本功能,普通款就足够了家用电器已经成为每个家庭生活的必需品,大家在选购时更愿意相信产品是一分钱一分货,会盲目地认为贵有贵的道理,根本不考虑自己的实际需要,一味的去追求品牌的高端款。但其实家电行业也会存在热血传奇8L的传奇故事福星冰雪(苹果版)热血传奇开始至今为止已经有二十余载了,在这二十年期间热血传奇出现各种各样的改版,有好有坏,但是不管怎么改变也不影响老玩家对传奇的热爱之情。很多老玩家都知道,在当时酷睿i912900KROGZ690EXTREME首测重返战力之巅文章开头不妨先说结论1Corei912900K提升非常大,部分场景对比10900K提升能超过502Corei512600K性能已经与10900K持平,甚至略优3最高功耗是给时刻保持设计出色,运动上选飞利浦A6606骨传导耳机大家好,我是波导终结者。最近几年,随着科技的发展,耳机界也不断有新技术流行开。从真无线到降噪,但是最合我意的还是骨传导。骨传导的原理简单易懂,可真正有产品铺开也不是很久。这次跟大家彻底告别用电担忧,就选小鸟无线耳机随着现在高科技的发展,很多电子产品都加入了智能化功能,用起来就很方便。就连耳机也可以制作成无线的了,也让我们摆脱了电线的限制。无线耳机方便确实是方便,但就是存在一个问题,那就是电量JeetAir2上手体验匠心独具,可能是最小的蓝牙耳机关于Jeet,相信大家已经非常熟悉了!作为国内高性价比的品牌,一直深受广大消费者的喜欢。最近,Jeet推出了新款真无线蓝牙耳机JeetAir2,可能是目前市面上最小的真无线蓝牙耳机无拘无束放飞自我,小而美的南卡RunnerPro2骨传导蓝牙耳机蓝牙耳机消除了线缆的束缚,而南卡RunnerPro2骨传导耳机更进一步消除了手机的束缚,运动时,阅读时,都可以更加轻松自在,放飞自我。作为夜跑爱好者,我很享受晚上独自一人漫步街头,拜雅拜亚动力LAGOONANC乐谷主动降噪蓝牙无线头戴式耳机产品图集SOOMAL天气转凉,又到了可以戴着大耳机出门的季节,所以SOOMAL准备一个主动降噪大耳机测评季,首先登场的是拜雅拜亚动力LAGOONANC乐谷耳机。拜雅作为资深耳机品牌,这款产品将音质作为这才是我想要的运动耳机,飞利浦骨传导耳机A8606体验测评大家平时锻炼用什么耳机呢?AirPods还是其他真无线耳机?实际上我以前也是一直用一款真无线降噪耳机进行锻炼,但是在经历多种不方便的情况下,决心换一款更加专业的运动耳机进行锻炼。在听了这么多年的蓝牙耳机,我们发现自己被骗了1080P与4K视频,究竟哪一种看起来清晰度更高?面对这个问题,相信许多朋友毫不犹豫地就会选择4K。因为按照常识,4K分辨率一帧画面的像素数量是1080P分辨率的四倍,自然清晰度就威世顿音频ProX10耳机测评T2插针,Linum线材,小而美!音质靓谈及威世顿音频(WestoneAudio)品牌,想必大家一定不陌生,Westone改名了!美国WestoneAudio继承60多年来于专业耳机声学领域的研发及制造经验。凭借对音乐及
互联网打开就业新空间纵深国务院新闻办公室近日发布的新时代的中国青年白皮书提出,新时代中国青年在与互联网的相互塑造中成长,快速兴起的新产业新业态,催生了大量新职业,集聚了大量灵活就业青年,充分体现了时代一些常用的MySQL语句描述有一个会员表,有个birthday字段,值为YYYYMMDD格式,现在要查询一个时间段内过生日的会员,比如0603到0708这个时间段内所有过生日的会员。SQL语句Select前端的成神之路,你知道多少?前端基础css了解样式,BFC选择器盒子模型页面布局定位浮动sassless和stylus,都是在现在的vue和react项目中经常用到的,用法也很简单,只要学会一种,其他两种都很耐用性强颜值高,三星GalaxyZFlip35G会让你心动吗?当代年轻人经常会出席各式各样的场合,在这种时候我们都习惯于精心打扮自己,除了外在的穿搭之外,如果再有一款高端个性的智能手机会更加提升个人的魅力,就如三星推出的GalaxyZFlipWord表格如何双面打印?word进行双面打印是需要打印机支持的,首先看打印机有没有双面打印功能,如果有才可以双面打印,没有就去买一台。这里说如果有双面打印功能。我们将word文档编辑好了之后,点击开始选项500个视频20个200万像素摄像头出现部分延迟,什么原因?你好,我是弱电工程师很高兴回答你的问题。我个人简单的分析一下,希望能帮助你,摄像机出现延迟有几个原因,需要排查就知道了用手机客户端观看和电脑客户端观看,电脑客户端观看的时候不卡在手QPAD新品CDX45猫垫评测好鼠标还真得有个好鼠垫,用了就回不去很多年以前,买电脑都是送鼠标键盘外加个鼠标垫。或者是买个高档的鼠标键盘也可能送个鼠标垫。那些鼠标垫,尺寸小不说,还易脏,易坏,特别容易滋生细菌。尤其是换个新的,刚到手的时候一打开塑安防监控镜头基本实现国产化隐形冠军优势明显摄像机镜头是视频监视系统的关键设备,负责把外面的景象影射到cmos芯片上,再通过光电转换实现图像输出。视频监控系统摄像机镜头品种繁多,从焦距上可分为短焦镜头中焦镜头,长焦镜头从视场突发!曝京东方被苹果要求停止供货iPhone13(ChinaIT。com讯)5月5日消息,据外媒报道,消息人士指出,京东方因为擅自更改了苹果手机面板设计,被苹果公司要求停止供货iPhone13!据报道,当下应该是iPhone13aigo六位插座快充版评测,65WPD,笔电也能充作为一名电子工程师,保持桌面整洁似乎是一件很难的事,电脑数字电源风枪烙铁电子显微镜等设备占据了太多空间,而且随着手机等数码设备增多,大大小小的充电头让桌面又添了几分凌乱。整理工作先马斯克又筹70亿接管推特要当临时CEO,跟沙特王子灵魂交易,三年后再上市前几天我们报道了马斯克收购Twitter的行动,终于得到Twitter董事会投票通过。当时,他动用了高额的保证金贷款(MarginLoan),才凑足了430亿美元左右的购买费用。这