跳至内容
本页内容

C/C++ 扩展

Node.js 的 C/C++ 扩展有一个非常显著的特点,它只支持构建成 CommonJS 格式,并使用 require() 加载。这对强依赖 ESModule 格式的打包工具,如 ViteRollup 来说是致命的。

虽然有 @rollup/plugin-commonjs 这样的工具插件,但它并非万能的,尤其是在一些动态 require 的场景下。这也是 cjsesm 最大的区别。

因此,很多时候我们不得不使用 external 选项排除 C/C++ 扩展的构建,以确保它能够正常工作。

注意

当然,这并非绝对的。如果你熟悉 Vite、Rollup 的工作原理以及 C/C++ 扩展的绑定方式,那么我相信你会有更好的方法来处理它们。

此外,这里提供了一些 C/C++ 扩展的示例 👉 electron-vite-samples

中文

Node.js 的 C/C++ 扩展有个很显著的特点,它只支持构建成为 CommonJS 格式的模块,并且使用 require() 加载它。这对强依赖 ESModule 格式的构建工具像 Vite、Rollup 十分的致命。

虽然有 @rollup/plugin-commonjs 这样的工具插件,但它不是万能的,尤其是在一些动态加载的场景,这同样也是 cjsesm 最大的不同点。

所以说,很多时候我们不得不使用 external 选项排除 C/C++ 模块构建,以保障它能正常工作。

当然,这不是绝对的。如果你很熟悉 Vite、Rollup 的工作原理和 C/C++ 模块的 binding 方式,那么我相信你有更好的办法处理它们。

此外,这里提供了一些 C/C++ 模块的模板 👉 electron-vite-samples

示例

ts
import electron from 'vite-plugin-electron'

export default {
  plugins: [
    electron({
      // Main process entry file of the Electron App.
      entry: 'electron/main/index.ts',
      vite: {
        build: {
          rollupOptions: {
            external: [
              'better-sqlite3',
              'sqlite3',
              'serialport',
              // other `C/C++` addons
            ],
          },
        },
      },
    }),
  ],
}

vite-plugin-native

此外,你还可以尝试使用社区插件 vite-plugin-native 来加载 C/C++ 扩展。

中文

另外,你也可以尝试使用社区插件 vite-plugin-native 加载 C/C++ 扩展。

ts
import electron from 'vite-plugin-electron'
import native from 'vite-plugin-native'

export default {
  plugins: [
    electron({
      entry: 'electron/main.ts',
      vite: {
        plugins: [
          native(/* options */),
        ],
      },
    }),
  ],
}