ちょっと前にLTSになったNode.js 22*1から、いくつかの条件を満たせばrequire
関数でES Modulesをロードすることができるになった。
一方で、Azure Functions。
Publick PreviewながらNode.js 22が動くようになった。
なので、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してるんだろうか。
最後に今回使ったリポジトリ。