instanceofはプロトタイプを===
演算子で比較するので、別のnode_modules
を有するディレクトリからimportすると期待通り動かない、という話です。
npm install
で外部のパッケージをインストールすると直下のnode_modules
にダウンロードされその中のものが参照されます。
npm install some-package
import SomePackage from 'some-package'
ここで、some-package
自体を一時的に変更したい事案が発生し、some-package
のソースをPULLしてきて参照先を相対パスに変更しました。
...
import SomePackage from '../some-package'
するとSomePackage内で読み込んでいる別の外部パッケージ(具体的にはselenium-webdriver)の中でinstanceofを使っているところがエラーでこけました。
呼び出し元とエラーは下記のような感じです。
return this.driver.wait(until.elementLocated(locator), this.waitElementTimeout)
Wait condition must be a promise-like object, function, or a Condition object
until.elementLocated(locator)
の返り値はWebElementCondition
なので本来この部分でIF文がtrueになるはずですが、同じクラスでも別の参照なのでinstanceof
がtrueにならずエラーになっていたようです。
自身のnode_modulesからではなく、独自にnode_modulesを持った'../some-package'からimportすると、'SomePackage'の中でインポートされるimport webdriver from 'selenium-webdriver'
は../some-package/node_modules
の中を参照するのはなんとなく知っていたのですが、some-package
側ではwebpackでes6から変換していて、selenium-webdriver
はwebpackでexternalsに指定してあったので、しばらく気づきませんでした。instanceofがprototypeの同一性を比較してるという話もあまり意識してませんでしたね。
npmに公開してあるライブラリを変更したい時、たまに、この相対パスで外側のライブラリを読む手法を一時的に使っていたのですが、気をつけないといけないですね。