Cách giải quyết lỗi trên 'react-native start'


117
  1. Tôi vừa cài đặt node.js & cli

    • đã cài đặt node.js
    • đã cài đặt react-native-cli

      npm -g react-native-cli
  2. Và tạo một 'dự án mới'.

    react-native init new_project
  3. và bên trong thư mục 'new_project' đó, tôi mệt mỏi để xem liệu gói metro có hoạt động tốt hay không.

    react-native start
  4. Nhưng lệnh đã cho tôi lỗi sau và tàu điện ngầm không bắt đầu. Bất kỳ manh mối để sửa lỗi này? (Tôi đang sử dụng hệ điều hành windows 10.)

    • chỉ huy : C:\projects\new_proj>react-native start

      lỗi Biểu thức chính quy không hợp lệ: /(.\fixtures.|node_modules[]react[]dist[].|website\node_modules.|heapCapture\bundle.js|.\tests.)$/: Lớp ký tự chưa kết thúc. Chạy CLI với cờ --verbose để biết thêm chi tiết. SyntaxError: Biểu thức chính quy không hợp lệ: /(.\fixtures.|node_modules[]react[]dist[].|website\node_modules.|heapCapture\bundle.js|.\tests.)$/: Lớp ký tự chưa kết thúc tại RegExp mới ( ) tại danh sách đen (D: \ project \ new_proj \ node_modules \ metro-config \ src \ defaults \ blacklist.js: 34: 10) tại getBlacklistRE (D: \ project \ new_proj \ node_modules \ react-native \ node_modules @ react-native -community \ cli \ build \ tools \ loadMetroConfig.js: 69: 59) tại getDefaultConfig (D: \ project \ new_proj \ node_modules \ react-native \ node_modules @ react-native-community \ cli \ build \ tools \ loadMetroConfig.js : 85: 20) khi tải (D:


Giống như họ đã nêu Run CLI with --verbose flag for more details.Có lẽ bạn đã quên thoát khỏi một phản ứng dữ dội. Xem stackoverflow.com/questions/14639339/… . Không thể nói mà không có thêm chi tiết.
rhand

Đề phòng trường hợp metro-config không tồn tại trong node_modules cho bạn thì hãy kiểm tra câu trả lời của tôi bên dưới.
gprathour

Câu trả lời:


248

Tôi vừa gặp một lỗi tương tự lần đầu tiên hôm nay. Nó xuất hiện trong \node_modules\metro-config\src\defaults\blacklist.js, có một biểu thức chính quy không hợp lệ cần được thay đổi. Tôi đã thay đổi biểu thức đầu tiên dưới sharedBlacklisttừ:

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

đến:

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

1
Cảm ơn rât nhiều! Tôi đã thực hiện các thay đổi như bạn đã nói và nó hoạt động ngay bây giờ. Tôi có phải sửa đổi điều này trên mọi dự án hay có cách nào để áp dụng điều này trên toàn cầu không?
Song Kevin,

10
Có một số câu trả lời khác từ truy vấn trên Github. - 'Đó là do nút v12.11.0 gây ra, hạ cấp xuống v12.10.0 sẽ giải quyết được nó.' Đó là từ Leo.Lei. Và tôi cũng cần phải xem nó có hiệu quả hay không.
Song Kevin,

3
Sửa lỗi xuất sắc! Cảm ơn rất nhiều. React Native có vẻ giống như một chuyến đi đầy lỗi như vậy, từ bộ nhớ cache npm bị hỏng cho đến lỗi PERM. Tôi mất hai ngày chỉ để cài đặt.
EdNdee

4
/node_modules[\/\]react[\/\]dist[\/\].*/, Chỉ cần dòng này thay đổi
vivek

1
Cảm ơn rất nhiều! Nó giúp tôi tiết kiệm rất nhiều thời gian. Tôi vừa nâng cấp Node.js của mình từ v8.xx lên v12.13.0 trong đêm nay và sau đó lỗi này đột ngột dẫn đến lỗi khởi động ứng dụng ... không biết nguyên nhân là do lỗi này mà không có bài đăng này ...
garykwwong

107

Điều này là do nút v12.11.0 gây ra do cách nó xử lý vị trí thông thường, có hai cách để giải quyết vấn đề này

Phương pháp I

Bạn có thể hạ cấp xuống nút v12.10.0, điều này sẽ áp dụng cách chính xác để xử lý lỗi phân tích cú pháp

Phương pháp II

Bạn có thể chấm dứt chính xác biểu thức chính quy trong trường hợp của mình bằng cách thay đổi tệp có vị trí:

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

Từ:

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

Đến:

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

2
cái này cực kỳ hữu ích, các bạn có thể gửi yêu cầu kéo không? đến metro-confighoặc expo-cli?
its4zahoor

1
Một yêu cầu kéo đã được gửi lại vào tháng 10: github.com/facebook/metro/commit/…
schellack

20

[Câu trả lời nhanh]

Đã xảy ra sự cố với Metro khi sử dụng một số phiên bản NPM và Node.

Bạn có thể khắc phục sự cố khi thay đổi một số mã trong tệp \node_modules\metro-config\src\defaults\blacklist.js.

Tìm kiếm biến này:

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

và thay đổi thành này:

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

Xin lưu ý rằng nếu bạn chạy cài đặt npm hoặc cài đặt sợi, bạn cần phải thay đổi lại mã.


Có phải vấn đề này không được nhà phát triển khắc phục? Mỗi khi tôi đến đây. Cảm ơn Ngài
Hasan Basri

1
Có, vấn đề có thể được khắc phục bằng cách các nhà phát triển tàu điện ngầm thực hiện những thay đổi này.
Javier C.

2
Cảm ơn bạn! Điều này đã sửa nó!
Robert

Tôi không nghĩ rằng đây là giải pháp tốt. sửa đổi các tệp bên trong node_modules
CodeMind

1
Lưu ý rằng nếu bạn đang sử dụng phiên bản cũ của react-native (ví dụ: 0.51.0), thì thay vào đó, tệp sẽ được thay đổi tại:.\node_modules\metro-bundler\src\blacklist.js
Venryx

20

Bạn có hai giải pháp:

bạn hạ cấp nút xuống V12.10.0 hoặc bạn có thể sửa đổi tệp này cho mọi dự án bạn sẽ tạo.

node_modules / metro-config / src / defaults / blacklist.js Thay đổi điều này:

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

đến điều này:

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

8

Tôi gặp vấn đề tương tự. Tôi đã thay đổi E: \ NodeJS \ ReactNativeApp \ ExpoTest \ node_modules \ metro-config \ src \ defaults \ blacklist.js trong dự án của mình

từ

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

đến

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

điều này làm việc hoàn hảo cho tôi


5

Một PR với một bản sửa lỗi đã được hợp nhất trong kho lưu trữ tàu điện ngầm . Bây giờ chúng ta chỉ cần đợi cho đến khi phát hành tiếp theo. Hiện tại, lựa chọn tốt nhất là hạ cấp xuống NodeJS v12.10.0. Như Brandon đã chỉ ra, sửa đổi mọi thứ trongnode_modules/ thực tế là thực sự không tốt và sẽ không phải là giải pháp cuối cùng.


5

Tôi không có metro-config trong dự án của mình, bây giờ phải làm sao?

Tôi đã phát hiện ra rằng trong dự án khá lớn tuổi không có là metro-configtrong node_modules. Nếu đó là trường hợp của bạn, thì

Đi tới node_modules / metro-Bundler / src / blacklist.js

Và thực hiện bước tương tự như đã đề cập trong các câu trả lời khác, tức là

Thay thế

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

với

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

Tái bút: Tôi đã đối mặt với tình huống tương tự trong một vài dự án nên nghĩ rằng chia sẻ nó có thể giúp ích cho ai đó.

Biên tập

Theo nhận xét của @beltrone, tệp cũng có thể tồn tại,

node_modules \ metro \ src \ blacklist.js


1
Đã giúp, nhưng tệp trong init 360 của tôi vẫn ở trong MyProject\node_modules\metro\src\blacklist.js. Chúc mừng.
beltrone

4

Tôi có cùng một vấn đề.

"error Biểu thức chính quy không hợp lệ: / (. \ fixtures \. | node_modules [\] react [\] dist [\]. | website \ node_modules \. | heapCapture \ pack.js |. \ tests \. ) $ /: Chưa kết thúc lớp nhân vật. "

Thay đổi biểu thức chính quy trong \node_modules\metro-config\src\defaults\blacklist.js

Từ

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

Đến

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

Thay đổi này đã giải quyết được lỗi của tôi.


3

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

cho những người vẫn gặp lỗi này mà không có bản vá chính thức trong phản ứng gốc, hội chợ

sử dụng sợi và thêm cài đặt này vào package.json

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

2

Đi đến

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

và thay thế cái này

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

đến

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

Đây không phải là phương pháp hay nhất và khuyến nghị của tôi là: hạ cấp phiên bản nút xuống 12.9 HOẶC cập nhật metro-config vì họ đang khắc phục sự cố Node.


1

Bạn có thể đi đến...

\ node_modules \ metro-config \ src \ defaults \ blacklist.js và thay đổi ...

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

cho điều này:

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

0

Theo nguyên tắc chung, tôi không sửa đổi các tệp bên trong node_modules/(hoặc bất kỳ thứ gì không được cam kết như một phần của kho lưu trữ) vì bản dựng, bản dựng hoặc bản cập nhật sạch sẽ tiếp theo sẽ hồi quy chúng. Tôi chắc chắn đã làm như vậy trong quá khứ và nó đã cắn tôi một vài lần. Nhưng điều này hoạt động như một bản sửa lỗi dành cho nhà phát triển ngắn hạn / cục bộ cho đến khi / trừ khi metro-config được cập nhật.

Cảm ơn!


0

Tôi thấy nguồn regexp.source đã thay đổi node v12.11.0, có thể v8do động cơ mới gây ra. xem thêm trên 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

Khắc phục sự cố bằng cách cài đặt metro-config của phiên bản mới nhất (hiện tại là 0.57.0), họ đã khắc phục được sự cố:

npm cài đặt metro-config

bạn có thể xóa nó sau này, sau khi những kẻ phản ứng gốc cập nhật phiên bản mô-đun


Điều đó không giúp ích gì cho tôi.
Velizar Andreev Kitanov

0

Việc sử dụng sợi ngăn ngừa tình trạng này. Sợi nên sử dụng


0

Trên windows 10, tôi thực sự khuyên bạn nên cài đặt Linux Bash Shell.

Đây là một hướng dẫn hay để thiết lập nó: https://www.howtogeek.com/249966/how-to-install-and-use-the-linux-bash-shell-on-windows-10/

chỉ cần làm theo các bước, chọn bản phân phối linux của bạn và tránh làm việc với nút trên cmd càng nhiều càng tốt vì không ổn định rõ ràng.

Hãy xem xét Microsoft mạnh mẽ cảnh báo chống lại việc thêm hoặc sửa đổi các tệp Linux bằng phần mềm Windows, như được mô tả tại đây: howtogeek.com/261383/how-to-access-your-ubuntu-bash-files-in-windows-and-your-windows- system-drive-in-bash /

Hy vọng nó giúp!


0

Tôi vừa cập nhật package.json để thay đổi từ

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

đến

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

Có vẻ như sự cố sẽ không xảy ra trong sdk-36 !!

Phiên bản nút của tôi là v12.16.0 và hệ điều hành là win10 .


0

Giải pháp rất đơn giản, nhưng tạm thời ...

Lưu ý rằng nếu bạn chạy một npm installhoặc một, yarn installbạn cần phải thay đổi mã một lần nữa!

Vì vậy, làm thế nào chúng ta có thể chạy nó tự động?

Giải pháp lâu dài

Để làm điều này "tự động" sau khi cài đặt các mô-đun nút của bạn, bạn có thể sử dụng patch-package.

  1. Sửa metro-configtệp, giải quyết lỗi:

Tệp xuất hiện trong \node_modules\metro-config\src\defaults\blacklist.js.

Chỉnh sửa từ:

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

Đến:

var sharedBlacklist = [
  /node_modules[\/\\]react[\/\\]dist[\/\\].*/,
  /website\/node_modules\/.*/,
  /heapCapture\/bundle\.js/,
  /.*\/__tests__\/.*/
];
  1. Sau đó, tạo một tệp vá vĩnh viễn:

npx patch-package metro-config

  1. Trong package.jsonkích hoạt của bạn , bản vá:
"scripts": {
+  "postinstall": "npx patch-package"
}

Tất cả đã được làm xong! Bây giờ bản vá này sẽ được thực hiện tại mỗi npm install/ yarn install.

Cảm ơn https://github.com/ds300/patch-package

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.