Node.jsはCommonJSまたはES module(現在は実験的機能)でライブラリを読み込むようになっていますが、enchant.jsはどちらにも対応していません。HTMLのscriptタグで単純に読み込む場合しか想定していないと言えます。このようなライブラリをNode.js上で直接利用することは本来出来ませんが、その構成によっては工夫次第で可能になる場合があります。
今回の目的はenchant.Class
のみであり、一つのJavaScriptにまとまる前のソースコードでは"Class.js"と言うファイルとして分離独立して存在します。こちらの中身を確認したところ、他のファイルには依存しておらず、また、ブラウザ版JavaScript特有のオブジェクト(DOMなど)も使用していませんでした。しかし、CommonJSやES moduleを想定してた構成ではないため、通常の方法では読み込みできません。今回はenchant.Class = function(...) {};
という書き方で定義してあったため、この性質を利用して、Node.jsに読み込みたいと思います。
以下、enchant.Class
を使うための方法です。Windowsで作業していることが前提ですが、OSには特に依存しません。
- enchant.js v0.8.3 ソースコードをダウンロードします。
- ダウンロードしたZIPファイルから"dev\src\Class.js"のみを取り出して、コピーします。
- グローバル変数
enchant
をObjectとして作成した後に、コピーしたソースをrequire()
します。
具体的なコードは下記のようにになります。
JavaScript
1// enchant.Classのみを読み込んでいる部分
2global.enchant = {};
3require("./Class.js");
4const Class = enchant.Class;
5
6const A = enchant.Class.create({
7 initialize: function(x) {
8 this.x = x;
9 },
10 f: function() {
11 console.log(`A.f: ${this.x}`);
12 }
13});
14
15const B = enchant.Class.create(A, {
16 initialize: function(x, y) {
17 A.call(this, x);
18 this.y = y;
19 },
20 g: function() {
21 console.log(`B.g: ${this.x}, ${this.y}`);
22 }
23});
24
25const a = new A("hoge");
26const b = new B("fuga", "piyo");
27a.f();
28b.f();
29b.g();
実行すれば、正常に継承が動作しているところまで確認できると思います。
なお、この方法はどんなものにも使えるというわけではなく、enhant.Class
が偶然こういう事が出来るような構成だったにすぎません。**他のライブラリではやり方が全く異なる場合があります。**場合によってはライブラリ側のコードを修正する必要があります。また、グローバル変数を使用していることからも、あまり良い方法とは言えません。
ということで、出来ることには出来ますが、推奨は出来ません。かといって、他にお勧めのクラス実装と言われても、私はCoffeeScriptばかり使ってきたのでクラスの作成に不便を感じたことがなく、そういうライブラリがあるかどうかすらよくわかりません。申し訳ないです。