NativeScriptモジュールとNativeScriptアプリのコードは、CommonJS仕様に準拠する必要があります。 NativeScriptでは、ファイルとモジュールは1対1で対応しています。 カスタムまたは組み込みのNativeScriptモジュールの機能を呼び出すには、requireステートメントで参照する必要があります。 requireステートメントを宣言するとき、NativeScriptランタイムはパフォーマンス上の理由からプラットフォームに依存した方法でJavaScriptファイルを検索および評価することに注意してください。
以下は、ビルドおよびパッケージ化されたNativeScriptアプリの典型的なアーキテクチャです。 この記事のすべてのrequireステートメントの例は、このサンプルアーキテクチャを参照しています。
/private/var/.../Applications/HelloWorldApp.app
└── app
├── app.js
├── main-page.js
├── package.json
├── user-module
│ ├── helper.js
│ └── index.js
└── tns_modules
└── camera
├── camera.js
└── package.json
CommonJSモジュールをロードするには、いくつかの方法があります。
/で始まるパスは、デバイスファイルシステムに対する絶対パスとして扱われます。
require('/private/.../HelloWorldApp.app/app/app.js');
これは、/private/.../HelloWorldApp.app/app/app.js
に解決されます。
~で始まるパスは、アプリバンドルに関連して解決されます。
require('~/user-module/index.js')
これは、/private/.../HelloWorldApp.app/app/user-module/index.js
に解決されます。
特別な記号なしで始まるパスは、tns_modulesフォルダーに関連して解決されます。
require('camera/camera.js');
これは、/private/.../HelloWorldApp.app/app/tns_modules/camera/camera.js
に解決されます。
NativeScriptとノードのプラグインの使用方法の詳細についてはPlugins.mdを参照してください。
...で始まるパスは、呼び出しモジュールに関連して解決されます。
// In `app/user-module/index.js`:
require('./helper.js');
これは、/private/.../HelloWorldApp.app/app/user-module/helper.js
に解決されます。
NativeScript 1.5.1以降では、.jsファイルと同じ方法で.jsonファイルを要求(require)できます。 オブジェクトはキャッシュされ、無期限に存続するため、一度だけ解析されて多くのモジュールから使用される、静的なコンフィグファイルに役立つ場合があります。 (一時的に利用する場合は)代わりにファイルシステムモジュールを使用してJSONファイルを読み取ることを検討してください。
各モジュールで、module変数は現在のモジュールを表すオブジェクトへの参照です。
moduleオブジェクトは、それを検査するための便利ないくつかの特性を有しています。
次の例は /private/.../HelloWorldApp.app/app/main.js
モジュール用です。
module.require(id)
- module.require
メソッドは、元のモジュールからrequire()が呼び出されたかのようにモジュールをロードする方法を提供します。module.id
- モジュールの完全に解決されたファイル名。例: /private/.../HelloWorldApp.app/app/main.js
module.filename
- モジュールの完全に解決されたファイル名。例: /private/.../HelloWorldApp.app/app/main.js
__dirname
- 現在実行中のスクリプトが存在するディレクトリの名前。例: /private/.../HelloWorldApp.app/app/
__filename
- 現在実行中のスクリプトが配置されている完全なファイル名。例: /private/.../HelloWorldApp.app/app/main.js
global.require関数は、評価モジュールのコンテキスト外で呼び出すことができるため、App Inspectorのコンテキストで使用でき便利です。 これはappフォルダーに関連して解決します。
global.require('./user-module');
これは、/private/.../HelloWorldApp.app/app/user-module/index.js
に解決されます。
モジュールには、Androidでは*.android.js、iOSでは*.ios.jsファイル拡張子を付けることができます。 このようにして、異なるプラットフォーム固有の実装で共通のインターフェースを公開できます。 プロジェクトの準備中に、プラットフォームに対応するモジュールの名前が* .jsに変更され、実行時に使用されます。
モジュールはキャッシュされるため、ファイルを複数回必要とする場合でも1回だけ評価されます。 これは、循環依存関係を解決する際の無限再帰の回避にも役立ちます。