วิธีแก้ไขข้อผิดพลาดใน 'react-native start'


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 OS)

    • คำสั่ง: C:\projects\new_proj>react-native start

      error นิพจน์ทั่วไปไม่ถูกต้อง: /(.\fixtures.|node_modules[]react[]dist[].|website\node_modules.|heapCapture\bundle.js|.\tests.)$/: คลาสอักขระที่ไม่สิ้นสุด เรียกใช้ CLI ด้วย --verbose flag สำหรับรายละเอียดเพิ่มเติม SyntaxError: นิพจน์ทั่วไปไม่ถูกต้อง: /(.\fixtures.|node_modules[]react[]dist[].|website\node_modules.|heapCapture\bundle.js|.\tests.)$/: คลาสอักขระที่ไม่สิ้นสุดที่ RegExp ใหม่ ( ) ที่บัญชีดำ (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: \ projects \ 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

ในกรณีที่ไม่มี metro-config อยู่ใน node_modules ให้คุณตรวจสอบคำตอบด้านล่าง
gprathour

คำตอบ:


254

ฉันเพิ่งได้รับข้อผิดพลาดที่คล้ายกันเป็นครั้งแรกในวันนี้ ปรากฏใน\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
ขอบคุณมาก! ฉันทำการเปลี่ยนแปลงตามที่คุณพูดและใช้งานได้แล้ว ฉันต้องแก้ไขสิ่งนี้ในทุกโครงการหรือมีวิธีนำไปใช้ทั่วโลกหรือไม่
Song Kevin

11
มีคำตอบอื่น ๆ จากแบบสอบถามใน Github - 'มันเกิดจากโหนด v12.11.0 การดาวน์เกรดเป็น v12.10.0 จะแก้ได้' มันมาจาก Leo.Lei และฉันต้องดูด้วยว่ามันใช้งานได้หรือไม่
เพลง Kevin

3
แก้ไขได้ดีเยี่ยม! ขอบคุณมาก. React Native ดูเหมือนการนั่งรถบั๊กตั้งแต่แคช npm เสียหายไปจนถึงข้อผิดพลาด PERM ฉันใช้เวลาสองวันในการติดตั้ง
EdNdee

4
/node_modules[\/\]react[\/\]dist[\/\].*/ เพียงแค่บรรทัดนี้ต้องการการเปลี่ยนแปลง
vivek

1
ขอบคุณมาก! มันช่วยฉันประหยัดเวลาได้มาก ฉันเพิ่งอัปเกรด Node.js ของฉันจาก v8.xx เป็น v12.13.0 ในคืนนี้และจากนั้นข้อผิดพลาดนี้ก็ทำให้การเริ่มต้นแอปล้มเหลว ... ไม่ทราบว่าเป็นสาเหตุของข้อผิดพลาดนี้หากไม่มีโพสต์นี้ ...
garykwwong

110

สิ่งนี้เกิดจากโหนด v12.11.0 เนื่องจากวิธีการระบุตำแหน่งปกติมีสองวิธีในการแก้ปัญหานี้

วิธีที่ 1

คุณสามารถดาวน์เกรดเป็นโหนด v12.10.0 ซึ่งจะใช้วิธีที่ถูกต้องในการจัดการกับข้อผิดพลาดในการแยกวิเคราะห์

วิธีที่ 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__\/.*/
];

2
นี่เป็นประโยชน์มากพวกคุณไม่สามารถส่งคำขอดึงได้หรือไม่ ถึงmetro-configหรือexpo-cli?
its4zahoor

1
มีการส่งคำขอดึงกลับในเดือนตุลาคม: github.com/facebook/metro/commit/…
schellack

21

[คำตอบที่รวดเร็ว]

มีปัญหากับ 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 หรือการติดตั้งเส้นด้ายคุณจำเป็นต้องเปลี่ยนรหัสอีกครั้ง


ปัญหานี้ไม่สามารถแก้ไขได้โดยนักพัฒนาหรือไม่? ทุกครั้งที่ฉันมาที่นี่ ขอบคุณครับ
Hasan Basri

1
ใช่ปัญหานี้สามารถแก้ไขได้โดยนักพัฒนารถไฟใต้ดินที่ทำการเปลี่ยนแปลงเหล่านี้
Javier C.

2
ขอบคุณ! สิ่งนี้แก้ไขได้!
Robert

ฉันไม่คิดว่านี่เป็นทางออกที่ดี การแก้ไขไฟล์ภายใน node_modules
CodeMind

1
โปรดทราบว่าหากคุณใช้ react-native เวอร์ชันเก่า (เช่น 0.51.0) ไฟล์ที่จะเปลี่ยนจะอยู่ที่:.\node_modules\metro-bundler\src\blacklist.js
Venryx

21

คุณมีสองวิธีแก้ไข:

ไม่ว่าคุณจะดาวน์เกรดโหนดเป็น 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__\/.*/
];

9

ฉันมีปัญหาเดียวกันกับที่ฉันแก้ไข 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__\/.*/
];

สิ่งนี้ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน


7

ฉันไม่มีการกำหนดค่าเมโทรในโปรเจ็กต์ของฉันตอนนี้คืออะไร

ฉันพบว่าในโครงการที่เก่ากว่านั้นไม่มี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__\/.*/
];

ปล. ฉันเจอสถานการณ์เดียวกันในสองโปรเจ็กต์ดังนั้นคิดว่าการแบ่งปันมันอาจช่วยใครสักคนได้

แก้ไข

ตามความคิดเห็นของ @beltrone ไฟล์อาจมีอยู่ใน

node_modules \ metro \ src \ blacklist.js


1
ช่วยได้ แต่ไฟล์ใน 360 init ของฉันอยู่ในMyProject\node_modules\metro\src\blacklist.js. ไชโย
beltrone

5

ประชาสัมพันธ์กับการแก้ไขที่ได้รับการรวมอยู่ในรถไฟใต้ดินที่เก็บ ตอนนี้เราต้องรอจนกว่าจะมีการเปิดตัวครั้งต่อไป สำหรับตอนนี้เป็นตัวเลือกที่ดีที่สุดคือการปรับลด v12.10.0NodeJS ดังที่แบรนดอนชี้ให้เห็นการแก้ไขสิ่งใด ๆ ในnode_modules/แนวทางปฏิบัติที่ไม่ดีจริงๆและจะไม่ใช่ทางออกสุดท้าย


4

ฉันมีปัญหาเดียวกัน

"ความผิดพลาดไม่ถูกต้องแสดงออกปกติ: / (. \ ติดตั้ง . \ | node_modules [\] ตอบสนอง [\] DIST [\]. | เว็บไซต์ \ node_modules \. | bundle.js heapCapture \ |. \ ทดสอบ \. ) $ /: 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__\/.*/
];

การเปลี่ยนแปลงนี้แก้ไขข้อผิดพลาดของฉัน


3

https://github.com/facebook/metro/issues/453

สำหรับผู้ที่ยังคงได้รับข้อผิดพลาดนี้โดยไม่มีการแก้ไขอย่างเป็นทางการใน react-native, expo

ใช้เส้นด้ายและเพิ่มการตั้งค่านี้ใน package.json

{
  ...
  "resolutions": {
    "metro-config": "bluelovers/metro-config-hotfix-0.56.x"
  },
 ...

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 หรืออัปเดต metro-config เนื่องจากกำลังแก้ไขปัญหา Node


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/(หรือสิ่งใดก็ตามที่ไม่ได้รับการยืนยันว่าเป็นส่วนหนึ่งของที่เก็บ) เนื่องจากการล้างการสร้างหรือการอัปเดตครั้งต่อไปจะถดถอย ที่ผ่านมาฉันเคยทำอย่างนั้นมาแล้วและมันก็กัดฉันสองสามครั้ง แต่สิ่งนี้ใช้งานได้เป็นการแก้ไข dev ระยะสั้น / โลคัลจนกว่า / เว้นแต่ 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 ติดตั้ง metro-config

คุณสามารถลบออกได้ในภายหลังหลังจากที่พวกตอบสนองชาวพื้นเมืองอัปเดตเวอร์ชันโมดูล


นั่นไม่ได้ช่วยอะไรฉัน
Velizar Andreev Kitanov


0

ใน windows 10 ฉันขอแนะนำให้ติดตั้ง Linux Bash Shell

นี่คือคำแนะนำที่ดีในการตั้งค่า: https://www.howtogeek.com/249966/how-to-install-and-use-the-linux-bash-shell-on-windows-10/

เพียงทำตามขั้นตอนเลือกการกระจาย linux ของคุณและหลีกเลี่ยงการทำงานกับ node บน 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และ os เป็น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 installyarn install

ขอบคุณข้อมูลhttps://github.com/ds300/patch-package

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.