blog

Browserify と browserify-shim でグローバルオブジェクトを扱う

    • Ryuichi Nonaka

    はじめに

    script タグや Sprockets で依存関係を管理していたところから Browserifywebpack などの CommonJS ベースのモジュール管理に移行する過渡期に jQuery や jQuery Plugins などのグローバルオブジェクトを Browserify ではどのように扱うのかについて覚えたことをメモしておきます。

    CommonJS ベースのモジュール管理については末尾の参考サイトを読んでみてください。

    環境

    以前に書いた Browserify の記事 Gulp から Watchify と Browserify を使う を参考に、 Gulp と Browserify の環境を用意します。また、グローバルオブジェクトの扱い方については jQuery を使って試します。

    npm の jQuery を require する

    まずは、シンプルに jQuery を require してみます。これだけであれば特に難しいことはなく、$ npm install --save jquery をして require するだけです。jQuery プラグイン等も基本的には npm にあるものを使っていくのが良さそうです。

    var $ = require('jquery');
    
    $(function(){
      console.log($('body'));
    });
    

    ただ、この手法だと bundle.js に jQuery 本体も含むことになるためファイルサイズが大きくなってしまいます。できればCDNを活用したいところです。

    browserify-shim を使ってグローバルオブジェクトを require する

    jQuery 本体は別ファイル(CDNを含む)で読み込ませ、グローバルオブジェクト($)を require できればファイルサイズの問題は少しだけマシになるかもしれません。それを実現するのが browserify-shim です。

    browserify-shim は グローバルオブジェクトを require できるモジュールにしてくれます(Shimとは詰め木のこと)。

    browserify-shim のインストールと設定

    npm から browserify-shim をインストール $ npm install --save-dev browserify-shim します。インストールしたら package.json に browserify-shim を使うためのおまじないを追加します。transform というのは 様々なものを Browserify で扱えるように変換するためのモジュールのことです。これで準備ができました。

      "browserify": {
        "transform": [ "browserify-shim" ]
      },
    

    グローバルオブジェクトをモジュール化する

    適当に JavaScript を作成し、hoge というグローバルオブジェクトを用意します。私の場合は面倒なので slim ファイルに script タグを定義しました。

    javascript:
      var hoge = "HelloWorld!";
    

    package.json に browserify-shim を定義します。グローバルにある hoge オブジェクト(global:hoge)を hoge という名前でモジュールに変換します。

      "browserify-shim": {
        "hoge": "global:hoge"
      },
    

    あとは hoge モジュールを require('hoge') して コンソールに出力してみます。コンソールに HelloWorld! と出力されていれば成功です。

    var hoge = require('hoge');
    
    console.log(hoge);
    

    CDN の jQuery を使う

    グローバルオブジェクトをモジュール化することで script タグで読み込んだ CDN の jQuery などをモジュールとして require できるようになります。browserify-shim は CDN の JavaScript が グローバルオブジェクトにできるのを待って処理してくれるようになっているのでその点も安心です。

      "browserify": {
        "transform": [ "browserify-shim" ]
      },
      "browserify-shim": {
        "jquery": "$"
      },
    
    require('jquery');
    
    $(function(){
      console.log($('body'));
    });
    

    カスタムした jQuery を require したい

    カスタムした jQuery (不要な機能を省いたりしたもの)を require したいときは Browser field (差し替え)を使います。 Browser field を利用するには package.jsonbrowser field を追加し、差し替える対象ファイルを指定します。

      "browserify": {
        "transform": [ "browserify-shim" ]
      },
      "browser": {
        "jquery": "./hoge/jquery.js"
      },
      "browserify-shim": {
        "jquery": "$"
      },
    

    終わりに

    Browserify は CommonJS ベースのモジュール管理に慣れるのにちょうど良いツールな気がしました。比較的小規模なプロジェクトで使いつつ、大規模なプロジェクト向けに webpack を勉強していこうと思います。

    参考サイト

    コメント・フィードバック