這篇文章假設你已配置TypeScript開發環境, 如果你還沒安裝TypeScript, 請先到TypeScript官網下載及安裝

導出Cloud Code

如果你不知道怎麼導出Cloud Code, 請看這篇文章

配置TypeScript

  1. 以CMD進入Cloud Code目錄, 並執行以下命令初始化, 這個命令會在當前目錄生成tsconfig.json文件

    tsc --init
    
  2. 打開tsconfig.json, 配置以下屬性

    "baseUrl": "./modules/"
    
  3. 將所有文件副檔名從.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/下的聲名, 所有文件的變量聲名都暴露了在全局空間, 定義過的變量名無法重覆定義

在下一篇文篇, 會用另一個方法解決這些限制