問題の声明
偶然にも、私はパイオニストから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)を使用できますが、使用することはできません。
一貫性のないテキストを読んでくれてありがとう! パッチ、紳士、良いものを書いて、すぐに会いましょう。