Azure FunctionsでES modulesをrequireする - ほりひログ

ほりひログ

所属組織の製品 (Azure とか) に関連する内容が多めだけど、個人の見解であって、所属組織を代表する公式情報ではないです。

Azure FunctionsでES modulesをrequireする

ちょっと前にLTSになったNode.js 22*1から、いくつかの条件を満たせばrequire関数でES Modulesをロードすることができるになった。

nodejs.org

一方で、Azure Functions。
Publick PreviewながらNode.js 22が動くようになった。

azure.microsoft.com

なので、Azure Functions上のNode.js 22でもrequire関数でES Modulesがロードできるか試してみた。

試した関数はこのHTTPトリガー関数。

src/functions/httpTrigger1.js

const { app } = require('@azure/functions');
const { foo } = require("../modules/esm.mjs");

app.http('httpTrigger1', {
    methods: ['GET'],
    authLevel: 'anonymous',
    handler: async (request, context) => {
        return { body: foo() };
    }
});

2行目のrequireでES Modulesをロードして、それを8行目で使うだけ。

ロードされるES Modulesはこちら。

src/modules/esm.mjs

export const foo = () => {
  return "Hello from ESM module";
};

文字列を返すだけの関数しかないシンプルなモジュール。

注意点として、ES Modules側のファイル名の拡張子はmjsにしておくこと。
あとNodeの実行コマンドにオプション--experimental-require-moduleをつけること*2
Azure FunctionsではNode.jsの実行時オプションを環境変数NODE_OPTIONSで設定するので、Azureポータルからだと以下のように設定する。

諸事情により東南アジアリージョン限定で試してみたが、2024年11月4日現在、デプロイ時に選択したプランでばらつきがあった。

Elastic PremiumとApp Service Planだと、Windows/Linuxのどちらでも問題なく動作した。

一方で従量課金プランの場合、OSがWindowsだと問題なく動いたが、LinuxだとNode.js 22を選択してデプロイできるものの、デプロイされたリソースでランタイムエラーが発生し、Azure Functionsのホストプロセス自体が動かなくなった。

Flex Comsumptionは、Azureポータルからのデプロイ時に、Node.jsのバージョンの中にNode 22がそもそもなく、デプロイができなかった。

プラン名 Windows Linux
Elastic Premium
App Service Plan
従量課金 ×*3
Flex comsumption - ×*4

Linuxでの従量課金とFlex Consumptionの両プランは、特殊なコンテナーを使ってた記憶があるので、それの対応がまだなのかもしれない。
それも含めてのPublic Preview

あとWindows版で確認したところ、Node.js 22.5.1が動いていたので、LTSになったNode.js 22.11.0と差がある状況。

GAまでには、LTSバージョンの導入やホスティングプランの差も解消するんだろう。
Node.js 20のAzure Functionsでのサポートが、Publick PreviewからGAまで半年ほど*5だったので、次の春にはGAしてるんだろうか。

最後に今回使ったリポジトリ

github.com


*1:https://nodejs.org/en/blog/release/v22.11.0

*2:オプションなしで使うにはNode.js 23以降が必要

*3:ランタイムエラー

*4:デプロイ不可

*5:Bingのキャッシュによると、Public Preview: 2023年9月、GA: 2024年3月、らしい