Two authoring paths over one runtime boundary
Prerequisites: Start here / basic technical literacy
Two authoring paths
Mental model verified
Both paths expose native functionality to the same JS app. TurboModules declare a TS/Flow spec that Codegen uses for platform glue. Expo Modules declare Name, Function, AsyncFunction, Events and View through a Swift/Kotlin module definition.
[S09] [S11] [S12]Worked example synthesis
A document scanner might expose scanAsync(): Promise<Result> through either path. The native implementation and SDK interaction remain Android and iOS code; the JS facade normalizes the result shape.
[S09] [S12]Engineering decision synthesis
Choose RN Codegen when C++ and generated interfaces are central. Choose Expo Modules when its Swift/Kotlin DSL and lifecycle helpers fit your team and dependencies. Measure actual bottlenecks rather than assuming one method call is decisively faster.
[S08] [S11]Failure mode and improvement synthesis
A matching method name does not guarantee the same permission, cancellation, or UI semantics. Define a cross-platform contract, then test its native branches independently.
[S12] [S15] [S17]Check yourself: Does an Expo Module create a separate JS runtime?
No. It exposes native functionality into the React Native app’s JS runtime.