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.
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.
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.