亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

scratch3.0二次開發之scratch-blocks免編譯修改問題的示例分析

發布時間:2021-08-17 09:51:50 來源:億速云 閱讀:454 作者:小新 欄目:開發技術

這篇文章主要介紹了scratch3.0二次開發之scratch-blocks免編譯修改問題的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

scratch-blocks編譯的時候會出現的問題:scratch-gui依賴的scratch-blocks模塊在安裝的時候編譯會報錯。

scratch3.0二次開發之scratch-blocks免編譯修改問題的示例分析

原因:scratch-blocks編譯時要調用的build.py文件運行時發生錯誤。windowst系統下,代碼壓縮的過程是build.py通過一個closure-library的插件處理后,發送到谷歌的服務器進行壓縮,返回的結果會生成blocks_compressed.js,blocks_compressed_horizontal.js,blocks_compressed_vertical.js這幾個文件。(linux系統下,有網友反映會編譯成功的。)build.py運行時,因為window系統在574行處要處理大量的信息流,所以導致錯誤發生。但即便成功,因為之后要把代碼發送到國內經常訪問不到的谷歌服務器,所以也會經常編譯失敗。這種方法每修改一次代碼就要編譯一次,效率比較低,比較耗時。

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

scratch4.0是怎么引進scratch-blocks的呢?在scratch-gui的源文件src\containers\blocks.jsx中,引入了scratch-blocks,

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

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

第一步,引入scratch-blocks,這是已經編譯好的文件

import ScratchBlocks from 'scratch-blocks';

第二步,根據vm的數據修改blocks的菜單項。比如looks_costume塊的修改代碼如下:

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

在修改之前,looks_costume塊的菜單項這樣子的:

scratch3.0二次開發之scratch-blocks免編譯修改問題的示例分析

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

修改后是這樣子的:

scratch3.0二次開發之scratch-blocks免編譯修改問題的示例分析

看到沒?菜單項的數據和vm聯系起來了。

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

scratch3.0二次開發之scratch-blocks免編譯修改問題的示例分析

在src\lib下創建scratch-blocks-modify文件夾,文件夾里創建了blocks_svg.js文件,從scratch-blocks的core文件夾中找到blocks_svg.js,把其中需要修改的函數代碼復制過來。
修改的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;
    };
}

注意:現在可以使用es6來編寫代碼了。

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

scratch3.0二次開發之scratch-blocks免編譯修改問題的示例分析

blockSvgModify是導入的函數變量。

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

scratch3.0二次開發之scratch-blocks免編譯修改問題的示例分析

方法:知道要修改的scratch-blocks的代碼,然后把代碼復制到一個js文件中修改,作為一個函數導出來,再把ScratchBlock作為參數傳進去,函數返回的就是改過后的scratch-block文件了。

小結:我們可以通過引入scratch-block到一個文件中,在這個文件中修改我們想要修改的scratch-block函數、屬性和方法,再導出來,實現我們想要的效果。而且這種方法是熱修改。和修改react一樣,每次修改會引起gui界面相應的變化,避免反復編譯源文件繁瑣的過程。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“scratch3.0二次開發之scratch-blocks免編譯修改問題的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

寿阳县| 南汇区| 上思县| 循化| 明水县| 合水县| 曲麻莱县| 贵定县| 黄梅县| 奉化市| 舒兰市| 张掖市| 绥化市| 盐边县| 新民市| 江北区| 基隆市| 海盐县| 安陆市| 类乌齐县| 阜康市| 顺平县| 鄂托克旗| 丹阳市| 萍乡市| 启东市| 涡阳县| 绥芬河市| 普安县| 县级市| 吉木萨尔县| 莆田市| 罗源县| 神农架林区| 原阳县| 内丘县| 剑河县| 沁源县| 石阡县| 缙云县| 台东县|