プログラミング

プログラミング

【これで解決!】Nodeとbrowserの両方に対応したJavaScriptのパッケージの書き方

812 views

Nodeとbrowserの両方に対応したJavaScriptのパッケージを書くことに関して、多くの混乱が発生しています。

熟練したJavaScriptの開発者でさえ細部を間違える可能性があります。そこで簡単なチュートリアルを作成しました。

 

 

 

JSパッケージを構築しましょう

まず、“base64-encode-string”という小さいJavaScriptパッケージを書きます。

Browser用は簡単です。単にビルドイン関数である”btoa”ファンクションを使います。

 

 

Nodeには“btoa”ファンクションがありません。そこで、“Buffer”を作り、“buffer.toString()”で呼び出します。

  

 

 

どちらも、正しいbase64-encoded バージョンのStringを規定する必要があります。

 

 

 

次に、browserなのかNodeなのかを決めるコードを書きます。
 

そしてファイルを、“index.js”、タイプ“npm publish”とします。この実装でも動きますが、パフォーマンス問題が出てきます。“index.js”ファイルがNodeのビルドイン“プロセス”と“Buffer”モジュールを含んでいることから、BrowserifyとWebpackは自動的にポリフィルを含むためです。
 

 

   
 
 

 

“browser”フィールド

この問題の解決策を調べると、“node-browser-resolve”に行きつくと思います。これは“package.json”中の“browser”フィールドの仕様で、browser用に構築している時に除かれるべきモジュールを定義してくれます。

このテクニックを用い、以下を”package.jason”に追加します。


 
 
 
 

そしてファンクションを2つのファイルに分けます。”index.js”と”browser.js”です。
 


 
 

こうすることでバイト数が大幅に減少します。

パッケージをnpmに公開したときに、Node中の“require(‘base64-encode-string’)”がNodeバージョンを呼び、そしてBrowserify又は Webpackを利用している場合はbrowserバージョンとなります。成功です!
 

   
 
 

 

  
 
 
 
 

高度なテクニック

より大きなプロジェクトの場合、以下のように”package.json”とコードベースがの組合せがおかしくなってしまうことがあります。
 

そのため、browserに特化したモジュールを作りたいときは毎回、二つのファイルを作成する必要があります。
そして”browser”フィールドに一行追加し、二つのファイルを結びつけます。

本記事にて使用したプロジェクトはnpmにて公開されています。ソースコードはGitHub上で入手可能です。

 

 

 

 

 

 

 

※本稿は「How to write a JavaScript package for both Node and the browser」を翻訳・再編集したものです。

関連記事

おすすめ記事