Ich frage mich nur, welches der beste Weg ist, den Import zu verwenden:
import { bar, bar2, bar3 } from './foo';
GEGEN:
In Bezug auf die Effizienz verwende ich zum Beispiel webpack zum Bündeln aller JavaScript-Dateien. Wird der erste tatsächlich alles importieren, obwohl ich sie nicht im Hauptcode verwende?
mögliches Duplikat von Ist die Verwendung eines ES6-Imports zum Laden bestimmter Namen schneller als das Importieren eines Namespace?
– Bergi
Benutzer-Avatar
Tamas Hegedus
Wenn Sie webpack mit der vom neuen uglify bereitgestellten Eliminierung von totem Code oder rollupjs mit Tree-Shaking verwenden, werden die nicht verwendeten Importe entfernt. moduleB.fooIch stimme dem Airbnb-Styleguide teilweise zu, Wildcard-Importe nicht zu verwenden, obwohl Javascript-Wildcard-Importe nicht unter den gleichen Krankheiten leiden wie beispielsweise Pythons oder Java-Wildcard-Importe, nämlich nicht den Bereich mit Variablennamen verunreinigen, die in anderen Modulen definiert sind (you kann nur über darauf zugreifen foo nicht import * as moduleB from ...beim Benutzen
).
Zum Artikel zum Testen: Ich verstehe die Bedenken einigermaßen, sehe aber nichts, was dort nicht gelöst werden könnte. Sie können die Importe selbst mit einem benutzerdefinierten Modullader verspotten (ein benutzerdefinierter AMD-Modullader umfasst buchstäblich 15 Codezeilen), sodass Sie sich nicht mit dem lokalen Bereich des getesteten Moduls herumschlagen müssen. import * as Foo from './foo'wenn ich Foo.barund ich benutze nur Foo.bar2 Wille Foo.bar3 und
als toter Code eliminiert werden?
– brietsparks
23. Oktober 2018 um 15:41 Uhr Foo.bar2 @bsapaka Ja, wenn Foo.bar3 und
kommen gar nicht zum Einsatz.
– Tamas Hegedus
23. Oktober 2018 um 16:10 Uhr
Wo kann ich mehr darüber lesen? Zum Beispiel offizielle Dokumente oder Github-Issues-Threads.
– Jason Kuhrt
26. Oktober 2018 um 1:21 Uhr
Zu diesem Teil der Frage:
Wird der erste tatsächlich alles importieren, obwohl ich sie nicht im Hauptcode verwende?
So wird es mit Babel 6.26 kompiliert:
import { bar, bar2, bar3 } from './foo';
Genannt
'use strict';
var _foo = require('./foo');
… wird …
import * as Foo from './foo';
Platzhalter
'use strict';
var _foo = require('./foo');
var Foo = _interopRequireWildcard(_foo);
function _interopRequireWildcard(obj) {
if (obj && obj.__esModule) {
return obj;
} else {
var newObj = {};
if (obj != null) {
for (var key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key))
newObj[key] = obj[key];
}
}
newObj.default = obj;
return newObj;
}
}
… wird … requireIn beiden Fällen wird die gesamte Datei durch importiert
. _interopRequireWildcard Bei Wildcard-Importen, an
-Funktion wird definiert und verwendet, um alle Exporte der Namespace-Variablen zuzuweisen. _interopRequireWildcard Es ist erwähnenswert, dass kompilierter Code nur eine einzige enthält require Definition und ein Aufruf an _interopRequireWildcard und
für jeden Import.
Letztendlich erfordert die Verwendung von Wildcard-Importen etwas mehr Verarbeitung zur Laufzeit und führt zu einer leichten Vergrößerung der kompilierten js.
Wäre toll zu sehen, ob dies für Webpack 4 mit seiner Tree-Shaking-Funktion gilt
– Kostjantyn Ko
12. September 2018 um 13:24 Uhr
Der Overhead ist in babel, es gibt keinen Overhead, wenn Sie rollupjs verwenden.
– Tamas Hegedus
13. Juli 2021 um 11:41 Uhr
Da die beiden mit einem modernen WebPack-Setup dasselbe kompilierte/transpilierte JS generieren, liegt der wahre Wert benannter Importe darin, wie viel ausdrucksstärker es ist. Indem Sie Ihre Importe benennen, sagen Sie jedem, der die Datei öffnet, welche Funktionen eines Moduls Sie verwenden werden. Ein Beispiel dafür, wo dies hilfreich sein kann, ist das Schreiben von Tests. Wenn Mocking erforderlich ist, haben Sie eine explizite Liste von Importen zum Mocking.
Ich stimme @Tamas zu. import * as Foo from './foo';
Wenn Sie vollen Zugriff auf alle Exporte in der Zieldatei benötigen, können Sie die import foo from './foo':
.
mögliches Duplikat von Ist die Verwendung eines ES6-Imports zum Laden bestimmter Namen schneller als das Importieren eines Namespace?
– Bergi