Skip to content

使用 nodejs

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.services = {
  colord: {
    darken(text) {
      const fmt = getFormat(text);
      if (!fmt) {
        return [null, "请输入一个有效的颜色值,比如 #000 或 rgb(0,0,0)"];
      } else {
        const darkColor = colord(text).darken(0.1);
        return [darkColor, null];
      }
    },
  },
};

通过源码引入

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 文档