JavaScript
nodejs
atom-shell
Node.jsDay 5

atom-shellを雑に使って任意のnodeスクリプトが実行可能なアプリケーションとして配布する

More than 3 years have passed since last update.

この記事は Node.js Advent Calendar 2014 - Qiita の5日目です。

atom-shellを使って、nodeつかった「アプリケーション」 -- そう、そのブラウザとかと同じような実行環境ですよ -- で配布する方法を紹介します。

今日紹介する方法は、チーム内でエンジニアじゃない人に渡してボタン押して実行してもらう、みたいなのを意図してます。

使えればいいという記事であって、この手続きで作ったものをプロダクションで配布したりとかはしないでください。


1. AtomShellをダウンロードして作業ディレクトリを作る

Resources/app以下にディレクトリを作ってそこで作業します。

ダウンロードはここから最新のやつを https://github.com/atom/atom-shell/releases

$ mkdir -p ~/Downloads/Atom.app/Contents/Resources/app

$ cd ~/Downloads/Atom.app/Contents/Resources/app
$ npm init

Macだと Atom.app/Contents/Resources/app ですが、Windowsだと Atom/resources/app になります。


2. AtomShell用のおまじないをする

$ npm init で雑にpackage.json生成

package.jsonのmainで main.js を指定。

次にAtomShellを起動させるための main.jsを書く。最小構成でこんな感じ。

var app = require('app');

var BrowserWindow = require('browser-window');
app.on('ready', function() {
var mainWindow = new BrowserWindow({width: 800, height: 600});
mainWindow.loadUrl('file://' + __dirname + '/index.html');
});

おまじないと思ってもらって大丈夫。ここはまだnode領域です。これはウィンドウサーバーみたいなもんです。

ここで同ディレクトリに 空のindex.htmlを作ってAtom.appを実行してみてください。起動出来ましたか?

こんなディレクトリ構成になってるはずです。

app/

- package.json
- main.js
- index.html

確認したら Cmd+Q で終了してください


3. index.html でやりたいことを書く

この生成されたウィンドウ、npmのモジュールならなんでも呼べます。一部例外ありますが、まあ動きます。

たとえばnpmからexpressいれて実行してみます。

package.jsonのあるとこでいつものやつをうちます

npm install express

じゃあこれをウィンドウ側から読んでみましょう

<html>

<head>
<script>
var express = require('express');
function startServer(){
var app = express.createServer();
app.get('/', function(req, res){
res.send('Hello World');
});
app.listen(3000);
}

</script>
</head>
<body>

<button onClick='startServer'>Start Server!</button>

</body>
</html>

ブラウザの中からexpressでサーバーを起動しています。主従関係が逆転したこの背徳感、堪らないですね。

この中から外部スクリプトを呼びたい場合、scriptタグで読んでもいいですが、ローカルパスへのrequireでも呼べます。つまりはなんでもアリです。

node-webkitと違って、細かいコンテキストポリシーありません。


注意点

ネイティブモジュールに依存する場合は、そのプラットフォームでビルド(npm install)する必要があります。WindowsならWindows, MacならMac.

それさえ守れば逆に言えばなんでもできます。

詳しく原理知りたい人は atom-shell/docs at master · atom/atom-shell

を読んでください。

次は n0bisuke さんです