解析scratch3.0二次開(kāi)發(fā)之scratch-blocks免編譯修改問(wèn)題
scratch-blocks編譯的時(shí)候會(huì)出現(xiàn)的問(wè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)下,代碼壓縮的過(guò)程是build.py通過(guò)一個(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ā)送到國(guó)內(nèi)經(jīng)常訪問(wèn)不到的谷歌服務(wù)器,所以也會(huì)經(jīng)常編譯失敗。這種方法每修改一次代碼就要編譯一次,效率比較低,比較耗時(shí)。
有沒(méi)有種方法不用編譯,就能修改scratch-blocks代碼,而且能即時(shí)生效呢?答案是,有的。
scratch3.0是怎么引進(jìn)scratch-blocks的呢?在scratch-gui的源文件src\containers\blocks.jsx中,引入了scratch-blocks,
import VMScratchBlocks from '../lib/blocks';
嗯…這是經(jīng)過(guò)修改后的blocks,我們?cè)夙樦{(diào)用的路徑,打開(kāi)文件src\lib\blocks.js,這文件的作用是修改對(duì)應(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)是原來(lái)在scratch-blocks里定義的,沒(méi)有變化。
修改后是這樣子的:

看到?jīng)]?菜單項(xiàng)的數(shù)據(jù)和vm聯(lián)系起來(lái)了。
再舉個(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ù)制過(guò)來(lái)。
修改的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來(lái)編寫代碼了。
然后在src\lib\blocks.js文件引入 :

blockSvgModify是導(dǎo)入的函數(shù)變量。
最后刷新下界面,修改生效:

方法:知道要修改的scratch-blocks的代碼,然后把代碼復(fù)制到一個(gè)js文件中修改,作為一個(gè)函數(shù)導(dǎo)出來(lái),再把ScratchBlock作為參數(shù)傳進(jìn)去,函數(shù)返回的就是改過(guò)后的scratch-block文件了。
小結(jié):我們可以通過(guò)引入scratch-block到一個(gè)文件中,在這個(gè)文件中修改我們想要修改的scratch-block函數(shù)、屬性和方法,再導(dǎo)出來(lái),實(shí)現(xiàn)我們想要的效果。而且這種方法是熱修改。和修改react一樣,每次修改會(huì)引起gui界面相應(yīng)的變化,避免反復(fù)編譯源文件繁瑣的過(guò)程。
到此這篇關(guān)于scratch3.0二次開(kāi)發(fā)之scratch-blocks的免編譯修改方法的文章就介紹到這了,更多相關(guān)scratch blocks的免編譯內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
值得推薦的Idea十幾大優(yōu)秀插件(小結(jié))
這篇文章主要介紹了值得推薦的Idea十幾大優(yōu)秀插件,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
windows下Idea使用git clone failed. Could not read from remote r
這篇文章主要介紹了windows下Idea使用git clone failed. Could not read from remote repository.,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
從此不再懼怕URI編碼 JavaScript及C# URI編碼詳解
JavaScript中的還好,只提供了三個(gè),C#中主要用的就有這么多,還沒(méi)有列出其他編碼(HTML),一多就弄不明白,弄不明白就心生恐懼,心生恐懼就變得苦逼,本文就向大家詳細(xì)解釋在JavaScript及C#中如何對(duì)URI進(jìn)行編碼的方法(注:本文不涉及到其他編碼)。2012-03-03
nacos?2.1.0集群多節(jié)點(diǎn)部署最新詳細(xì)教程
這篇文章主要介紹了全網(wǎng)最新的nacos?2.1.0集群多節(jié)點(diǎn)部署教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
基于rsync寫腳本實(shí)現(xiàn)多節(jié)點(diǎn)多服務(wù)器文件一鍵同步的方法
這篇文章主要介紹了利用rsync寫腳本實(shí)現(xiàn)多節(jié)點(diǎn)多服務(wù)器文件一鍵同步,本文將介紹?scp?和?rsync?兩個(gè)命令及基本語(yǔ)法介紹,需要的朋友可以參考下2022-01-01
提高github下載速度的方法可達(dá)到2MB/s(100%有效)
這篇文章主要介紹了提高github下載速度的方法可達(dá)到2MB/s(100%有效),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

