1. 程式人生 > >Scratch 3.0建站指南(二)後臺技術選型

Scratch 3.0建站指南(二)後臺技術選型

上一節,我們簡單講了一下Scratch 3.0的背景介紹,以及如何在本地編譯執行的內容,對於採用面對面的教學方式,如果部署在區域網,這種方式應該也足夠了。Scratch 3.0的指令碼可以存放在本地,如果是公用電腦,可以使用目錄的方式分開存放,如果是學生自帶的電腦,那麼就自行存放。

面臨的一些限制

但這種方式也有些問題,進入高階後,很多內容都需要素材,這樣就需要能夠分配一個初始的含有素材的指令碼。雖然sb3(Scratch 3.0檔案)可以通過copy的方式傳給各個電腦,但畢竟不方便,如果學習的進度不同 ,管理起來就更加麻煩。另外,如果是公用電腦,那麼學生就不能在家裡對作品進行修改。

如果要方便上述的需求,就需要有後臺的功能,至少可以進行課程的設定,並且將學生的進度與課程關聯起來。

假設我們要實現上述功能,我們首先面臨的是技術選型的問題,採用什麼樣的後臺方案與前端進行配合。因為前端已經確定了,Scratch GUI使用的ReactJS,也就是說,它是一個SPA(single page web application)的應用,那麼他的UI展現是在客戶端渲染的,而不是在Server生成HTML頁面再返回客戶端的,因此,不需要SpringMVC這樣的服務端MVC類的框架,我們只需要能夠支援Restful API的框架就可以。

可選擇的框架

可以選擇的範圍很廣,Jakarta EE,Python Diango,PHP…,有了後臺,必然要對前端進行改造,前端是確定,那麼JS就是必須的,因此,大家也可以考慮使用JS進行全棧開發,那麼後端就可以採用Nodejs。資料庫,如果是對關係資料庫比較熟悉,那麼可以使用Mysql,但如果採用nodejs,我建議可以考慮mongodb。

JS

先說一下JS,學習ReactJS,首先要對ES6比較熟悉,現代的語言發展,其中一個目標是讓語言越來越精煉,如果大家比較一下ES6, Python和Java 8之前的版本,就會發現一些差異,比如ES6不需要語句用”;”結尾,一些新的操作符“=>, …”,有些情況下可以省略return語句,比如

const addColor = (title, array) => array.concat({title})

上邊的函式是返回一個新陣列, Python 的程式碼段不使用{,},而採用自然縮排。所以,現代的程式語言變得越來越短小精湛,也因此可閱讀性和維護性越好。

ES6中有Class的概念,但它的實現與OO語言C++/Java等不同,不是虛擬函式而是原型鏈。JS是解釋性的語言,而不是像其他語言需要編譯後執行,所以他的編碼風格也與OO語言有較大的不同,它更偏向Function Programming,所以,ReactJS中的Class主要用於一些元件的實現上,大家可以看一下Scratch 3.0 GUI的原始碼,使用Class的原因是要管理元件的生命週期,如果可以話,應該儘量的使用Function Programming而不是Class,他的效率要高於Class,而且,你會發現,寫出的高階函式會很漂亮。

Scratch 3.0 採用的是React Redux, Facebook 提供的一套解決方案,我個人覺得這個架構比MVC的架構要好一些,這方面的資料很多,大家可以學習一下再自行比較一下。

Nodejs

再說一下後端採用的方案,Jakarta EE的方案很多,這裡就不做介紹了,這裡提一下nodejs的方案。Nodejs採用google的V8引擎,使用js語言,所以它與Java的編譯後執行的語言在程式碼執行層面上的效率會有差距,另外,Nodejs是單執行緒的,Java是多執行緒的。但Nodejs使用的是非同步回撥的方式,大家可以參照一下Nginx的架構,所以Nodejs在應對大規模併發的情況下,表現十分優秀,相對多執行緒也更加容易除錯。另外,Nodejs的開發、部署比Jakarta來說,那便利的就不是一點點了。

Nodejs的開發一定要熟悉非同步程式設計的模式,對Promise的使用要得心應手,NPM中有太多的Module來實現Restful API,比如Express。

Mongodb

最後再說一下資料庫,關係型的資料庫大家都很熟悉,但如果採用Nodejs,我個人的建議是Mongodb,這種No-sql的資料庫在資料結構上與JS語言是一種自然的結合,不像在使用ORMapping的架構中,你要編寫很多的程式碼或者配置進行對映,在Nodejs中,會是一種自描述的編寫方式,比如:

Work.updateOne({
            _id: work_id
        }, {
            $addToSet: {
                'sections': section
            }
        })
        .then(doc => resloves(doc))
        .catch(e => rejects(e))

這樣的程式碼的可讀性更好一些!。

好,這一節我們主要講了一下後端技術選型的問題,下一節,我們再討論一下業務邏輯的一些簡單考慮!