Giter Site home page Giter Site logo

open-scratch / easy-scratch3 Goto Github PK

View Code? Open in Web Editor NEW
254.0 16.0 117.0 131.29 MB

Easy Scratch封装了如上传、加载、菜单配置、云变量接口、自定义素材库等常用的功能。只需简单js基础,即可轻松对接到平台上。You can easy embed scratch to your website with config and javascript

Home Page: http://teaching.vip

License: BSD 3-Clause "New" or "Revised" License

JavaScript 92.34% Shell 0.10% CSS 6.98% EJS 0.58%
scratch3

easy-scratch3's Introduction

English | 简体中文

项目介绍

使用本项目,不需要关注Scratch3.0功能的具体实现,只需要简单的js基础即可调用Scratch的相关功能,助力项目快速开发。

可以实现的功能

  • 加载项目
  • 上传项目
  • 修改外观
  • 移动端播放器
  • 修改积木大小
  • 显示隐藏积木
  • 自定义素材库
  • 对接背包API
  • And more……

使用案例

开源Teaching在线教学系统便是使用的本项目,可以参考具体示例

官网:http://teaching.vip

开源地址:http://github.com/open-scratch/teaching-open

二次开发

  • 安装依赖 npm install

  • 调试 npm start

  • 编译正式版 npm run build:prod

建议在Linux环境下编译开发,若windows下编译遇到问题可参见:

https://www.213.name/archives/1739

参与本项目

欢迎提交Issues和PR!

快速使用

直接使用本DEMO

编译后直接修改index.html和player.html中的配置即可使用

引入到自己的页面

不使用DEMO,引入到自己的页面

页面引入lib.min.jschunks/gui.js后,scratch将自动渲染至<div id="scratch"></div>内。

别忘了配置 window.scratchConfig

项目文档

初始化配置

初始化配置均通过window.scratchConfig对象完成

需要注意的是,需要在引入lib.min.js之前就加入该代码,即Scratch主程序加载前就需要定义该配置

以下是完整示例:

    window.scratchConfig = {
      session: {
        token: "", // 用户Token
        username: "Username" //用户名
      },
      backpack:{
        enable: true, // 是否启用背包
        api: "/api/teaching/scratch/backpack", //背包API接口
      },
      cloudData:{
        enable: true, //是否开启云变量功能
        id: "create", //默认云变量ID,可使用window.scratch.setCloudId更换ID
        api: "127.0.0.1:1234/api/websocket/scratch/cloudData" //云变量API地址
      },
      projectInfo: {//作品信息
        projectName: "",
        authorUsername: "admin",
        authorAvatar: './static/avatar.png',
      },
      logo: {
        show: true, //是否显示
        url: "./static/logo.png", //logo地址,支持base64图片
        handleClickLogo: () => { //处理LOGO点击事件
        }
      },
      menuBar: {
        //菜单栏样式
        style: {
          background: 'hsla(215, 100%, 65%, 1)',
        },
        //切换语言按钮
        languageButton:{
          show: true, //是否显示
          defaultLanguage: 'zh-cn' //默认语言 en zh-cn zh-tw
        },
        //新建按钮
        newButton:{
          show: true, //是否显示
          handleBefore(){
            //拦截点击事件,返回true继续执行
            return true
          }
        },
        //从计算机加载按钮
        loadFileButton:{
          show: true, //是否显示
          handleBefore(){
            //拦截点击事件,返回true继续执行
            return true
          }
        },
        //保存到计算机按钮
        saveFileButton:{
          show: true, //是否显示
          handleBefore(){
            //拦截点击事件,返回true继续执行
            return true
          }
        },
        //加速模式按钮
        turboModeButton:{
          show: true //是否显示
        },
        //教程按钮
        helpButton:{
          show: true, //是否显示
          handleBefore:()=>{
            //拦截点击事件,返回true继续执行
            return true
          }
        },
        //我的物品按钮
        myStuff:{
          show: true, //是否显示
          url: '/myProject' //跳转的连接
        },
        //用户头像按钮
        userAvatar:{
          show: true, //是否显示
          username: '未登录', //用户名
          avatar: './static/avatar.png', //用户头像
          handleClick(){
            //点击头像,可以弹出登录框等操作
          }
        },
        //自定义按钮
        customButtons: [
          {
            show: true, //是否显示
            buttonName: '分享', //按钮名
            style:{ //按钮样式
              color: 'white',
              background: 'hsla(30, 100%, 55%, 1)',
            },
            handleClick:()=>{ //按钮事件
              console.log("自定义按钮1");
              console.log('分享按钮')
              window.scratch.getProjectCover(cover => {
                //TODO 获取到作品截图
              })
              window.scratch.getProjectFile(file => {
                //TODO 获取到项目文件
              })
              // 获取到项目名
              var projectName = window.scratch.getProjectName()
              console.log(projectName);
            }
          },
          //可继续新增按钮
        ]
      }, 
      blocks:{
         // 积木缩放比例
        scale: 0.8,
        // 隐藏分类 费雷见README附录:
        // 如需动态隐藏显示分类或积木,修改此配置后需手动执行 window.vm.emitWorkspaceUpdate()
        hideCatagorys:[], 
        //隐藏积木 积木代码见README附录:
        hideBlocks:[],
      },
      stageArea:{ //舞台设置
        fullscreenButton:{ //全屏按钮
          show: true,
          handleBeforeSetStageUnFull(){ //拦截退出全屏,返回true继续执行
            return true
          },
          handleBeforeSetStageFull(){ //拦截全屏,返回true继续执行
            return true
          }
        },
        startButton:{ //开始按钮
          show: true,
          handleBeforeStart(){ //拦截开始按钮,返回true继续执行
            return true
          }
        },
        stopButton:{ // 停止按钮
          show: true,
          handleBeforeStop(){ //拦截停止按钮,,返回true继续执行
            return true
          }
        }
      },
      //scratch vm初始化完毕
      handleVmInitialized: (vm) => {
        window.vm = vm
      },
      //作品加载完毕
      handleProjectLoaded:() => {
      },
      //默认作品加载完毕
      handleDefaultProjectLoaded:() => {
      },
      //默认项目地址,不需要修请删除本配置项
      defaultProjectURL: "./static/project.sb3",
      //素材库配置
      assets:{
        //附:Scratch素材库采集和处理工具 https://github.com/open-scratch/scratch-asset-utils
        //素材库地址,默认为/static下的素材库
        assetHost: './static',
        //素材库索引地址
        defaultIndex:{
          sprites: "./static/json_index/sprites.json",
          costumes: "./static/json_index/costumes.json",
          backdrops: "./static/json_index/backdrops.json",
          sounds: "./static/json_index/sounds.json"
        },
        //拦截角色库打开
        handleBeforeSpriteLibraryOpen(){
          console.log("角色库打开")
          //追加素材库
          // window.scratch.pushSpriteLibrary(Arrays)
          return true;
        },
        //拦截造型库打开
        handleBeforeCostumesLibraryOpen(){
          return true;
        },
        //拦截背景库打开
        handleBeforeBackdropsLibraryOpen(){
          return true;
        },
        //拦截声音库打开
        handleBeforeSoundLibraryOpen(){
          return true;
        }
      },
    }

API

ScratchVm对象

scratch-vm实例化的对象,可以从外部直接操作部分scratch-vm虚拟机功能,

该对象常用API列表:

  • vm.saveProjectSb3() //获取SB3格式项目
  • vm.loadProject(file) //加载SB3项目
  • vm.greenFlag() //点击小绿旗
  • vm.stopAll() //停止运行项目
  • vm.emitWorkspaceUpdate() //刷新工作区
  • ……

Scratch-vm介绍

Scratch-vm官方文档

加载项目

window.scratch.loadProject(url, callback)

也可以使用vm对象的loadProject方法载入scratch项目

示例

window.scratch.loadProject(url, ()=>{
    //加载文件完成后的操作
})

获取项目文件

window.scratch.getProjectFile(callback)

也可以使用vm对象的saveProjectSb3方法

示例

window.scratch.getProjectFile((file)=>{
    console.log(file)
    //上传file文件
})

获取项目截图

window.scratch.getProjectCover(callback)

示例

window.scratch.getProjectCover((file)=>{
    console.log(file)
    //上传截图文件
})

获取项目名称

window.scratch.getProjectName()

设置项目名称

window.scratch.setProjectName(projectName)

设置为仅播放模式

示例

window.scratch.setPlayerOnly(true)

设置为全屏

示例

window.scratch.setFullScreen(true)

追加素材库

可以动态新增素材库索引,需要等待用户打开素材库后再调用本方法,否则无法追加成功。 增加索引后还需要assetHost中增加对应的素材文件。

参数为素材索引的数组,具体格式参见json_index下文件的内容。

追加角色库

window.scratch.pushSpritesLibrary(Arrays)

追加造型库

window.scratch.pushCostumesLibrary(Arrays)

追加背景库

window.scratch.pushBackdropsLibrary(Arrays)

追加声音库

window.scratch.pushSoundsLibrary(Arrays)

示例

window.scratch.pushSoundsLibrary(
  [{
        "name": "自定义声音",
        "tags": [
            "music",
        ],
        "assetId": "5cb46ddd903fc2c9976ff881df9273c9",
        "dataFormat": "",
        "md5ext": "5cb46ddd903fc2c9976ff881df9273c9.wav",
        "sampleCount": 11840,
        "rate": 44100
    }]
)

设置云变量ID

window.scratch.setCloudId(id)

附录

Scratch项目结构

各个模块

scratch-vm 虚拟机

解析加载序列化项目文件、扩展功能实现、根据相应事件渲染舞台

scratch-audio 声音引擎

解析、播放声音

scratch-blocks 代码积木块

创建积木操作块区域和每个积木对应的代码

scratch-l10n 国际化

多语言支持

scratch-paint 画图引擎

图片编辑器

scratch-render:

舞台渲染

scratch-storage 存储引擎

项目和对应素材的存储加载

scratch-svg-renderer

svg文件处理

项目结构

├── build                    # 编译后的文件夹
│   ├── static               # 静态资源
│   ├── chunks               # scratch核心加载器
│   ├── index.html           # scratch编辑器
│   ├── player.html          # scratch播放器
│   ├── lib.min.js           # scratch核心
├── src
│   ├── components           # UI组件
│   ├── containers           # 容器组件,承载容器组件业务逻辑
│   ├── css                  # 全局通用css
│   ├── examples             # 集成测试用例
│       ├── extensions       # 拓展案例
│   ├── lib                  # 插件及高阶组件
│       ├── audio            # 声音插件
│       ├── backpack         # 背包插件
│       ├── default-project  # 默认项目
│       ├── libraries        # 素材库相关
│       ├── video            # 视频模块
│   ├── playground           # 编译后页面的模版
│   ├── reducers             # 全局状态控制
├── test                     # 测试用例
├── translations             # 翻译库
├── README.md
├── README-RAW.md            #
└── package.json
└── webpack.config.js
└── webpack.prod.js

积木分类代码

motion looks sound events control sensing operators variables myBlocks

积木代码

运动分类

motion_movesteps motion_turnright motion_turnleft motion_goto motion_gotoxy motion_glideto motion_glidesecstoxy motion_pointindirection motion_pointtowards motion_changexby motion_setx motion_changeyby motion_sety motion_ifonedgebounce motion_setrotationstyle motion_xposition motion_yposition motion_direction

外观分类

looks_sayforsecs looks_say looks_thinkforsecs looks_think looks_switchbackdropto looks_switchbackdroptoandwait looks_nextbackdrop looks_switchcostumeto looks_nextcostume looks_switchbackdropto looks_nextbackdrop looks_changesizeby looks_setsizeto looks_changeeffectby looks_seteffectto looks_cleargraphiceffects looks_show looks_hide looks_gotofrontback looks_goforwardbackwardlayers looks_backdropnumbername looks_costumenumbername looks_backdropnumbername looks_size

声音分类

sound_playuntildone sound_play sound_stopallsounds sound_changeeffectby sound_seteffectto sound_cleareffects sound_changevolumeby sound_setvolumeto sound_volume

事件分类

event_whenflagclicked event_whenkeypressed event_whenstageclicked event_whenthisspriteclicked event_whenbackdropswitchesto event_whengreaterthan event_whenbroadcastreceived event_broadcast event_broadcastandwait

控制分类

control_wait control_repeat control_forever control_if control_if_else control_wait_until control_repeat_until control_stop control_create_clone_of control_start_as_clone control_create_clone_of control_delete_this_clone

侦测分类

sensing_touchingobject sensing_touchingcolor sensing_coloristouchingcolor sensing_distanceto sensing_askandwait sensing_answer sensing_keypressed sensing_mousedown sensing_mousex sensing_mousey sensing_setdragmode sensing_loudness sensing_timer sensing_resettimer sensing_of sensing_current sensing_dayssince2000 sensing_username

运算分类

operator_add operator_subtract operator_multiply operator_divide operator_random operator_gt operator_lt operator_equals operator_and operator_or operator_not operator_join operator_letter_of operator_length operator_contains operator_mod operator_round operator_mathop

手机端虚拟按键实现案例

绑定某个dom为移动端的虚拟键盘,需要先引入jQuery

function regKeyEvent(selector, key, keyCode) {
    console.log("注册按键事件:" + key)
    $(selector).on("touchstart", function(event) {
        vm.postIOData("keyboard", {
          keyCode: keyCode,
          key: key,
          isDown: true,
        });
        event.preventDefault();
      });
      $(selector).on("touchend", function() {
        vm.postIOData("keyboard", {
          keyCode: keyCode,
          key: key,
          isDown: false,
        });
        event.preventDefault();
      });
  }

  // 配置上下左右空格键
  regKeyEvent(".button_space", " ", 32)
  regKeyEvent(".button_down", "ArrowDown", 40)
  regKeyEvent(".button_up", "ArrowUp", 38)
  regKeyEvent(".button_left", "ArrowLeft", 37)
  regKeyEvent(".button_right", "ArrowRight", 39)

easy-scratch3's People

Contributors

chengyu2333 avatar shenqihui avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

easy-scratch3's Issues

saveProjectSb3方法生成文件保存到服务器后无法加载

请问 调用saveProjectSb3方法生成的blob文件 的type是 application/x.scratch.sb3 这个文件上传到服务器之后,从服务器获取回来加载不了,请问保存的时候前端需要做什么其他的操作吗? 我看到调用saveProjectSb3方法返回的type应该是zip类型啊

menuBar上的一些配置不生效

楼主,您好,遇到个问题请教一下~

window.scratchConfig对象下面的menuBar对象下面的这些配置项除了color之外的配置之后都不生效,我的需求是不想展示教程啊,保存文件啊这些。下面是我的配置,是哪里配的不对吗
menuBar: {
color: 'hsla(215, 100%, 65%, 1)',
newButton:{
show:false
},
loadFileButton:{
show:false
},
saveFileButton:{
show:false
},
turboModeButton:{
show: false
},
helpButton:{
show: false
}
}

舞台区域拖拽无拖拽过程的动画

在舞台区域拖拽素材时,没有任务跟随鼠标的拖拽动画,只有松掉鼠标以后素材才会更换位置。
控制台出现了this.renderer.extractDrawableScreenSpace的错误,
在控制台打印出来的renderer里面没有extractDrawableScreenSpace这个方法。
包括开源Teaching该网站里面也有一模一样的错误,
但是Teaching商业版是没有出现这个问题的

无法使用scratch-desktop打包

我使用最新的scratch-desktop进行electron打包,无法正常运行,请问你这个二次开发版如何正确打包为app,谢谢

支持调出任务描述的弹窗吗

您好,请问有API支持调出任务描述的弹窗吗,并且可以自定义任务描述的内容,描述内容可能包括音频文案图片等

添加角色失败

在npm start 后,页面可以正常访问,但是添加角色的时候,出现以下报错。应该如何处理?

DataCloneError: The object could not be cloned.

image

如何运行

你说,可以在index.html直接运行,但我没找着啊。

npm start失败

我在mac os catalina下npm start 失败,错误信息
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] start: webpack-dev-server
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
解决方法多都是 npm cache clean --force rm -rf node_modules rm package-lock.json 之后npm install 依然失败
麻烦问下,这个怎么解决呢?

加载一个静态sb3文件地址项目失败

不同的域名,已经可以fetch(mode='no-cors'),就是加载的时候异常,sb3资源文件下载下来手动导入可以加载

gui.jsx:154 Uncaught Error: Error in Scratch GUI [location=http://localhost:63342/scratch3-master/build/index.html?_ijt=nroh28kmkj1oo04hn3nn4bvpjp]: Error: Non-ascii character in FixedAsciiString
    at GUI.render (gui.jsx:154)
    at finishClassComponent (react-dom.development.js:7873)
    at updateClassComponent (react-dom.development.js:7850)
    at beginWork (react-dom.development.js:8225)
    at performUnitOfWork (react-dom.development.js:10224)
    at workLoop (react-dom.development.js:10288)
    at HTMLUnknownElement.callCallback (react-dom.development.js:542)
    at Object.invokeGuardedCallbackDev (react-dom.development.js:581)
    at invokeGuardedCallback (react-dom.development.js:438)
    at renderRoot (react-dom.development.js:10366)
render @ gui.jsx:154
finishClassComponent @ react-dom.development.js:7873
updateClassComponent @ react-dom.development.js:7850
beginWork @ react-dom.development.js:8225
performUnitOfWork @ react-dom.development.js:10224
workLoop @ react-dom.development.js:10288
callCallback @ react-dom.development.js:542
invokeGuardedCallbackDev @ react-dom.development.js:581
invokeGuardedCallback @ react-dom.development.js:438
renderRoot @ react-dom.development.js:10366
performWorkOnRoot @ react-dom.development.js:11014
performWork @ react-dom.development.js:10967
requestWork @ react-dom.development.js:10878
scheduleWorkImpl @ react-dom.development.js:10732
scheduleWork @ react-dom.development.js:10689
enqueueSetState @ react-dom.development.js:6212
./node_modules/react/cjs/react.development.js.Component.setState @ react.development.js:237
onStateChange @ connectAdvanced.js:205
notify @ Subscription.js:26
notifyNestedSubs @ Subscription.js:65
onStateChange @ connectAdvanced.js:202
notify @ Subscription.js:26
notifyNestedSubs @ Subscription.js:65
onStateChange @ connectAdvanced.js:202
notify @ Subscription.js:26
notifyNestedSubs @ Subscription.js:65
onStateChange @ connectAdvanced.js:202
notify @ Subscription.js:26
notifyNestedSubs @ Subscription.js:65
onStateChange @ connectAdvanced.js:202
notify @ Subscription.js:26
notifyNestedSubs @ Subscription.js:65
onStateChange @ connectAdvanced.js:202
notify @ Subscription.js:26
notifyNestedSubs @ Subscription.js:65
onStateChange @ connectAdvanced.js:202
dispatch @ createStore.js:173
e @ VM178:1
(anonymous) @ index.js:70
dispatch @ VM178:1
onError @ vm-manager-hoc.jsx:139
(anonymous) @ vm-manager-hoc.jsx:74
Promise.catch (async)
loadProject @ vm-manager-hoc.jsx:72
wrapper @ index.js:550
componentDidUpdate @ vm-manager-hoc.jsx:47
commitLifeCycles @ react-dom.development.js:8778
commitAllLifeCycles @ react-dom.development.js:9946
callCallback @ react-dom.development.js:542
invokeGuardedCallbackDev @ react-dom.development.js:581
invokeGuardedCallback @ react-dom.development.js:438
commitRoot @ react-dom.development.js:10050
performWorkOnRoot @ react-dom.development.js:11017
performWork @ react-dom.development.js:10967
requestWork @ react-dom.development.js:10878
scheduleWorkImpl @ react-dom.development.js:10732
scheduleWork @ react-dom.development.js:10689
enqueueSetState @ react-dom.development.js:6212
./node_modules/react/cjs/react.development.js.Component.setState @ react.development.js:237
onStateChange @ connectAdvanced.js:205
notify @ Subscription.js:26
notifyNestedSubs @ Subscription.js:65
onStateChange @ connectAdvanced.js:202
notify @ Subscription.js:26
notifyNestedSubs @ Subscription.js:65
onStateChange @ connectAdvanced.js:202
notify @ Subscription.js:26
notifyNestedSubs @ Subscription.js:65
onStateChange @ connectAdvanced.js:202
notify @ Subscription.js:26
notifyNestedSubs @ Subscription.js:65
onStateChange @ connectAdvanced.js:202
notify @ Subscription.js:26
notifyNestedSubs @ Subscription.js:65
onStateChange @ connectAdvanced.js:202
dispatch @ createStore.js:173
e @ VM178:1
(anonymous) @ index.js:70
dispatch @ VM178:1
onSetFontsLoaded @ font-loader-hoc.jsx:81
(anonymous) @ font-loader-hoc.jsx:57
Promise.then (async)
document.onreadystatechange @ font-loader-hoc.jsx:56
Show 50 more frames
react_devtools_backend.js:2273 The above error occurred in the <GUI> component:
    in GUI (created by Connect(GUI))
    in Connect(GUI) (created by InjectIntl(Connect(GUI)))
    in InjectIntl(Connect(GUI)) (created by CloudManager)
    in CloudManager (created by Connect(CloudManager))
    in Connect(CloudManager) (created by VMManager)
    in VMManager (created by Connect(VMManager))
    in Connect(VMManager) (created by VMListener)
    in VMListener (created by Connect(VMListener))
    in Connect(VMListener) (created by ProjectSaverComponent)
    in ProjectSaverComponent (created by Connect(ProjectSaverComponent))
    in Connect(ProjectSaverComponent) (created by TitledComponent)
    in TitledComponent (created by Connect(TitledComponent))
    in Connect(TitledComponent) (created by InjectIntl(Connect(TitledComponent)))
    in InjectIntl(Connect(TitledComponent)) (created by ProjectFetcherComponent)
    in ProjectFetcherComponent (created by Connect(ProjectFetcherComponent))
    in Connect(ProjectFetcherComponent) (created by InjectIntl(Connect(ProjectFetcherComponent)))
    in InjectIntl(Connect(ProjectFetcherComponent)) (created by QueryParserComponent)
    in QueryParserComponent (created by Connect(QueryParserComponent))
    in Connect(QueryParserComponent) (created by FontLoaderComponent)
    in FontLoaderComponent (created by Connect(FontLoaderComponent))
    in Connect(FontLoaderComponent) (created by ErrorBoundaryWrapper)
    in ErrorBoundary (created by Connect(ErrorBoundary))
    in Connect(ErrorBoundary) (created by ErrorBoundaryWrapper)
    in ErrorBoundaryWrapper (created by LocalizationWrapper)
    in IntlProvider (created by Connect(IntlProvider))
    in Connect(IntlProvider) (created by LocalizationWrapper)
    in LocalizationWrapper (created by Connect(LocalizationWrapper))
    in Connect(LocalizationWrapper) (created by HashParserComponent)
    in HashParserComponent (created by Connect(HashParserComponent))
    in Connect(HashParserComponent) (created by AppStateWrapper)
    in IntlProvider (created by Connect(IntlProvider))
    in Connect(IntlProvider) (created by AppStateWrapper)
    in Provider (created by AppStateWrapper)
    in AppStateWrapper

React will try to recreate this component tree from scratch using the error boundary you provided, ErrorBoundary.
overrideMethod @ react_devtools_backend.js:2273
logCapturedError @ react-dom.development.js:9747
captureError @ react-dom.development.js:10540
renderRoot @ react-dom.development.js:10391
performWorkOnRoot @ react-dom.development.js:11014
performWork @ react-dom.development.js:10967
requestWork @ react-dom.development.js:10878
scheduleWorkImpl @ react-dom.development.js:10732
scheduleWork @ react-dom.development.js:10689
enqueueSetState @ react-dom.development.js:6212
./node_modules/react/cjs/react.development.js.Component.setState @ react.development.js:237
onStateChange @ connectAdvanced.js:205
notify @ Subscription.js:26
notifyNestedSubs @ Subscription.js:65
onStateChange @ connectAdvanced.js:202
notify @ Subscription.js:26
notifyNestedSubs @ Subscription.js:65
onStateChange @ connectAdvanced.js:202
notify @ Subscription.js:26
notifyNestedSubs @ Subscription.js:65
onStateChange @ connectAdvanced.js:202
notify @ Subscription.js:26
notifyNestedSubs @ Subscription.js:65
onStateChange @ connectAdvanced.js:202
notify @ Subscription.js:26
notifyNestedSubs @ Subscription.js:65
onStateChange @ connectAdvanced.js:202
notify @ Subscription.js:26
notifyNestedSubs @ Subscription.js:65
onStateChange @ connectAdvanced.js:202
dispatch @ createStore.js:173
e @ VM178:1
(anonymous) @ index.js:70
dispatch @ VM178:1
onError @ vm-manager-hoc.jsx:139
(anonymous) @ vm-manager-hoc.jsx:74
Promise.catch (async)
loadProject @ vm-manager-hoc.jsx:72
wrapper @ index.js:550
componentDidUpdate @ vm-manager-hoc.jsx:47
commitLifeCycles @ react-dom.development.js:8778
commitAllLifeCycles @ react-dom.development.js:9946
callCallback @ react-dom.development.js:542
invokeGuardedCallbackDev @ react-dom.development.js:581
invokeGuardedCallback @ react-dom.development.js:438
commitRoot @ react-dom.development.js:10050
performWorkOnRoot @ react-dom.development.js:11017
performWork @ react-dom.development.js:10967
requestWork @ react-dom.development.js:10878
scheduleWorkImpl @ react-dom.development.js:10732
scheduleWork @ react-dom.development.js:10689
enqueueSetState @ react-dom.development.js:6212
./node_modules/react/cjs/react.development.js.Component.setState @ react.development.js:237
onStateChange @ connectAdvanced.js:205
notify @ Subscription.js:26
notifyNestedSubs @ Subscription.js:65
onStateChange @ connectAdvanced.js:202
notify @ Subscription.js:26
notifyNestedSubs @ Subscription.js:65
onStateChange @ connectAdvanced.js:202
notify @ Subscription.js:26
notifyNestedSubs @ Subscription.js:65
onStateChange @ connectAdvanced.js:202
notify @ Subscription.js:26
notifyNestedSubs @ Subscription.js:65
onStateChange @ connectAdvanced.js:202
notify @ Subscription.js:26
notifyNestedSubs @ Subscription.js:65
onStateChange @ connectAdvanced.js:202
dispatch @ createStore.js:173
e @ VM178:1
(anonymous) @ index.js:70
dispatch @ VM178:1
onSetFontsLoaded @ font-loader-hoc.jsx:81
(anonymous) @ font-loader-hoc.jsx:57
Promise.then (async)
document.onreadystatechange @ font-loader-hoc.jsx:56
Show 44 more frames
react_devtools_backend.js:2273 gui Unhandled Error: Error: Error in Scratch GUI [location=http://localhost:63342/scratch3-master/build/index.html?_ijt=nroh28kmkj1oo04hn3nn4bvpjp]: Error: Non-ascii character in FixedAsciiString    at GUI.render (http://localhost:63342/scratch3-master/build/lib.min.js:327497:15)    at finishClassComponent (http://localhost:63342/scratch3-master/build/lib.min.js:103632:31)    at updateClassComponent (http://localhost:63342/scratch3-master/build/lib.min.js:103609:12)    at beginWork (http://localhost:63342/scratch3-master/build/lib.min.js:103984:16)    at performUnitOfWork (http://localhost:63342/scratch3-master/build/lib.min.js:105983:16)    at workLoop (http://localhost:63342/scratch3-master/build/lib.min.js:106047:26)    at HTMLUnknownElement.callCallback (http://localhost:63342/scratch3-master/build/lib.min.js:96301:14)    at Object.invokeGuardedCallbackDev (http://localhost:63342/scratch3-master/build/lib.min.js:96340:16)    at invokeGuardedCallback (http://localhost:63342/scratch3-master/build/lib.min.js:96197:27)    at renderRoot (http://localhost:63342/scratch3-master/build/lib.min.js:106125:7)Component stack:     in GUI (created by Connect(GUI))    in Connect(GUI) (created by InjectIntl(Connect(GUI)))    in InjectIntl(Connect(GUI)) (created by CloudManager)    in CloudManager (created by Connect(CloudManager))    in Connect(CloudManager) (created by VMManager)    in VMManager (created by Connect(VMManager))    in Connect(VMManager) (created by VMListener)    in VMListener (created by Connect(VMListener))    in Connect(VMListener) (created by ProjectSaverComponent)    in ProjectSaverComponent (created by Connect(ProjectSaverComponent))    in Connect(ProjectSaverComponent) (created by TitledComponent)    in TitledComponent (created by Connect(TitledComponent))    in Connect(TitledComponent) (created by InjectIntl(Connect(TitledComponent)))    in InjectIntl(Connect(TitledComponent)) (created by ProjectFetcherComponent)    in ProjectFetcherComponent (created by Connect(ProjectFetcherComponent))    in Connect(ProjectFetcherComponent) (created by InjectIntl(Connect(ProjectFetcherComponent)))    in InjectIntl(Connect(ProjectFetcherComponent)) (created by QueryParserComponent)    in QueryParserComponent (created by Connect(QueryParserComponent))    in Connect(QueryParserComponent) (created by FontLoaderComponent)    in FontLoaderComponent (created by Connect(FontLoaderComponent))    in Connect(FontLoaderComponent) (created by ErrorBoundaryWrapper)    in ErrorBoundary (created by Connect(ErrorBoundary))    in Connect(ErrorBoundary) (created by ErrorBoundaryWrapper)    in ErrorBoundaryWrapper (created by LocalizationWrapper)    in IntlProvider (created by Connect(IntlProvider))    in Connect(IntlProvider) (created by LocalizationWrapper)    in LocalizationWrapper (created by Connect(LocalizationWrapper))    in Connect(LocalizationWrapper) (created by HashParserComponent)    in HashParserComponent (created by Connect(HashParserComponent))    in Connect(HashParserComponent) (created by AppStateWrapper)    in IntlProvider (created by Connect(IntlProvider))    in Connect(IntlProvider) (created by AppStateWrapper)    in Provider (created by AppStateWrapper)    in AppStateWrapper

通过window.scratch.getProjectFile方式保存到服务器的某些文件,或者有些本地的文件再次加载加载不出来。

楼主您好,非常感谢开源,遇到个问题如标题所述,还请您有空解答下~

我这也有本地的加载不出的文件,如果您需要可以发给您,不过在这个issue上不知道怎么把文件放上去。

这是报错信息。
lib.min.js:93 gui {"validationError":"Could not parse as a valid SB2 or SB3 project.","sb2Errors":[{"keyword":"required","dataPath":"","schemaPath":"#/required","params":{"missingProperty":"objName"},"message":"should have required property 'objName'"}],"sb3Errors":[{"keyword":"enum","dataPath":".targets[0].layerOrder","schemaPath":"sb3_definitions.json#/definitions/stage/properties/layerOrder/enum","params":{"allowedValues":[0]},"message":"should be equal to one of the allowed values"}]}
a.write @ lib.min.js:93
o @ lib.min.js:29
emit @ lib.min.js:93
i.write @ lib.min.js:93
o @ lib.min.js:29
emit @ lib.min.js:93
A.write @ lib.min.js:29
o.warn @ lib.min.js:93
(anonymous) @ lib.min.js:29
Promise.catch (async)
value @ lib.min.js:29
t @ lib.min.js:6
load (async)
value @ lib.min.js:29
mountClassInstance @ lib.min.js:93
beginWork @ lib.min.js:93
A @ lib.min.js:93
i @ lib.min.js:93
a @ lib.min.js:93
I @ lib.min.js:93
w @ lib.min.js:93
batchedUpdates @ lib.min.js:93
ut @ lib.min.js:93
eo @ lib.min.js:93

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.