濮阳杆衣贸易有限公司

主頁 > 知識庫 > 解析scratch3.0二次開發(fā)之scratch-blocks免編譯修改問題

解析scratch3.0二次開發(fā)之scratch-blocks免編譯修改問題

熱門標(biāo)簽:400電話辦理費(fèi)用低 宿遷怎么辦理400電話 谷歌地圖標(biāo)注日期 400電話申請到底哪家好 鶴壁高頻外呼系統(tǒng)多少錢一個(gè)月 聯(lián)通外呼系統(tǒng)電腦app軟件 地圖標(biāo)注項(xiàng)目幾個(gè)月 外呼系統(tǒng)怎么群發(fā)短信 蘇州呼叫中心外呼系統(tǒng)哪家強(qiáng)

scratch-blocks編譯的時(shí)候會(huì)出現(xiàn)的問題:scratch-gui依賴的scratch-blocks模塊在安裝的時(shí)候編譯會(huì)報(bào)錯(cuò)。

原因:scratch-blocks編譯時(shí)要調(diào)用的build.py文件運(yùn)行時(shí)發(fā)生錯(cuò)誤。windowst系統(tǒng)下,代碼壓縮的過程是build.py通過一個(gè)closure-library的插件處理后,發(fā)送到谷歌的服務(wù)器進(jìn)行壓縮,返回的結(jié)果會(huì)生成blocks_compressed.js,blocks_compressed_horizontal.js,blocks_compressed_vertical.js這幾個(gè)文件。(linux系統(tǒng)下,有網(wǎng)友反映會(huì)編譯成功的。)build.py運(yùn)行時(shí),因?yàn)閣indow系統(tǒng)在574行處要處理大量的信息流,所以導(dǎo)致錯(cuò)誤發(fā)生。但即便成功,因?yàn)橹笠汛a發(fā)送到國內(nèi)經(jīng)常訪問不到的谷歌服務(wù)器,所以也會(huì)經(jīng)常編譯失敗。這種方法每修改一次代碼就要編譯一次,效率比較低,比較耗時(shí)。

有沒有種方法不用編譯,就能修改scratch-blocks代碼,而且能即時(shí)生效呢?答案是,有的。

scratch3.0是怎么引進(jìn)scratch-blocks的呢?在scratch-gui的源文件src\containers\blocks.jsx中,引入了scratch-blocks,

import VMScratchBlocks from '../lib/blocks';

嗯…這是經(jīng)過修改后的blocks,我們再順著調(diào)用的路徑,打開文件src\lib\blocks.js,這文件的作用是修改對應(yīng)的角色(target)塊的菜單項(xiàng)。

第一步,引入scratch-blocks,這是已經(jīng)編譯好的文件

import ScratchBlocks from 'scratch-blocks';

第二步,根據(jù)vm的數(shù)據(jù)修改blocks的菜單項(xiàng)。比如looks_costume塊的修改代碼如下:

 ScratchBlocks.Blocks.looks_costume.init = function () {
        const json = jsonForMenuBlock('COSTUME', costumesMenu, looksColors, []);
        this.jsonInit(json);
    };

在修改之前,looks_costume塊的菜單項(xiàng)這樣子的:

菜單項(xiàng)是原來在scratch-blocks里定義的,沒有變化。

修改后是這樣子的:

看到?jīng)]?菜單項(xiàng)的數(shù)據(jù)和vm聯(lián)系起來了。

再舉個(gè)例子吧,比如修改workspace界面在block上右鍵彈出菜單項(xiàng),我要保留'添加注釋',然后把其他兩項(xiàng)去掉,修改前,右鍵彈出菜單是這樣子的:

在src\lib下創(chuàng)建scratch-blocks-modify文件夾,文件夾里創(chuàng)建了blocks_svg.js文件,從scratch-blocks的core文件夾中找到blocks_svg.js,把其中需要修改的函數(shù)代碼復(fù)制過來。
修改的blocks_svg.js文件代碼如下 :

export default function(Blockly){
    Blockly.BlockSvg.prototype.showContextMenu_ = function(e) {
        if (this.workspace.options.readOnly || !this.contextMenu) {
            return;
        }
        // Save the current block in a variable for use in closures.
        var block = this;
        var menuOptions = [];
        if (this.isDeletable()  this.isMovable()  !block.isInFlyout) {
            //menuOptions.push(
             //   Blockly.ContextMenu.blockDuplicateOption(block, e)); 這是注釋掉的代碼
            if (this.isEditable()  this.workspace.options.comments) {
                menuOptions.push(Blockly.ContextMenu.blockCommentOption(block));
            }
            //menuOptions.push(Blockly.ContextMenu.blockDeleteOption(block));這是注釋掉的代碼
        } else if (this.parentBlock_  this.isShadow_) {
            this.parentBlock_.showContextMenu_(e);
            return;
        }

        // Allow the block to add or modify menuOptions.
        if (this.customContextMenu) {
            this.customContextMenu(menuOptions);
        }
        Blockly.ContextMenu.show(e, menuOptions, this.RTL);
        Blockly.ContextMenu.currentBlock = this;
    };
}

注意:現(xiàn)在可以使用es6來編寫代碼了。

然后在src\lib\blocks.js文件引入 :

blockSvgModify是導(dǎo)入的函數(shù)變量。

最后刷新下界面,修改生效:

方法:知道要修改的scratch-blocks的代碼,然后把代碼復(fù)制到一個(gè)js文件中修改,作為一個(gè)函數(shù)導(dǎo)出來,再把ScratchBlock作為參數(shù)傳進(jìn)去,函數(shù)返回的就是改過后的scratch-block文件了。

小結(jié):我們可以通過引入scratch-block到一個(gè)文件中,在這個(gè)文件中修改我們想要修改的scratch-block函數(shù)、屬性和方法,再導(dǎo)出來,實(shí)現(xiàn)我們想要的效果。而且這種方法是熱修改。和修改react一樣,每次修改會(huì)引起gui界面相應(yīng)的變化,避免反復(fù)編譯源文件繁瑣的過程。

到此這篇關(guān)于scratch3.0二次開發(fā)之scratch-blocks的免編譯修改方法的文章就介紹到這了,更多相關(guān)scratch blocks的免編譯內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 詳解scratch3.0二次開發(fā)之scratch-blocks中的blocks的類型、定義和使用方法
  • scratch3.0二次開發(fā)之用blocks生成python代碼
  • Scratch3.0二次開發(fā)之windows環(huán)境下打包成exe的流程
  • Scratch3.0 頁面初始化同時(shí)加載sb3文件的操作代碼

標(biāo)簽:遵義 莆田 錫林郭勒盟 雙鴨山 鄂爾多斯 丹東 哈爾濱 襄陽

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《解析scratch3.0二次開發(fā)之scratch-blocks免編譯修改問題》,本文關(guān)鍵詞  解析,scratch3.0,二次,開,發(fā)之,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《解析scratch3.0二次開發(fā)之scratch-blocks免編譯修改問題》相關(guān)的同類信息!
  • 本頁收集關(guān)于解析scratch3.0二次開發(fā)之scratch-blocks免編譯修改問題的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    比如县| 东安县| 烟台市| 伊吾县| 丰宁| 育儿| 延庆县| 厦门市| 亳州市| 盐山县| 定结县| 济源市| 南通市| 花莲县| 抚州市| 高州市| 逊克县| 龙里县| 济南市| 重庆市| 建平县| 全州县| 临桂县| 澄城县| 临汾市| 吉安市| 内江市| 邻水| 开封市| 阳谷县| 石门县| 沙湾县| 兴和县| 孟村| 曲麻莱县| 普兰店市| 浑源县| 南部县| 秦皇岛市| 兰考县| 姚安县|