Sự khác biệt giữa Expo và React Native là gì?


Câu trả lời:


206

Tôi làm việc tại hội chợ triển lãm!

Khi bạn viết mã trong Expobạn viết React Nativemã. Expocó hai phần chính:

1) expo-cli: một công cụ dành cho nhà phát triển để tạo dự án, xem nhật ký, mở trên thiết bị của bạn, xuất bản, v.v.

2) Ứng Expodụng khách: một ứng dụng trên điện thoại cho phép bạn mở các dự án của mình trong khi bạn đang làm việc với chúng mà không cần phải thông qua XCodehoặc Android Studiocũng cho phép người khác xem chúng! Và nếu bạn xuất bản nó thông qua expo-cli, mọi người có thể truy cập nó bất cứ lúc nào thông qua Expoứng dụng khách trên Android hoặc trên iOS nếu đăng nhập vào cùng một tài khoản mà nó đã được xuất bản. Cuối cùng, chúng tôi cũng cho phép xây dựng các ứng dụng độc lập để mọi người không phải sử dụng ứng dụng Expokhách để mở ứng dụng đó và bạn có thể phân phối đến cửa hàng ứng dụng và cửa hàng chơi nếu bạn muốn.

Vì vậy, Expolà một bộ công cụ được xây dựng trên / xung quanh React Native. Các công cụ này phụ thuộc vào một niềm tin chính mà chúng tôi nắm giữ Expo: có thể xây dựng hầu hết các ứng dụng mà không cần phải viết mã gốc, miễn là bạn có một bộ API toàn diện được tiếp xúc Javascript.

Điều này rất quan trọng vì với React Nativebạn luôn có thể thả xuống mã gốc. Điều này đôi khi cực kỳ hữu ích nhưng phải trả giá: bạn cần gửi cho mọi người nhị phân của mình nếu bạn muốn họ kiểm tra họ, một người ở bên kia thế giới không thể chỉ cần nhấn vào một liên kết để mở nó trong khi bạn đang làm việc trên đó và bạn không thể chỉ xuất bản nó bằng một cú nhấp chuột để ai đó truy cập nó tương tự như cách bạn làm trong trình duyệt.

Với Expo, chúng tôi khuyên bạn nên cố gắng tránh thả xuống mã gốc, nếu bạn có thể. Như tôi đã đề cập ở trên, chúng tôi nghĩ rằng với một bộ API toàn diện có sẵn Javascript, điều này không cần thiết cho hầu hết các ứng dụng. Vì vậy, chúng tôi mong muốn cung cấp bộ API toàn diện này và sau đó xây dựng tất cả các công cụ tuyệt vời có thể tồn tại trong một thế giới nơi thời gian chạy riêng được chia sẻ.

Tuy nhiên, nếu bạn phải thấy rằng bạn hoàn toàn thả xuống bản địa, bạn có thể sử dụng ExpoKitđể tiếp tục sử dụng API gốc Expomang lại cho bạn trong khi có cùng mức độ kiểm soát như trong bất kỳ dự án gốc nào. " ExpoKitlà một thư viện Java và Objective-C cho phép bạn sử dụng Exponền tảng và Expodự án hiện tại của bạn như là một phần của dự án gốc tiêu chuẩn lớn hơn." Đọc thêm tại đây.


4
"Với Exponent, bạn không thể thả xuống mã gốc". Thật tuyệt khi biết rằng bạn KHÔNG PHẢI thả xuống mã gốc, nhưng nếu bạn cần, tại sao Exponent lại ngăn bạn làm điều đó?
Otto

3
Ah tôi có thể thấy làm thế nào mà không rõ ràng. Vì vậy, ứng dụng khách Exponent hoàn toàn là nguồn mở ( github.com/exponentjs/exponent ) có nghĩa là bạn có thể viết mã riêng nếu bạn thích, nhưng sau đó bạn thực sự chỉ coi các thư viện Exponent là một tập hợp các mô đun gốc trong React Native điển hình khác ứng dụng. Điều này là hoàn toàn tốt và là một động lực để chúng tôi mở nguồn dự án. Điều đó nói rằng, nếu bạn muốn có thể sử dụng công cụ của chúng tôi (trình tạo nhị phân ứng dụng, ứng dụng khách Exponent trên cửa hàng ứng dụng / cửa hàng để chia sẻ các bản dựng thử nghiệm, thông báo đẩy tích hợp, v.v.) thì bạn không thể viết mã gốc.
brentvatne

tại thời điểm viết bài, Expo đã trở nên khá tốt với việc tích hợp các plugin hữu ích. Tuy nhiên, họ đang thiếu tích hợp plugin MAJOR cho IAP và không có nó, bạn không thể kiếm tiền từ ứng dụng của mình !!! Và bạn hỏi, điểm làm ứng dụng là gì nếu tôi không thể kiếm được lợi nhuận !!
Adam

96

Tôi đã cố gắng làm một bản tóm tắt các tài liệu và câu trả lời từ các nhân viên của Expo:

Phản ứng init init:

Ưu điểm :

  • Bạn có thể thêm các mô đun gốc được viết bằng Java / Objective-C (có thể là mô-đun duy nhất nhưng mạnh nhất)

Nhược điểm :

  • Cần Android Studio và XCode để chạy các dự án
  • Bạn không thể phát triển cho iOS mà không cần máy mac
  • Thiết bị phải được kết nối qua USB để sử dụng thử nghiệm
  • Phông chữ cần được nhập thủ công trong XCode
  • Nếu bạn muốn chia sẻ ứng dụng, bạn cần gửi toàn bộ tệp .apk / .ipa
  • Không cung cấp API JS ngoài hộp, ví dụ: Thông báo đẩy, Trình quản lý tài sản, chúng cần được cài đặt thủ công và liên kết với npm chẳng hạn
  • Thiết lập dự án làm việc đúng cách (cấu hình thiết bị bao gồm) khá phức tạp và có thể mất thời gian

Hội chợ triển lãm

Ưu điểm :

  • Thiết lập một dự án rất dễ dàng và có thể được thực hiện trong vài phút
  • Bạn (và những người khác) có thể mở dự án trong khi bạn đang làm việc với nó
  • Chia sẻ ứng dụng rất dễ dàng (thông qua mã QR hoặc liên kết), bạn không phải gửi toàn bộ tệp .apk hoặc .ipa
  • Không cần xây dựng để chạy ứng dụng
  • Tích hợp một số thư viện cơ bản trong một dự án tiêu chuẩn (Thông báo đẩy, Trình quản lý tài sản, ...)
  • Bạn có thể đẩy nó đến ExpoKit và tích hợp mã gốc tiếp tục sử dụng một số tính năng của Expo, nhưng không phải tất cả chúng
  • Expo có thể xây dựng các tệp .apk và .ipa (có thể phân phối tới các cửa hàng với Expo)

Nhược điểm :

  • Bạn không thể thêm các mô-đun gốc (có thể là một trò chơi điện tử cho một số)
  • Bạn không thể sử dụng các thư viện sử dụng mã gốc trong Objective-C / Java
  • Ứng dụng Hello World tiêu chuẩn có dung lượng lớn khoảng 25 MB (do các thư viện tích hợp)
  • Nếu bạn muốn sử dụng: FaceDetector, ARKit hoặc Thanh toán, bạn cần đẩy nó ra ExpoKit
  • Đẩy nó ra ExpoKit có sự đánh đổi các tính năng của Expo, ví dụ bạn không thể chia sẻ qua mã QR
  • Khi đẩy ra ExpoKit, bạn bị giới hạn ở phiên bản gốc phản ứng được ExpoKit hỗ trợ tại thời điểm đó
  • Việc gỡ lỗi trong ExpoKit (với các mô đun gốc) phức tạp hơn rất nhiều, vì nó trộn lẫn hai ngôn ngữ và các thư viện khác nhau (không hỗ trợ Expo chính thức nữa)

Tôi hy vọng tôi có thể tổng hợp những điểm quan trọng nhất. Xin vui lòng thêm điểm bổ sung.

Nguồn: https://code.tutsplus.com/tutorials/detaching-expo-apps-to-Exokit-con accept--cms-30661 https://github.com/react-community/create-react-native-app/ các vấn đề / 516 #suecomment-373629114 https://docs.expo.io/versions/latest/guides/detach.html (tài liệu chính thức nói chung)


1
Một nhược điểm lớn khác của việc sử dụng expo là kích thước của ứng dụng. Kích thước tối thiểu là ~ 25 MB cho các ứng dụng iOS và ~ 20 MB cho các ứng dụng Android
Pratik Singhal

3
Điều này đã được đề cập là nhược điểm của một dự án hội chợ: "Ứng dụng Hello World tiêu chuẩn có dung lượng lớn khoảng 25 MB (vì các thư viện tích hợp)"
Benjamin Heinke

1
Cảm ơn bạn @BenjaminHeinke vì một bức tranh rõ ràng về những lợi thế và bất lợi. Tôi đã gặp bất lợi # 2 với quyết định của chúng tôi áp dụng expo cho ứng dụng gốc phản ứng. Chúng tôi không thể tích hợp với Appsee vì điều này. Không có cách giải quyết cho điều này?
CoolDocMan

1
Thiết bị không phải kết nối với USB để kiểm tra, chỉ có quá trình biên dịch và cài đặt đầu tiên phải được thực hiện qua USB. Sau này bạn có thể sử dụng Wi-Fi! Sẽ cần một biên dịch lại nếu bạn thay đổi thành bản địa.
rszalski

28

Câu trả lời của Brent Vatne là tốt nhưng tôi muốn thêm một số chi tiết.


Hội chợ triển lãm mở rộng bề mặt API của React Native

React Native không cung cấp cho bạn tất cả các API JS bạn cần, nhưng chỉ có các tính năng nguyên thủy nhất. Các nhà phát triển React Native dự kiến ​​sẽ sử dụng Android Studio / XCode để liên kết các thư viện gốc bổ sung. Expo nhằm mục đích tăng cường RN và cung cấp tất cả API JS bạn cần cho các nhu cầu phổ biến nhất. Về cơ bản, nó là một tập hợp các lib gốc chất lượng được xác định rõ ràng đã được đóng gói cho bạn trong một lib duy nhất: ExpoKit. Đôi khi các thư viện này thực sự đã tồn tại trong thế giới RN và được tích hợp vào ExpoKit.

Một điều cũng quan trọng cần lưu ý là nhóm Expo không thể bao gồm mọi lib ngoài đó vào ExpoKit (điều này có thể gây ra sự thất vọng) vì kích thước ứng dụng hello world sẽ tăng lên, vì nó sẽ vận chuyển rất nhiều API sẽ không được sử dụng trong hầu hết các ứng dụng.

Expo cung cấp các cập nhật JS không thường xuyên

Giống như các hệ thống khác (CodePush ...), Expo cung cấp một hệ thống để cập nhật ứng dụng của bạn qua mạng. Điều này có nghĩa là bạn tải lên gói JS của mình trên CDN và các ứng dụng di động sẽ tự động tải xuống và sử dụng JS mới khi khởi động tiếp theo (mà không yêu cầu xuất bản / đánh giá từ các cửa hàng).

Expo cung cấp một công cụ CLI để tải lên / quản lý các gói JS trên CDN của họ. Để phát triển, bạn cũng có thể chọn trở thành CDN và lưu trữ gói JS trên localhost. Và XDE chỉ là một trình bao bọc trực quan trên CLI.

Expo cung cấp một khách hàng chung

Ứng dụng khách Expo là một ứng dụng khách chung cho phép tải bất kỳ ứng dụng nào tương thích với Expo. Tất cả các ứng dụng Expo đều có chung thời gian chạy chính xác (RN + ExpoKit), điểm khác biệt duy nhất là JS mà chúng tôi cung cấp cho chúng. Các ứng dụng hội chợ triển lãm mà bạn xuất bản tới các cửa hàng ứng dụng có mã url gói JS được mã hóa trong đó. Ứng dụng khách Expo được xây dựng theo một cách cụ thể để bạn có thể chọn từ url nào để tải JS, bằng cách quét QRCode hoặc cung cấp url.

Lưu ý rằng ứng dụng khách này cũng có thể tải các gói JS từ localhost và giúp trải nghiệm phát triển của bạn dễ dàng hơn: không cần XCode hoặc Android Studio và sẽ nhanh hơn nhiều khi Hello World đầu tiên của bạn chạy trên điện thoại (từ vài giờ đến vài phút). Bạn thực sự có thể phát triển trên iPhone mà không cần máy Mac và quá trình thiết lập mất 2 phút.

Trên thực tế vì SDK SDK có thể được nâng cấp, ứng dụng khách Expo bao gồm một lớp tương thích để có thể chạy 5 phiên bản SDK cuối cùng.

Expo cung cấp dịch vụ xây dựng

Vì tất cả các ứng dụng Expo đều có chung mã gốc, Expo có thể dễ dàng xây dựng các ứng dụng này cho bạn. Họ đã tạo ra một dịch vụ xây dựng đám mây.

Điều quan trọng khác biệt giữa 2 ứng dụng được xây dựng bởi Expo chỉ là url được mã hóa cứng mà ứng dụng được cho là tải xuống gói JS để chạy.

Expo thực hiện một số việc khác cho bạn, như cung cấp một cách khai báo để thiết lập biểu tượng ứng dụng, định hướng, quyền, khóa api, giúp bạn thiết lập thông báo đẩy, cung cấp hồ sơ ... nhiều cài đặt phải được mã hóa cứng khi xây dựng ứng dụng và có thể Sẽ được thay đổi trong không khí.

Hội chợ triển lãm là để React Native những gì Phonegap dành cho Cordova

React Native tương tự như Cordova. Nó không phải là cùng một công nghệ xem (gốc so với webview) nhưng cả hai đều cho phép bạn kiểm soát các tính năng gốc từ javascript và cả hai đều cung cấp một hệ thống plugin để các nhà phát triển có thể dễ dàng thêm các ràng buộc JS / gốc mới.

PhoneGap tương tự như hội chợ triển lãm. Cả hai đều cố gắng làm phong phú API thô của nền tảng cơ bản mà chúng được xây dựng với một bộ bổ sung gốc được xác định trước. PhoneGap cũng cung cấp dịch vụ xây dựng và có một ứng dụng khách chung hoạt động miễn là bạn sử dụng các plugin được phê duyệt.

Phần kết luận

Như bạn có thể thấy, Expo là một bộ công cụ. Cuối cùng, nó cho phép dễ dàng phát triển, chia sẻ và xuất bản tới các cửa hàng các dự án di động của bạn. Nó khá giống với trải nghiệm PhoneGap (nhưng tốt hơn rất nhiều và ít gây nhầm lẫn).

Tôi chắc chắn sẽ đề xuất Expo cho bất kỳ dự án Greenfield React mới nào, ngoại trừ 2 trường hợp sau:

  • Bạn đã biết bạn cần API không có sẵn trong hội chợ triển lãm và sẽ không sớm xuất hiện
  • Bạn quan tâm rất nhiều về kích thước ứng dụng của mình (HelloWorld> 25mb do kích thước lớn của ExpoKit, nhưng sau đó nó không tăng nhiều vì nó chỉ là JS)

1
Tôi đang cố gắng tìm danh sách các API của Expo không hỗ trợ. Bất cứ ai biết nơi để tìm thấy điều này?
ronnyrr

@ronnyrr Expo không hỗ trợ tất cả mọi thứ không phải là JS và điều đó không được bao gồm trong RN và ExpoKit thô. Có một danh sách vô hạn những thứ mà Expo không hỗ trợ, bởi vì đó là những thứ khác không có trong danh sách hữu hạn các tính năng mà Expo hỗ trợ. Những gì bạn yêu cầu không thể tồn tại.
Sebastien Lorber

2
@ronnyrr Tôi nghĩ đây là thứ bạn đang tìm kiếm: expo.canny.io đó là danh sách các yêu cầu tính năng mà bạn có thể sắp xếp theo mức độ phổ biến
Evan Bacon

26

Nó được giải thích trong tài liệu chính thức của hội chợ triển lãm

Sự khác biệt giữa Expo và React Native là gì?

Expo giống như Rails cho React Native. Rất nhiều thứ được thiết lập cho bạn, vì vậy nhanh hơn để bắt đầu và đi đúng hướng.

Với hội chợ triển lãm, bạn không cần Xcode hoặc Android Studio. Bạn chỉ cần viết JavaScript bằng bất kỳ trình soạn thảo văn bản nào mà bạn cảm thấy thoải mái (Atom, vim, emacs, Sublime, VS Code, bất cứ điều gì bạn thích). Bạn có thể chạy XDE (phần mềm máy tính để bàn của chúng tôi) trên Mac, Windows và Linux.

Dưới đây là một số điều mà hội chợ triển lãm mang đến cho bạn ngay lập tức:

Hỗ trợ cho iOS và Android

Bạn có thể sử dụng các ứng dụng được viết trong hội chợ triển lãm trên cả iOS và Android ngay lập tức. Bạn không cần phải trải qua một quá trình xây dựng riêng cho từng người. Chỉ cần mở bất kỳ ứng dụng Expo nào trong ứng dụng Expo Client từ App Store trên iOS hoặc Android (hoặc trong trình giả lập hoặc giả lập trên máy tính của bạn).

Thông báo đẩy

Thông báo đẩy hoạt động ngay lập tức trên cả iOS và Android, sử dụng API thống nhất, duy nhất. Bạn không phải thiết lập APNS và GCM / FCM hoặc định cấu hình ZeroPush hoặc bất cứ thứ gì tương tự. Chúng tôi nghĩ rằng chúng tôi đã làm điều này dễ dàng như nó có thể ngay bây giờ.

Đăng nhập Facebook

Điều này có thể mất nhiều thời gian để tự thiết lập đúng cách, nhưng bạn sẽ có thể làm cho nó hoạt động trong 10 phút hoặc ít hơn trên Expo.

Cập nhật tức thì

Tất cả các ứng dụng Expo có thể được cập nhật trong vài giây chỉ bằng cách nhấp vào Xuất bản trong XDE. Bạn không cần phải thiết lập bất cứ điều gì; Nó chỉ hoạt động theo cách này. Nếu bạn không sử dụng Expo, bạn sẽ sử dụng Microsoft Code Push hoặc đưa ra giải pháp của riêng mình cho vấn đề này

Quản lý tài sản

Hình ảnh, video, phông chữ, v.v ... đều được phân phối linh hoạt qua Internet với hội chợ triển lãm. Điều này có nghĩa là chúng hoạt động với cập nhật tức thì và có thể được thay đổi nhanh chóng. Hệ thống quản lý tài sản tích hợp trong hội chợ triển lãm đảm nhận việc tải tất cả tài sản trong repo của bạn lên CDN để chúng sẽ tải nhanh chóng cho bất kỳ ai.

Không có hội chợ triển lãm, điều bình thường cần làm là đưa tài sản của bạn vào ứng dụng của bạn, điều đó có nghĩa là bạn không thể thay đổi chúng. Hoặc bạn phải quản lý việc đưa tài sản của mình vào CDN hoặc tương tự.

Cập nhật dễ dàng hơn để phát hành bản gốc mới

Chúng tôi thực hiện các phiên bản mới của hội chợ triển lãm cứ sau vài tuần. Bạn có thể ở lại phiên bản cũ của React Native nếu bạn thích hoặc nâng cấp lên phiên bản mới mà không phải lo lắng về việc xây dựng lại nhị phân ứng dụng của mình. Bạn có thể lo lắng về việc nâng cấp JavaScript vào thời gian của riêng bạn.

Nhưng không có mô-đun bản địa nào

Điều hạn chế nhất về hội chợ triển lãm là bạn không thể thêm vào các mô-đun riêng của mình mà không tách rời và sử dụng ExpoKit.


2
Tôi đang sử dụng expo trong windows 8. cách tạo mã QR để trực tiếp chạy ứng dụng của mình trên thiết bị.
Prasanna

1
Tôi đã không thử nó trên Windows, nhưng tôi nghĩ nó phải giống với mọi hệ thống. Mã QR được tạo tự động hoặc trong Expo XDEbàn điều khiển hoặc trong exp startđầu ra lệnh của bàn điều khiển.
kẹo cao su

1
$ prasanna Đôi khi bạn không thấy mã QR vì bạn không có điện thoại và máy phát triển của mình trên cùng một mạng. Ví dụ: nếu bạn đang làm việc tại nhà, hãy đảm bảo điện thoại của bạn nằm trong mạng gia đình. Và v.v ...
ccalvert

7

EXPO CLI

ưu: -

 1. No need to install Android studio and Xcode for start building mobile app.
 2. No requirement of high configuration machine for development.
 3. Mobile ui easily check on both devices android and iphone using barcode scanning.and some time you can check on online iphone and android simulators.
 4. fast development.

Nhược điểm: -

 1. Native dependency can not add on expo because expo project don't have ios and android folder so here expo is bounded.
 2. Making apk and ipa are to difficult  using expo.
 3. Size of the apk/ipa is huge

Phản ứng Cli bản địa

Ưu điểm: -

 1. Easily add native dependency for android and ios because this project structure have ios and android folder.
 2. Apk and ipa build making is easy rather than expo.

Note":- React Native cli is right approach to started work on react native framework.

Nhược điểm: -

1. High configuration machine is require.
2. Adding dependency some time more difficult but good.
3. Required basic knowledge of android folder structure and ios folder structure but from this learn more things.

Bạn có thể thích bất kỳ phương pháp tiếp cận theo yêu cầu của bạn.


2

Tôi sẽ lưu ý ở đây rằng Expo đang sử dụng phiên bản cũ hơn của phản ứng 16.5. Điều này sẽ cấm bạn sử dụng tính năng móc mới. Nếu bạn quyết định đi với Expo, hãy chú ý xem các điều khiển phiên bản của bạn. Các phiên bản cũ hơn của điều hướng phản ứng sẽ cần được sử dụng với phiên bản 16.5 nếu bạn gặp phải các lỗi lạ.


expo updatethực hiện khá tốt việc có được các phiên bản tương thích cho hầu hết các gói được quản lý bởi Expo. Ngay bây giờ, tôi không nghĩ rằng nó cập nhật React Navigation, nhưng thư viện đó thực sự được tài trợ bởi Expo. Cá nhân, tôi hiếm khi gặp phải các vấn đề tương thích giữa React Navigation và Expo (Tôi nghĩ rằng tôi đã gặp một số vấn đề khi sử dụng phiên bản beta). Tuy nhiên, bạn có thể thấy nhiều vấn đề tương thích hơn với các gói không do Expo quản lý.
Christian Juth

2

Các câu trả lời về ưu điểm và nhược điểm của expo và Reac -igen-cli đã hoàn tất. Tôi muốn đề cập đến một điểm khác như kinh nghiệm cá nhân của tôi. Expo chứa nhiều mô-đun theo mặc định trong dự án và nó làm việc dễ dàng hơn với nó. Nhưng nó có một vấn đề lớn về giai đoạn sản xuất vì các phiên bản được xây dựng androidioscó kích thước lớn như vậy. Ví dụ nếu bạn có một trang duy nhất với một 'Hello World'sự apkkích thước tập tin sẽ vào khoảng 19 MB. Có một dự án tương tự trong Reac -igen-cli sẽ dẫn đến một ứng dụng có kích thước 6 MB.

Vì vậy, cá nhân tôi không khuyên bạn nên sử dụng expo nếu bạn muốn phát triển một ứng dụng thương mại.


Tôi không nghĩ rằng đây là một lý do đủ tốt để các ứng dụng hội chợ không sẵn sàng sản xuất. Bên cạnh đó, điều này đã được giải thích
cặn kẽ

1

Tôi đã trải qua hơn một năm hoạt động với hội chợ triển lãm Nếu Kích thước của ứng dụng không quan trọng đối với bạn khi sử dụng Expo vì việc triển khai Bản đồ dễ dàng, Đẩy dễ dàng hơn React -igen nhưng ở cuối dự án nếu bạn muốn xuất bản ứng dụng trong Google Play hoặc một cửa hàng khác mà bạn gặp khó khăn khi xóa một số Quyền trong APK React -igen, bạn có thể thay đổi mọi thứ nhưng để nhập một số thư viện như thông báo đẩy hoặc bản đồ cũng cần một số thách thức vì bạn phải thêm các thư viện này theo cách thủ công dự án Android và iOS


-1

expo là một chuỗi công cụ được xây dựng xung quanh React Native để giúp bạn nhanh chóng khởi động một ứng dụng. Nó cung cấp một bộ công cụ giúp đơn giản hóa việc phát triển và thử nghiệm ứng dụng và giao diện và dịch vụ React Native thường có sẵn trong các thành phần React Native của bên thứ ba. Với hội chợ triển lãm, bạn có thể tìm thấy tất cả chúng trong Expo SDK.

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.