ガイド開発ガイド

フィブスとは?

fibjs は、主に Web バックエンド開発用に設計されたアプリケーション サーバー開発フレームワークであり、Google v8 JavaScript エンジンをベースにしており、従来のコールバックとは異なる並行ソリューションを選択します。fibjs はファイバーを使用して、フレームワーク層での非同期呼び出しによって引き起こされるビジネスの複雑さを分離します。これにより、開発の難しさが大幅に軽減され、ユーザー空間での頻繁な非同期処理によって引き起こされるパフォーマンスの問題が軽減されます。

歴史的な理由から、JavaScriptは主にブラウザのUI処理に使用され、UI開発は典型的なシングルスレッドのイベント駆動型モデルであるため、JavaScriptは非同期処理をメインのプログラミングパラダイムとするプログラミングパラダイムも形成しています。

JavaScript の成功により、JavaScript を他のシナリオに適用する人がますます増えています。同時に、多くのシナリオで非同期処理が最も適切な選択ではないことに気付く人が増えています。

基本に立ち返ってアジャイル開発

fibjs は、フレームワーク レイヤーでファイバーを使用して、非同期呼び出しによって引き起こされるビジネスの複雑さを分離し、io の非同期処理をより直感的な同期呼び出しにカプセル化します。エンジニアは、通常の同期ビジネス ロジックに従ってコードを記述するだけで、その利点を享受できます。非同期処理で便利。

次のコードは、mysql モジュールのドキュメントから抜粋したものです。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
conn.beginTransaction(err => { if (err) { throw err; } conn.query('INSERT INTO posts SET title=?', title, (error, results, fields) => { if (error) { return conn.rollback(() => { throw error; }); } var log = 'Post ' + results.insertId + ' added'; conn.query('INSERT INTO log SET data=?', log, (error, results, fields) => { if (error) { return conn.rollback(() => { throw error; }); } conn.commit((err) => { if (err) { return conn.rollback(() => { throw err; }); } console.log('success!'); }); }); }); });

fibjs では、同じ作業を完了するためのコードは次のとおりです。

1 2 3 4 5 6
conn.trans(() => { var result = conn.execute('INSERT INTO posts SET title=?', title); var log = 'Post ' + results.insertId + ' added'; conn.execute('INSERT INTO log SET data=?', log); }); console.log('success!');

簡潔さを求めている場合は、次のようなコードを書くこともできます。

1 2 3 4
conn.trans(() => conn.execute('INSERT INTO log SET data=?', 'Post ' + conn.execute('INSERT INTO posts SET title=?', title).insertId + ' added')); console.log('success!');

2 つの異なるプログラミング スタイルによってもたらされる違いを明確に比較できます。コードが少ないほどエラーが少なくなり、コードが少なくなるにつれて、コードのロジックが明確になり、開発と保守の両方でメリットが得られます。

高いエネルギーを抱きしめる

サーバーを拡張することで簡単に応答速度を向上させることができますが、それでもパフォーマンスは開発フレームワークを選択する重要な基準の 1 つです。ES7 の導入により、新しい非同期開発モデルとして async が JavaScript に導入されました。ただし、非同期によってもたらされる同期スタイルを楽しむときは、パフォーマンスへの影響にも直面する必要があります。

テスト コードの一部を使用して、さまざまなプログラミング スタイルによってもたらされるパフォーマンスの違いを比較できます。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
var count = 1000; async function test_async(n) { if (n == count) return; await test_async(n + 1); } function test_callback(n, cb) { if (n == count) return cb(); test_callback(n + 1, () => { cb(); }); } function test_sync(n) { if (n == count) return; test_sync(n + 1); } async function test() { console.time("async"); await test_async(0); console.timeEnd("async"); console.time("callback"); test_callback(0, () => { console.timeEnd("callback"); }); console.time("sync"); test_sync(0); console.timeEnd("sync"); } test();

最新の v8 では、このコードの結果は次のとおりです。

1 2 3
async: 0.539ms callback: 0.221ms sync: 0.061ms

テスト結果から、プロジェクトで非同期が広く使用されている場合、サーバーは非同期関数の呼び出しと戻りの処理に多くの時間を費やすことを明確に知ることができます。この点は、いくつかのサーバー側アプリケーションの実際のテストでも見つかりました。そして、この種のパフォーマンスの急激な低下はまったく受け入れられません。

fibjs はファイバーを使用しているため、JavaScript 言語自体の特性を活かし、v8 の優れたパフォーマンスを最大限に発揮できます。エンジニアは、サーバーのパフォーマンスを簡単に最大化できます。

誘拐されない柔軟なパラダイム選択

fibjs を使用することを選択したからといって、同期開発スタイルを使用しなければならないというわけではありません.

コールバックと非同期の両方に、伝染という致命的な欠陥があります。関数がコールバックまたは非同期である限り、それに依存する他のすべての関数はコールバックまたは非同期でなければなりません。これは、大規模なソフトウェア開発において莫大な開発コストをもたらします。

単純なサーバー開発シナリオを例にとります。プロジェクト当初はセッションデータの保存場所としてメモリーを選択していましたが、今回はsyncメソッドを使って直接データを読み込んで保存し、これを基に完全なビジネスを展開することができました。事業規模の拡大に伴い、セッションデータをredisやmongodbに保存する必要があり、その際、セッション関連の操作を非同期モードに変更する必要があります。

理論上、各関数を順番に変更して、依存している関数の要件を満たすことができますが、これにはすべてのモジュールを完全に理解し、それらを変更する能力が必要です。これは、複数人で共同開発する場合やサードパーティのモジュールを使用する場合には完全に不可能です。

したがって、すべての一般的なモジュールは、非同期とパフォーマンスのバランスを取るために、同期と非同期の両方のインターフェイスを提供する必要があります。より一般的な開発者は、非同期インターフェイスのみを提供することを選択します。これは、パフォーマンスの災害につながります。

fibjs では、同様の問題を簡単に解決し、明示的な非同期および制御されていない感染を回避できます。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
var util = require('util'); function session_get(sid) { return sdata; } async function async_session_get(sid) { return sdata; } function callback_session_get(sid, cb) { cb(null, sdata); } data = session_get(sid); data = util.sync(async_session_get)(sid); data = util.sync(callback_session_get)(sid);

fibjs は util.sync を使用して、コールバック関数または非同期関数を同期関数に変換し、それらを直接呼び出すことができます。このようにして、異なるプログラミング パラダイムのモジュールを簡単に統合し、最小限の開発コストでそれらを同期パラダイムに変換し、パラダイムの伝染によって引き起こされる災害を効果的に回避できます。

体験を始める

楽しい開発体験を始める準備はできていますか? それでは、インストールから始めましょう。

👉【設置・動作環境