LoginSignup
3
3

More than 5 years have passed since last update.

直接requireされているreact-jadeのファイルをwatchifyできるようにする

Posted at

対象バージョン

react-jadeのインライン展開

react-jadeはbrowserify用のtransformを提供しており、jadeファイルをコンパイルして生成したjsコードをsubstack/brfsと同じようにインライン挿入することができます。

watchifyにjadeファイルの変更が伝わらない

substack/brfsと同じようにwatchifyによる差分更新をしたいのですが、現状のreact-jadeが提供するbrowserify用のtrasformは'file'イベントを発火しないため、watchifyがjadeファイルの変更を探知してくれません。そのためjadeファイルを編集するたびに、それをrequireしているjsファイルも更新(もしくはtouch)しなければなりません。

自分で書く

react-jadeのtransformがfileイベントを発火するように修正してもいいですが、自分が欲しいのはcomfileFileだけだったのでスクラッチで小さいtransformを書いてみました。

var reactJade = require('react-jade');
var staticModule = require('static-module');
var path = require('path');

module.exports = transform;

function transform(file) {
  var modules = {
    "react-jade": {
      "compileFile": compileFile,
    },
  };
  var vars = {
    __dirname: path.dirname(file)
  };
  var sm = staticModule(modules, {vars: vars});
  return sm;

  function compileFile(file, localOptions) {
    sm.emit('file', file); // これが必要
    return reactJade.compileFile(file, localOptions);
  }
}

static-moduleはjsコードを構文解析した上で特定モジュールの関数呼び出しを静的に評価しインライン展開します。上の例では、"react-jade"というモジュールのcompileFile関数を呼び出している文があれば、そこだけ静的に評価します。その静的評価の中でfileイベントを発火するように書けばwatchifyに依存ファイル情報が追加されます。

jadeファイル間の依存は未対応

記事タイトルの通りこの実装はjsコードからrequireされているjadeファイルだけwatchします。つまり、jadeファイルからincludes構文などで参照されているjadeファイルには対応出来ていませんので注意してください。(jadeのcompileClientWithDependenciesTrackedのようにjadeファイル間の依存を簡単に取得出来ればいいのですが...)

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3