-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix(NODE-6730): allow webpack bundling #67
Conversation
path: path.resolve(__dirname, 'dist') | ||
}, | ||
experiments: { topLevelAwait: true }, | ||
target: 'node', |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This line in combination with lines 20 & 21 are they key to get the bundle to work.
src/index.ts
Outdated
@@ -5,7 +5,8 @@ function load() { | |||
try { | |||
return require('../build/Release/mongocrypt.node'); | |||
} catch { | |||
return require('../build/Debug/mongocrypt.node'); | |||
// eslint-disable-next-line no-console | |||
console.log('Could not load the native module mongocrypt.node'); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The Debug native binding is never published by us, so no reason to attempt to include it in the published package and generate a warning from Webpack.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
console.log('Could not load the native module mongocrypt.node'); | |
try { | |
return require('../build/Debug/mongocrypt.node'); | |
} catch (error) { | |
throw error; | |
} |
It is kinda nice to have the code set up to pull in the debug build when dev-ing locally. So all we need here is a try {}
around the require
You may see "Module not found: Error: Can't resolve" but it is printed as a "WARNING" and does not stop the build and that's the intended behavior
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I had a conversation with Bailey about this and we thought it was more developer friendly to not have a warning even in the event of a valid bundle. I'm on that side that the bundle should be warning-free, since the debug aspect is only for ourselves and would never be published.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also just to clarify with the double try/catch, Webpack will still issue a warning about the Debug module not being available, though it will not fail. I think it's a better developer experience that if they bundle the module correctly, no warning is issued.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The warning is desirable IMO because each warning alerts you to what your bundle is missing, you can squash them in your webpack config if you don't want to see them and it creates an intentional "paper trail" of the resolutions you don't care about.
We may not ship Debug but it can still be built and imported if Release is removed.
If we really feel strongly about not having Debug that's fine but we shouldn't introduce a console.log on import when this is missing, we can just throw inside this catch. The module is going to throw anyway when mc
is accessed during extends mc.MongoCrypt
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
RFC @addaleax, our resident webpack user 😅
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, definitely feeling strongly that:
- We should support the debug-mode addon, running
npm install --debug --build-from-source ...
isn't that hard and it's usually what a (sufficiently experienced) user will do to start diagnosing issues with native addons require()
ing a native addon package should throw if the addon itself is unavailable – that's just the general expectation for how addon packages behave- A warning at runtime printed via
console.error()
is much more disruptive than a warning in webpack. Most webpack configs will result in a bunch of warnings being printed, that's unfortunately more or less a fact of life
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've updated to throw now if both modules are missing.
@@ -1,5 +1,5 @@ | |||
import { expect } from 'chai'; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I moved the root tests to test/unit to avoid all the root test/ eslint craziness.
Co-authored-by: Neal Beeken <[email protected]>
Despite eslint's warning, it is not a useless catch 😅 given all that it is solving for here |
Description
Updates require to work with Webpack.
What is changing?
Is there new documentation needed for these changes?
What is the motivation for this change?
Release Highlight
Package is now compatible with Webpack
In order to use this module when bundling with Webpack, please include in your
webpack.config.js
:Double check the following
npm run check:lint
scripttype(NODE-xxxx)[!]: description
feat(NODE-1234)!: rewriting everything in coffeescript