Jak rozwiązać problem dotyczący „startu w trybie natywnym reagowania”


117
  1. Właśnie zainstalowałem node.js i cli

    • zainstalowany node.js
    • Zainstalowany respond-native-cli

      npm -g react-native-cli
  2. I stworzył „nowy projekt”.

    react-native init new_project
  3. a wewnątrz tego katalogu „new_project” zmęczono mnie, aby sprawdzić, czy pakiet oprogramowania Metro działa dobrze.

    react-native start
  4. Ale komenda dała mi następujący błąd i metro się nie uruchamia. Jakaś wskazówka, jak naprawić ten błąd? (Używam systemu operacyjnego Windows 10).

    • Komenda : C:\projects\new_proj>react-native start

      error Invalid regular expression: /(.\fixtures.|node_modules[]react[]dist[].|website\node_modules.|heapCapture\bundle.js|.\tests.)$/: Unterminated character class. Aby uzyskać więcej informacji, uruchom CLI z flagą --verbose. SyntaxError: Invalid regular expression: /(.\fixtures.|node_modules[]react[]dist[].|website\node_modules.|heapCapture\bundle.js|.\tests.)$/: Nieskończona klasa postaci w nowym RegExp ( ) na czarnej liście (D: \ projects \ new_proj \ node_modules \ metro-config \ src \ defaults \ blacklist.js: 34:10) w getBlacklistRE (D: \ projects \ new_proj \ node_modules \ respons-native \ node_modules @active-native -community \ cli \ build \ tools \ loadMetroConfig.js: 69: 59) w getDefaultConfig (D: \ projects \ new_proj \ node_modules \ respons-native \ node_modules @ respons-native-community \ cli \ build \ tools \ loadMetroConfig.js : 85:20) przy obciążeniu (D:


Jak stwierdzili Run CLI with --verbose flag for more details.Być może zapomniałeś uciec przed ukośnikiem. Zobacz stackoverflow.com/questions/14639339/… . Nie mogę powiedzieć bez więcej szczegółów.
rhand

Na wypadek, gdybyś metro-config nie istniał w node_modules, sprawdź moją odpowiedź poniżej.
gprathour

Odpowiedzi:


251

Właśnie dzisiaj po raz pierwszy wystąpił podobny błąd. Pojawia się w \node_modules\metro-config\src\defaults\blacklist.js, istnieje nieprawidłowe wyrażenie regularne, które wymagało zmiany. Zmieniłem pierwsze wyrażenie pod sharedBlacklistz:

var sharedBlacklist = [
  /node_modules[/\\]react[/\\]dist[/\\].*/,
  /website\/node_modules\/.*/,
  /heapCapture\/bundle\.js/,
  /.*\/__tests__\/.*/
];

do:

var sharedBlacklist = [
  /node_modules[\/\\]react[\/\\]dist[\/\\].*/,
  /website\/node_modules\/.*/,
  /heapCapture\/bundle\.js/,
  /.*\/__tests__\/.*/
];

1
Dziękuję Ci bardzo! Wprowadziłem zmiany, jak powiedziałeś, i teraz działa. Czy muszę to modyfikować w każdym projekcie, czy jest sposób, aby zastosować to globalnie?
Song Kevin

11
Mam inną odpowiedź z zapytania na Githubie. - „Jest to spowodowane przez węzeł w wersji 12.11.0, zmiana na wersję 12.10.0 rozwiąże problem”. To było od Leo.Lei. Muszę też sprawdzić, czy to działa, czy nie.
Song Kevin,

3
Doskonała poprawka! Wielkie dzięki. React Native wygląda na taką wadliwą jazdę, od uszkodzonej pamięci podręcznej npm do błędów PERM. Instalacja zajęła mi dwa dni.
EdNdee

4
/node_modules[\/\]react[\/\]dist[\/\].*/, Tylko ta linia wymaga zmiany
vivek

1
Wielkie dzięki! Oszczędza mi to dużo czasu. Właśnie zaktualizowałem mój Node.js z v8.xx do v12.13.0 tej nocy, a potem nagle ten błąd, który prowadzi do niepowodzenia uruchamiania aplikacji ... nie wiedziałem, że jest to spowodowane przez ten błąd bez tego postu ...
garykwwong

107

Jest to spowodowane przez węzeł w wersji 12.11.0 ze względu na sposób, w jaki obsługuje on regularne lokalizacje na dwa sposoby rozwiązania tego problemu

Metoda I

Możesz przejść na starszą wersję węzła 12.10.0, co spowoduje poprawny sposób radzenia sobie z błędem przetwarzania

Metoda II

W twoim przypadku możesz poprawnie zakończyć wyrażenie regularne, zmieniając plik znajdujący się a:

\node_modules\metro-config\src\defaults\blacklist.js

Z:

var sharedBlacklist = [
  /node_modules[/\\]react[/\\]dist[/\\].*/,
  /website\/node_modules\/.*/,
  /heapCapture\/bundle\.js/,
  /.*\/__tests__\/.*/
];

Do:

 var sharedBlacklist = [
  /node_modules[\/\\]react[\/\\]dist[\/\\].*/,
  /website\/node_modules\/.*/,
  /heapCapture\/bundle\.js/,
  /.*\/__tests__\/.*/
];

2
to jest bardzo pomocne, czy nie możecie przesłać żądania ściągnięcia? do metro-configlub expo-cli?
its4zahoor

1
Żądanie wycofania zostało przesłane w październiku: github.com/facebook/metro/commit/ ...
schellack,

20

[Szybka odpowiedź]

Wystąpił problem z Metro podczas korzystania z niektórych wersji NPM i Node.

Możesz rozwiązać problem, zmieniając kod w pliku \node_modules\metro-config\src\defaults\blacklist.js.

Wyszukaj tę zmienną:

var sharedBlacklist = [
  /node_modules[/\\]react[/\\]dist[/\\].*/,
  /website\/node_modules\/.*/,
  /heapCapture\/bundle\.js/,
  /.*\/__tests__\/.*/
];

i zmień na to:

var sharedBlacklist = [
  /node_modules[\/\\]react[\/\\]dist[\/\\].*/,
  /website\/node_modules\/.*/,
  /heapCapture\/bundle\.js/,
  /.*\/__tests__\/.*/
];

Pamiętaj, że jeśli uruchomisz instalację npm lub instalację przędzy, musisz ponownie zmienić kod.


Czy tego problemu nie mogą rozwiązać programiści? Za każdym razem, gdy tu przychodzę. Dzięki Sir
Hasan Basri

1
Tak, problem może zostać rozwiązany przez deweloperów metra, którzy wprowadzają te zmiany.
Javier C.

2
Dziękuję Ci! To naprawiło!
Robert

Nie sądzę, żeby to było dobre rozwiązanie. modyfikowanie plików wewnątrz node_modules
CodeMind

1
Zwróć uwagę, że jeśli używasz starej wersji React-Native (np. 0.51.0), plik do zmiany znajduje się pod adresem:.\node_modules\metro-bundler\src\blacklist.js
Venryx

20

Masz dwa rozwiązania:

albo obniżysz węzeł do wersji 12.10.0, albo możesz zmodyfikować ten plik dla każdego projektu, który utworzysz.

node_modules / metro-config / src / defaults / blacklist.js Zmień to:

var sharedBlacklist = [
  /node_modules[/\\]react[/\\]dist[/\\].*/,
  /website\/node_modules\/.*/,
  /heapCapture\/bundle\.js/,
  /.*\/__tests__\/.*/
];

do tego:

var sharedBlacklist = [
  /node_modules[\/\\]react[\/\\]dist[\/\\].*/,
  /website\/node_modules\/.*/,
  /heapCapture\/bundle\.js/,
  /.*\/__tests__\/.*/
];

8

Miałem ten sam problem, który zmieniłem E: \ NodeJS \ ReactNativeApp \ ExpoTest \ node_modules \ metro-config \ src \ defaults \ blacklist.js w moim projekcie

z

var sharedBlacklist = [
  /node_modules[/\\]react[/\\]dist[/\\].*/,
  /website\/node_modules\/.*/,
 /heapCapture\/bundle\.js/,
 /.*\/__tests__\/.*/
];

do

var sharedBlacklist = [
  /node_modules[\/\\]react[\/\\]dist[\/\\].*/,
  /website\/node_modules\/.*/,
  /heapCapture\/bundle\.js/,
  /.*\/__tests__\/.*/
];

to działało idealnie dla mnie


5

W repozytorium Metro został scalony PR z poprawką . Teraz musimy tylko poczekać do następnego wydania. Na razie najlepszą opcją jest przejście na NodeJS . Jak zauważył Brandon , modyfikowanie czegokolwiek jest naprawdę złą praktyką i nie będzie ostatecznym rozwiązaniem.v12.10.0node_modules/


5

Nie mam programu Metro-config w swoim projekcie, co teraz?

I odkryli, że w całkiem starszego projektu tam nie ma metro-configw node_modules. Jeśli tak jest w Twoim przypadku,

Przejdź do node_modules / metro-bundler / src / blacklist.js

I wykonaj ten sam krok, jak wspomniano w innych odpowiedziach, tj

Zastąpić

var sharedBlacklist = [
    /node_modules[/\\]react[/\\]dist[/\\].*/,
    /website\/node_modules\/.*/,
    /heapCapture\/bundle\.js/,
    /.*\/__tests__\/.*/
];

z

var sharedBlacklist = [
    /node_modules[\/\\]react[\/\\]dist[\/\\].*/,
    /website\/node_modules\/.*/,
    /heapCapture\/bundle\.js/,
    /.*\/__tests__\/.*/
];

PS Miałem tę samą sytuację w kilku projektach, więc myślenie, że podzielenie się tym może komuś pomóc.

Edytować

Zgodnie z komentarzem @beltrone plik może również istnieć w,

node_modules \ metro \ src \ blacklist.js


1
Pomogło, ale plik w mojej inicjalizacji 360 jest w formacie MyProject\node_modules\metro\src\blacklist.js. Twoje zdrowie.
beltrone

4

Mam ten sam problem.

"błąd Nieprawidłowe wyrażenie regularne: / (. \ fixtures \. | node_modules [\] respond [\] dist [\]. | website \ node_modules \. | heapCapture \ bundle.js |. \ tests \. ) $ /: Niezakończony klasa postaci ”.

Zmień wyrażenie regularne w \node_modules\metro-config\src\defaults\blacklist.js

Z

var sharedBlacklist = [
  /node_modules[/\\]react[/\\]dist[/\\].*/,
  /website\/node_modules\/.*/,
  /heapCapture\/bundle\.js/,
  /.*\/__tests__\/.*/
];

Do

var sharedBlacklist = [
  /node_modules[\/\\]react[\/\\]dist[\/\\].*/,
  /website\/node_modules\/.*/,
  /heapCapture\/bundle\.js/,
  /.*\/__tests__\/.*/
];

Ta zmiana rozwiązała mój błąd.



2

Iść do

\ node_modules \ metro-config \ src \ defaults \ blacklist.js

i wymień to

var sharedBlacklist = [
/node_modules[/\\]react[/\\]dist[/\\].*/,
/website\/node_modules\/.*/,
/heapCapture\/bundle\.js/,
/.*\/__tests__\/.*/
];

do

var sharedBlacklist = [
/node_modules[\/\\]react[\/\\]dist[\/\\].*/,
/website\/node_modules\/.*/,
/heapCapture\/bundle\.js/,
/.*\/__tests__\/.*/
];

To nie jest najlepsza praktyka i moja rekomendacja to: obniż wersję węzła do 12.9 LUB zaktualizuj metro-config, ponieważ naprawiają problem z węzłem.


1

Możesz iść do...

\ node_modules \ metro-config \ src \ defaults \ blacklist.js i zmień ...

var sharedBlacklist = [   /node_modules[/\\]react[/\\]dist[/\\].*/,  
/website\/node_modules\/.*/,   /heapCapture\/bundle\.js/,  
/.*\/__tests__\/.*/ ];

dla tego:

var sharedBlacklist = [
  /node_modules[\/\\]react[\/\\]dist[\/\\].*/,
  /website\/node_modules\/.*/,
  /heapCapture\/bundle\.js/,
  /.*\/__tests__\/.*/
];

0

Zasadniczo nie modyfikuję plików w obrębie node_modules/(ani niczego, co nie zostanie zatwierdzone jako część repozytorium), ponieważ następne czyszczenie, kompilacja lub aktualizacja spowoduje ich regres. Zdecydowanie robiłem to w przeszłości i ugryzło mnie to kilka razy. Ale to działa jako krótkoterminowa / lokalna poprawka deweloperska do / chyba że metro-configzostanie zaktualizowana.

Dzięki!


0

Znalazłem zmienione źródło regexp.source node v12.11.0, być może v8spowodował to nowy silnik. zobacz więcej na https://github.com/nodejs/node/releases/tag/v12.11.0 .

D:\code\react-native>nvm use 12.10.0
Now using node v12.10.0 (64-bit)

D:\code\react-native>node
Welcome to Node.js v12.10.0.
Type ".help" for more information.
> /node_modules[/\\]react[/\\]dist[/\\].*/.source
'node_modules[\\/\\\\]react[\\/\\\\]dist[\\/\\\\].*'
> /node_modules[/\\]react[/\\]dist[/\\].*/.source.replace(/\//g, path.sep)
'node_modules[\\\\\\\\]react[\\\\\\\\]dist[\\\\\\\\].*'
>
(To exit, press ^C again or ^D or type .exit)
>

D:\code\react-native>nvm use 12.11.0
Now using node v12.11.0 (64-bit)

D:\code\react-native>node
Welcome to Node.js v12.11.0.
Type ".help" for more information.
> /node_modules[/\\]react[/\\]dist[/\\].*/.source
'node_modules[/\\\\]react[/\\\\]dist[/\\\\].*'
> /node_modules[/\\]react[/\\]dist[/\\].*/.source.replace(/\//g, path.sep)
'node_modules[\\\\\\]react[\\\\\\]dist[\\\\\\].*'
>
(To exit, press ^C again or ^D or type .exit)
>

D:\code\react-native>nvm use 12.13.0
Now using node v12.13.0 (64-bit)

D:\code\react-native>node
Welcome to Node.js v12.13.0.
Type ".help" for more information.
> /node_modules[/\\]react[/\\]dist[/\\].*/.source
'node_modules[/\\\\]react[/\\\\]dist[/\\\\].*'
> /node_modules[/\\]react[/\\]dist[/\\].*/.source.replace(/\//g, path.sep)
'node_modules[\\\\\\]react[\\\\\\]dist[\\\\\\].*'
>
(To exit, press ^C again or ^D or type .exit)
>

D:\code\react-native>nvm use 13.3.0
Now using node v13.3.0 (64-bit)

D:\code\react-native>node
Welcome to Node.js v13.3.0.
Type ".help" for more information.
> /node_modules[/\\]react[/\\]dist[/\\].*/.source
'node_modules[/\\\\]react[/\\\\]dist[/\\\\].*'
> /node_modules[/\\]react[/\\]dist[/\\].*/.source.replace(/\//g, path.sep)
'node_modules[\\\\\\]react[\\\\\\]dist[\\\\\\].*'
>

0

Napraw to, instalując metro-config najnowszej wersji (na razie 0.57.0), naprawili problem:

npm zainstaluj metro-config

możesz go później usunąć, po tym jak reaktywni goście zaktualizują wersje modułów


To mi nie pomaga.
Velizar Andreev Kitanov

0

Użycie przędzy zapobiega takiej sytuacji. Przędza powinna używać


0

W systemie Windows 10 bardzo polecam zainstalowanie powłoki Linux Bash Shell.

Oto fajny przewodnik, jak to skonfigurować: https://www.howtogeek.com/249966/how-to-install-and-use-the-linux-bash-shell-on-windows-10/

po prostu postępuj zgodnie z instrukcjami, wybierz dystrybucję Linuksa i unikaj jak największej ilości pracy z node na cmd, ponieważ jest to oczywista niestabilność.

Weź pod uwagę Microsoft zdecydowanie ostrzega przed dodawaniem lub modyfikowaniem plików Linuksa za pomocą oprogramowania Windows, jak opisano tutaj: howtogeek.com/261383/how-to-access-your-ubuntu-bash-files-in-windows-and-your-windows- system-drive-in-bash /

Mam nadzieję, że to pomoże!


0

Właśnie zaktualizowałem package.json do zmiany

"react-native": "https://github.com/expo/react-native/archive/sdk-35.0.0.tar.gz"

do

"react-native": "https://github.com/expo/react-native/archive/sdk-36.0.0.tar.gz"

Wygląda na to, że problem nie wystąpi w sdk-36 !!

Wersja mojego węzła to 12.16.0, a system operacyjny to win10 .


0

Rozwiązanie jest proste, ale tymczasowe ...

Zauważ, że jeśli uruchomić npm installlubyarn install , musisz ponownie zmienić kod!

Jak więc możemy to uruchomić automatycznie?

Stałe rozwiązanie

Aby zrobić to „automagicznie” po zainstalowaniu modułów węzłów, możesz użyć patch-package.

  1. Napraw metro-configplik, rozwiązując błąd:

Plik pojawi się w formacie \node_modules\metro-config\src\defaults\blacklist.js .

Edytuj od:

var sharedBlacklist = [
  /node_modules[/\\]react[/\\]dist[/\\].*/,
  /website\/node_modules\/.*/,
  /heapCapture\/bundle\.js/,
  /.*\/__tests__\/.*/
];

Do:

var sharedBlacklist = [
  /node_modules[\/\\]react[\/\\]dist[\/\\].*/,
  /website\/node_modules\/.*/,
  /heapCapture\/bundle\.js/,
  /.*\/__tests__\/.*/
];
  1. Następnie wygeneruj stały plik poprawki:

npx patch-package metro-config

  1. W twoim package.jsonwyzwalaczu patch:
"scripts": {
+  "postinstall": "npx patch-package"
}

Gotowe! Teraz ta poprawka zostanie wprowadzona na każdym npm install/yarn install .

Dzięki https://github.com/ds300/patch-package

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.