Использование пакетов модуля 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.