2016-06-27 16 views
-1

Ich Refactoring eine extrem große Javascript-Datei in mehrere Dateien mit es6 Module/Webpack. Zunächst verschiebe ich eine einzelne Funktion aus giantFile.js in singleFunction.js und importiere dann diese neue Funktionsdatei in index.js, dem Einstiegspunkt für das webpack zum Erstellen von bundle.js, das dann eingebunden wird Meine template.html-Datei als Skript-Tag. In meiner Vorlagendatei schließe ich auch giantFile.js als Skript-Tag ein, der die Funktion in singleFunction.js aufruft.Schrittweise Refactoring von Javascript/Jquery-Datei in ES6-Module

Ist es einfach, dass das Skript in der richtigen Reihenfolge importiert wird, oder irre ich in meinem Verständnis davon, wie gigantFile.js auf die neu erstellten Module zugreifen kann.

Zur Zeit, wenn ich singleFunction() eintippe, empfange ich "ist nicht definiert" Fehlermeldung, und so wäre es gut zu überprüfen, mein Verständnis ist richtig, wie ich Module vor dem weiteren Debuggen verwenden kann. Wenn jemand mich auf einige gute Ressourcen auf Refactoring Front-End-Javascript und beste Praktiken, die auch sehr geschätzt werden könnte, zeigen. Danke vielmals.

in singleFunction.js

`export default function singleFunction() {...}` 

in index.js

import singleFunction from './components/singleFunction' 

in template.js

<script src="/frontendHotness/components/singleFunction.js"></script> 
<script src="/unstructuredMess/js/giantFile.js"></script> 
+0

Sie würden gut tun, um Hierarchie in einem Diagramm zu zeigen, anstatt es zu erzählen ... Ich verliere das Interesse in den zweiten Satz .. – Jonathan

Antwort

2

Die webpack kompilierte Version Ihrer giantFile.js noch Ihrer Anwendung Eintrag sein sollte Punkt und die einzige Datei, die mit derin Ihre HTML-Datei eingebettet isttag.

Während des Refactorings sollten Sie schrittweise eingekapselte Funktionsbausteine ​​schrittweise in separate Dateien oder Module verschieben. Diese Module export die Funktionalität, die von abhängigen Modulen verwendet werden soll.

Ihr Stammmodul, in diesem Fall giantFile.js kann jetzt import die verschiedenen Module, auf die es ankommt. Diese Abhängigkeiten werden durch das Webpack gelöst, das Ihr Elternmodul mit allen Abhängigkeiten in eine JavaScript-Datei verschiebt, die Sie von Ihrer HTML-Seite laden können.

Beachten Sie, dass dieser Abhängigkeitsbaum beliebig tief sein kann - Ihre Submodule können selbst von anderen Modulen abhängen. Sie sollten jedoch sicherstellen, dass Ihre Module die Funktionalität für eine bestimmte Aufgabe kapseln, während sie lose mit anderen Modulen verbunden sind. Vermeiden Sie auch zirkuläre Abhängigkeiten.

+0

Vielen Dank für Ihre Antwort TimoSta. Allerdings giantFile.js enthält Variablen, die in der Jinja-Vorlage auf der Seite serviert werden, und ich kann anscheinend nicht auf diese Variablen zugreifen, wenn ich die ganze giantFile.js über webpack einstelle. –

+1

Ein großer Vorteil von ES6 Module sind, dass ihre internen Variablen * nicht * den globalen Staat verschmutzen, und aus diesem Grund nicht von irgendwo außerhalb des Moduls zugänglich sind, es sei denn, sie wurden explizit als Export des Moduls deklariert. Während ich persönlich noch nie mit Jinja gearbeitet habe, ergab eine Google-Suche nach 'Jinja Webpack' Ergebnisse, z. in [diesem npm Modul] (https://www.npmjs.com/package/jinja-loader). Vielleicht bieten sie einen guten Ansatz für Ihr Problem? – Timo