Skip to content

nodejs api

preload.js 中,我们可以引入 nodejs 的 api,以及少量被限制的 electron 的 api。

模块引入

preload.js 遵循 CommonJS 规范,因此我们可以通过 require 引入 nodejs 的 api。

可以引入的 api 包括 nodejs (基于 nodejs@16) 所有的内置模块,开发者自己编写的 nodejs 模块,以及第三方 nodejs 模块。

js
const writeText = require("./libs/writeText.js");

window.services = {
  writeText,
};
js
const fs = require("fs");
const path = require("path");

module.exports = function writeText(text, filePath) {
  const dir = path.dirname(filePath);
  if (!fs.existsSync(dir)) {
    fs.mkdirSync(dir, { recursive: true });
    fs.writeFileSync(filePath, text);
    return true;
  }
  return false;
};

第三方模块

当你需要使用第三方模块时,为了保证审核的通过率,请尽量保证直接使用第三方模块的源代码,而不是使用第三方模块的打包版本。

通过 npm 安装

preload.js 同级目录下,保证存在一个独立的 package.json,并且设置 typecommons

json
{
  "type": "commonjs"
  "dependencies": {}
}

preload.js 同级目录下,执行 npm install 安装第三方模块,保证 node_modules 目录存在。

bash
npm install colord
js
const { getFormat, colord } = require("colord");
// ...其他代码
window.exports = {
  darken: {
    mode: "list",
    args: {
      search(_, text, setList) {
        const fmt = getFormat(text);
        if (!fmt) {
          setList([
            {
              title: "无效的颜色",
              description: "请输入一个有效的颜色值,比如 #000 或 rgb(0,0,0)",
            },
          ]);
        } else {
          const darkColor = colord(text).darken(0.1);
          setList([
            {
              title: "变暗10%",
              description: darkColor,
            },
          ]);
        }
      },
      //...其他代码
    },
  },
};

通过源码引入

preload.js 同级目录下,下载源码,并使用 require 引入。

比如从 github 下载 nodemailer

bash
git clone https://github.com/nodemailer/nodemailer.git
js
const nodemailer = require("./nodemailer");
const _setImmediate = setImmediate;
process.once("loaded", function () {
  global.setImmediate = _setImmediate;
});
const sendMail = () => {
  let transporter = require("./nodemailer").createTransport({
    host: "smtp.qq.com",
    port: 465,
    secure: true,
    auth: {
      user: "aaa@qq.com",
      pass: "xxx",
    },
  });
  let mailOptions = {
    from: "aaa@qq.com",
    to: "bbb@gmail.com",
    subject: "Sending Email using Node.js",
    text: "That was easy!",
  };

  transporter.sendMail(mailOptions, function (error, info) {
    if (error) {
      console.log(error);
    } else {
      console.log("Email sent: " + info.response);
    }
  });
};
window.services = {
  sendMail: () => {
    return sendMail();
  },
};
tsx
export default function App() {
  return <button onClick={() => window.services.sendMail()}>发送邮件</button>;
}

Electron API

编写 preload.js 并使用 CommonJs 的方式引入 electron 的 api

获取更多 electron 的能力请查阅: electron 官方 API 文档