Yoga is a cross-platform layout engine which implements Flexbox. Follow for updates.
Branch: master
Clone or download
davidaurelio and facebook-github-bot Don't call `jni_YGNodeFree` as fast native method

If `jni_YGNodeFree` is called while GC is running, the weak reference table lock is held by the GC, leading to deadlock.

Here, we revert the method to being a regular native method, solving that problem.

Reviewed By: SidharthGuglani

Differential Revision: D14184220

fbshipit-source-id: 2882fa10586617cea2df99550a7dd8885376d11e
Latest commit 95169c3 Feb 23, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
.github Add issue template. Jan 30, 2017
YogaKit Use `YGNodeRemoveAllChildren` where appropriate Feb 20, 2019
android Switch to `YogaNode.create()` Feb 19, 2019
benchmark Apply clang-format rules Jan 8, 2019
csharp Adds fixes for react-native-windows UWP (#848) Feb 1, 2019
gentest flex_shrink_flex_grow_row and flex_shrink_flex_grow_child_flex_shrink… Oct 31, 2018
gradle updated gradle build tool version to 3.1.0 and gradle to 4.6 Feb 12, 2019
java Don't call `jni_YGNodeFree` as fast native method Feb 22, 2019
javascript Expose dirtied func in Javascript bindings (#842) Feb 1, 2019
lib Make Yoga's libfb code to be gcc7 compatible Jan 17, 2019
mode Disable assert code in release builds (define DNDEBUG) Dec 18, 2017
scripts Pin cmake version to 3.6 Feb 14, 2019
tests `setBaseLine` -> `setBaseline` Feb 21, 2019
tools/build_defs Change compiler flag to `-O2` Feb 4, 2019
website Fix small typos (#784) Feb 19, 2019
yoga `setBaseLine` -> `setBaseline` Feb 21, 2019
yogacore Added Copyright Header Oct 24, 2018
.buckconfig Modernize Android build system, bump dependencies Nov 8, 2017
.clang-format Add `.clang-format` Jan 8, 2019
.clang-format-ignore Add `.clang-format` Jan 8, 2019
.editorconfig Add .editorconfig May 27, 2017
.gitignore Add NDK build for libfb Apr 19, 2017
.gitmodules Add googletest submodule Nov 16, 2016
.swift-version Add podspec for C-Library. Jan 26, 2017
.travis.yml Fix Travis build (#800) Aug 2, 2018
BUCK Clean up unnecessary header glob Feb 21, 2019
CMakeLists.txt Update copyright headers to yearless format Sep 11, 2018 Update CoC for various projects Aug 2, 2018 Update CoC for various projects Aug 2, 2018
LICENSE Update copyright headers to yearless format Sep 11, 2018
LICENSE-examples example license Dec 7, 2016 Fix typo Aug 13, 2018
Yoga.podspec Allow Yoga Pod to be built on any platform (#821) Feb 1, 2019
YogaKit.podspec Bump version to 1.12.0 Feb 18, 2019
build.gradle updated gradle build tool version to 3.1.0 and gradle to 4.6 Feb 12, 2019 Update copyright headers to yearless format Sep 11, 2018 Add `-SNAPSHOT` to version Feb 18, 2019
gradlew Bundle gradle wrapper Apr 19, 2017
settings.gradle Added Copyright Header Oct 24, 2018

Yoga CocoaPods npm bintray NuGet


Yoga builds with buck. Make sure you install buck before contributing to Yoga. Yoga's main implementation is in C, with bindings to supported languages and frameworks. When making changes to Yoga please ensure the changes are also propagated to these bindings when applicable.


For testing we rely on gtest as a submodule. After cloning Yoga run git submodule init followed by git submodule update.

For any changes you make you should ensure that all the tests are passing. In case you make any fixes or additions to the library please also add tests for that change to ensure we don't break anything in the future. Tests are located in the tests directory. Run the tests by executing buck test //:yoga.

Instead of manually writing a test which ensures parity with web implementations of Flexbox you can run gentest/gentest.rb to generate a test for you. You can write html which you want to verify in Yoga, in gentest/fixtures folder, such as the following.

<div id="my_test" style="width: 100px; height: 100px; align-items: center;">
  <div style="width: 50px; height: 50px;"></div>

Run gentest/gentest.rb to generate test code and re-run buck test //:yoga to validate the behavior. One test case will be generated for every root div in the input html.

You may need to install the latest watir-webdriver gem (gem install watir-webdriver) and ChromeDriver to run gentest/gentest.rb Ruby script.


.NET testing is not integrated in buck yet, you might need to set up .NET testing environment. We have a script which to launch C# test on macOS, csharp/tests/Facebook.Yoga/


Benchmarks are located in benchmark/YGBenchmark.c and can be run with buck run //benchmark:benchmark. If you think your change has affected performance please run this before and after your change to validate that nothing has regressed. Benchmarks are run on every commit in CI.


Installing through NPM

npm install yoga-layout

By default this will install the library and try to build for all platforms (node, browser asm, and standalone webpack). You may receive errors if you do not have the required platform development tools already installed. To preset the platform you'd like to build for you can set a .npmrc property first.

npm config set yoga-layout:platform standalone

This will now only run the standalone webpack build upon install.

Build Platforms

name description
all (default) Builds all of these platforms.
browser Builds asm js browser version.
node Builds node js version.
standalone Runs webpack.
none Does nothing. You can use the prepackaged libs.