文字列補間。 おとぎ話が叶う

問題の声明



偶然にも、私はパイオニストからJS開発者になりましたが、JSには存在しなかった圧倒的な負荷が、壊れやすい子供の精神に落ちました。 たとえば、文字列の便利な書式設定はありません。 Pythonでは次のように書くことができます:

'hello, %(thing)s' % {'thing': 'world'}
      
      





またはこのように:

 'hello, {thing}'.format(**{'thing': 'world'})
      
      









JSの最も近い類似体は連結( operator +



)です。これは、行の長さが長くなるとスケーリングが非常に悪くなり、限界まで見苦しくなります。

 '<div class="input-append"><input type="text" name="username" '+ 'id="signup_username" placeholder="'+placeholder+'"><input '+ 'type="hidden" name="password" value="'+generated+'"><button '+ ...
      
      





可能であれば、これを避けたいと思います。



Jeremy Ashkenasは、CoffeeScriptの開発時に、JSのこの機能、および偶然にPHPの方言にも注意を向けました。

 "hello, #{document.cookie}"
      
      





これも悪いです。文字列リテラルに対してのみ機能するだけでなく、ファイルからテンプレートをロードするためには機能しません。



私はこの点でRubyのような構文が好きですが、他のすべて、特に文字列内の任意のコードの実行が好きではありません。 したがって、問題のステートメント:

-関数を書く

-変数を文字列に置き換えます

-ファイルからロード

-PHPではない


ソリューションを検索する



通常、このような場合、既製のライブラリが使用されます。さらに、NPMでは、単語テンプレートによると、2,000を超えるパッケージがあります。



実際、口ひげまたはlodash(underscore.js)は正常に機能しますが、...非常に遅い:ルックアップあたり10〜20μs。 ループやフィルターなどの「高度な」機能が絶対に必要ない場合は特に、夢の限界ではありません。



しかし、連結は、動物の集団主義のニヤリのように恐ろしく見えますが、それでも10〜30倍速く動作します。 したがって、問題のステートメントに追加します。

-連結に変換します

-そして非常に高速に動作します


これで、この仕様に従って、車輪を再発明できます。 理由はありません。



どうした



私はこのようなものを得ました: Rubyのような単純な文字列補間(GitHub)



9行のコードがあり、口ひげが130,000で、ダッシュ/アンダースコアが45,000である同じマシン上で、毎秒100万の30万回の置換(置換あたり約0.77マイクロ秒)を実行します。

 var hello = fmt('hello, #{thing}') hello({thing: 'world'}) // -> hello, world
      
      





結論:テンプレートエンジンの複雑な機能(ループ、条件式)の拒否により、テンプレート内の任意のコードの実行に頼ることなく、一般的なライブラリと比較して10〜30倍の高速化が達成されました。



Rssi.jsは、 npm install rssi



からインストールできますnpm install rssi



bower install rssi



)もサポートされています。 クライアント側では、AMD(RequireJS)を使用できますが、使用することはできません。







一貫性のないテキストを読んでくれてありがとう! パッチ、紳士、良いものを書いて、すぐに会いましょう。



All Articles