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

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

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

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

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

Если вы не знакомы с 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. Вы можете использовать эту карту кода в любой интегрированной среде разработки или через модуль Node.