次のサンプル ノード アプリケーションを Azure Web サイトにデプロイしようとしています。
var http = require('http');
var port = process.env.port || 1337;
http.createServer(function (req, res) {
res.writeHead(200, { 'Content-Type': 'text/html' });
try {
var canvasModule = require('canvas'),
canvas = new canvasModule(200, 200),
ctx = canvas.getContext('2d');
ctx.rotate(0.5);
ctx.font = '30px Impact';
var message = "Hello World";
ctx.fillText(message, 40, 40);
ctx.strokeRect(30, 5, 160, 50);
res.end('<html><img src="' + canvas.toDataURL() + '" /></html>');
} catch (e) {
res.end('Error: ' + e);
}
}).listen(port);
注意が必要なのは、インストール時に node-gyp を使用してコンパイルする必要がある「 canvas 」というノード モジュールを使用していることです。
このMicrosoft ページによると、ネイティブ モジュールは Azure Web サイトではサポートされていません。アプリが正しく動作するには、モジュールのコンパイル済みバージョンを Azure にコピーする必要があります。
ネイティブ モジュール
ほとんどのモジュールはプレーンテキストの JavaScript ファイルですが、一部のモジュールはプラットフォーム固有のバイナリ イメージです。これらのモジュールは、通常は Python と node-gyp を使用して、インストール時にコンパイルされます。Azure Web サイトの特定の制限の 1 つは、package.json または npm-shrinkwrap.json ファイルで指定されたモジュールをインストールする方法をネイティブに理解しますが、Python または node-gyp を提供せず、ネイティブ モジュールをビルドできないことです。
Azure Cloud Services は、アプリケーションの一部としてデプロイされる node_modules フォルダーに依存しているため、インストールされたモジュールの一部として含まれるネイティブ モジュールは、Windows 開発システムにインストールおよびコンパイルされている限り、クラウド サービスで動作するはずです。
ネイティブ モジュールは、Azure Web サイトではサポートされていません。JSDOM や MongoDB などの一部のモジュールには、オプションのネイティブ依存関係があり、Azure Web サイトでホストされているアプリケーションと連携します。
(発行ウィザードを使用して) すべてを Azure にデプロイし、コンパイルされたモジュールを含むすべてのファイルが (少なくとも) Azure に送信されました。Azure でサイトを実行すると、次の例外が発生します。
Error: The specified module could not be found.
D:\home\site\wwwroot\node_modules\canvas\build\Release\canvas.node
しかし、そのファイルは実際にはサーバーにデプロイされています。
VM を作成することは明らかにオプションですが、私は Web サイトを使用することを好みます。誰でも試してみることができますか?