A private package for various tasks for Expo module packages like compiling and testing
Last updated 7 months ago by evanbacon .
MIT · Repository · Bugs · Original npm · Tarball · package.json
$ cnpm install expo-module-scripts 
SYNC missed versions from official npm registry.

Expo Module Scripts

This package contains a collection of common scripts for all Expo modules and the Expo SDK package. This sets us up to have a consistent way of compiling JS, testing, linting, and other common tasks so that the Expo SDK is coherent and unified. Knowledge and experience from working on an Expo module in this repository will carry over to working on other modules. And ultimately, we want the development experience for Expo developers to be similar across modules. A structurally unified way of developing Expo modules helps us achieve these goals.

This is the package that installs Babel CLI, TypeScript, Jest, and other common development dependencies. Update the dependencies in this package when changing them for the Expo repository.

Getting Started

yarn add -D expo-module-scripts

# or

npm install --save-dev expo-module-scripts


Add the following scripts to your package.json and run yarn

  "scripts": {
      "build": "expo-module build",
      "clean": "expo-module clean",
      "test": "expo-module test",
      "prepare": "expo-module prepare",
      "prepublishOnly": "expo-module prepublishOnly",
      "expo-module": "expo-module"

Running yarn will now run the prepare script, which generates any missing files:

  • .eslintrc.js (docs) this extends eslint-config-universe.
  • .npmignore (docs) currently only ignores the babel.config.js in your module. You might also want to also add tests and docs.
    • Expo modules use .npmignore instead of the files field in the package.json.
    • (Pro Tip) Test which files get packaged by running npm pack. If you see files that aren't crucial to running the module, you should add them to .npmignore.
  • README.md A default template for Unimodule installation.
    • Project docs should try to have relevant emojis in headers because OSS is fun.
    • Use badges
    • Try and incorporate a table of contents (TOC).
  • tsconfig.json (docs) extends tsconfig.base.json this is important for ensuring all Unimodules use the same version of TypeScript.

You should also add the following fields to your package.json:

???? Jest

The Jest preset extends jest-expo or jest-expo-enzyme and adds proper TypeScript support and type declarations to the presets.

For unit testing API-based modules:

  "jest": {
    "preset": "expo-module-scripts/universal"

For unit testing component-based modules:

  "jest": {
    "preset": "expo-module-scripts/enzyme"


This makes it easier for other members of the community to work with your package. Expo usually has the MIT license.

  "license": "MIT",

Side Effects

The @expo/webpack-config is optimized for tree-shaking, you should always make sure to list whatever files in your module have side effects. In Expo modules we use the .fx.* extension on these files (this makes it easier to target them with sideEffects).

Learn more about side effects

  "sideEffects": false,

Entry Point and Types

We recommend you name the initial file after the module for easier searching. Be sure to define the types file as well.

???? Note that the "typings" field is synonymous with "types" field, Expo uses the TypeScript preferred "types" field.

Learn more about "types" field

  "main": "build/Camera.js",
  "types": "build/Camera.d.ts",

???? You technically don't need to define the types file if it's named the same as the main file but Expo modules always define it (which is what TypeScript recommends).

???? NPM Linking

Make your package accessible to NPM users by adding the following fields:

Expo modules use the long form object when possible to better accommodate monorepos and hyperlinks:

  "homepage": "https://github.com/YOU/expo-YOUR_PACKAGE#readme",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/YOU/expo-YOUR_PACKAGE.git"
  "bugs": {
    "url": "https://github.com/YOU/expo-YOUR_PACKAGE/issues"

⌘ Commands

This package defines a program called expo-module that accepts a command (ex: expo-module build). This allows us to add more commands without changing the behavior of existing commands while not needing to define more programs. Typically, you'd invoke these commands from Yarn:

$ cd expo-example-module
$ yarn expo-module test

# For commonly run commands, add "expo-module test" as an npm script named "test"
$ yarn test

For scripts that need to run as part of the npm lifecycle, you'd invoke the commands from npm scripts in package.json:

  "scripts": {
    "prepare": "expo-module prepare",
    "prepublishOnly": "expo-module prepublishOnly",

These are the commands:


This generates common configuration files like tsonfig.json for the package. These auto-generated files are meant to be read-only and committed to Git.


This type checks the source TypeScript with tsc. This command is separate from build and does not emit compiled JS.


This compiles the source JS or TypeScript to "compiled" JS that Expo can load. We use tsc instead of the Babel TypeScript plugin since tsc has complete support for the TypeScript language, while the Babel plugin has some limitations. tsc also performs type checking in the same way that VS Code and other IDEs do.

If we wished to switch to using just Babel with the TypeScript plugin, this package would let us change the implementation of the build command and apply it to all packages automatically.


We run tests using Jest with ts-jest, which runs TypeScript and Babel. This setup type checks test files and mimics the build command's approach of running tsc followed by Babel.

If we were to use just Babel with the TypeScript plugin for the build command, Jest with babel-jest would be more closely aligned.


This runs ESLint over the source JS and TypeScript files.


This deletes the build directory.

Lifecycle Commands

These are commands to run as part of the npm scripts lifecycle.

prepare (npm lifecycle)

Runs clean and build.

prepublishOnly (npm lifecycle)

Runs npm-proofread, which ensures a dist-tag is specified when publishing a prerelease version.

Unified dependencies

This package depends on common development dependencies like Babel and Jest. The commands for compiling and testing JS need these dependencies, and the most important benefit is that all Expo module packages use the same version of Babel, Jest, their various plugins, and other development dependencies. This does remove the flexibility to customize the dependency versions for each module. We intentionally make this tradeoff to prioritize Expo as a whole over individual modules.

Current Tags

  • 1.2.0                                ...           latest (7 months ago)
  • 1.1.1-rc.0                                ...           next (a year ago)

6 Versions

  • 1.2.0                                ...           7 months ago
  • 1.1.1                                ...           a year ago
  • 1.1.1-rc.0                                ...           a year ago
  • 1.1.0                                ...           a year ago
  • 1.0.1                                ...           a year ago
  • 1.0.0                                ...           a year ago

Copyright 2014 - 2016 © taobao.org |