10

HTML5クライアントとnode.jsで実行されているサーバーの間でWebSocketを介してメッセージングを実行しています。当然、私はメッセージ形式としてJSONを選択し、そのため、さまざまなメッセージコンテンツタイプと変換操作を定義する一般的なJavaScriptコードを作成しました。javascriptコードは両方のプロジェクト間で共有されます。

Webクライアントを1つのgitプロジェクトとして作成し、サーバーを別のgitプロジェクトとして作成しました。部分的には、phonegapを使用して、さまざまなタッチベースの環境用のWebkitベースのクライアントを構築しているためです。また、さまざまなロジックをうまく分離することもできます。

共通コードを共有するために、共通ロジック用に別のプロジェクトを作成し、gitのサブプロジェクトを使用してコードを他の2つのプロジェクトに「インポート」しました。

これで、html5ベースのプロジェクトで正常に機能します。これは、次のようにしてコードを含めることができるためです。

<script src="common/js/comms.js" type="text/javascript"></script>

ただし、ノードでは、コードを取得しようとして問題が発生しました。コードを取得するために、私は次のことを行うことになりました。

var fs = require('fs');
eval(fs.readFileSync('./common/js/comms.js').toString());

私が採用したアプローチは機能しますが、依存関係があると(a.jsが必要な場合はx.js、y.js、x.jsが必要です)、非常に厄介になり始めていることに気付きました。これらのエンティティのいずれかを使用したいすべての単一のnode.jsjsファイルに対してそれを行う必要があります。

私もこのevalアプローチを使うのは苦手です。strictモードを使用したいのですが、セキュリティ上の問題はありません。evalモードとstrictモードは、油と水のように連携することを理解しています。

だから私の質問は、htmlプロジェクトとnode.jsプロジェクトの間に共有jsファイルを含めるための最良の方法は何ですか?私は厳格に従うものを好みます。

このトピックに関してはいくつかの質問がありますが、私が提起している特定の問題に対処する質問は見つかりませんでした。また、「サーバー」からファイルを「提供」したくないことも付け加えておきます。HTML5クライアントは「スタンドアロン」になります。


明確にするために、「一般的なjsファイル」にあるのは次のようなものです。

var Comms = function (options) {
   ...
}

HTML5では、参照はviaを介して行うことができnew Comms()ます。これは、node.jsでも実行したいことです。

4

2 に答える 2

5

ノードモジュールがどのように機能するかを調査しましたか?このパターンを使用して開発している場合はrequire('./common/js/comms')、クライアントにも含めながら、サーバーで使用するのはかなり簡単です。

この記事はあなたを正しい方向に向けるべきです:https ://caolan.org/posts/writing_for_node_and_the_browser.html


以下は、タイラーが以下のコメントでリンクしているコードです。

例(example.js):

if(typeof exports == "undefined"){
    exports = this;
}

Example = function() {
    this.init();
};

Example.prototype = {
    init: function() {
         console.log('hello world');
    }
};

exports.Example = new Example();

example.js(app.js)のnode.jsの使用法:

example = require('./example');

example.js(index.html)のhtmlの使用法:

<html>
    <head>
        <title></title>
    </head>
    <body>
        <script src="./example.js"></script>
    </body>

OPによる変更は、新しいインスタンスではなくに割り当てるexports.Exampleことでした。Exampleしたがって、node.jsロジックは以下を使用できます。

var Example = require('./example.js').Example;
var foo = new Example();

したがって、元の質問は解決されます。

于 2013-01-25T23:48:21.420 に答える
1

nodeJSモジュールを見てください。

comm.jsにあります:

module.exports = function(/* any dependency? */){
   // things
   // you can return some object
}

ファイルにはcomm.jsが必要です

require('./common/js/comm.js')();
// or you can assign it to a variable if it returned something

お役に立てば幸いです。

于 2013-01-25T23:48:59.783 に答える