Blockly["JavaScript"].workspaceToCode(workspace);
在这个函数内,通过var blocks = workspace.getTopBlocks(true);
获取各个分离的block,再使用var line = this.blockToCode(block);
将每个block转为脚本

blockToCode内,通过block的类型,获取对应的转换函数,在转换为脚本。这个函数通过遍历各个condition和branch(ifelse、do)组装成一个完整的代码
Blockly.JavaScript['controls_if'] = function(block) {
var n = 0;
var code = '', branchCode, conditionCode;
if (Blockly.JavaScript.STATEMENT_PREFIX) {
code += Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_PREFIX,
block);
do {
conditionCode = Blockly.JavaScript.valueToCode(block, 'IF' + n,
Blockly.JavaScript.ORDER_NONE) || 'false';
branchCode = Blockly.JavaScript.statementToCode(block, 'DO' + n);
if (Blockly.JavaScript.STATEMENT_SUFFIX) {
branchCode = Blockly.JavaScript.prefixLines(
Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_SUFFIX,
block), Blockly.JavaScript.INDENT) + branchCode;
code += (n > 0 ? ' else ' : '') +
'if (' + conditionCode + ') {\n' + branchCode + '}';
++n;
} while (block.getInput('IF' + n));
if (block.getInput('ELSE') || Blockly.JavaScript.STATEMENT_SUFFIX) {
branchCode = Blockly.JavaScript.statementToCode(block, 'ELSE');
if (Blockly.JavaScript.STATEMENT_SUFFIX) {
branchCode = Blockly.JavaScript.prefixLines(
Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_SUFFIX,
block), Blockly.JavaScript.INDENT) + branchCode;
code += ' else {\n' + branchCode + '}';
return code + '\n';
在生成代码之后,再用scrub_函数加入注释。

这是一个重载函数,下面是这个函数在Generator和JavaScript内的定义:
Blockly.Generator.prototype.scrub_ = function(_block, code, _opt_thisOnly) {
return code;
Blockly.JavaScript.scrub_ = function(block, code, opt_thisOnly) {
var commentCode = '';
if (!block.outputConnection || !block.outputConnection.targetConnection) {
var comment = block.getCommentText();
if (comment) {
comment = Blockly.utils.string.wrap(comment, this.COMMENT_WRAP - 3);
commentCode += this.prefixLines(comment + '\n', '// ');
for (var i = 0; i < block.inputList.length; i++) {
if (block.inputList[i].type == Blockly.inputTypes.VALUE) {
var childBlock = block.inputList[i].connection.targetBlock();
if (childBlock) {
comment = this.allNestedComments(childBlock);
if (comment) {
commentCode += this.prefixLines(comment, '// ');
var nextBlock = block.nextConnection && block.nextConnection.targetBlock();
var nextCode = opt_thisOnly ? '' : this.blockToCode(nextBlock);
return commentCode + code + nextCode;
神奇的js,这里貌似把JavaScript看成Generator的子类,我们再看下声明部分
Blockly.JavaScript = new Blockly.Generator('JavaScript');
Blockly.Generator = function(name) {
this.name_ = name;
this.FUNCTION_NAME_PLACEHOLDER_REGEXP_ =
new RegExp(this.FUNCTION_NAME_PLACEHOLDER_, 'g');
Google的Blockly是基于网络的可视化程序编辑器。 用户可以将块拖在一起来构建程序。 所有代码都是免费和开源的。
该项目页面为
Blockly有一个活跃的。 请顺道打个招呼。 尽早向我们展示您的原型; 总的来说,我们有很多经验,可以提供一些提示,以节省您的时间。
通过告诉我们帮助我们集中精力进行开发。 该问卷仅需几分钟,将有助于我们更好地支持Blockly社区。
想要贡献吗? 伟大的! 首先,请阅读。
多年来,Blockly和Blockly Games团队学到了许多适用于那些开发基于Blockly的应用程序的课程。以下是我们所犯错误的集合,或者他人通常犯的错误。
这些是我们使用Blockly的视觉风格学到的一般教训,可能不适用于所有用例或设计。可能存在其他解决方案。这也不是用户可能遇到的问题和如何避免它们的问题的详尽列表。每一种情况都有点不同,可能有自己的权衡
介绍blockly是google发布的可视化编程工具,基于web技术构建。在功能/设计上和MIT的儿童编程语言Scratch类似使用blockly的时候,用户可以通过拖曳模块,来构建代码逻辑,过程很像搭积木在用户视角下,blockly是一个简单易用的可视化工具,用来生成代码。在开发者视角下,blockly是一个文本框,里边包含了用户输入好的代码。代码生成到文本框的过程,就是用户在blockly里拖...
整个过程只需要鼠标的拖曳,不需要键盘敲击。Blockly初始时,将分类XML转化为分类区和积木区,生成Workspace,运行时,将脚本区中的积木组,转成对应的代码段,然后转成可执行的高级编程语言,获得结果。Blockly语言2012年还处于技术探讨阶段,希望开发人员使用Blockly,给予反馈,想出新的能使用它的地方,所有的代码都是开源的。用于编写代码的区域,将积木区中的积木,拖动到脚本区,积木进行卡合形成积木组,积木组即可成为可执行的代码段,执行代码段获得运算结果;不需要任何的代码编写。
3.1 什么是Blockly语言
2012年6月,Google发布了完全可视化的编程语言Google Blockly,整个界面清晰明了, 你可以如同在玩拼图一样用一块块图形对象构建出应用程序。每个图形对象都是代码块,你可以将它们拼接起来,创造出简单功能,然后将一个个简单功能组合起来,构建出一个程序。这个程序与我们平时使用的编程语言最大的差别是无需自己编写代码,在我们所使用的代码块的背后就是已经...
Google Blockly 是一款基于Web的、开源的、可视化程序编辑器。你可以通过拖拽块的形式快速构建程序,而这些所拖拽的每个块就是组成程序的基本单元。可视化编程完成,Blockly 直接支持 JavaScript、Python、PHP、Lua、Dart 语言源码的导出。此外,还可以将 Blockly 编辑器快速集成到Web、Android或iOS环境中。因近期参与一个机器人项目,可视化编程是...
构建一个Blockly应用
从用户的角度来看,Blockly是一种直观,直观的代码构建方式。从开发人员的角度来看,Blockly是一种现成的UI,用于创建可视化语言,该可视...
本文基于Web Blockly,整理一下可视化编程工具-Blockly 的常用配置,包括:工作区配置、添加自定义块、配置工具箱、配置代码生成器等。固定尺寸工作区可调尺寸工作区添加自定义块(Block)工具箱(Toolbox)配置代码生成器网格(Grid)缩放(Zoom)事件云存储1. 固定尺寸工作区把 Blockly 放到网页上最简单的方法是将其注入到一个空div中。1.1 引入 Blockly ...
Blockly Developer Tools
Blockly Developer Tools是一个基于Web的开发人员工具,可自动执行Blockly配置过程的各个部分,包括创建自定义块,构建工具箱和配置Web Blockly工作区。
使用该工具的Blockly开发人员流程包括三个部分:
使用“Block Factory”和“Block Exporter”创建自定义块。
使用工作区工厂构...
2.Blockly能做什么?
官方解释是,Blockly是一个用于给web或者手机app添加可视化程序编辑器的框架。它采用图形化的咬合拼接的积木块表示变量、逻辑表达式、循环以及其他编程概念。它能让用户在不关心语法的情况下进行编程练习,同时摆脱那...