最初に考えていたものではありませんが、さまざまなビルド環境で解決策を見つけました。
私の場合、Node のhttp
、https
、querystring
および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 のときに異なるビルド環境を作成するなど、他のソリューションがあるかどうかはまだ興味があります。