Quantcast
Channel: ほりひログ
Viewing all articles
Browse latest Browse all 44

Azure FunctionsでES modulesをrequireする

$
0
0

ちょっと前に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

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がそもそもなく、デプロイができなかった。

プラン名 WindowsLinux
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月、らしい


Viewing all articles
Browse latest Browse all 44

Trending Articles