Extract native modules (.node files) while creating a rollup bundle and put them in one place"
npm install --save-dev rollup-plugin-natives
In some cases you have native dependencies (usually required by bindings
or node-pre-gyp
)
and you have to put them somewhere accessible to the rolled-up bundle.
This package is just for doing exactly this.
// rollup.config.js
import nativePlugin from 'rollup-plugin-natives';
export default {
input: 'main.js',
output: {
file: 'dist/bundle.js',
format: 'cjs'
},
plugins: [
nativePlugin({
// Where we want to physically put the extracted .node files
copyTo: 'dist/libs',
// Path to the same folder, relative to the output bundle js
destDir: './libs',
// Use `dlopen` instead of `require`/`import`.
// This must be set to true if using a different file extension that '.node'
dlopen: false,
// Modify the final filename for specific modules
// A function that receives a full path to the original file, and returns a desired filename
map: (modulePath) => 'filename.node',
// OR you can have a function that returns a desired file name and a specific destination to copy to.
map: (modulePath) => { name: 'filename.node', copyTo: 'C:\\Dist\\libs\\filename.node' },
// A transformer function that allows replacing a given node module path with another.
// This is good for either handling missing files, or dynamically resolving desired architectures etc.
originTransform: (path: string, exists: boolean) => (path: string|undefined),
// Generate sourcemap
sourcemap: true,
// If the target is ESM, so we can't use `require` (and .node is not supported in `import` anyway), we will need to use `createRequire` instead.
targetEsm: false,
})
]
};
node-pre-gyp
way of determining the require path is supported only if the module code matches (almost) exactly the recommended method, ie if it looks like this:
const binary = require('@mapbox/node-pre-gyp');
const binding_path = binary.find(path.resolve(path.join(__dirname, '../package.json')));
const module = require(binding_path);
MIT
This plugin was created by me and shared with you courtesy of Silverbolt which I'm working for.