Node-vibrant: Demander une version utilisable en react-native

CrĂ©Ă© le 23 oct. 2016  Â·  14Commentaires  Â·  Source: Vibrant-Colors/node-vibrant

J'essaie de l'utiliser dans mon application native de rĂ©action, et le composant semble par dĂ©faut utiliser une classe d'image basĂ©e sur un navigateur, et je ne peux pas comprendre comment l'obtenir pour utiliser la classe d'image de nƓud comme documentĂ© dans le LISEZ-MOI.
j'ai

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

Et quand j'essaie de définir l'option Image avec

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

Je reçois Cannot read property 'Node' of undefined

Je pense que je n'importe pas correctement Image.Node, mais je ne sais pas comment le faire.

help wanted wontfix

Commentaire le plus utile

Votre derniĂšre version "3.2.0-alpha" plante dans React Native avec l'erreur "Can't find variable: self"
et aprÚs avoir supprimé une seule chaßne :
import * as Vibrant from 'node-vibrant';
l'application fonctionne, il n'y a donc mĂȘme aucune possibilitĂ© de la tester dans React Native.

Tous les 14 commentaires

Hmmm. Je suppose que je suis naĂŻf en m'attendant Ă  ce que les modules de nƓud fonctionnent en natif rĂ©actif. J'ai constatĂ© que ce problĂšme particulier survient parce que le packager natif de rĂ©action honore le champ browser dans package.json afin que la version du navigateur soit chargĂ©e au lieu de la version du nƓud. exiger node-vibrant/lib/index fonctionne autour de cela, mais la prochaine erreur est Requiring unknown module 'fs'

@chetstone Avez-vous essayĂ© rn-nodeify ? Les modules de nƓud de base ne fonctionneront pas par dĂ©faut dans une application RN car ils ne s'exĂ©cutent pas rĂ©ellement sur le nƓud (V8), mais sur JSC. Ce n'est pas Ă  l'Ă©preuve des balles, mais fonctionne assez bien d'aprĂšs mon expĂ©rience.

Cela dit, j'ai des problĂšmes avec node-vibrant. Pouvez-vous l'essayer aussi et voir oĂč vous obtenez? Je n'ai pas de problĂšme avec fs , mais je pense que les hacks rn-nodeify pour stream dans les modules pngjs ou stream-to ne sont pas ajoutĂ©s - juste une intuition cependant.

Edit : Cela peut ĂȘtre pertinent s'il s'agit de pngjs : https://github.com/lukeapage/pngjs/issues/64

(Pour référence)

├─┬ [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. La prĂ©cĂ©dente PL #21 semble indiquer que le nƓud-vibrant a dĂ©jĂ  travaillĂ© avec React Native.
Je n'ai pas encore essayĂ© React Native.Mais s'il charge lib/index.js tant que script d'entrĂ©e, l'implĂ©mentation d'image par dĂ©faut devrait ĂȘtre celle de nodejs. (voir https://github.com/akfish/node-vibrant/blob/master/src/index.coffee)
Vous pouvez essayer d'importer l'image du nƓud vous-mĂȘme en :

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

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

Edit : peu importe. Je viens de voir les commentaires suivis. Si require('node-vibrant/lib/index') ne fonctionne pas, la méthode ci-dessus ne fonctionnera pas non plus.

Je vais configurer React Native et faire des tests une fois que j'en aurai le temps.

@stovmascript merci pour l' React-Nativify qui semble ĂȘtre une approche prometteuse mais je n'ai pas eu le temps de l'essayer. Je suis sur un autre projet en ce moment mais je vais m'en occuper la semaine prochaine.

@chetstone Cool, Ă  son tour, merci pour l'avertissement sur ReactNativity. Je viens de l'essayer et je l'aime mieux. Il y a quand mĂȘme des compromis.

Avec rn-nodeify, Ă  peu prĂšs tout est pris en charge pour vous. Vous n'avez qu'Ă  vous rappeler d'exĂ©cuter le script de post-installation aprĂšs avoir installĂ© de nouveaux packages (c'est-Ă -dire qu'il s'exĂ©cutera aprĂšs npm install , mais pas aprĂšs npm install some-package --save ). Ce qui n'est pas si joli, c'est qu'Ă  moins que vous ne sauvegardiez et restaurez votre package.json avant et aprĂšs la fin de rn-nodeify, il y ajoutera un tas de choses, qui ne doivent pas nĂ©cessairement ĂȘtre lĂ  si vous avez ajoutĂ© le script de post-installation . De plus, il entre dans vos node_modules et commence directement Ă  dĂ©conner - d'un autre cĂŽtĂ©, s'il ne casse rien, peu importe, c'est gitignorĂ©, n'est-ce pas ? J'utilise cette solution jusqu'Ă  prĂ©sent et j'en suis satisfait.

La solution ReactNativity est IMO plus Ă©lĂ©gante dans la mesure oĂč vous pouvez fournir votre propre fonction de transformateur de bundle au RN Packager (super cool) et vous pouvez utiliser babel-plugin-rewrite-require pour modifier les appels require() ou import s des modules de nƓud de base Ă  leurs versions de navigateur lors de la compilation. Vous avez Ă©galement beaucoup plus de contrĂŽle sur les dĂ©pendances - vous pouvez installer toutes les versions du navigateur en une seule fois avec node-libs-browser ou browserify (les deux fournissent un objet avec des mappages vers les versions du navigateur, dont vous aurez besoin pour configurer le plugin babel ). En plus de cela, vous pouvez ajouter de maniĂšre sĂ©lective des packages tels que react-native-level-fs pour le module fs. Vous devrez tester minutieusement votre application avec cette solution car elle est plus sujette aux exceptions d'exĂ©cution - toutes les bibliothĂšques de nƓuds de base n'ont pas d'homologues de navigateur et rn-nodeify va plus loin pour essayer de rĂ©soudre ce problĂšme. Il en va de mĂȘme pour les nƓuds globaux comme process ou __dirname - rn-nodeify fournit une cale assez complĂšte pour ceux-ci, mais avec la mĂ©thode ReactNativity, vous devrez maintenir votre propre cale.

Avec les deux mĂ©thodes, je suis arrivĂ© au mĂȘme point de pensĂ©e...


AprÚs avoir importé comme ceci :

import Vibrant from 'node-vibrant/lib';

J'obtiens cette erreur :

Le prototype d'objet ne peut ĂȘtre qu'un objet ou null : undefined

provenant de : _node_modules/inherits/inherits_browser.js:5_ (version navigateur du module inherits).

Si vous mettez Ă  jour cette fonction avec le nƓud qui utilise actuellement , cela dĂ©clenchera la nouvelle erreur personnalisĂ©e :

Le super constructeur pour "hériter" doit avoir un prototype

Cela semble se produire parce que le super constructeur qui est censĂ© ĂȘtre passĂ© Ă  cette fonction n'est pas un constructeur, mais en fait une classe instanciĂ©e, donc quand vous changez le superCtor en : superCtor = superCtor.constructor , cela fonctionne.

AprĂšs le stacktrace, cela mĂšne au package de requĂȘte utilisĂ© par jimp, mais s'il s'agit d'un problĂšme avec la requĂȘte ou que jimp n'utilise pas correctement la requĂȘte, je ne sais pas. Cela fonctionne trĂšs probablement bien dans le nƓud, mais ne s'interrompt que lorsqu'il est fourni pour le navigateur ou uniquement pour la rĂ©action native mĂȘme.

Merci beaucoup pour le rapport dĂ©taillĂ©. Alors, vos modifications Ă  _inherits_ suffisent-elles pour que le nƓud fonctionne avec RN ou ĂȘtes-vous toujours bloquĂ©?

Le 6 novembre 2016, 07:24 -0700, Martin Ć Ć„ovíček [email protected] , a Ă©crit :

@chetstone (https://github.com/chetstone) Cool, Ă  son tour, merci pour l'avertissement sur ReactNativity. Je viens de l'essayer et je l'aime mieux. Il y a quand mĂȘme des compromis.

Avec rn-nodeify, Ă  peu prĂšs tout est pris en charge pour vous. Vous n'avez qu'Ă  vous rappeler d'exĂ©cuter le script de post-installation aprĂšs l'installation de nouveaux packages (c'est-Ă -dire qu'il s'exĂ©cutera aprĂšs l'installation de npm, mais pas aprĂšs l'installation de npm some-package --save). Ce qui n'est pas si joli, c'est qu'Ă  moins que vous ne sauvegardiez et restaurez votre package.json avant et aprĂšs la fin de rn-nodeify, il y ajoutera un tas de choses, qui ne doivent pas nĂ©cessairement ĂȘtre lĂ  si vous avez ajoutĂ© le script de post-installation . De plus, il entre dans vos node_modules et commence directement Ă  dĂ©conner - d'un autre cĂŽtĂ©, s'il ne casse rien, peu importe, c'est gitignorĂ©, n'est-ce pas ? J'utilise cette solution jusqu'Ă  prĂ©sent et j'en suis satisfait.

La solution ReactNativity est IMO plus Ă©lĂ©gante en ce sens que vous pouvez fournir votre propre fonction de transformateur de bundle au RN Packager (super cool) et vous pouvez utiliser babel-plugin-rewrite-require pour modifier les appels require() ou les importations de modules de nƓud de base en leurs versions de navigateur lors de la compilation. Vous avez Ă©galement beaucoup plus de contrĂŽle sur les dĂ©pendances - vous pouvez installer toutes les versions du navigateur en une seule fois avec node-libs-browser ou browserify (les deux fournissent un objet avec des mappages vers les versions du navigateur, dont vous aurez besoin pour configurer le plugin babel ). En plus de cela, vous pouvez ajouter de maniĂšre sĂ©lective des packages tels que react-native-level-fs pour le module fs. Vous devrez tester minutieusement votre application avec cette solution car elle est plus sujette aux exceptions d'exĂ©cution - toutes les bibliothĂšques de nƓuds de base n'ont pas d'homologues de navigateur et rn-nodeify va plus loin pour essayer de rĂ©soudre ce problĂšme. Il en va de mĂȘme pour les nƓuds globaux comme process ou __dirname - rn-nodeify fournit un shim assez complet pour ceux-ci, mais avec la mĂ©thode ReactNativity, vous devrez maintenir votre propre shim.

Avec les deux mĂ©thodes, je suis arrivĂ© au mĂȘme point de pensĂ©e...

AprÚs avoir importé comme ceci :

importer Vibrant depuis 'node-vibrant/lib'

J'obtiens cette erreur :

Le prototype d'objet ne peut ĂȘtre qu'un objet ou null : undefined

provenant de : node_modules/inherits/inherits_browser.js:5 (version navigateur du module inherits).

Si vous mettez Ă  jour cette fonction avec le nƓud actuellement utilisĂ© (https://github.com/nodejs/node/blob/master/lib/util.js#L956-L969), cela dĂ©clenchera la nouvelle erreur personnalisĂ©e :

Le super constructeur pour "hériter" doit avoir un prototype

Cela semble se produire parce que le super constructeur qui est censĂ© ĂȘtre passĂ© Ă  cette fonction n'est pas un constructeur, mais en fait une classe instanciĂ©e, donc lorsque vous modifiez le superCtor (https://github.com/isaacs/inherits/blob/master /inherits_browser.js#L3) Ă  : superCtor = superCtor.constructor, ça marche.

AprĂšs le stacktrace, cela mĂšne au package de requĂȘte utilisĂ© par jimp, mais s'il s'agit d'un problĂšme avec la requĂȘte ou que jimp n'utilise pas correctement la requĂȘte, je ne sais pas. Cela fonctionne trĂšs probablement bien dans le nƓud, mais ne s'interrompt que lorsqu'il est fourni pour le navigateur ou uniquement pour la rĂ©action native mĂȘme.

-
Vous recevez ceci parce que vous avez été mentionné.
RĂ©pondez directement Ă  cet e-mail, affichez-le sur GitHub (https://github.com/akfish/node-vibrant/issues/29#issuecomment-258684020), ou coupez le fil (https://github.com/notifications/unsubscribe -auth/AA7l1wl7ggsGTqd7RZlpwWup6T3Ookl7ks5q7eMSgaJpZM4KeOV2).

@stovmascript J'ai enfin eu le temps d'essayer avec react-nativify . Je ne pense pas ĂȘtre allĂ© aussi loin que toi. Il semble que la quantitĂ© de piratage nĂ©cessaire pour que cela fonctionne pourrait ĂȘtre presque infinie.

PremiÚrement, je n'arrivais pas à faire fonctionner le transformateur. J'ai finalement découvert que la possibilité de spécifier getTransformModulePath() dans rn-cli.config.js avait été supprimée via une régression dans ma version de react-native (0.32.1). J'ai donc contourné cela en utilisant --transformer dans la commande npm start .

Ensuite, le packager, pour une raison quelconque, n'a pas pu trouver le module util mĂȘme s'il Ă©tait installĂ©. Encore plus Ă©trangement, il semble qu'il puisse trouver util au besoin dans certains modules ( png.js ) mais pas dans d'autres ( _stream_readable ).

Commentant l'exigence de util dans _stream_readable pour voir si je pouvais aller plus loin, cela a échoué lorsque jimp faisait référence à des variables qui n'étaient pas définies dans le process cale.

Enfin, aprĂšs avoir lu cet article , je suis prĂȘt Ă  abandonner cette approche. Je n'ai pas essayĂ© avec rn-nodify mais compte tenu de votre expĂ©rience, je pense que ce serait perdre plus de temps.

Il semble beaucoup plus simple de crĂ©er un wrapper natif pour Android autour de la bibliothĂšque de palettes rĂ©elle. Je ne connais pas Java, mais il est peut-ĂȘtre temps d'apprendre. Et cela ne fonctionnera pas sur iOS, mais j'utilise avec succĂšs le composant

Je viens de publier react-native-palette qui encapsule l'excellente classe Android Palette en tant que module natif. Le composant prend également en charge des fonctionnalités similaires pour iOS, mais avec quelques problÚmes.

Ce serait bien d'avoir également une solution uniquement javascript telle que node-vibrant qui fonctionnerait sur iOS car le support natif y fait quelque peu défaut.

Désolé pour le long délai. La vraie vie est arrivée.
D'aprĂšs ce que je comprends des commentaires ci-dessus, le problĂšme semble ĂȘtre liĂ© Ă  la rĂ©fĂ©rence de jimp Ă  fs , qui n'est pas disponible dans l'environnement react-native.

À partir jimp source [1] de jimp , le rĂ©glage de process.env.ENVIRONMENT Ă  "BROWSER" ne nĂ©cessitera pas le module fs .

Une solution de contournement possible :

// 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()

Quelqu'un pourrait-il vérifier si cette approche fonctionnera? Merci.

Un rappel que GitHub a réactions aux problÚmes pour montrer son support sans obstruer le fil

Votre derniĂšre version "3.2.0-alpha" plante dans React Native avec l'erreur "Can't find variable: self"
et aprÚs avoir supprimé une seule chaßne :
import * as Vibrant from 'node-vibrant';
l'application fonctionne, il n'y a donc mĂȘme aucune possibilitĂ© de la tester dans React Native.

Votre derniĂšre version "3.2.0-alpha" plante dans React Native avec l'erreur _"Can't find variable: self"_
et aprÚs avoir supprimé une seule chaßne :
import * as Vibrant from 'node-vibrant';
l'application fonctionne, il n'y a donc mĂȘme aucune possibilitĂ© de la tester dans React Native.

Je suis désolé, je ne comprends pas vraiment, la bibliothÚque node-vibrant fonctionne-t-elle avec RN ou non?

@Psiiirus, cela devrait fonctionner dans la version non alpha

J'obtiens Can't find variable: document en react-native.

Cette page vous a été utile?
0 / 5 - 0 notes