LoginSignup
0
0

More than 5 years have passed since last update.

node_modulesの参照とinstanceof

Posted at

instanceofはプロトタイプを===演算子で比較するので、別のnode_modulesを有するディレクトリからimportすると期待通り動かない、という話です。

npm installで外部のパッケージをインストールすると直下のnode_modulesにダウンロードされその中のものが参照されます。

npm install some-package
test.js
import SomePackage from 'some-package'

ここで、some-package自体を一時的に変更したい事案が発生し、some-packageのソースをPULLしてきて参照先を相対パスに変更しました。

test.js
...
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に公開してあるライブラリを変更したい時、たまに、この相対パスで外側のライブラリを読む手法を一時的に使っていたのですが、気をつけないといけないですね。

0
0
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
0
0