Як вирішити помилку при "початковому старті реакції"


117
  1. Я щойно встановив node.js & cli

    • встановлено node.js
    • встановлено react-native-cli

      npm -g react-native-cli
  2. І створив "новий проект".

    react-native init new_project
  3. і всередині цього каталогу «new_project» я втомився бачити, чи добре працює пакувальник метро.

    react-native start
  4. Але команда дала мені наступну помилку, і метро не запускається. Будь-яка підказка для виправлення цієї помилки? (Я використовую ОС Windows 10.)

    • команда: C:\projects\new_proj>react-native start

      Помилка Неправильний регулярний вираз: /(.\fixtures.| node_modules зроблений обвинувальний факт, що свідчить, про це записано. Запустіть CLI з --verbose прапором для отримання детальної інформації. SyntaxError: Неправильний регулярний вираз: /(.\fixtures.| node_modules зроблений обвинуваченийcакзахищенийdist freedict. ) у чорному списку (D: \ projects \ new_proj \ node_modules \ metro-config \ src \ defaults \ blacklist.js: 34: 10) у getBlacklistRE (D: \ projects \ new_proj \ node_modules \ react-native \ node_modules @ react-native -community \ cli \ build \ tools \ loadMetroConfig.js: 69: 59) у getDefaultConfig (D: \ проекти \ new_proj \ node_modules \ react-native \ node_modules @ react-native-community \ cli \ build \ tools \ loadMetroConfig.js : 85: 20) при навантаженні (D:


Ніби вони заявили Run CLI with --verbose flag for more details.Можливо, ви забули уникнути зворотної косої риси. Дивіться stackoverflow.com/questions/14639339/… . Не можу сказати без деталей.
rhand

Про всяк випадок, якщо метро-конфігурація не існує в node_modules, тоді перевірте мою відповідь нижче.
gprathour

Відповіді:


250

Сьогодні я вперше отримав подібну помилку. З'являється в \node_modules\metro-config\src\defaults\blacklist.js, є недійсний регулярний вираз, який потрібно змінити. Я змінив перший вираз під на sharedBlacklist:

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

до:

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

1
Велике спасибі! Я вніс зміни, як ви сказали, і це працює зараз. Чи потрібно змінювати це на кожному проекті чи є спосіб застосувати це глобально?
Пісня Кевіна

11
Отримав ще одну відповідь із запиту на Github. - 'Це викликано вузлом v12.11.0, оновлення до v12.10.0 вирішить його.' Це було від Leo.Lei. І мені також потрібно перевірити, працює він чи ні.
Пісня Кевіна

3
Відмінна фіксація! Дуже дякую. Схоже, що таке реагування на баггі - від пошкодженого кеш-пам'яті npm до помилок PERM. На встановлення мені знадобилося два дні.
EdNdee

4
/node_modules[\/\]react[\/\]dist[\/\].*/, Просто ця лінія потребує в змінах
Вівек

1
Дуже дякую! Це економить мені багато часу. Я щойно оновив свою Node.js з v8.xx до v12.13.0 в цю ніч, а потім раптом ця помилка, яка призводить до відмови запуску програми ... не знала, що це причина цієї помилки без цієї посади ...
garykwwong

107

Це викликано вузлом v12.11.0 через те, що він справляється з регулярним розташуванням, існує два способи вирішення цієї проблеми

Спосіб I

Ви можете перейти до вузла v12.10.0, це застосує правильний спосіб поводження з помилкою розбору

Метод II

Ви можете правильно скасувати регулярний вираз у вашому випадку, змінивши файл, розташований у:

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

Від:

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

До:

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

2
це дуже корисно, чи не можете ви подати запит на тягу? до metro-configабо expo-cli?
its4zahoor

1
Запит на витяг був поданий ще в жовтні: github.com/facebook/metro/commit/…
schellack

20

[Швидкий відповідь]

У Metro є проблема використання деяких версій NPM та Node.

Ви можете усунути проблему, змінивши якийсь код у файлі \node_modules\metro-config\src\defaults\blacklist.js.

Шукайте по цій змінній:

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

і змінити це:

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

Зверніть увагу, що якщо ви запускаєте npm install або пряжу, вам потрібно буде знову змінити код.


Чи не можуть цю проблему вирішити розробники? Кожен раз, коли я приїжджаю сюди. Спасибі, сер
Хасан Басрі

1
Так, проблему можуть вирішити розробники метро, ​​які роблять ці зміни.
Хав'єр К.

2
Дякую! Це це виправило!
Роберт

Я не думаю, що це хороше рішення. модифікація файлів всередині node_modules
CodeMind

1
Зауважте, що якщо ви використовуєте стару версію нативної реакції (наприклад, 0.51.0), файл, який потрібно змінити, знаходиться замість:.\node_modules\metro-bundler\src\blacklist.js
Venryx

20

У вас є два рішення:

або ви зменшите рівень вузла до V12.10.0, або можете змінити цей файл для кожного створеного вами проекту.

node_modules / metro-config / src / defaults / blacklist.js Змініть це:

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

до цього:

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

8

У мене була така ж проблема, що я змінив E: \ NodeJS \ ReactNativeApp \ ExpoTest \ node_modules \ metro-config \ src \ defaults \ blacklist.js у своєму проекті

з

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

до

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

це для мене прекрасно працювало


5

PR з виправленням був об'єднаний в метро сховища. Тепер нам просто потрібно дочекатися наступного випуску. Наразі найкращим варіантом є перехід на NodeJS v12.10.0. Як зазначив Брендон , змінити що-небудь у node_modules/справді поганій практиці і не буде остаточним рішенням.


5

У мене в проекті немає метро-конфігурації, що тепер?

Я не знайшов , що в досить старому проекті немає metro-configв node_modules. Якщо це з вами, то,

Перейдіть до node_modules / metro-bundler / src / blacklist.js

І зробіть той самий крок, як зазначено в інших відповідях, тобто

Замініть

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

з

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

PS Я зіткнувся з тією ж ситуацією в декількох проектах, тому думка поділитися нею може комусь.

Редагувати

Відповідно до коментаря @beltrone, файл також може існувати в

node_modules \ metro \ src \ blacklist.js


1
Допомогла, але файл у моєму 360 init є в MyProject\node_modules\metro\src\blacklist.js. Ура.
beltrone

4

У мене така ж проблема.

"помилка Неправильний регулярний вираз: / (. \ світильники \. | node_modules [\] реагувати [\] dist [\]. | веб-сайт \ node_modules \. | heapCapture \ bundle.js |. \ тести \. ) $ /: Unterminated клас персонажів ".

Змініть регулярний вираз на \node_modules\metro-config\src\defaults\blacklist.js

З

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

До

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

Ця зміна усунула мою помилку.



2

Йти до

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

і замінити це

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

до

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

Це не найкраща практика, і моя рекомендація: зменшити версію вузла на 12,9 АБО оновити метро-конфігурацію, оскільки вони виправляють проблему з вузлом.


1

Ви можете піти в ...

\ node_modules \ metro-config \ src \ defaults \ blacklist.js та змінити ...

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

для цього:

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

0

Як правило, я не змінюю файли в межах node_modules/(або нічого, що не приймається в рамках сховища), оскільки наступне очищення, збирання або оновлення буде регресувати їх. Я, безумовно, робив це в минулому, і це мене покусало пару разів. Але це працює як короткотерміновий / локальний виправник, поки / не metro-configбуде оновлено.

Дякую!


0

Я виявив, що джерело regexp.source змінився node v12.11.0, можливо, v8викликав новий двигун. докладніше див . на 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

Виправте це, встановивши metro-config останньої версії (0.57.0 на даний момент), вони вирішили проблему:

npm встановити метро-config

ви можете його видалити пізніше, після того, як реагенти-хлопці оновлять версії модулів


Це мені не допомагає.
Велізар Андрєєв Кітанов

0

Використання пряжі запобігає цій ситуації. Пряжа повинна використовувати


0

На Windows 10 я дуже рекомендую встановити Linux Bash Shell.

Ось приємний посібник з його налаштування: https://www.howtogeek.com/249966/how-to-install-and-use-the-linux-bash-shell-on-windows-10/

просто виконайте кроки, виберіть свій дистрибутив Linux і уникайте максимально можливої ​​роботи з вузлом на cmd, оскільки очевидна нестабільність.

Враховуйте, що Microsoft наполегливо застерігає від додавання чи зміни файлів Linux із програмним забезпеченням Windows, як описано тут: howtogeek.com/261383/how-to-access-your-ubuntu-bash-files-in-windows-and-your-windows- системний привід-в-баш /

Сподіваюся, це допомагає!


0

Я щойно оновив package.json, щоб змінити

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

до

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

Здається, що проблема не виникне в sdk-36 !!

Моя версія вузла - v12.16.0, а ОС - win10 .


0

Рішення просте, але тимчасове ...

Зауважте, що якщо ви запускаєте npm installабо, yarn installвам потрібно знову змінити код!

Отже, як ми можемо це запустити автоматично?

Постійне рішення

Для цього "автоматично" після установки модулів вузлів ви можете скористатися patch-package.

  1. Виправте metro-configфайл, вирішивши помилку:

Файл з'являється в \node_modules\metro-config\src\defaults\blacklist.js.

Редагувати з:

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

До:

var sharedBlacklist = [
  /node_modules[\/\\]react[\/\\]dist[\/\\].*/,
  /website\/node_modules\/.*/,
  /heapCapture\/bundle\.js/,
  /.*\/__tests__\/.*/
];
  1. Потім генеруйте постійний файл виправлення:

npx patch-package metro-config

  1. У вашому package.jsonтригерному патчі:
"scripts": {
+  "postinstall": "npx patch-package"
}

Готово! Тепер цей пластир буде зроблений у кожному npm install/ yarn install.

Завдяки https://github.com/ds300/patch-package

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.