OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

将GO编绎成JavaScript,用GO语言来写前端代码


分享到


分类 JS开源   关键字 开源   发布 kris  1413424802902
注意 转载须保留原文链接,译文链接,作者译者等信息。  
GopherJS是一个将GO编绎成JavaScript的开源项目, 下面的描述来自开源项目主页,Github

GopherJS将GO代码编绎成纯的JavaScript代码。它的主要目的是让你有机会使用GO语言来写前端代码。你可以在线玩一玩。 

你可以使用GO优雅的类型系统和编绎时检查系统,因此你有机会发现大量的潜在BUG,并可以更好的进行重构。想像一下你之前要处理多少有关JavaScript遗留的参数问题,因为你不确定会不会还有人在用这些老API。GopherJS会豪无怨言地帮你解决这些问题。你可以放心,这种BUG将不会再出现。

Goroutines


注* Goroutines是Go语言中一种轻量级的并发实现机制;可以理解为轻量级的多线程机制,不同的是Goroutines运行时还可以访问当前上下文。

JavaScript没有并发的概念(除了web workers,但是与Goroutines不同,他们被隔离地太彻底了)。所以,JavaScript中的代码永远不会被阻塞。一个阻塞的调用将会让你的网页停止响应。所以我们使用了一个带参回调来代替。

GopherJS对于这种限制做了大量的工作: 当一个指令被阻塞(比如通信中的一个通道 channel没有好),整个栈就不会被执行(等待所有的函数都被调用过以后),其它goroutine会暂时休息。然后另外一个准备执行的goroutine会恢复运行(与本地变量一起恢复)。这种机制通过一个闭包来实现。


这种机制生成的代码性能非常好,但是还是没有非阻塞系统(基于原生JS回调)的好。这是GopherJS努力去克服的一面。

但是它也有一个优点,外部JavaScript从来不会被阻塞执行,但你可以使用go语法在JS中达到阻塞的效果。


这是一个Go编绎到JavaScript的示例,来自其Playgroud

GO的代码

package main
import (
"fmt"
"github.com/gopherjs/gopherjs/js"
)
func main() {
fmt.Println("Hello, playground")
js.Global.Call("alert", "Hello, JavaScript")
println("Hello, JS console")
}

JavaScript代码

$packages["main"] = (function() {
  var $pkg = {}, fmt = $packages["fmt"], js = $packages["github.com/gopherjs/gopherjs/js"], main;
  main = function() {
    fmt.Println(new ($sliceType($emptyInterface))([new $String("Hello, playground")]));
    $global.alert($externalize("Hello, JavaScript", $String));
    console.log("Hello, JS console");
  };
  $pkg.$run = function($b) {
    $packages["github.com/gopherjs/gopherjs/js"].$init();
    $packages["runtime"].$init();
    $packages["errors"].$init();
    $packages["sync/atomic"].$init();
    $packages["sync"].$init();
    $packages["io"].$init();
    $packages["math"].$init();
    $packages["unicode"].$init();
    $packages["unicode/utf8"].$init();
    $packages["bytes"].$init();
    $packages["syscall"].$init();
    $packages["strings"].$init();
    $packages["time"].$init();
    $packages["os"].$init();
    $packages["strconv"].$init();
    $packages["reflect"].$init();
    $packages["fmt"].$init();
    $pkg.$init();
    main();
  };
  $pkg.$init = function() {
  };
  return $pkg;
})();

引入了非常多的预定义packages和对象如($global, $String)等,个人认为这样的前端代码实用性并不强,冗余非常明显,降低了可维护。 

目前GO的编绎系统检查地非常严格,不允许一些未定义的外部全局变量的直接访问,如你得这样访问document:

JS代码: 

document.write("Hello world!");

GO代码:

js.Global.Get("document").Call("write", "Hello world!")


这种机制造成了与外部第三方插件(如jQuery)等配合起来非常不便。要写很多额外代码。 实用性比目前的CoffeeScript和TypeScript还要差很多。


 相关阅读

社区评论 ( Beta版 )
OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  1. 我们不需要JavaScript框架
  2. Bootstrap vs Foundation如何选择靠谱前端框架
  3. Docker究竟是什么,为什么这么流行,它的优点和缺陷有哪些?
  4. 5个经典的前端面试问题
  5. JavaScript有可能取代AppleScript成为OS X平台的默认编程脚本
  6. 针对特定浏览器起作用的CSS: IE Chrome Firefox CSS Hack
  7. 不需要密码的登录
  8. 15个最好的HTML5前端响应式框架(2014)
  9. 程序员取名:用大数据分析一下宝宝取名时最容易重复的名字
  10. 拿什么守护你的Node.JS进程: Node出错崩溃了怎么办?
  11. 用 OnceAir 搭建个人Git/Svn/照片备份服务器,每年电费7块钱

 相关阅读 - JS开源
  1. JuliusJS: 基于JavaScript的在线语音识别库
  2. PathFinding.js: 基于JavaScript的开源智能寻路算法库
  3. 了不起的Node.JS和前端资源:一些有用的资源列表
  4. 可访问的HTML5 Video视频播放器
  5. Animate.css让添加CSS动画像喝水一样容易
  6. LowDB - 基于Node的纯Json文件数据库
  7. JavaScript构建(编绎)系统大比拼:Grunt vs. Gulp vs. NPM
  8. Google官方支持的NodeJS访问API,提供后台登录授权
  9. 微软开源TypeScript编绎器
  10. 开源的多行字符串工具: 在JS中整段地写HTML

 关键字 - 开源
  1. 几款开源的图形化Redis客户端管理软件
  2. HTML5相关格式转换提供商对比—选择困难户的专属福利来啦!
  3. 使用NodeJS搭建邮件自动发送服务器
  4. Mongoose学习参考文档——基础篇
  5. NodeJS 文件(夹)压缩/解压方案(zip/unzip)-Linux上zip相关命令
  6. 今天的你吃鸡了吗
  7. HexGL用HTML5和WebGL实现的3D赛车游戏
  8. Docker究竟是什么,为什么这么流行,它的优点和缺陷有哪些?
  9. 15个最好用的Node.JS后端框架
  10. Node.JS与USB接口通信:检测U盘/移动硬盘插拔事件和发送接数据

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号