(Dies ist eine Folgefrage von hier .)
In den häufig gestellten Fragen der Metamask-Entwickler heißt es, "die Version von web3 zu bündeln, die während der Entwicklung verwendet wird".
Also habe ich eine web3.min.js-Version 0.20.6 von GitHub heruntergeladen und wie im folgenden Code "gebündelt". Dann logge ich "web3.version.api" in die Konsole ein.
Jetzt meldet die Konsole mit oder ohne Bündelung nach dem Klicken auf die Schaltfläche eine Version 0.20.3 .
Ich vermute das liegt an der Leitung
web3 = new Web3(web3.currentProvider);
was web3 auf den eingefügten Code von meinem Metamask-Plugin setzt, in dem ich angemeldet bin, und es führt diesen Code aus, nicht meine "gebündelte" Version ...
Frage: Wie bündele ich meine eigene Version von web3?
<html>
<body>
<script type="text/javascript" src="scripts/web3.min.js"></script>
<script type="text/javascript">
window.addEventListener("load", function() {
if (typeof web3 === "undefined") {
console.log("No web3 provider found");
} else {
web3 = new Web3(web3.currentProvider);
console.log("Using web wallet");
}
}) </script>
<button id="buttonBalance">Click to report version to console</button>
<script type="text/javascript">
button = document.getElementById("buttonBalance")
button.onclick = function tmp()
{
console.log("Version=" + web3.version.api);
};
</script>
</body>
</html>
PS. Ich habe die Schaltfläche erstellt, um sicherzustellen, dass der web3-Aufruf an „web.version.api“ gemäß dem Vorschlag von @Kai Kälberer „außerhalb des Hinzufügens des eventListener zum Fenster“ erfolgt
Update: Wie von @viz vorgeschlagen, habe ich die nicht minimierte web3j-Version von GitHub heruntergeladen und die Zeile, die das Überschreiben der globalen web3-Instanz vermeidet, auskommentiert. Überprüfen Sie diesen Screenshot von meinem Dev-Tools-Debugger:
Ich sehe immer noch, dass die Konsole die Version 0.20.3 und nicht 0.20.6 ausgibt , wie in der heruntergeladenen web3.js definiert ... warum?
Dies geschieht aufgrund dieser Zeile . Derzeit überschreibt der Code das Web3
Objekt nicht, wenn das Global Web3
bereits vorhanden ist. Aus diesem Grund erhalten Sie dieselbe Version der Web3-API, die MetaMask bereits injiziert hat, egal wie Sie es versuchen.
Dies kann gelöst werden, indem Sie ein Paketierungstool wie webpack verwenden und das Web3-Objekt als Modul laden oder die Datei web3.js manuell herunterladen und diese Zeile korrigieren, wenn Sie sie als Skript-Tag einbetten möchten.
Ich denke jedoch, dass web3.js überschreiben sollte , selbst wenn das globale Objekt vorhanden ist. Wenn Sie der Meinung sind, dass das aktuelle Verhalten unangemessen ist, können Sie ein Problem über das web3.js-Github-Repository melden.
&& typeof window.Web3 === 'undefined'
diesen Teil entfernen.
nämlich
Web3
Objekt nicht korrekt überschreiben.