Node-vibrant: Fordern Sie eine Version an, die in Reactive-native verwendet werden kann

Erstellt am 23. Okt. 2016  Â·  14Kommentare  Â·  Quelle: Vibrant-Colors/node-vibrant

Ich versuche, dies in meiner reaktiven App zu verwenden, und die Komponente scheint standardmĂ€ĂŸig eine browserbasierte Bildklasse zu verwenden, und ich kann nicht herausfinden, wie ich die Knotenbildklasse verwenden kann, wie in der Dokumentation beschrieben LIESMICH.
ich habe

var Vibrant = require('node-vibrant');
const { 
  Image,
} = Vibrant;

Und wenn ich versuche, die Bildoption mit einzustellen

        var v = new Vibrant(uri, {Image: Image.Node});

Ich bekomme Cannot read property 'Node' of undefined

Ich glaube, ich importiere Image.Node einfach nicht richtig, bin mir aber nicht sicher, wie das geht.

help wanted wontfix

Hilfreichster Kommentar

Ihre neueste Version "3.2.0-alpha" stĂŒrzt in React Native mit dem Fehler "Can't find variable: self" ab
und nach dem Löschen von nur 1 String:
import * as Vibrant from 'node-vibrant';
app funktioniert, daher gibt es nicht einmal die Möglichkeit, sie in React Native zu testen.

Alle 14 Kommentare

Hmmm. Ich denke, ich bin naiv, wenn ich erwarte, dass Knotenmodule in Reaktiv-nativ arbeiten. Ich habe festgestellt, dass dieses spezielle Problem auftritt, weil der reaktive-native Paketierer das Feld browser in package.json sodass die Browserversion anstelle der Knotenversion geladen wird. Wenn Sie node-vibrant/lib/index benötigen, wird dies Requiring unknown module 'fs'

@chetstone Hast du es mit rn-nodeify versucht? Core-Node-Module funktionieren standardmĂ€ĂŸig nicht in einer RN-App, da sie nicht wirklich auf Node (V8), sondern auf JSC ausgefĂŒhrt wird. Es ist nicht kugelsicher, lĂ€uft aber meiner Erfahrung nach recht gut.

Das heißt, ich habe Probleme mit Node-Vibrant. Kannst du es auch ausprobieren und sehen, wo du herkommst? Ich habe kein Problem mit fs , aber ich denke, rn-nodeify-Hacks fĂŒr stream in pngjs oder Stream-to-Module werden nicht hinzugefĂŒgt - nur eine Ahnung.

Bearbeiten: Dies könnte relevant sein, wenn es sich um pngjs handelt: https://github.com/lukeapage/pngjs/issues/64

(Als Referenz)

├─┬ [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ ├── [email protected]
│ │ │ │ └─┬ [email protected]
│ │ │ │   └── [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ ├── [email protected]
│ │ │ │ ├─┬ [email protected]
│ │ │ │ │ ├── [email protected]
│ │ │ │ │ └── [email protected]
│ │ │ │ └── [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ └─┬ [email protected]
│ │   └── [email protected]
│ ├── [email protected]
│ └─┬ [email protected]
│   ├── [email protected]
│   └── [email protected]

Hmm. Die vorherige PL #21 scheint darauf hinzudeuten, dass node-vibrant einmal mit React Native gearbeitet hat.
React Native habe ich noch nicht ausprobiert.Wenn es jedoch lib/index.js als Eingabeskript lÀdt, sollte die Standardbildimplementierung die von nodejs sein. (siehe https://github.com/akfish/node-vibrant/blob/master/src/index.coffee)
Sie können versuchen, das Knoten-Image selbst zu importieren, indem Sie:

// var Vibrant = require('node-vibrant')
// var NodeImage = require('node-vibrant/lib/image/node')

// var v = new Vibrant(uri, {Image: NodeImage})

Edit: egal. Habe gerade folgende Kommentare gesehen. Wenn require('node-vibrant/lib/index') nicht funktioniert, funktioniert die obige Methode auch nicht.

Ich werde React Native einrichten und einige Tests durchfĂŒhren, sobald ich Zeit habe.

@stovmascript danke fĂŒr den Hinweis zu rn-nodeify. Ich habe auch React-Nativify gefunden, was ein vielversprechender Ansatz zu sein scheint, aber ich hatte keine Zeit, es auszuprobieren. Ich arbeite gerade an einem anderen Projekt, werde mir das aber nĂ€chste Woche anschauen.

@chetstone Cool, wiederum

Mit rn-nodeify wird so ziemlich alles fĂŒr Sie erledigt. Sie mĂŒssen nur daran denken, das Postinstall-Skript auszufĂŒhren, nachdem Sie neue Pakete installiert haben (dh es wird nach npm install , aber nicht nach npm install some-package --save ). Was nicht so schön ist, ist, dass es eine Menge Dinge hinzufĂŒgt, die im Grunde nicht vorhanden sein mĂŒssen, wenn Sie das Postinstall-Skript hinzugefĂŒgt haben, es sei denn, Sie speichern und stellen Ihre package.json vor und nach dem Abschluss von rn-nodeify wieder her . Es geht auch in Ihre node_modules und fĂ€ngt direkt an, herumzuspielen - auf der anderen Seite, wenn es nichts kaputt macht, wen kĂŒmmert es, es ist gitignored, oder? Ich benutze diese Lösung bisher und bin damit zufrieden.

Die ReactNativity-Lösung ist IMO insofern eleganter, als Sie dem RN Packager Ihre eigene Bundle-Transformer-Funktion bereitstellen können (super cool) und Sie können babel-plugin-rewrite-require verwenden, um die require() Aufrufe oder import zu Ă€ndern process oder __dirname - rn-nodeify liefert fĂŒr diese einen ziemlich umfangreichen Shim, aber mit der ReactNativity-Methode mĂŒssen Sie Ihren eigenen Shim pflegen.

Mit beiden Methoden bin ich am selben Punkt angekommen, dachte...


Nach dem Importieren wie folgt:

import Vibrant from 'node-vibrant/lib';

Ich bekomme diesen Fehler:

Objektprototyp darf nur ein Objekt oder null sein: undefiniert

Ursprungsland: _node_modules/inherits/inherits_browser.js:5_ (Browserversion des inherits-Moduls).

Wenn Sie diese Funktion mit dem aktuell verwendeten Knoten aktualisieren, wird der neue benutzerdefinierte Fehler ausgelöst:

Der Superkonstruktor zum "erben" muss einen Prototyp haben

Es scheint zu passieren, weil der Superkonstruktor, der an diese Funktion ĂŒbergeben werden soll, kein Konstruktor ist, sondern eine instanziierte Klasse. Wenn Sie also den SuperCtor in superCtor = superCtor.constructor Ă€ndern, funktioniert es.

Nach dem Stacktrace fĂŒhrt es zu dem von jimp verwendeten Anforderungspaket, aber ob es ein Problem mit der Anforderung ist oder ob jimp die Anforderung nicht korrekt verwendet, weiß ich nicht. Es funktioniert höchstwahrscheinlich gut in Node, bricht aber nur ab, wenn es fĂŒr den Browser gebĂŒndelt wird oder nur fĂŒr Reaktiv-Native.

Vielen Dank fĂŒr den ausfĂŒhrlichen Bericht. Reichen Ihre Modifikationen an _inherits_ aus, um Node-Vibrant mit RN arbeiten zu lassen, oder stecken Sie immer noch fest?

Am 6. November 2016, 07:24 -0700, schrieb Martin Ć Ć„ovíček [email protected] :

@chetstone (https://github.com/chetstone) Cool, wiederum vielen Dank fĂŒr den Hinweis zu ReactNativity. Habe es gerade ausprobiert und es gefĂ€llt mir besser. Es gibt jedoch Kompromisse.

Mit rn-nodeify wird so ziemlich alles fĂŒr Sie erledigt. Sie mĂŒssen nur daran denken, das postinstall-Skript nach der Installation neuer Pakete auszufĂŒhren (dh es wird nach npm install ausgefĂŒhrt, aber nicht nach npm install some-package --save). Was nicht so schön ist, ist, dass es eine Menge Dinge hinzufĂŒgt, die im Grunde nicht vorhanden sein mĂŒssen, wenn Sie das Postinstall-Skript hinzugefĂŒgt haben, es sei denn, Sie speichern und stellen Ihre package.json vor und nach dem Abschluss von rn-nodeify wieder her . Es geht auch in Ihre node_modules und fĂ€ngt direkt an, herumzuspielen - auf der anderen Seite, wenn es nichts kaputt macht, wen kĂŒmmert es, es ist gitignored, oder? Ich benutze diese Lösung bisher und bin damit zufrieden.

Die ReactNativity-Lösung ist IMO eleganter, da Sie dem RN Packager Ihre eigene Bundle-Transformer-Funktion bereitstellen können (super cool) und Sie können babel-plugin-rewrite-require verwenden, um die require()-Aufrufe oder Importe von Core-Node-Modulen zu Ă€ndern deren Browserversionen wĂ€hrend der Kompilierung. Sie haben auch viel mehr Kontrolle ĂŒber AbhĂ€ngigkeiten - Sie können alle Browserversionen auf einmal installieren, entweder mit node-libs-browser oder browserify (beide liefern ein Objekt mit Zuordnungen zu den Browserversionen, die Sie zum Konfigurieren des Babel-Plugins benötigen ). DarĂŒber hinaus können Sie Pakete wie React-native-level-fs selektiv fĂŒr das fs-Modul hinzufĂŒgen. Sie mĂŒssen Ihre App mit dieser Lösung grĂŒndlich testen, da sie anfĂ€lliger fĂŒr Laufzeitausnahmen ist – nicht alle Kernknotenbibliotheken haben Browser-GegenstĂŒcke und rn-nodeify geht weiter, um dies zu beheben. Das Gleiche gilt fĂŒr Node-Globals wie process oder __dirname - rn-nodeify liefert dafĂŒr ein ziemlich umfangreiches Shim, aber mit der ReactNativity-Methode mĂŒssen Sie Ihr eigenes Shim pflegen.

Mit beiden Methoden bin ich am selben Punkt angekommen, dachte...

Nach dem Importieren wie folgt:

Importieren Sie Vibrant von 'node-vibrant/lib'

Ich bekomme diesen Fehler:

Objektprototyp darf nur ein Objekt oder null sein: undefiniert

Ursprung: node_modules/inherits/inherits_browser.js:5 (Browserversion des inherits-Moduls).

Wenn Sie diese Funktion mit dem derzeit verwendeten Knoten aktualisieren (https://github.com/nodejs/node/blob/master/lib/util.js#L956-L969), wird der neue benutzerdefinierte Fehler ausgelöst:

Der Superkonstruktor zum "erben" muss einen Prototyp haben

Es scheint zu passieren, weil der Superkonstruktor, der an diese Funktion ĂŒbergeben werden soll, kein Konstruktor ist, sondern tatsĂ€chlich eine instanziierte Klasse. Wenn Sie also den SuperCtor Ă€ndern (https://github.com/isaacs/inherits/blob/master /inherits_browser.js#L3) an: superCtor = superCtor.constructor, es funktioniert.

Nach dem Stacktrace fĂŒhrt es zu dem von jimp verwendeten Anforderungspaket, aber ob es ein Problem mit der Anforderung ist oder ob jimp die Anforderung nicht korrekt verwendet, weiß ich nicht. Es funktioniert höchstwahrscheinlich gut in Node, bricht aber nur ab, wenn es fĂŒr den Browser gebĂŒndelt wird oder nur fĂŒr Reaktiv-Native.

—
Sie erhalten dies, weil Sie erwÀhnt wurden.
Antworten Sie direkt auf diese E-Mail, zeigen Sie sie auf GitHub an (https://github.com/akfish/node-vibrant/issues/29#issuecomment-258684020) oder schalten Sie den Thread stumm (https://github.com/notifications/unsubscribe .). -auth/AA7l1wl7ggsGTqd7RZlpwWup6T3Ookl7ks5q7eMSgaJpZM4KeOV2).

@stovmascript Endlich habe react-nativify zu versuchen. Ich glaube, ich habe es nicht so weit geschafft wie du. Es scheint, dass die Menge an Hacking, die erforderlich ist, um dies zum Laufen zu bringen, fast endlos sein könnte.

Erstens konnte ich den Transformator nicht zum Laufen bringen. Ich habe schließlich festgestellt, dass die Möglichkeit, getTransformModulePath() in rn-cli.config.js anzugeben, durch eine Regression in meiner Version von Reactive (0.32.1) entfernt wurde. Also habe ich das umgangen, indem ich --transformer im Befehl npm start .

Dann konnte der Paketierer aus irgendeinem Grund das Modul util nicht finden, obwohl es installiert war. Noch seltsamer scheint es, dass es util finden könnte , wenn es von einigen Modulen ( png.js ) benötigt wird, aber nicht von anderen ( _stream_readable ).

Das Erfordernis von util in _stream_readable auskommentieren, um zu sehen, ob ich weiterkommen könnte, es schlug fehl, als jimp auf Variablen verwies, die nicht in process unterlegen.

Schließlich, nachdem ich diesen Artikel gelesen rn-nodify versucht, aber nach Ihrer Erfahrung denke ich, dass es mehr Zeit verschwenden wĂŒrde.

Es scheint viel einfacher zu sein, einen nativen Wrapper fĂŒr Android um die eigentliche Palettenbibliothek herum zu Colorgrabber- Komponente in meiner iOS-App mit gutem Erfolg verwendet. Nicht so voll ausgestattet wie die Palette, aber fĂŒr meine Zwecke gut genug.

Ich habe gerade React-native-Palette veröffentlicht, die die ausgezeichnete Android-Palette-Klasse als natives Modul umschließt. Die Komponente unterstĂŒtzt auch Ă€hnliche Funktionen fĂŒr iOS, jedoch mit einigen Problemen.

Es wĂ€re schön, auch eine reine Javascript-Lösung wie node-vibrant zu haben, die unter iOS funktioniert, da dort die native UnterstĂŒtzung etwas fehlt.

Entschuldigung fĂŒr die lange Verzögerung. Das wahre Leben ist passiert.
Nach dem, was ich aus den obigen Kommentaren verstehe, scheint das Problem mit dem Verweis von jimp auf fs , der in einer reaktiven nativen Umgebung nicht verfĂŒgbar ist.

Ab der Quelle von jimp [1] wird das Setzen von process.env.ENVIRONMENT auf "BROWSER" das erforderliche fs Modul ĂŒberspringen.

Ein möglicher Workaround:

// Prevent jimp from requiring `fs`
process.env.ENVIRONMENT = 'BROWSER'
// Require node.js version vibrant explicitly
const Vibrant = require('node-vibrant/lib/index')
// Load image file into a Buffer in some react-native compatible way
let buf = react_native_read_file('path/to/image')
// Pass buffer to node-vibrant
Vibrant.from(buf).getPalette()

Könnte jemand ĂŒberprĂŒfen, ob dieser Ansatz funktioniert? Vielen Dank.

Eine Erinnerung daran, dass GitHub 👍 auf Probleme reagiert, um UnterstĂŒtzung zu zeigen, ohne den Thread zu verstopfen

Ihre neueste Version "3.2.0-alpha" stĂŒrzt in React Native mit dem Fehler "Can't find variable: self" ab
und nach dem Löschen von nur 1 String:
import * as Vibrant from 'node-vibrant';
app funktioniert, daher gibt es nicht einmal die Möglichkeit, sie in React Native zu testen.

Ihre neueste Version "3.2.0-alpha" stĂŒrzt in React Native mit dem Fehler _"Kann Variable nicht finden: self"_
und nach dem Löschen von nur 1 String:
import * as Vibrant from 'node-vibrant';
app funktioniert, daher gibt es nicht einmal die Möglichkeit, sie in React Native zu testen.

Es tut mir leid, dass ich es nicht wirklich verstehe, funktioniert die Node-Vibrant Lib mit RN oder nicht?

@Psiiirus es sollte im Nicht-Alpha-Build funktionieren working

Ich bekomme Can't find variable: document in Reactive-Native.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

lucafaggianelli picture lucafaggianelli  Â·  9Kommentare

Kikobeats picture Kikobeats  Â·  9Kommentare

stelasido picture stelasido  Â·  15Kommentare

amirping picture amirping  Â·  6Kommentare

glomotion picture glomotion  Â·  5Kommentare