What is tiny-invariant?
The tiny-invariant package is a utility that allows developers to enforce conditions throughout their code. When a condition fails, it throws an error with a specified message. This is particularly useful for catching programming errors at runtime and ensuring that code behaves as expected. It's designed to be minimalistic and efficient, making it suitable for both development and production environments.
What are tiny-invariant's main functionalities?
Invariant Checking
This feature allows you to check if a condition is true. If the condition is false, it throws an error with the provided message. This is useful for validating assumptions in your code. For example, checking if a required function argument is provided.
invariant(condition, message);
Other packages similar to tiny-invariant
assert
The 'assert' module is a part of Node.js core and provides a simple set of assertion tests. It is similar to tiny-invariant in that it can be used to test invariants and throw errors when conditions fail. However, 'assert' is more comprehensive, offering a wider range of assertion types, such as deep equality checks and strict equality checks. Unlike tiny-invariant, 'assert' is built into Node.js and does not need to be installed separately.
invariant
The 'invariant' package is another npm package that provides similar functionality to tiny-invariant. It allows developers to enforce invariants by throwing errors when conditions are not met. The main difference between 'invariant' and tiny-invariant is in their size and dependencies. 'invariant' might be slightly larger and could have more dependencies, making tiny-invariant a more lightweight choice for projects where package size is a concern.
tiny-invariant
🔬💥
A tiny invariant
alternative.
What is invariant
?
An invariant
function tasks 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!');
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
condition
is required and can be anythingmessage
is an optional string
Installation
yarn add tiny-invariant
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 rollup
use rollup-plugin-replace and set NODE_ENV
to production
and then rollup
will treeshake out the unused code
Webpack
instructions
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!
🤘