So verwenden Sie ES6-Module über die Dev-Tools-Konsole

Lesezeit: 6 Minuten

Wenn ich ein ES6-Modul erstelle, kann ich es meines Wissens nur aus Code importieren, der selbst ein Modul ist. Dies bedeutet, dass Nicht-Modulcode, z. B. Inline-Javascript, oder die Chrome Dev Tools-Konsole niemals auf Code zugreifen können, der sich in einem Modul befindet.

Ist das wahr? Gibt es eine Möglichkeit, dies zu umgehen, denn es scheint eine ziemlich extreme Einschränkung zu sein?

Sie können verwenden dynamischer Import in der Chrome-Konsole.

import('path/to/module.js').then(m => module = m)

// [doSomething] is an exported function from [module.js].
module.doSomething()

  • Welcher Pfad muss im Falle einer Webpack-Umgebung mit a verwendet werden node_modules Verzeichnis? Ich kann keine Kombination von Dingen zum Laufen bringen

    – T3db0t

    14. Januar 2020 um 19:55 Uhr

  • Was möchten Sie importieren? Ein ES6-Modul oder ein von Webpack erstelltes Ausgabeskript? Wenn es sich um Letzteres handelt, bei dem es sich nicht um ein ES6-Modul handelt, glaube ich nicht, dass es funktionieren wird.

    – Verwandtschaft

    18. Januar 2020 um 2:04

  • ES6-Modul. In diesem Fall versuche ich nur, Ideen damit zu testen immutabledas lokal in installiert ist node_modules. Ich weiß einfach nicht, welchen Pfad ich verwenden soll import Funktion

    – T3db0t

    20. Januar 2020 um 16:28

  • Als leichte Verbesserung können Sie in modernen Browsern Folgendes tun const m = await import('path/to/module.js');

    – John

    5. November 2020 um 1:27

  • Mit Skypack gibt es ein praktisches CDN, mit dem Benutzer dies ganz einfach tun können, ohne sich den Aufwand für das Herunterladen von NPM sparen zu müssen.

    – Cachius

    7. Mai 2022 um 16:05 Uhr


Carls Benutzeravatar
Carl

Sie können die Funktion oder Variable mit einer Zeile wie im globalen Namensraum registrieren window.myFunction = myFunction oder window.myVariable = myVariable. Sie können dies im Modul tun, wo myFunction oder myVariable deklariert werden oder dies in einem separaten Modul tun, in das sie importiert wurden.

Sobald Sie dies getan haben, können Sie es verwenden myFunction Und myVariable über die Chrome DevTools-Konsole.

Zum Beispiel:

import myModule from '/path/to/module.js';
window.myModule = myModule;

// in the console:
myModule.foo();

(Dank an @Evert, dass er diese Lösung in einem Kommentar bereitgestellt hat, wenn auch auf eher umständliche Weise, für die ich eine Weile gebraucht habe, um sie herauszufinden.)

  • Um es klarzustellen, schreiben Sie das import (Und window.myModule)-Anweisungen in Ihrer HTML-Datei. Navigieren Sie zu dieser Seite. Dann öffnen Sie die Konsole und verwenden Sie myModule.

    – Richard

    5. Februar 2020 um 15:28

  • Das ist Liebe. Vielen Dank für die Übermittlung.

    – Rico Rodriquez Collins

    16. Okt. 2020 um 17:46 Uhr

  • Ich konnte es nicht verwenden window.myModule Ich musste die Array-Syntax verwenden, damit dies funktionierte. import * as operators from 'rxjs/operators'; window['operators'] = operators;

    – Jmaurier

    6. November 2020 um 17:23

  • Ich habe das schlechte Gefühl, dass das so gut ist, wie es nur geht. Na ja, erledigt die Arbeit. Danke!

    – Jason Stewart

    18. November 2021 um 7:19 Uhr

Benutzer-Avatar von David Foster
David Foster

Du kannst erwarten A dynamischer Import in der Chrome-Konsole:

const Module = await import('./path/to/module.js')
Module.doSomething()

Dieser dynamische Import entspricht in etwa:

import * as Module from './path/to/module.js';
Module.doSomething()

Es gibt eine Möglichkeit, die Chrome Dev Tools mit ES6-Modulen zu verwenden, sofern Sie diese verwenden VSCode und das Javascript-Debugger für Chrome. Ich hatte einige Mühe, es zum Laufen zu bringen, aber es hat sich gelohnt.
https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome

Der VSCode-Debugger startet ein neues Chrome-Fenster, das mit dem VSCode-Debugger verbunden ist. Sie können in diesem Fenster auch wie gewohnt Chrome Dev Tools (F12) verwenden. Es funktioniert mit ES6-Modulen und Sie können Haltepunkte setzen, die Konsole verwenden, Variablen überprüfen usw.


Falls Sie Probleme beim Einrichten des Debuggers haben, funktioniert es bei mir folgendermaßen:

  • Gehen Sie zum VSCode-Debug-Fenster (CTRL+SHIFT+D) -> auswählen Add Configuration Aus Dropdown -> Auswählen Chrome Launch oder Chrome Launch Legacy „launch.json“ ändern

meine launch.json:

{
  "name": "Launch Chrome Legacy",
  "type": "chrome",
  "request": "launch",
  "url": "http://localhost:5000/auth/login",
  "webRoot": "${workspaceFolder}",
  "sourceMaps": true
},
{
  "name": "Launch Chrome",
  "request": "launch",
  "type": "pwa-chrome",
  "url": "http://localhost:5000/auth/login",
  "webRoot": "${workspaceFolder}",
  "sourceMaps": true
},

Der Schlüssel lag in der Verwendung "sourceMaps": true Und "url": "http://localhost:5000/auth/login" anstatt http://localhost:5000/blog", das ist die Seite, die ich eigentlich debuggen möchte. Als der Debugger jedoch das neue Chrome-Fenster öffnete, wurde meine Seite weitergeleitet /auth/loginalso musste ich diese URL verwenden.

  • Sie können versuchen, die Vorschauversion des neuen Debuggers zu deaktivieren und die zu verwenden Legacy Version stattdessen: Ausschalten Debug › JavaScript: Use Preview in den VSCode-Einstellungen.
  • Dann renne Launch Chrome Legacy aus dem Debug-Fenster in VSCode
  • Um Haltepunkte in VSCode festzulegen, öffnen Sie das Javascript-Modul von Loaded Scripts

Sie können Funktionen, die in Javascript-Modulen enthalten sind, über die Chrome-Entwicklerkonsole aufrufen, indem Sie den Import verwenden, wie in der Antwort von @Kin.

Wenn Sie die Fehlermeldung „TypeError: Modulspezifizierer konnte nicht aufgelöst werden“ erhalten, versuchen Sie, die vollständige URL für die Moduldatei zu verwenden. Unter Windows 10 mit lokal ausgeführtem IIS und Chrome 87 funktioniert dies beispielsweise für mich:

// Call doSomething(), an exported function in module file mymodule.js
import('http://localhost/mysite/myfolder/mymodule.js').then((m) => { m.doSomething(); });

Benutzeravatar von Lionel Rowe
Lionel Rowe

Einige etwas ergonomischere Versionen mit Übereinstimmung zwischen den verschiedenen Importarten:

// import { namedExport1, namedExport2 } from 'https://example.com/lib.js'
const { namedExport1, namedExport2 } = await import('https://example.com/lib.js')

// import defaultExport from 'https://example.com/lib.js'
const { default: defaultExport } = await import('https://example.com/lib.js')

// import * as mod from 'https://example.com/lib.js'
const mod = await import('https://example.com/lib.js')

Everts Benutzeravatar
Evert

Sie können ein Modul nur aus anderen Modulen importieren, weil import ist eine Modulfunktion.

Wie haben Sie vor ES6 Module „importiert“? Du hast es nicht getan, weil es nicht existierte. Sie können tatsächlich mit einem E6-Modul genauso interagieren, wie Sie es mit der Interaktion zwischen zwei unabhängigen Nicht-Modul-Skripten getan haben.

  • Ah, wenn ich also ein Modul aus Nicht-Modulcode verwenden möchte, entferne ich grundsätzlich das type="module" von dem <script>?

    – Timmmm

    29. September 2018 um 16:00 Uhr

  • Das ist nicht nötig. Wenn Sie vor den Modulen zwei Javascript-Funktionen hatten. Wie würden Sie das eine vom anderen anrufen? Globals.

    – Evert

    29. September 2018 um 16:01 Uhr

  • Ok… also wie lade ich das Modul (oder eine Funktion aus dem Modul) in ein globales?

    – Timmmm

    29. September 2018 um 16:15 Uhr


  • Wenn Sie keine Kontrolle über das Modul haben, das Sie laden, können Sie eine separate es6-Moduldatei schreiben, die das gewünschte Modul importiert, und seine Mitglieder erneut als Globals registrieren.

    – Evert

    29. September 2018 um 16:26 Uhr

  • Ah, ich verstehe, das war die Lösung, nach der ich gesucht habe, danke!

    – Timmmm

    29. September 2018 um 16:28

1453800cookie-checkSo verwenden Sie ES6-Module über die Dev-Tools-Konsole

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy