12

http私は、主に特定の JSON API のラッパー (ノードとモジュールを使用) でhttpsあるノード NPM パッケージを開発しました。querystringこれは Coffeescript で構築されており、Node.js サーバーがこの API と通信できるようにします。API は主に REST です。

今、このライブラリをブラウザでも利用できるようにしたいと考えています。これは、モジュールへの呼び出しを(非同期)httpに置き換える必要があることを意味します。XMLHttpRequestアダプターのラッパーを作成するようです。ノード環境の場合、このアダプターはすべての呼び出しをhttpモジュールに渡し、ブラウザー環境の場合はXMLHttpRequestオブジェクトに渡します。

npm パッケージに両方のバージョンが含まれるようにビルド システムを作成する良い方法はありますか? その後、node パッケージは 経由で利用可能にrequire('package-name')なり、JS ファイル (ブラウザ用) をディレクトリに配置する必要があります。

クライアント側のパッケージ管理に適したComponentを調べましたが、さまざまなビルド環境を作成する方法に問題が残っています。

4

4 に答える 4

5

browserify を使用した node.js とブラウザーのクロス開発のサンプル ソリューション: https://github.com/amitayd/grunt-browserify-jasmine-node-example (および私のブログ投稿での議論) 。

具体的には、Browser/Node.js のさまざまな実装を確認するには、PersistentReaderWriter.jsを確認してください。

browserify での作業を開始するためのテンプレートを作成し、いくつかの落とし穴に気付いたら、それを小さなライブラリにも使用したいと思うかもしれません。

編集: モジュールを browserify する場合、isBrowser() チェックは、module と module.exports が定義されているかどうかをチェックすることによって行うべきではないことに注意してください。Browserify のラッパーはそれらをモジュール コンテキストで定義するためです。代わりに、私の例では、ウィンドウが定義されているかどうかを確認します。

于 2013-05-16T23:54:57.787 に答える
0

最初に考えていたものではありませんが、さまざまなビルド環境で解決策を見つけました。

私の場合、Node のhttphttpsquerystringおよびurlパッケージを使用するかなり小さなライブラリがありました。小さな api-library にこれらすべてのパッケージをバンドルするのは適切ではないように思えたので、Browserifyのようなものは使いたくありませんでした。代わりに、httpおよびhttps機能をXMLHttpRequestパッケージに置き換えました。querystringおよびによって提供される小さな機能は、url簡単に書き直すことができます。

私のライブラリでは、window.XMLHttpRequestオブジェクトが利用可能かどうかを実行時にチェックします。その場合は、その (ネイティブ) オブジェクトを使用します。それ以外の場合は、パッケージによって提供されるものを使用します。そのような:

_getRequestObject: () ->
  if window? and window.XMLHttpRequest?
    return new window.XMLHttpRequest()

  if window? and window.ActiveXObject?
    try
      request = new ActiveXObject('Msxml2.XMLHTTP')
    catch e
      try
        request = new ActiveXObject('Microsoft.XMLHTTP')
      catch e

  XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest
  return new XMLHttpRequest()

もう 1 つの問題はexports、ブラウザーで定義されていないことでした。この動作をシミュレートするパッケージがありますが、ライブラリを肥大化させたくありませんでした。moduleそのため、変数が設定されているかどうかを再度実行時に確認します。もしそうなら、私が定義したオブジェクトはそれに設定され、そうでなければwindowオブジェクトに設定されます:

if typeof module is 'undefined'
  window['My-module'] = My_module_object
else
  module.exports = exports = My_module_object

ブラウザ環境に存在しないNode.jsの実際に必要な依存関係がないため、これはすべてうまくいきます。大規模なプロジェクトではBrowserifyのようなソリューションが本当に必要なのではないかと心配していますが、Node.js のライブラリをパッケージ化するときや (例) Bower のときに異なるビルド環境を作成するなど、他のソリューションがあるかどうかはまだ興味があります。

于 2013-05-10T07:49:25.490 に答える