Использование пакетов модуля ES в функции Azure Typescript

Я не могу использовать p-map пакета в своей функции Azure. Я получаю следующую ошибку:

      Worker failed to load function: 'serverless' with function id: '<id>'.
Result: Failure
Exception: Worker was unable to load function serverless: 'Error [ERR_REQUIRE_ESM]: require() of ES Module <es-module> from /usr/local/Cellar/azure-functions-core-tools@4/4.0.4483/workers/node/worker-bundle.js not supported.
Instead change the require of index.js in /usr/local/Cellar/azure-functions-core-tools@4/4.0.4483/workers/node/worker-bundle.js to a dynamic import() which is available in all CommonJS modules.'

Проект создается с помощью шагов, описанных в документации Azure . В index.ts есть следующее:

      import { AzureFunction, Context, HttpRequest } from "@azure/functions";
import pMap from "p-map";
import got from "got";

const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
    const sites = [
        'https://avajs.dev',
        'https://github.com'
    ];

    const mapper = async site => {
        const {requestUrl} = await got.head(site);
        return requestUrl;
    };

    const result = await pMap(sites, mapper, {concurrency: 2});
    

    context.res = {
        // status: 200, /* Defaults to 200 */
        body: result
    };

};

export default httpTrigger;

Мой tsconfig.json выглядит следующим образом:

      {
  "compilerOptions": {
    "module": "es2020",
    "target": "es2020",
    "outDir": "dist",
    "rootDir": ".",
    "sourceMap": true,
    "strict": false,
    "moduleResolution": "node",
    "allowSyntheticDefaultImports": true
  }
}

Наконец, это мой package.json:

      {
  "name": "azure-functions-test",
  "version": "1.0.0",
  "description": "",
  "type": "module",
  "scripts": {
    "build": "tsc",
    "watch": "tsc -w",
    "prestart": "npm run build",
    "start": "func start",
    "test": "echo \"No tests yet...\""
  },
  "dependencies": {
    "got": "^12.0.4",
    "p-map": "^5.3.0"
  },
  "devDependencies": {
    "@azure/functions": "^3.0.0",
    "typescript": "^4.0.0"
  }
}

p-map строго является модулем ES и не может использоваться в проектах CommonJS.

Я что-то упустил или просто невозможно использовать пакеты модулей ES в функциях Azure? Заранее спасибо.

Репозиторий GitHub с вышеупомянутым кодом для локального тестирования: azure-functions-test

2 ответа

Согласно документам на веб-сайте Node.js, указав"type": "module"в вашейpackage.jsonтакже должен указать, должен ли Node использовать ESM.

Вот что я сделал, чтобы ESM работал для моих функций в моем функциональном приложении:

tsconfig.json

      {
  "compilerOptions": {
    "module": "ESNext",
    "target": "ESNext",
    "moduleResolution": "Node",
    "outDir": "dist",
    "rootDir": ".",
    "sourceMap": true,
    "strict": false,
    "noImplicitAny": true,
    "noUnusedLocals": true
  }
}

Некоторые соответствующие настройки функционального приложения:

WEBSITE_NODE_DEFAULT_VERSION:~16(Для запуска с использованием среды выполнения Node.js 16)FUNCTIONS_EXTENSION_VERSION:~4

Затем обязательно импортируйте экспорт в стиле ES с.jsрасширение, если ваше исходное расширение.ts. Итак, если у вас есть файл с именемcustom.tsкоторый имеет экспорт, вы должны импортировать его как `import {что-то} из "custom.js;".

И для любых пакетов npm, которые используют экспорт по умолчанию (стиль CommonJS), вы должны импортировать пакет, используя его экспорт по умолчанию, т.е.import * as pkg from "pkg";.

Соответствующие ссылки:

https://github.com/Azure/azure-функции-nodejs-worker/issues/104

https://learn.microsoft.com/en-us/azure/azure-functions/functions-reference-node?tabs=v2-v3-v4-export%2Cv2-v3-v4-done%2Cv2%2Cv2-log-custom-telemetry%2Cv2-accessing-request-and-response%2Cwindows-setting-the-node-version#ecmascript-modules (обратите внимание, что в этом документе говорится об импорте ваших экспортов ESM с.mjsрасширение, но мне не нужно было этого делать.)

Я решил свою проблему, переименовав файл index.ts в index.mts. Это создало файл index.mjs (после запуска npm run build) в моей папке dist, что устранило проблему.

Следует отметить, что вам также необходимо отредактировать ключ scriptFile вашего function.json, чтобы он использовал ваш файл .mjs вместо несуществующего файла .js.

Другие вопросы по тегам