Open teramotodaiki opened 8 years ago
require.jsを使わず、es2015 modulesをエミュレートしてみては?
手法は同じでよくて、あらかじめ [name]: { ...data } を登録しておき、raw:string から /import (.*);/m
でマッチングして依存関係をあらかじめ明らかにしておく。
このときNamed importかDefault importかで扱いが変わる。es2015 modulesではcyclic dependenciesをサポートすべきとし、後から値を埋めることも出来るとしているため、Default importの場合、依存先スクリプトの実行を 必ずしも待たなくてよい (要検証…値がプリミティブの場合は解決すべきだ)。一方、Named importの場合、構造がStaticに解決していなければならないため、依存先のスクリプトは必ず解決させる必要がある。
スクリプト実行のとき、export構文を一時的に独自構文に変換し、exportされた値を保持できるようにする。import構文は一時的に生成したオブジェクトの参照に切り替える。このオブジェクトはmutableで、依存先のスクリプト等の影響で後から値が変わることがある。つまり、1つのスクリプトごとに1つの親オブジェクトがある。
依存の最上位から順番にevalする。依存の中にあるすべてのスクリプトを実行するまで続ける。同じスクリプトを2度実行することは決してない(要検証)。
疑問:依存解決の順番によって結果が変わることはないか?
WebPackのやり方が一番近い気がする(ただしバンドルすることはない)
Circular dependency の解決には rollup のような手段が必要
rollup instead of require.js
ただし、そのばあい require は使えなくなる
CommonJS will be... ??
Which is better
require
orimport
?