tiny-invariant 🔬💥
A tiny invariant alternative.
What is invariant?
An invariant function takes a value, and if the value is falsy then the invariant function will throw. If the value is truthy, then the function will not throw.
import invariant from 'tiny-invariant';
invariant(truthyValue, 'This should not throw!');
invariant(falsyValue, 'This will throw!');
// Error('Invariant violation: This will throw!');
Why tiny-invariant?
The library: invariant supports passing in arguments to the invariant function in a sprintf style (condition, format, a, b, c, d, e, f). It has internal logic to execute the sprintf substitutions. The sprintf logic is not removed in production builds. tiny-invariant has dropped all of the sprintf logic. tiny-invariant allows you to pass a single string message. With template literals there is really no need for a custom message formatter to be built into the library. If you need a multi part message you can just do this: invariant(condition, 'Hello, ${name} - how are you today?')
API: (condition: mixed, message?: string) => void
conditionis required and can be anythingmessageis an optional string
Installation
# yarn
yarn add tiny-invariant
# bash
npm add tiny-invariant --save
Dropping your message for kb savings!
We recommend using babel-plugin-dev-expression to remove the message argument from your invariant calls in production builds to save kbs!
What it does it turn your code that looks like this:
invariant(condition, 'My cool message that takes up a lot of kbs');
Into this
if (!condition) {
if ('production' !== process.env.NODE_ENV) {
invariant(false, 'My cool message that takes up a lot of kbs');
} else {
invariant(false);
}
}
Your bundler can then drop the code in the "production" !== process.env.NODE_ENV block for your production builds
Final result:
if (!condition) {
invariant(false);
}
For
rollupuse rollup-plugin-replace and setNODE_ENVtoproductionand thenrollupwill treeshake out the unused code
Builds
- We have a
es(EcmaScript module) build (because you know you want to deduplicate this super heavy library) - We have a
cjs(CommonJS) build - We have a
umd(Universal module definition) build in case you needed it
We expect process.env.NODE_ENV to be available at module compilation. We cache this value
That's it!
🤘