使用TypeScript編寫GameSparks Cloud Code
這篇文章假設你已配置TypeScript開發環境, 如果你還沒安裝TypeScript, 請先到TypeScript官網下載及安裝
導出Cloud Code
如果你不知道怎麼導出Cloud Code, 請看這篇文章
配置TypeScript
以CMD進入Cloud Code目錄, 並執行以下命令初始化, 這個命令會在當前目錄生成tsconfig.json文件
tsc --init打開tsconfig.json, 配置以下屬性
"baseUrl": "./modules/"將所有文件副檔名從.js改為.ts
下載聲名文件
從這個主題可以找到Cloud Code的聲名文件, 你可以直接將typings文件夾下載到你的項目
如果使用GitHub托管, 可以使用以下指令, 將聲名文件以Git子模組的形式引用到項目
git submodule add git@github.com:JEphron/gamesparks-typings.git
30-9-2017更新
後來發現這個項目缺少Request API的聲名文件, 我從https://api.gamesparks.net/ 轉換了缺少的聲名文件
同樣可直接下載typings, 或以Git子楔組加入到項目
Request API聲名文件: https://github.com/johnsoncodehk/gamesparks-request-api-typings/
代碼規範
- 用let代替var
Code Code執行上有別於CommonJS模組, 更接近是作為代碼片段插入, 因此CommonJS模組形式的代碼將無法在Cloud Code上運行
- 用const代替export
- 用require代替import
Code Code的require是將目標文件的所有聲名, 聲名為全局全量。因此當有多個require時, 會產生全局變量污染, 例如以下例子中, 你無法從myEvent.ts得知addNums以及minusNums是屬於哪個腳本:
modules/myModuleA.ts
function addNums(num1: number, num2: number) { return num1 + num2; }modules/myModuleB.ts
function minusNums(num1: number, num2: number) { return num1 - num2; }event/myEvent.ts
require("myModuleA"); require("myModuleB"); let num1 = Spark.getData().num1; let num2 = Spark.getData().num2; Spark.setScriptData("numAdd", addNums(num1, num2)); Spark.setScriptData("numMinus", minusNums(num1, num2));
建議解決方法是將module的所有聲名封裝在一個物件內, 並經物件名進行調用, 例如:
modules/myModuleA.ts
const MyModuleA { addNums: (num1: number, num2: number) => { return num1 + num2; } }modules/myModuleB.ts
const MyModuleB { minusNums: (num1: number, num2: number) => { return num1 - num2; } }event/myEvent.ts
require("myModuleA"); require("myModuleB"); let num1 = Spark.getData().num1; let num2 = Spark.getData().num2; Spark.setScriptData("numAdd", MyModuleA.addNums(num1, num2)); Spark.setScriptData("numMinus", MyModuleB.minusNums(num1, num2));
限制
開發時就算沒有require文件, 編譯器也能找到modules/下的所有聲名, 必須人手檢查require是否正確
event/myEvent.ts
// messing require myModuleA let num1 = Spark.getData().num1; let num2 = Spark.getData().num2; // 能通過IDE編譯, 但運行時會出錯, 因為IDE中只要目錄文件存在MyModuleA的定義就能找到. 但在Cloud Code中, 不require myModuleA.ts, MyModuleA不會出現在全局變量 Spark.setScriptData("numAdd", MyModuleA.addNums(num1, num2));
這是因為沒有使用export或import, 腳本不會被識別為模組, 所有定義就會暴露在全局空間下
不止modules/下的聲名, 所有文件的變量聲名都暴露了在全局空間, 定義過的變量名無法重覆定義
在下一篇文篇, 會用另一個方法解決這些限制