- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- scratch3.0二次開(kāi)發(fā)之scratch-blocks免編譯修改問(wèn)題的
這篇文章主要介紹了scratch3.0二次開(kāi)發(fā)之scratch-blocks免編譯修改問(wèn)題的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著(zhù)大家一起了解一下。
scratch-blocks編譯的時(shí)候會(huì )出現的問(wèn)題:scratch-gui依賴(lài)的scratch-blocks模塊在安裝的時(shí)候編譯會(huì )報錯。
原因:scratch-blocks編譯時(shí)要調用的build.py文件運行時(shí)發(fā)生錯誤。windowst系統下,代碼壓縮的過(guò)程是build.py通過(guò)一個(gè)closure-library的插件處理后,發(fā)送到谷歌的進(jìn)行壓縮,返回的結果會(huì )生成blocks_compressed.js,blocks_compressed_horizontal.js,blocks_compressed_vertical.js這幾個(gè)文件。(linux系統下,有網(wǎng)友反映會(huì )編譯成功的。)build.py運行時(shí),因為window系統在574行處要處理大量的信息流,所以導致錯誤發(fā)生。但即便成功,因為之后要把代碼發(fā)送到國內經(jīng)常訪(fǎng)問(wèn)不到的谷歌服務(wù)器,所以也會(huì )經(jīng)常編譯失敗。這種方法每修改一次代碼就要編譯一次,效率比較低,比較耗時(shí)。
有沒(méi)有種方法不用編譯,就能修改scratch-blocks代碼,而且能即時(shí)生效呢?答案是,有的。
scratch4.0是怎么引進(jìn)scratch-blocks的呢?在scratch-gui的源文件src\containers\blocks.jsx中,引入了scratch-blocks,
import VMScratchBlocks from '../lib/blocks';
嗯…這是經(jīng)過(guò)修改后的blocks,我們再順著(zhù)調用的路徑,打開(kāi)文件src\lib\blocks.js,這文件的作用是修改對應的角色(target)塊的菜單項。
第一步,引入scratch-blocks,這是已經(jīng)編譯好的文件
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塊的菜單項這樣子的:
菜單項是原來(lái)在scratch-blocks里定義的,沒(méi)有變化。
修改后是這樣子的:
看到?jīng)]?菜單項的數據和vm聯(lián)系起來(lái)了。
再舉個(gè)例子吧,比如修改workspace界面在block上右鍵彈出菜單項,我要保留'添加注釋',然后把其他兩項去掉,修改前,右鍵彈出菜單是這樣子的:
在src\lib下創(chuàng )建scratch-blocks-modify文件夾,文件夾里創(chuàng )建了blocks_svg.js文件,從scratch-blocks的core文件夾中找到blocks_svg.js,把其中需要修改的函數代碼復制過(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; }; }
注意:現在可以使用es6來(lái)編寫(xiě)代碼了。
然后在src\lib\blocks.js文件引入 :
blockSvgModify是導入的函數變量。
最后刷新下界面,修改生效:
方法:知道要修改的scratch-blocks的代碼,然后把代碼復制到一個(gè)js文件中修改,作為一個(gè)函數導出來(lái),再把ScratchBlock作為參數傳進(jìn)去,函數返回的就是改過(guò)后的scratch-block文件了。
小結:我們可以通過(guò)引入scratch-block到一個(gè)文件中,在這個(gè)文件中修改我們想要修改的scratch-block函數、屬性和方法,再導出來(lái),實(shí)現我們想要的效果。而且這種方法是熱修改。和修改react一樣,每次修改會(huì )引起gui界面相應的變化,避免反復編譯源文件繁瑣的過(guò)程。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站