文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
压缩安装包体积
better-sqlite3 是一个原生模块,原生模块是无法被 vite 编译到 JavaScript 的,那为什么还要把它安装成开发依赖呢?
把 better-sqlite3 安装成开发依赖,在功能上没有任何问题,electron-builder 在制作安装包时,会自动为安装包附加这个依赖(better-sqlite3 这个库自己的依赖也会被正确附加到安装包内)。
但 electron-builder 会把很多无用的文件(很多编译原生模块时的中间产物)也附加到安装包内。无形中增加了安装包的体积(大概 10M),如下图所示:
在 plugins/buildPlugin.ts 中增加一个方法:
async prepareSqlite() {
// 拷贝 better-sqlite3
const srcDir = path.join(process.cwd(), 'node_modules/better-sqlite3');
const destDir = path.join(process.cwd(), 'dist', 'node_modules/better-sqlite3');
fs.ensureDirSync(destDir);
fs.copySync(srcDir, destDir, {
filter: (src, dest) => {
if (src.endsWith('better-sqlite3') || src.endsWith('build') || src.endsWith('Release') || src.endsWith('better_sqlite3.node')) {
return true;
} else return src.includes('node_modules\\better-sqlite3\\lib');
}
});
let pkgJson = '{"name": "better-sqlite3","main": "lib/index.js"}';
let pkgJsonPath = path.join(process.cwd(), 'dist', 'node_modules/better-sqlite3/package.json');
fs.writeFileSync(pkgJsonPath, pkgJson);
// 制作 bindings 模块
const bindingPath = path.join(process.cwd(), 'dist', 'node_modules/bindings/index.js');
fs.ensureDirSync(bindingPath);
const bindingsContent = `module.exports = () => {
let addonPath = require("path").join(__dirname, '../better-sqlite3/build/Release/better_sqlite3.node');
return require(addonPath);
};`;
fs.writeFileSync(bindingPath, bindingsContent);
pkgJson = '{"name": "bindings","main": "index.js"}';
pkgJsonPath = path.join(process.cwd(), 'dist', 'node_modules/bindings/package.json');
fs.writeFileSync(pkgJsonPath, pkgJson);
}
这段代码主要做了两个工作:
- 把开发环境的 node_modules/better-sqlite3 目录下有用的文件拷贝到 dist/node_modules/better-sqlite3 目录下,并为这个模块自制了一个简单的 package.json。
- 完全自己制作了一个 bindings 模块,把这个模块放置在 dist/node_modules/bindings 目录下。
- closeBundle 钩子函数中调用这个方法:buildObj.prepareSqlite()。
这里 bindings 模块是 better-sqlite3 模块依赖的一个模块,它的作用仅仅是确定原生模块文件 better_sqlite3.node 的路径。
接下来再修改一下 BuildObj 的 preparePackageJson 方法,在生成 package.json 文件之前,为其附加两个生产依赖,代码如下:
localPkgJson.dependencies['better-sqlite3'] = '*';
localPkgJson.dependencies['bindings'] = '*';
有了这两个配置,electron-builder 就不会自动安装这些模块了。
完成这些工作后,在 closeBundle 钩子函数中调用这个方法: buildObj.prepareSqlite(),再打包看看,安装包的体积是否变小了呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论