Как использовать TypeScript для Cloud Functions

Разработчики, которые предпочитают писать функции на TypeScript, могут использовать два типа поддержки от Cloud Functions:

  • Создание и настройка проектов TypeScript для автоматической трансляции при инициализации (firebase init functions).
  • Транспилируйте существующий исходный код TypeScript в JavaScript во время развертывания с помощью хука predeploy.

Следуя инструкциям в этом руководстве, вы можете перенести существующий проект JavaScript на TypeScript и продолжить развертывать функции, используя хук predeploy для преобразования исходного кода. При написании функций TypeScript имеет ряд преимуществ по сравнению с обычным JavaScript:

  • TypeScript поддерживает новейшие функции JavaScript, такие как async/await, упрощающие управление обещаниями.
  • Cloud Functions Линтер выделяет распространенные проблемы во время написания кода.
  • Безопасность типов помогает избежать ошибок во время выполнения развернутых функций.

Если вы никогда не работали с TypeScript, ознакомьтесь с кратким руководством по TypeScript.

Как инициализировать новый проект Cloud Functions с помощью TypeScript

Запустите firebase init functions в новом каталоге. При создании проекта можно использовать JavaScript или TypeScript. Выберите TypeScript, чтобы получить следующую структуру проекта:

myproject
 +- functions/     # Directory containing all your functions code
      |
      +- package.json  # npm package file describing your Cloud Functions code
      |
      +- tsconfig.json
      |
      +- .eslintrc.js # Optional file if you enabled ESLint
      +- tsconfig.dev.json # Optional file that references .eslintrc.js
      |
      +- src/     # Directory containing TypeScript source
      |   |
      |   +- index.ts  # main source file for your Cloud Functions code
      |
      +- lib/
          |
          +- index.js  # Built/transpiled JavaScript code
          |
          +- index.js.map # Source map for debugging

После завершения инициализации раскомментируйте пример в файле index.ts и выполните команду npm run serve, чтобы увидеть функцию "Hello World" в действии.

Как использовать существующий проект TypeScript

Если у вас уже есть проект TypeScript, вы можете добавить хук predeploy, чтобы проект транслировался каждый раз, когда вы развертываете код в Cloud Functions for Firebase. Вам понадобится правильно сформированный файл tsconfig.json и проект Firebase. Кроме того, вам нужно будет внести следующие изменения в конфигурацию Firebase:

  1. Измените package.json, чтобы добавить скрипт bash для сборки проекта TypeScript. Пример:

     {
       "name": "functions",
       "scripts": {
         "build": "npm run lint && tsc"
       }
     ...
    
  2. Измените firebase.json, чтобы добавить хук predeploy для запуска скрипта сборки. Пример:

     {
       "functions": {
         "predeploy": "npm --prefix functions run build",
       }
     }
    

В такой конфигурации команда firebase deploy --only functions создает код TypeScript и развертывает его как функции.

Как перенести существующий проект JavaScript в TypeScript

Если у вас есть проект Cloud Functions, который вы инициализировали и разрабатывали на JavaScript, вы можете перенести его в TypeScript. Настоятельно рекомендуем создать контрольную точку git или другую резервную копию перед началом работы.

Чтобы перенести существующий проект JavaScript Cloud Functions:

  1. Создайте контрольную точку git и сохраните копии существующих исходных файлов JavaScript.
  2. В каталоге проекта выполните команду firebase init functions и выберите TypeScript, когда будет предложено указать язык для написания функций.
  3. Когда появится запрос о том, нужно ли перезаписать существующий файл package.json, выберите Нет, если только вы не уверены, что не хотите сохранять существующий файл.
  4. Удалите файл index.ts из каталога functions/src и замените его существующим исходным кодом.
  5. В файле tsconfig.json, созданном при инициализации, задайте параметры компилятора, чтобы разрешить JavaScript: "allowJs": true.
  6. Скопируйте сохраненный файл package.json в каталог functions и измените его, задав для параметра "main" значение "lib/index.js".
  7. Также в файле package.json добавьте скрипт сборки для TypeScript, например следующий:

     {
       "name": "functions",
       "scripts": {
         "build": "npm run lint && tsc"
       }
     ...
    
  8. Добавьте "typescript" в качестве зависимости для разработки, выполнив команду npm install --save-dev typescript @typescript-eslint/eslint-plugin @typescript-eslint/parser.

  9. Для всех зависимостей выполните команду npm install --save @types/<dependency>.

  10. При необходимости перепишите исходный код с .js на .ts.

Эмуляция функций TypeScript

Чтобы протестировать функции TypeScript локально, можно использовать инструменты эмуляции, описанные в разделе Запуск функций локально. Важно скомпилировать код перед использованием этих инструментов, поэтому обязательно выполните команду npm run build в каталоге функций, прежде чем запускать firebase emulators:start или firebase functions:shell. В качестве альтернативы можно использовать ярлыки npm run serve или npm run shell. Обе эти команды запускают сборку и оболочку функций.

Журналы функций для проектов TypeScript

Во время firebase deploy index.ts вашего проекта будет преобразован в index.js. Это означает, что в журнале Cloud Functions будут показываться номера строк из файла index.js, а не из написанного вами кода. Чтобы вам было проще находить соответствующие пути и номера строк в index.ts, firebase deploy создает functions/lib/index.js.map. Вы можете использовать эту карту источника в предпочитаемой IDE или через модуль Node.