2016-08-29 2 views
4

Ich bin mit einem Javascript-System gebaut (ich glaube?) Auf ES6 kompatibel Javascript arbeiten, die zu kompatibelem Browser Javascript (if it matters Wordpress Calypo,), einen Weg zu reflektieren in die BerufungES6 und "Wer hat mich importiert"?

Hat moderner Javascript transpiled nach unten zusammengestellt/sind Kontext? Anders gesagt, wenn ich ein Javascript-Modul foo habe

#File: foo/index.js 
//...lots of code... 
export default() => { 
    //...more code... 
} 

Gibt es eine Möglichkeit zu sagen, zur Laufzeit, das andere Javascript-Modul und/oder Datei meines „foo“ Modul importiert? Wenn dies nicht möglich ist, gibt es einen allgemeinen Weg, dies mit der statischen Analyse zu tun. Wenn meine Frage keinen Sinn ergibt, weil ich eine falsche Annahme gemacht habe (das wahrscheinlichste Szenario), würde ich diese Annahme gerne korrigieren.

+0

Ich glaube an die Laufzeit gibt es keine "Modul" oder "Datei" existiert. – zerkms

+1

Dies ist völlig unmöglich, da ein Modul in mehrere andere Module importiert werden kann, die zu beliebigen Zeiten geladen werden können. – Bergi

+0

Klingt ein bisschen wie ein X/Y-Problem - können Sie etwas genauer beschreiben, was Sie zu tun versuchen? Es kann einen anderen Weg geben, um darüber zu gehen. –

Antwort

4

tl; dr: Nein und nein.

Es gibt keine Möglichkeit für einen bestimmten Teil von ES6 Javascript, um festzustellen, wie es geladen wurde. Über das Beste, was Sie tun können, ist das Laden von Javascript. Sagen Sie dem geladenen Javascript, wie der Loader damit umgegangen ist.

Statische Analyse kann Ihnen nicht 100% der Zeit mitteilen, ob ein bestimmter Codecode ausgeführt wird und Ihnen daher nicht 100% der Zeit mitteilen kann, wenn eine bestimmte Datei geladen wird. (Dies bezieht sich auf die halting problem.) Das heißt, 100% Erkennung ist selten erforderlich, da Dateianforderungen selten bis zu dem Grad verdeckt werden, der notwendig ist, um sie zu verstecken. Ich weiß jedoch nicht, dass es ein statisches Analyse-Tool gibt, das die komplexeren Versionen gängiger Javascript-Ladetechniken abwickeln kann, da die Code-Ersteller normalerweise bereits wissen, unter welchen Umständen sie den fraglichen Code geladen haben.

+0

Danke! Wenn dies in Browser JavaScript übersetzt/kompiliert wird, gibt es ES 5 oder darunter Konstrukte, die in der Lage wären, dies zu reflektieren? Browserspezifische Dinge zum Einlesen in einen Callstack und zum Reverse Engineering des Importmoduls interpretieren? –

+0

@AlanStorm Über das Beste, was Sie bekommen, ist 'argument.callee' in ES5 (aber nicht im' strict' Modus). Obwohl Sie möglicherweise etwas mit Stack-Traces tun können. Theoretisch könnten Sie eine Exception auslösen/abfangen und dann programmatisch in die darin aufgeführten Aufrufe eintauchen. – Ouroborus

+0

@zerkms Ich sehe kein Mittel, mit dem das importierte Modul erkennen kann, wie/wo es über 'import' importiert wurde. Das importierte Modul kann möglicherweise erkennen, dass es importiert oder geladen wurde, aber ich glaube nicht, dass es weiter geht. In jedem Fall ist es möglich, ein 'eval' zu erstellen, das ein Modul so importiert, dass es von der statischen Analyse ausschließt, ob der Import tatsächlich stattfindet (entweder in einer angemessenen Zeit oder überhaupt). – Ouroborus