ちょっと前に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
exportconst 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してるんだろうか。
最後に今回使ったリポジトリ。