返回介绍

压缩安装包体积

发布于 2024-09-11 01:11:55 字数 2601 浏览 0 评论 0 收藏 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文