"People make mistakes. It's all a part of growing up and you never really stop growing" - Duke of nuts (Adventure time)
For detectable setup problems react-beautiful-dnd
will log some information console
for development builds (process.env.NODE_ENV !== 'production'
). These logs are stripped from productions builds to save kbs and to keep the console
clean. Keep in mind, that any setup errors that are logged will cause things to break in fun and interesting ways - so it is worth ensuring that there are none.
Some setup problems will cause errors. These are logged with console.error
. We do not throw
these errors. This is because an infinite loop can be created.
More details if you are interested
If we threw setup errors, here is the infinite loop:
- Mount application
- Error detected (we usually do it in a
useEffect
) and thrown - Error caught in
componentDidCatch
- React tree recovered (remounted). Goto step 2.
We could work around this loop condition, but it would lead to conditionally throwing, and otherwise logging. It is also tricky to avoid double logging of errors. Given that we are trying to recover the React tree, there is not a lot of value in throwing any setup problem in the first place. So we just log the problem in the console
.
Here are a few guides on how to drop development only code from your production builds:
If you want to disable the warnings in development, you just need to update a flag on the window
:
// disable all react-beautiful-dnd development warnings
window['__react-beautiful-dnd-disable-dev-warnings'] = true;
Note: this will not strip the messages from your production builds. See above for how to do that
An error can occur when:
- A
Error
is explicitlythrow
n byreact-beautiful-dnd
(an rbd error) - A
Error
isthrow
n by something else (a non-rbd error) - A runtime error occurs (eg
SyntaxError
,TypeError
)
React error boundaries do not catch all errors that can occur in rbd
. So rbd
uses a React error boundary as well as a window
error
event listener.
- cancel any active drag (no choice about this really, an error unmounts everything under the error boundary)
- log the error (non-production builds; will respect disabled logging)
- recover the React tree
- can any active drag
throw
the error for your own error boundary. We will not recover from errors that are not caused explicitly byrbd
. A run time error (such as aTypeError
) that is caused byrbd
will not be recovered.rbd
will only recover from explicitly thrownrbd
errors.
- Cancel any active drag.
- Log a warning stating that the drag has been cancelled (non-production builds; will respect disabled logging)
- Log the error
- Call
event.preventDefault()
on the event. This marks the event as consumed. See how we use DOM events. It will also prevent any 'uncaught error' warnings in yourconsole
.
- Cancel any active drag.
- Log a warning stating that the drag has been cancelled (non-production builds; will respect disabled logging)